【小安派试玩】红外接收NEC码

[复制链接]
查看2128 | 回复10 | 2023-9-1 20:54:14 | 显示全部楼层 |阅读模式
前言:在生活中,红外的应用非常广泛,比如,安防监控,军事安全,医疗设备,消费电子产品,红外遥控器是生活中我们最常见的应用,例如电视、音频设备和空调等。红外信号用于远程控制和通信,目前红外遥控器广泛使用的两种遥控码格式,一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准,一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。

本次楼楼分享如果通过小安派来实现红外NEC编码接收


效果展示:

楼楼按下遥控器某个键就可以实现灯的打开或关闭灯



红外接收.gif



串口输出信息


串口打印.gif



流程介绍:


· 硬件连接
将红外接收模块的OUT引脚连接到小安派的一个IO口(楼楼使用的例程默认的10号引脚)。
连接模块的VCC和GND引脚分别到小安派的电源正负极。

· 初始化设置
设置IO口为输入模式,用于接收来自红外接收模块的数据。

· 红外接收信号处理:
在主程序的循环中,不断地读取红外接收模块的状态。
当接收到红外信号时,红外接收模块会将数据以脉冲的方式输出给单片机。
使用计时器或外部中断来记录脉冲的时间间隔。

· NEC编码解析
根据NEC编码协议,红外信号的逻辑由脉冲的高低电平表示。
首先,检测起始位的标识脉冲,通常为9ms的高电平脉冲,然后是4.5ms的低电平脉冲。
接下来是8个数据位和8个反码数据位,每个位之间有560us的低电平脉冲表示0,或1.68ms的低电平脉冲表示1。
使用单片机记录数据位的高低电平信息,并解析出对应的二进制数据。

· 数据处理
根据接收到的数据,进行相应的处理。



代码:
  1. #include "bflb_ir.h"
  2. #include "board.h"
  3. #include "bflb_gpio.h"
  4. struct bflb_device_s *irrx;
  5. uint64_t rx_data;
  6. uint8_t data;

  7. u_int8_t flgs[] = {0,0,0,0};

  8. u_int8_t leds[] = {31,32,33,34};


  9. int main(void)
  10. {
  11.     board_init();

  12.     //配置led
  13.     struct bflb_device_s *gpio;
  14.     gpio = bflb_device_get_by_name("gpio");

  15.     for(int i = 0; i < 4; i++){
  16.         bflb_gpio_init(gpio, leds[i], GPIO_OUTPUT);
  17.     }

  18.     // 红外GPIO初始化 io10
  19.     board_ir_gpio_init();
  20.     struct bflb_ir_rx_config_s rx_cfg;
  21.     irrx = bflb_device_get_by_name("irrx");
  22.     rx_cfg.rx_mode = IR_RX_NEC; // 接收NEC
  23.     rx_cfg.input_inverse = true; // 输入反转使能
  24.     rx_cfg.deglitch_enable = false; // 关闭去抖动功能
  25.     bflb_ir_rx_init(irrx, &rx_cfg); // 初始化红外接收设备

  26.     /* 使能红外接收 */
  27.     bflb_ir_rx_enable(irrx, true);

  28.     while (1) {
  29.         // 接收红外信号,将结果存储到 rx_data 变量中
  30.         bflb_ir_receive(irrx, &rx_data);

  31.         data = (uint8_t)((rx_data >> 16) & 0xFF); // 取出控制码

  32.         // 处理事件
  33.         switch (data)
  34.         {
  35.         case 0x46:
  36.             if(flgs[0] == 0){
  37.                 flgs[0] = 1;
  38.                 bflb_gpio_set(gpio,leds[0]);
  39.             }else{
  40.                 flgs[0] = 0;
  41.                 bflb_gpio_reset(gpio,leds[0]);
  42.             }
  43.             break;
  44.         
  45.         case 0x07:
  46.             if(flgs[1] == 0){
  47.                 flgs[1] = 1;
  48.                 bflb_gpio_set(gpio,leds[1]);
  49.             }else{
  50.                 flgs[1] = 0;
  51.                 bflb_gpio_reset(gpio,leds[1]);
  52.             }
  53.             break;
  54.         case 0x09:
  55.             if(flgs[2] == 0){
  56.                 flgs[2] = 1;
  57.                 bflb_gpio_set(gpio,leds[2]);
  58.             }else{
  59.                 flgs[2] = 0;
  60.                 bflb_gpio_reset(gpio,leds[2]);
  61.             }
  62.             break;
  63.         case 0x0C:
  64.             if(flgs[3] == 0){
  65.                 flgs[3] = 1;
  66.                 bflb_gpio_set(gpio,leds[3]);
  67.             }else{
  68.                 flgs[3] = 0;
  69.                 bflb_gpio_reset(gpio,leds[3]);
  70.             }
  71.             break;
  72.         
  73.         }
  74.         
  75.         printf("data: %d\r\n", data);
  76.         bflb_mtimer_delay_ms(50);
  77.     }
  78. }
复制代码

代码不是很多,楼楼添加了注释,如果有什么错误的地方大家可以自行修正,通过这个例程,我们可以实现一个简单的红外控制开关。



本帖被以下淘专辑推荐:

回复

使用道具 举报

ai_mcu | 2023-9-1 21:28:06 | 显示全部楼层
高产啊,这帖子一篇跟一篇
明天总会更好
回复 支持 反对

使用道具 举报

iiv | 2023-9-1 22:07:37 | 显示全部楼层
ai_mcu 发表于 2023-9-1 21:28
高产啊,这帖子一篇跟一篇

你是黑哥吗,黑哥黑哥黑哥
回复 支持 反对

使用道具 举报

jkernet | 2023-9-1 23:05:09 | 显示全部楼层
连续输出
回复

使用道具 举报

ai_mcu | 2023-9-1 23:23:32 | 显示全部楼层
iiv 发表于 2023-9-1 22:07
你是黑哥吗,黑哥黑哥黑哥

到论坛了也不放过我?!?!
明天总会更好
回复 支持 反对

使用道具 举报

粉肠 | 2023-9-1 23:41:01 | 显示全部楼层
支持期哥
回复

使用道具 举报

夜樱99 | 2023-9-2 21:30:32 | 显示全部楼层
支持所有开源的帖子!
回复 支持 反对

使用道具 举报

iiv | 2023-9-11 09:46:16 | 显示全部楼层
点赞~
回复

使用道具 举报

iiv | 2023-9-16 19:16:30 | 显示全部楼层
666
回复

使用道具 举报

molun | 2023-9-17 08:40:37 | 显示全部楼层
牛掰
等风,等雨,也等你!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则