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

相关连接

【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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值