相关连接
【STM32】【HAL库】遥控关灯0 概述
【STM32】【HAL库】遥控关灯1主机
【STM32】【HAL库】遥控关灯2 分机
【STM32】【HAL库】遥控关灯3 遥控器
需求
硬件遥控器
控制一个灯的开关(2个按键),发射RF433或红外
使用纽扣电池供电
一键启动,低待机功耗
硬件设计
一键启动电路
功能描述:
按下open按键时,电路自动开始给后级供电,单片机得电后发送RF433信号,过一段时间后失电,保证低待机功耗
按下close时同理,只有发送的编码信号不一样
原理图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMY4McvY-1676130602834)(picture/1.png)]](https://img-blog.csdnimg.cn/1f32f8ddd31b413ab81fc385e6287565.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOUnRk3w-1676130602836)(picture/2.png)]](https://img-blog.csdnimg.cn/7a40f8b77ddd46f5adbd3f79bf95fdbf.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)]](https://img-blog.csdnimg.cn/8b1fb6de2f57434594f8f049530c7eb6.png)
3V3 LDO
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wg8U5eJf-1676130602838)(picture/4.png)]](https://img-blog.csdnimg.cn/e6c5cb75ead84ade86ce543a1da0dca6.png)
RF433发射
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Osz0FDe1-1676130602838)(picture/5.png)]](https://img-blog.csdnimg.cn/cb8a2674c83643aba66ba02811c1b143.png)
STM32
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXzbeHMH-1676130602839)(picture/6.png)]](https://img-blog.csdnimg.cn/c1750374c6e24cd08810c5ada7ffaf3f.png)
红外
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmaZZ4Mk-1676130602840)(picture/7.png)]](https://img-blog.csdnimg.cn/de94f1c9ada2405b82f0aac7f3f6a7f2.png)
软件设计
使用到了之前写的几个库
相关链接
NEC
RF433
需要实现的功能
读取按键,更改电源mos的G极电压
根据按键内容输出RF433或红外即可
HAL初始化
定时器1
用于提供RF433和红外的延迟时序
分频后周期1us,最大溢出值,开启溢出中断
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-44Lgd4bJ-1676130602841)(picture/8.png)]](https://img-blog.csdnimg.cn/eeba20927a17457cbc9951b05e39d509.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8XxRKZSm-1676130602841)(picture/9.png)]](https://img-blog.csdnimg.cn/e36735bfa4fc402c9567c10f6a192348.png)
定时器3
用与产生红外NEC的PWM波
中断频率 38K*2 Hz,开启中断
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H86Rvmt5-1676130602841)(picture/10.png)]](https://img-blog.csdnimg.cn/0675275cd666404fac46e84b22285f9f.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vrDpXIUS-1676130602842)(picture/11.png)]](https://img-blog.csdnimg.cn/8cf4d0a6f3c04544b2a425c6fb8f456b.png)
GPIO
按键输入
浮空输入模式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UBD6TrzN-1676130602842)(picture/12.png)]](https://img-blog.csdnimg.cn/64a5e91064754738877514f9d97fa0a7.png)
GPIO
RF433输出
推挽输出(开漏上拉不行),最高等级
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MTIkmlrG-1676130602843)(picture/13.png)]](https://img-blog.csdnimg.cn/03e41d3b4c844d4e84c3f3245f70e72b.png)
GPIO
红外输出
推挽输出
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dffSLsle-1676130602843)(picture/14.png)]](https://img-blog.csdnimg.cn/05d2b133de294d05ac65e6dc2a66322d.png)
GPIO
电源管理mos管
推挽输出
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uj3CRfQ7-1676130602844)(picture/15.png)]](https://img-blog.csdnimg.cn/0dd819b3b21d43438324bed5ac7ecc0a.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



















