【STM32】【HAL库】遥控关灯3 遥控器

news2024/12/25 9:01:32

相关连接

【STM32】【HAL库】遥控关灯0 概述

【STM32】【HAL库】遥控关灯1主机

【STM32】【HAL库】遥控关灯2 分机

【STM32】【HAL库】遥控关灯3 遥控器

需求

硬件遥控器

控制一个灯的开关(2个按键),发射RF433或红外

使用纽扣电池供电

一键启动,低待机功耗

硬件设计

一键启动电路

功能描述:

按下open按键时,电路自动开始给后级供电,单片机得电后发送RF433信号,过一段时间后失电,保证低待机功耗

按下close时同理,只有发送的编码信号不一样

原理图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMY4McvY-1676130602834)(picture/1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOUnRk3w-1676130602836)(picture/2.png)]

解析:

大体上分为2个部分,一个是按键部分(上图),另一个是电源管理(下图)

电源管理部分的Q1管,在没有按键按下时,GS电压为0,Q1不导通,

当其中一个按键按下时,BAT_KEY的电压会被钳制在0.7v(电源正通过R1与按键的D2/D4二极管接地,二极管钳制电压)

VGS<-2.3V,Q1导通,此时后级电路得电,升压芯片和单片机开始工作,单片机程序中零BAT_MCU输出高电平,使U10 mos管导通,令Q1的GS电压差持续存在,直到执行程序完成后,拉低BAT_MCU,电路断电,回到初始态

按键部分的3.3v电压出现,如果按键被按下,则OPEN/CLOSE会被二极管钳制到0.7v(低电平范围),如果没被按下则维持3.3V(高电平)

升压电路

电池电压是3V左右,需要升压后使用,升压到4V左右即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P7kqu7hd-1676130602837)(picture/3.png)]

3V3 LDO

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wg8U5eJf-1676130602838)(picture/4.png)]

RF433发射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Osz0FDe1-1676130602838)(picture/5.png)]

STM32

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXzbeHMH-1676130602839)(picture/6.png)]

红外

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmaZZ4Mk-1676130602840)(picture/7.png)]

软件设计

使用到了之前写的几个库

相关链接

NEC

RF433

需要实现的功能

读取按键,更改电源mos的G极电压

根据按键内容输出RF433或红外即可

HAL初始化

定时器1

用于提供RF433和红外的延迟时序

分频后周期1us,最大溢出值,开启溢出中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-44Lgd4bJ-1676130602841)(picture/8.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8XxRKZSm-1676130602841)(picture/9.png)]

定时器3

用与产生红外NEC的PWM波

中断频率 38K*2 Hz,开启中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H86Rvmt5-1676130602841)(picture/10.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vrDpXIUS-1676130602842)(picture/11.png)]

GPIO

按键输入

浮空输入模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UBD6TrzN-1676130602842)(picture/12.png)]

GPIO

RF433输出

推挽输出(开漏上拉不行),最高等级

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MTIkmlrG-1676130602843)(picture/13.png)]

GPIO

红外输出

推挽输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dffSLsle-1676130602843)(picture/14.png)]

GPIO

电源管理mos管

推挽输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uj3CRfQ7-1676130602844)(picture/15.png)]

程序

中断回调函数

用于实现红外输出

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim == &IR_NEC_Send_TIM)
  {
    if (IR_NEC_Send_Square)
      HAL_GPIO_WritePin(IR_NEC_Send_GPIOx, IR_NEC_Send_GPIO_Pin, GPIO_PIN_SET);
    else
      HAL_GPIO_WritePin(IR_NEC_Send_GPIOx, IR_NEC_Send_GPIO_Pin, GPIO_PIN_RESET);
    IR_NEC_Send_Square++;
    if (IR_NEC_Send_Square >= 2)
      IR_NEC_Send_Square = 0;
  }
}

主循环

按键检测后发送对应信号即可

当按键按下不松开时,每隔固定时间重发一次信号

 if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)
    {
      HAL_Delay(20);
      while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)
      {
        // printf("open\r\n");
        RF_Write_Send(RF433_open);
        HAL_Delay(500);
      }
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
    }
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET)
    {
      HAL_Delay(20);
      while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET)
      {
        // printf("close\r\n");
        RF_Write_Send(RF433_close);
        HAL_Delay(500);
      }
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
    }

注意:别忘记程序初始化完成后拉高mos的G极,运行结束时拉低

int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t RF433_close[3] = {0xac, 0x33, 0xff};
  uint8_t RF433_open[3] = {0xac, 0x33, 0x00};
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */

  HAL_Delay(20);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)
    {
      HAL_Delay(20);
      while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)
      {
        // printf("open\r\n");
        RF_Write_Send(RF433_open);
        HAL_Delay(500);
      }
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
    }
    if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET)
    {
      HAL_Delay(20);
      while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET)
      {
        // printf("close\r\n");
        RF_Write_Send(RF433_close);
        HAL_Delay(500);
      }
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
    }
  }
  /* USER CODE END 3 */
}

成品

另外app开发很简单,百度凑凑就行了,源码同样在GitHub上,请自行查看即可

GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐系统开源工具RecBole学习

文章全文首发&#xff1a;码农的科研笔记&#xff08;公众号&#xff09; RecBole是由AI Box团队开发的基于Pytorch的推荐系统算法库。该框架从数据处理、模型开发和算法训练都有涉及&#xff0c;能方便进行算法构建和实验对比。 数据组织形式 RecBole约定了一个统一、易用的数…

发生异常: AttributeError ‘xxx’ object has no attribute ‘ooo’

python 发生异常: AttributeError ‘xxx’ object has no attribute ‘ooo’ 原因&#xff1a; 函数调用发生在变量定义之前 示例分析&#xff1a; 在apple.py文件中代码如下&#xff1a; class Apple():def __init__(self):self.eat()self.pricedef eat(self):print("吃…

Spring Security in Action 第十八章 手把手OAuth2应用

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…

Java:SpringMVC的使用(2)

目录第十二章 REST风格CRUD练习12.1 搭建环境12.2 实现功能思路第十三章 SpringMVC消息转换器13.1 消息转换器概述13.2 使用消息转换器处理请求报文(1) 使用RequestBody获取请求体(2) 使用HttpEntity\<T>获取请求体及请求头13.3 使用消息转换器处理响应报文(1) 使用Respo…

llvm 创建外部调用函数方法

llvm 创建外部调用函数方法 2023-02-12 15:26:19 sizaif 文章目录llvm 创建外部调用函数方法法一:声名参数类型及函数类型在llvm IR中处理并调用函数:外部函数&#xff1a;法二声明函数在llvm IR中处理并函数调用外部函数法一: 声名参数类型及函数类型 // Fun Ty static Fun…

【CS224W】(task3)NetworkX工具包实践

note 节点可以为任意可哈希的对象&#xff0c;比如字符串、图像、XML对象&#xff0c;甚至另一个Graph、自定义的节点对象。通过这种方式可以自由灵活地构建&#xff1a;图为节点、文件为节点、函数为节点&#xff0c;等灵活的图形式。暂时省略&#xff1a;【B5】计算机网络图…

vue3学习资料整理

一、一个后端程序员为什么要学习前端&#xff1f; 1.网上找到的学习理由 《Java后端的我也要学Node.js 了》 https://blog.csdn.net/yusimiao/article/details/104689007 《nodejs后端开发的优缺点&#xff08;nodejs的概念与特征详解&#xff09;》 https://www.1pindao.co…

2023级浙江大学MEM提面最新经验分享

一、个人背景背景&#xff1a;本人毕业于某211大学工程管理相关专业&#xff0c;目前定居在杭州&#xff0c;在某汽车制造公司工作&#xff0c;负责研发无人驾驶项目。我申请的是浙大MEM提前批面试&#xff0c;因为通过提面优秀资格顺利上岸录取&#xff0c;之前感到对自己有帮…

Java、JSP动漫网站的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着科技的迅速发展&#xff0c;计算机技术已应用到社会的各个领域。随着计算机技术和通信技术的迅速发展&#xff0c;网络的规模也逐渐增大&#xff0c;网络的元素也随之不断增加&#xff0c;有的利用其通信&#xff0c;有的利用其…

【软件测试开发】Junit5单元测试框架

目录1. 注解Test 注解BeforeEach BeforeAllAfterEach AfterAll2. 断言 assertassertequalsassertTrue assertFalseassertNull assertNotNull3. 用例执行顺序方法排序&#xff0c;通过 Order 注解来排序4. 测试套件 Suite5. 参数化单参数stringsints6. 参数化多参数CsvSourceCsv…

File类

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 ✈️推荐一款模拟面试&#xff0c;刷题神器…

2. SpringMVC 请求与响应

文章目录1. 请求映射路径2. 请求参数2.1 get 请求发送普通参数2.2 post 请求发送普通参数2.3 五种类型的参数传递2.4.1 普通参数2.4.2 POJO 数据类型2.4.3 嵌套 POJO 类型参数2.4.4 数组类型参数2.4.5 集合类型参数3. json 数据传输参数&#xff08;重点&#xff09;3.1 传输 j…

C语言(C预编译指令)

目录 1.undef 2.条件编译#ifdef,#else和#endif 3.#ifndef 4.#if和#elif 5.预定义宏 6.#line和#error 7.#pragma 1.undef #undef指令用于取消已定义的#define指令 #define LIMIT 400 #undef LIMIT 如果想使用一个名称但又不确定之前是否已经用过&#xff0c;为了安全起…

Python中的进程线程

文章目录前言多进程与多线程基本概念多进程multiprocessing 类对象进程池subprocess模块进程间通信多线程threading实现线程操作线程共享所有变量线程锁参考资料前言 又花了点时间学习了一下Python中的多线程与多进程的知识点&#xff0c;梳理一下供复习参考 多进程与多线程 …

JUC并发编程与源码分析

一、本课程前置知识及要求说明 二、线程基础知识复习 三、CompletableFuture 四、说说Java"锁"事 8锁案例原理解释: 五、LockSupport与线程中断 六、 Java内存模型之JMM 七、volatile与JMM 八、CAS 九、原子操作类之18罗汉增强 十、聊聊ThreadLocal 十一、Java对…

离线数据仓库

1 数据仓库建模 1.1 建模工具 PowerDesigner/SQLYog/EZDML… 1.2 ODS层 &#xff08;1&#xff09;保持数据原貌不做任何修改&#xff0c;起到备份数据的作用。 &#xff08;2&#xff09;数据采用压缩&#xff0c;减少磁盘存储空间&#xff08;例如&#xff1a;压缩采用LZO&…

seata源码-全局事务回滚服务端源码

这篇博客来记录在发起全局事务回滚时&#xff0c;服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中&#xff0c;有说到过&#xff0c;事务发起者在发现分支事务执行异常之后&#xff0c;会提交全局事务回滚的请求到netty服务端&#xff0c;这里是发…

Python 解决dilb和face_recognition第三方包安装失败

目录 dilb和face_recognition第三方包安装失败 亲测有效的解决方法&#xff1a;whl安装方式 dilb和face_recognition第三方包安装失败 场景复现&#xff1a;因为需要用到dlibface_recognition&#xff0c;基于OpenCV做一些人脸识别的项目&#xff0c;在Pycharm中进行pip清华…

图解LeetCode——剑指 Offer 24. 反转链表

一、题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 二、示例 示例: 【输入】 1->2->3->4->5->NULL 【输出】 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 三、…

Linux | Linux卸载和安装MySQL(Ubuntu版)

最近又来到了Linux学习了&#xff0c;原因是要接触云服务器相关知识&#xff0c; 所以博主整理了一些关于Linux的知识&#xff0c; 欢迎各位朋友点赞收藏&#xff0c;天天开心丫&#xff0c;快乐写代码&#xff01; Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…