本帖最后由 zzbinfo 于 2023-12-29 11:21 编辑
作为2023年最后一个工作日的总结,今天把M61实现远程开关机、433或315无线遥控、NEC红外遥控的代码分享出来,欢迎大家交流。其中红外遥控只做了NEC的部分,由于是用软件模拟的38Khz载波,准确性不会太高,后续可以用PWM来实现。
- void Local_Ctrl(struct bflb_device_s *gp_io,uint8_t pin,uint8_t flag)
- {
- switch (pin)
- {
- case '1':
- switch (flag)
- {
- case 'n':
- bflb_gpio_set(gp_io, RED_LED_Pin);
- break;
- case 'f':
- bflb_gpio_reset(gp_io, RED_LED_Pin);
- break;
- case 'k':
- bflb_gpio_set(gp_io, RED_LED_Pin);
- vTaskDelay(1000/portTICK_PERIOD_MS);
- bflb_gpio_reset(gp_io, RED_LED_Pin);
- break;
- default:
- break;
- }
- break;
- case '2':
- switch (flag)
- {
- case 'n':
- bflb_gpio_set(gp_io, GREEN_LED_Pin);
- break;
- case 'f':
- bflb_gpio_reset(gp_io, GREEN_LED_Pin);
- break;
- case 'k':
- bflb_gpio_set(gp_io, GREEN_LED_Pin);
- vTaskDelay(1000/portTICK_PERIOD_MS);
- bflb_gpio_reset(gp_io, GREEN_LED_Pin);
- break;
- default:
- break;
- }
- break;
- case '3':
- switch (flag)
- {
- case 'n':
- bflb_gpio_set(gp_io, BLUE_LED_Pin);
- break;
- case 'f':
- bflb_gpio_reset(gp_io, BLUE_LED_Pin);
- break;
- case 'k':
- bflb_gpio_set(gp_io, BLUE_LED_Pin);
- vTaskDelay(1000/portTICK_PERIOD_MS);
- bflb_gpio_reset(gp_io, BLUE_LED_Pin);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
复制代码 这部分代码可以实现远程开关机,我只是用开关板载的led举例。
- //模拟串口输出信息 600bps N ,8,1 1/600 1/9600
- void Tx1Send(uint8_t dat)
- {
- uint8_t i;
- bflb_gpio_reset(gpio,TXA);
- BitTime();
- for(i=0; i<8; i++)
- {
- if(dat & 1) bflb_gpio_set(gpio,TXA);
- else bflb_gpio_reset(gpio,TXA);
- dat >>= 1;
- BitTime();
- }
- bflb_gpio_set(gpio,TXA);
- BitTime();
- BitTime();
- }
- void Delayaus(uint8_t Delaytime)
- {
- bflb_mtimer_delay_us(pt2262_cycle * Delaytime);
- }
- void p2262_1() //发射“1”函数
- {
- bflb_gpio_set(gpio,TXA);
- Delayaus(12); //12
- bflb_gpio_reset(gpio,TXA);
- Delayaus(4); //4
- }
- void p2262_0() //发射“0”函数
- {
- bflb_gpio_set(gpio,TXA);
- Delayaus(4); //4
- bflb_gpio_reset(gpio,TXA);
- Delayaus(12); //12
- }
- void p2262_syn() //发射同步码
- {
- bflb_gpio_set(gpio,TXA);
- Delayaus(4); //4
- bflb_gpio_reset(gpio,TXA);
- Delayaus(124); //124
- }
- void p2262_8(unsigned char ch) //发射8位PT2262编码
- {
- uint8_t temp, i;
- for(i=0;i<8;i++)
- {
- temp=ch;
- temp=temp>>(7-i);
- temp&=0x01;
- if(temp==0)
- p2262_0();
- if(temp==1)
- p2262_1();
- }
- }
复制代码 这部分代码实现了无线数传和pt2262编码遥控。这里需要注意的时,不能用timer定时器来实现us延时,精确不到us,需要用到mtimer,bflb_mtimer_delay_us用这个来实现us计时。
红外部分同理,也是用定时器来模拟红外载波进行发射
- void Wait_High(uint8_t a)//a*560uS LED亮
- {
- uint16_t delaytime = a*560;
- uint16_t k = delaytime/13/2;
- while(k--) //软件制造38khz脉冲
- {
- bflb_gpio_set(gpio,IR_OUT);
- bflb_mtimer_delay_us(13);
- bflb_gpio_reset(gpio,IR_OUT);
- bflb_mtimer_delay_us(13);
- }
- bflb_gpio_set(gpio,IR_OUT);
- }
- void Wait_Low(uint8_t a)//a*560uS LED灭
- {
- bflb_gpio_set(gpio,IR_OUT);
- bflb_mtimer_delay_us(a*560);
- }
- void Send_IR()
- {
- uint8_t i,j;
- Wait_High(16);//9ms 亮 16
- Wait_Low(8);//4.5ms 灭
- for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- {
- Wait_High(1);//0.56ms 高电平
- if((DATA[i])&0x01)
- {
- Wait_Low(3);// 1.68ms 低电平
- }
- else
- {
- Wait_Low(1);//0.56ms 低电平
- }
- DATA[i]>>=1;
- }
- }
- Wait_High(1);//0.56ms 高电平 结束位 CEND = 0;
- //模拟重复码
- for(i=0;i<4;i++)
- {
- Wait_Low(108);
- Wait_High(16);//9ms 亮
- Wait_Low(4);//2.25ms 灭
- Wait_High(1);//0.56ms 高电平
-
- Wait_Low(200);
- }
- bflb_gpio_reset(gpio,IR_OUT);
- }
复制代码
这个是红外线发送和解码的验证截图。我会把完整的工程代码发到最后。
wifi_tcp_client.rar
(13.52 KB, 下载次数: 12)
|
|