『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1553|回复: 6

[新奇玩法] 8266运行2个LOOP可行码?

[复制链接]

3

主题

28

帖子

328

积分

中级会员

Rank: 3Rank: 3

积分
328
金钱
300
HASS币
0
发表于 2023-6-29 11:50:53 | 显示全部楼层 |阅读模式
本帖最后由 tpsdm 于 2023-6-29 11:55 编辑

#include <IRremoteESP8266.h>#include <IRrecv.h>
#include <IRutils.h>
#define IR_RECEIVE_PIN 4  // 连接红外接收器的GPIO引脚#define LED_PIN 2         // 板载LED的GPIO引脚
#define IR_CODE_A 0x123   // 假设红外固定值1
#define IR_CODE_B 0x456   // 假设红外固定值2
IRrecv irrecv(IR_RECEIVE_PIN);
decode_results irResults;
void setup() {  
Serial.begin(115200);  // 初始化红外接收器  
irrecv.enableIRIn();  // 配置板载LED引脚  
pinMode(LED_PIN, OUTPUT);}
void loop()
{  if (irrecv.decode(&irResults))
{    unsigned long irCode = irResults.value;   
irrecv.resume();   
if (irCode == IR_CODE_A)
{      loopA();
   } else if (irCode == IR_CODE_B)
{      loopB();   
} }
}
void loopA()
{  Serial.println("Executing loopA()");
digitalWrite(LED_PIN, HIGH);
delay(1000);   // 板载LED闪烁1秒  
digitalWrite(LED_PIN, LOW);
}
void loopB()
{  Serial.println("Executing loopB()");
  digitalWrite(LED_PIN, HIGH);
delay(5000);   // 板载LED闪烁5秒
digitalWrite(LED_PIN, LOW);
}


回复

使用道具 举报

17

主题

320

帖子

2499

积分

金牌会员

Rank: 6Rank: 6

积分
2499
金钱
2179
HASS币
20
发表于 2023-6-29 16:01:41 | 显示全部楼层
这俩不就是普通方法吗
回复

使用道具 举报

0

主题

21

帖子

540

积分

高级会员

Rank: 4

积分
540
金钱
519
HASS币
0
发表于 2023-6-29 16:02:05 | 显示全部楼层
我理解你想同时多任务吧,你这样表面看起来是两个任务,但并不是。。。而且还用了delay(1000);这样的阻塞延迟,会导致运行到这里就等待。你可以试试用FreeRTOS的xTaskCreate多任务,并且使用vTaskDelay非阻塞延迟方式替代。
回复

使用道具 举报

3

主题

28

帖子

328

积分

中级会员

Rank: 3Rank: 3

积分
328
金钱
300
HASS币
0
 楼主| 发表于 2023-6-30 10:32:41 | 显示全部楼层
fbll 发表于 2023-6-29 16:02
我理解你想同时多任务吧,你这样表面看起来是两个任务,但并不是。。。而且还用了delay(1000);这样的阻塞延 ...

当接收到红外A信号就运行LOOPA,当接收到红外B信号就运行LOOPB,我试了LOOP,AB不能无线循环。当接收到红外A信号就运行LOOPA,灯灭一秒就常亮,不能反复亮灭?
回复

使用道具 举报

3

主题

28

帖子

328

积分

中级会员

Rank: 3Rank: 3

积分
328
金钱
300
HASS币
0
 楼主| 发表于 2023-6-30 10:33:57 | 显示全部楼层
lujiashun1 发表于 2023-6-29 16:01
这俩不就是普通方法吗

刚学会,小白一个,请指教!
回复

使用道具 举报

17

主题

320

帖子

2499

积分

金牌会员

Rank: 6Rank: 6

积分
2499
金钱
2179
HASS币
20
发表于 2023-6-30 12:45:39 | 显示全部楼层
unsigned long irCode;
void loop()
{  
    if (irrecv.decode(&irResults))
    {    
        irCode = irResults.value;   
        irrecv.resume();   
    }
    if (irCode == IR_CODE_A)
    {      
        loopA();
    } 
    else if (irCode == IR_CODE_B)
    {      
        loopB();   
    } 
}
ya要循环应该这么写,还有 你循环里明显不能闪烁起码在loopA loopB最后面也要加延时,但是加延时不知道会不会影响你接收红外信号
回复

使用道具 举报

3

主题

28

帖子

328

积分

中级会员

Rank: 3Rank: 3

积分
328
金钱
300
HASS币
0
 楼主| 发表于 2023-6-30 14:25:30 | 显示全部楼层
本帖最后由 tpsdm 于 2023-7-2 11:48 编辑
lujiashun1 发表于 2023-6-30 12:45
ya要循环应该这么写,还有 你循环里明显不能闪烁起码在loopA loopB最后面也要加延时,但是加延时不知道会不 ...

#include <IRremoteESP8266.h>#include <IRrecv.h>
#include <IRsend.h>
#include <RCSwitch.h>
#define IR_RECEIVE_PIN 2   // 红外接收器连接的引脚
#define RF_TRANSMIT_PIN 0  // 射频发射模块连接的引脚
#define IR_CODE_A 0x44bba15e  // 红外码A
#define IR_CODE_B 0x44bb619e  // 红外码B
#define IR_CODE_C 1153153860  // 红外码C
#define IR_CODE_D 1153118670  // 红外码D
#define IR_CODE_E 1153124790  // 红外码E
#define RF_CODE_A 5605901   // 射频信号A
#define RF_CODE_B 5605890   // 射频信号B
#define RF_CODE_C 8269452   // 射频信号
CIRrecv irrecv(IR_RECEIVE_PIN);
IRsend irsend;RCSwitch rfSwitch;
void setup() {  
Serial.begin(115200);  
irrecv.enableIRIn();  
rfSwitch.enableTransmit(RF_TRANSMIT_PIN);  
rfSwitch.setProtocol(1);}
void loop() {
if (irrecv.decode()) {   
unsigned long irCode = irrecv.decodedIRData.decodedRawData;   
if (irCode == IR_CODE_A) {
     A();   
} else if (irCode == IR_CODE_B) {      
B();    }   
irrecv.resume();  
}}void A() {
Serial.println("Executing A()");  
if (irrecv.decode())
{   
unsigned long irCode = irrecv.decodedIRData.decodedRawData;        
if (irCode == IR_CODE_C)
{      
transmitRFSignal(RF_CODE_A);  
  }
else if (irCode == IR_CODE_D)
{      
transmitRFSignal(RF_CODE_B);   
}
else if (irCode == IR_CODE_E)
{      
transmitRFSignal(RF_CODE_C);   
}  
}
}
void B() {  
Serial.println("Executing B()");  
if (irrecv.decode())
{   
unsigned long irCode = irrecv.decodedIRData.decodedRawData;        
if (irCode == IR_CODE_C)
{      
transmitRFSignal(RF_CODE_B);   
}
else if (irCode == IR_CODE_D)
{      
transmitRFSignal(RF_CODE_C);   
}
else if (irCode == IR_CODE_E)
{      
transmitRFSignal(RF_CODE_A);   
}  
}
}void transmitRFSignal(unsigned long rfCode)
{  
rfSwitch.send(rfCode, 24);
}


外外A 0x44bba15e
红外B 0x44bb619e
红外C 1153153860
红外D 1153118670
红外D 1153124790
射频A 5605901
射频B 5605890
射频B 8269452
红外接收器引脚 2
射频发射引脚 0
8266红外转433程序,但接收到红外A就运行A()函数,但接收到红外B就运行B()函数。
A()函数:(但接收到红外C就转发射频A的信号,但接收到红外D就转发射频B的信号,但接收到红外E就转发射频C的信号,)
B()函数:(但接收到红外C就转发射频B的信号,但接收到红外D就转发射频C的信号,但接收到红外E就转发射频A的信号,)

这个代码有问题码?怎么编译出错?请老师指教!!!





回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-27 09:56 , Processed in 0.488113 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表