前言:在生活中,红外的应用非常广泛,比如,安防监控,军事安全,医疗设备,消费电子产品,红外遥控器是生活中我们最常见的应用,例如电视、音频设备和空调等。红外信号用于远程控制和通信,目前红外遥控器广泛使用的两种遥控码格式,一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准,一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。
本次楼楼分享如果通过小安派来实现红外NEC编码接收
效果展示:
楼楼按下遥控器某个键就可以实现灯的打开或关闭灯
串口输出信息
流程介绍:
· 硬件连接
将红外接收模块的OUT引脚连接到小安派的一个IO口(楼楼使用的例程默认的10号引脚)。
连接模块的VCC和GND引脚分别到小安派的电源正负极。
· 初始化设置
设置IO口为输入模式,用于接收来自红外接收模块的数据。
· 红外接收信号处理:
在主程序的循环中,不断地读取红外接收模块的状态。
当接收到红外信号时,红外接收模块会将数据以脉冲的方式输出给单片机。
使用计时器或外部中断来记录脉冲的时间间隔。
· NEC编码解析
根据NEC编码协议,红外信号的逻辑由脉冲的高低电平表示。
首先,检测起始位的标识脉冲,通常为9ms的高电平脉冲,然后是4.5ms的低电平脉冲。
接下来是8个数据位和8个反码数据位,每个位之间有560us的低电平脉冲表示0,或1.68ms的低电平脉冲表示1。
使用单片机记录数据位的高低电平信息,并解析出对应的二进制数据。
· 数据处理
根据接收到的数据,进行相应的处理。
代码:
- #include "bflb_ir.h"
- #include "board.h"
- #include "bflb_gpio.h"
- struct bflb_device_s *irrx;
- uint64_t rx_data;
- uint8_t data;
- u_int8_t flgs[] = {0,0,0,0};
- u_int8_t leds[] = {31,32,33,34};
- int main(void)
- {
- board_init();
- //配置led
- struct bflb_device_s *gpio;
- gpio = bflb_device_get_by_name("gpio");
- for(int i = 0; i < 4; i++){
- bflb_gpio_init(gpio, leds[i], GPIO_OUTPUT);
- }
- // 红外GPIO初始化 io10
- board_ir_gpio_init();
- struct bflb_ir_rx_config_s rx_cfg;
- irrx = bflb_device_get_by_name("irrx");
- rx_cfg.rx_mode = IR_RX_NEC; // 接收NEC
- rx_cfg.input_inverse = true; // 输入反转使能
- rx_cfg.deglitch_enable = false; // 关闭去抖动功能
- bflb_ir_rx_init(irrx, &rx_cfg); // 初始化红外接收设备
- /* 使能红外接收 */
- bflb_ir_rx_enable(irrx, true);
- while (1) {
- // 接收红外信号,将结果存储到 rx_data 变量中
- bflb_ir_receive(irrx, &rx_data);
- data = (uint8_t)((rx_data >> 16) & 0xFF); // 取出控制码
- // 处理事件
- switch (data)
- {
- case 0x46:
- if(flgs[0] == 0){
- flgs[0] = 1;
- bflb_gpio_set(gpio,leds[0]);
- }else{
- flgs[0] = 0;
- bflb_gpio_reset(gpio,leds[0]);
- }
- break;
-
- case 0x07:
- if(flgs[1] == 0){
- flgs[1] = 1;
- bflb_gpio_set(gpio,leds[1]);
- }else{
- flgs[1] = 0;
- bflb_gpio_reset(gpio,leds[1]);
- }
- break;
- case 0x09:
- if(flgs[2] == 0){
- flgs[2] = 1;
- bflb_gpio_set(gpio,leds[2]);
- }else{
- flgs[2] = 0;
- bflb_gpio_reset(gpio,leds[2]);
- }
- break;
- case 0x0C:
- if(flgs[3] == 0){
- flgs[3] = 1;
- bflb_gpio_set(gpio,leds[3]);
- }else{
- flgs[3] = 0;
- bflb_gpio_reset(gpio,leds[3]);
- }
- break;
-
- }
-
- printf("data: %d\r\n", data);
- bflb_mtimer_delay_ms(50);
- }
- }
复制代码
代码不是很多,楼楼添加了注释,如果有什么错误的地方大家可以自行修正,通过这个例程,我们可以实现一个简单的红外控制开关。
|
|