用Ai-M61实现物联网开发(2)---实现远程开机、无线控制、红外遥控

[复制链接]
查看949 | 回复7 | 2023-12-29 11:16:01 | 显示全部楼层 |阅读模式
本帖最后由 zzbinfo 于 2023-12-29 11:21 编辑

作为2023年最后一个工作日的总结,今天把M61实现远程开关机、433或315无线遥控、NEC红外遥控的代码分享出来,欢迎大家交流。其中红外遥控只做了NEC的部分,由于是用软件模拟的38Khz载波,准确性不会太高,后续可以用PWM来实现。

  1. void Local_Ctrl(struct bflb_device_s *gp_io,uint8_t pin,uint8_t flag)
  2. {
  3.     switch (pin)
  4.     {
  5.     case '1':
  6.         switch (flag)
  7.         {
  8.         case 'n':
  9.             bflb_gpio_set(gp_io, RED_LED_Pin);
  10.             break;
  11.          case 'f':
  12.             bflb_gpio_reset(gp_io, RED_LED_Pin);
  13.             break;  
  14.          case 'k':
  15.             bflb_gpio_set(gp_io, RED_LED_Pin);
  16.             vTaskDelay(1000/portTICK_PERIOD_MS);
  17.             bflb_gpio_reset(gp_io, RED_LED_Pin);
  18.             break;              
  19.         default:
  20.             break;
  21.         }
  22.         break;
  23.      case '2':
  24.         switch (flag)
  25.         {
  26.         case 'n':
  27.             bflb_gpio_set(gp_io, GREEN_LED_Pin);
  28.             break;
  29.          case 'f':
  30.             bflb_gpio_reset(gp_io, GREEN_LED_Pin);
  31.             break;  
  32.          case 'k':
  33.             bflb_gpio_set(gp_io, GREEN_LED_Pin);
  34.             vTaskDelay(1000/portTICK_PERIOD_MS);
  35.             bflb_gpio_reset(gp_io, GREEN_LED_Pin);
  36.             break;              
  37.         default:
  38.             break;
  39.         }
  40.         break;
  41.     case '3':
  42.         switch (flag)
  43.         {
  44.         case 'n':
  45.             bflb_gpio_set(gp_io, BLUE_LED_Pin);
  46.             break;
  47.          case 'f':
  48.             bflb_gpio_reset(gp_io, BLUE_LED_Pin);
  49.             break;  
  50.          case 'k':
  51.             bflb_gpio_set(gp_io, BLUE_LED_Pin);
  52.             vTaskDelay(1000/portTICK_PERIOD_MS);
  53.             bflb_gpio_reset(gp_io, BLUE_LED_Pin);
  54.             break;              
  55.         default:
  56.             break;
  57.         }
  58.         break;           
  59.     default:
  60.         break;
  61.     }

  62. }
复制代码
这部分代码可以实现远程开关机,我只是用开关板载的led举例。
  1. //模拟串口输出信息 600bps N ,8,1   1/600   1/9600
  2. void        Tx1Send(uint8_t dat)               
  3. {
  4.     uint8_t        i;
  5.     bflb_gpio_reset(gpio,TXA);
  6.         BitTime();
  7.         for(i=0; i<8; i++)
  8.         {
  9.                 if(dat & 1)                bflb_gpio_set(gpio,TXA);
  10.                 else                        bflb_gpio_reset(gpio,TXA);
  11.                 dat >>= 1;
  12.         BitTime();
  13.         }
  14.         bflb_gpio_set(gpio,TXA);
  15.         BitTime();
  16.         BitTime();
  17. }
  18. void Delayaus(uint8_t Delaytime)
  19. {  
  20.   bflb_mtimer_delay_us(pt2262_cycle * Delaytime);
  21. }
  22. void p2262_1() //发射“1”函数
  23. {
  24.   bflb_gpio_set(gpio,TXA);
  25.   Delayaus(12);  //12  
  26.   bflb_gpio_reset(gpio,TXA);
  27.   Delayaus(4); //4
  28. }
  29. void p2262_0() //发射“0”函数
  30. {     
  31.    bflb_gpio_set(gpio,TXA);
  32.    Delayaus(4); //4   
  33.    bflb_gpio_reset(gpio,TXA);
  34.    Delayaus(12); //12
  35. }
  36. void p2262_syn() //发射同步码
  37. {
  38.    bflb_gpio_set(gpio,TXA);
  39.    Delayaus(4); //4
  40.    bflb_gpio_reset(gpio,TXA);
  41.    Delayaus(124);            //124
  42. }

  43. void p2262_8(unsigned char ch) //发射8位PT2262编码
  44. {   
  45. uint8_t temp, i;     
  46. for(i=0;i<8;i++)   
  47. {     
  48.   temp=ch;     
  49.   temp=temp>>(7-i);      
  50.   temp&=0x01;     
  51.   if(temp==0)
  52.    p2262_0();   
  53.   if(temp==1)
  54.    p2262_1();   
  55. }
  56. }
复制代码
这部分代码实现了无线数传和pt2262编码遥控。这里需要注意的时,不能用timer定时器来实现us延时,精确不到us,需要用到mtimer,bflb_mtimer_delay_us用这个来实现us计时。
红外部分同理,也是用定时器来模拟红外载波进行发射
  1. void Wait_High(uint8_t a)//a*560uS LED亮
  2. {

  3. uint16_t delaytime = a*560;
  4. uint16_t k = delaytime/13/2;
  5. while(k--)  //软件制造38khz脉冲
  6.         {
  7.         bflb_gpio_set(gpio,IR_OUT);
  8.         bflb_mtimer_delay_us(13);
  9.         bflb_gpio_reset(gpio,IR_OUT);
  10.         bflb_mtimer_delay_us(13);
  11.         }
  12. bflb_gpio_set(gpio,IR_OUT);
  13. }

  14. void Wait_Low(uint8_t a)//a*560uS LED灭
  15. {
  16.    bflb_gpio_set(gpio,IR_OUT);
  17.    bflb_mtimer_delay_us(a*560);
  18. }

  19. void Send_IR()
  20. {
  21.       uint8_t i,j;
  22.       Wait_High(16);//9ms 亮   16
  23.       Wait_Low(8);//4.5ms        灭
  24.       for(i=0;i<4;i++)
  25.       {
  26.         for(j=0;j<8;j++)
  27.         {
  28.             Wait_High(1);//0.56ms 高电平
  29.             if((DATA[i])&0x01)
  30.             {
  31.                  Wait_Low(3);// 1.68ms     低电平
  32.             }
  33.             else
  34.             {
  35.                 Wait_Low(1);//0.56ms 低电平
  36.             }
  37.             DATA[i]>>=1;   
  38.         }
  39.       }   
  40.        Wait_High(1);//0.56ms 高电平 结束位       CEND = 0;
  41.          //模拟重复码
  42.         for(i=0;i<4;i++)
  43.         {
  44.           Wait_Low(108);
  45.           Wait_High(16);//9ms 亮
  46.           Wait_Low(4);//2.25ms        灭
  47.           Wait_High(1);//0.56ms 高电平
  48.          
  49.           Wait_Low(200);
  50.         }
  51.            bflb_gpio_reset(gpio,IR_OUT);
  52. }
复制代码
红外发送和解码.png

这个是红外线发送和解码的验证截图。我会把完整的工程代码发到最后。
wifi_tcp_client.rar (13.52 KB, 下载次数: 12)

本帖被以下淘专辑推荐:

回复

使用道具 举报

爱笑 | 2023-12-29 11:24:27 | 显示全部楼层
优秀~
用心做好保姆工作
回复

使用道具 举报

bzhou830 | 2023-12-29 12:41:15 | 显示全部楼层
赞一个
选择去发光,而不是被照亮
回复

使用道具 举报

1084504793 | 2023-12-29 12:59:45 | 显示全部楼层
回复

使用道具 举报

King6688 | 2024-1-13 19:53:43 | 显示全部楼层
学习了
回复

使用道具 举报

lza | 2024-2-11 00:21:42 | 显示全部楼层
收纳了
回复

使用道具 举报

1055173307 | 2024-4-8 10:15:30 | 显示全部楼层
回复

使用道具 举报

1055173307 | 2024-5-2 10:23:02 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则