Arduino合并PIR传感与NRF遥控步进电机代码冲突问题求助
问题核心原因
你代码存在引脚资源冲突,这是导致功能异常的直接原因:
- NRF24L01的CE引脚被定义为7号:
RF24 radio(7, 8); - 第三个PIR传感器的输入引脚也被定义为7号:
int pirSensor3 = 7;
NRF初始化时会修改7号引脚的工作模式,直接覆盖了PIR传感器的输入配置,所以只要启用NRF初始化,PIR3的读数就会完全异常,进而导致整套PIR传感逻辑失效。
修复步骤
调整引脚分配
将第三个PIR传感器的引脚改为未被占用的空闲IO,比如11号:
// 修改前 // int pirSensor3 = 7; // 修改后 int pirSensor3 = 11;
接线时同步将第三个PIR的输出端接到11号数字引脚即可。
补全模式切换逻辑
你可以新增一个按键实现模式切换,参考修改代码如下:
首先新增全局定义:
// 新增模式按键引脚,接按键一端到GND,另一端到12号引脚 const int modeBtn = 12; // 存储当前工作模式,默认PIR模式 bool isNRFMode = false; // 按键消抖用变量 unsigned long lastBtnPress = 0; const unsigned long btnDebounce = 200;
setup中新增按键初始化,取消NRF初始化的注释:
void setup() { pinMode(pirSensor1, INPUT); pinMode(pirSensor2, INPUT); pinMode(pirSensor3, INPUT); // 按键用上拉输入,默认高电平,按下为低 pinMode(modeBtn, INPUT_PULLUP); Serial.begin(9600); // 取消NRF初始化注释 radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); }
loop中修改逻辑,先判断按键切换模式,再执行对应功能:
void loop() { // 按键模式切换逻辑 if(digitalRead(modeBtn) == LOW && millis() - lastBtnPress > btnDebounce) { isNRFMode = !isNRFMode; lastBtnPress = millis(); Serial.print("切换到"); Serial.println(isNRFMode ? "遥控模式" : "PIR传感模式"); // 切换模式时清空残留命令 cCommand = '0'; } if(isNRFMode) { // 遥控模式逻辑:先判断是否有NRF数据,再读取 if(radio.available()) { char text[32] = ""; radio.read(&text, sizeof(text)); if (text[0] != '\0') { cCommand = text[0]; } } // 执行遥控命令 if(cCommand == '1'){ stepper.moveDegreesCCW (5); Serial.println(cCommand); cCommand = '0'; } else if(cCommand == '2'){ stepper.moveDegreesCW (5); Serial.println(cCommand); cCommand = '0'; } else if(cCommand == '9'){ // 收到切PIR模式的命令也可以直接切换 isNRFMode = false; Serial.println("切换到PIR传感模式"); cCommand = '0'; } } else { // PIR传感模式逻辑 SensorMode(); } }
可选优化
如果对功耗有要求,可以在切换到PIR模式时调用radio.powerDown()关闭NRF模块,切换回遥控模式时调用radio.powerUp()重新唤醒,进一步降低引脚干扰概率。
内容的提问来源于stack exchange,提问作者Verne
相关产品推荐
相关产品推荐

