求助:添加外设后Arduino Mega与ESP8266串口通信异常
ESP866 NodeMCU V3与Arduino Mega 2560串口通信故障排查
仅输出文本的代码可正常运行,但添加I2C LCD、电机及温度传感器相关代码后,系统完全无法执行对应逻辑。需求是通过ThingSpeak APP控制电机,NodeMCU向Arduino发送0、1、2指令。
可正常运行的代码
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); //rx,tx void setup(){ mySerial.begin(115200); Serial.begin(115200); } void loop (){ if(mySerial.available() >= 2) { int data = mySerial.read(); data = (data << 8) + mySerial.read(); if (data == 0){ Serial.println("BREWING: Light COFFEE"); Serial.println(data); mySerial.write("reset"); } else if (data == 1) { Serial.println("BREWING: Normal COFFEE"); Serial.println(data); mySerial.write("reset"); }else if (data == 2) { Serial.println("BREWING: Strong COFFEE"); Serial.println(data); mySerial.write("reset"); } } }
无法运行的代码
#include <SoftwareSerial.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); #define ENA 5 // Enable Pin for Motor A #define IN1 7 // Input Pin 1 for Motor A #define IN2 6 // Input Pin 2 for Motor A SoftwareSerial mySerial(10, 11); //rx,tx LiquidCrystal_I2C lcd(0x27, 16, 2); void setup(){ mySerial.begin(115200); Serial.begin(115200); pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); lcd.begin(20, 21); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Temp: "); sensors.begin(); } void loop(){ if(mySerial.available() >= 2){ int data = mySerial.read(); data = (data << 8) + mySerial.read(); if (data == 0){ Serial.println("BREWING: Light COFFEE"); Serial.println(data); // Read temperature value from the DS18B20 sensors.requestTemperatures(); float temp = sensors.getTempCByIndex(0); // print the temperature on the LCD lcd.setCursor(0, 1); lcd.print(temp); // Control the L298N motor digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); delay(1000); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); analogWrite(ENA, 128); mySerial.write("reset"); } else if (data == 1) { Serial.println("BREWING: Normal COFFEE"); Serial.println(data); // Read temperature value from the DS18B20 sensors.requestTemperatures(); float temp = sensors.getTempCByIndex(0); // print the temperature on the LCD lcd.setCursor(0, 1); lcd.print(temp); mySerial.write("reset"); } else if (data == 2) { Serial.println("BREWING: Strong COFFEE"); Serial.println(data); // Read temperature value from the DS18B20 sensors.requestTemperatures(); float temp = sensors.getTempCByIndex(0); // print the temperature on the LCD lcd.setCursor(0, 1); lcd.print(temp); mySerial.write("reset"); } } }
排查与修复步骤
1. 修正LCD初始化参数
lcd.begin(20, 21); 参数错误,你的LCD是16列2行,应改为:
lcd.begin(16, 2);
这个错误会直接导致LCD初始化失败,阻塞后续代码执行。
2. 调整串口数据读取逻辑
需求中NodeMCU发送的是0、1、2单字节数据,但当前代码按双字节读取(if(mySerial.available() >= 2)),导致Arduino一直等待2字节数据无法触发逻辑。修改为单字节读取:
if(mySerial.available() > 0) { int data = mySerial.read(); // 后续判断逻辑保持不变 }
若NodeMCU确实发送双字节数据,需确认发送格式后再调整读取逻辑。
3. 优化电机控制逻辑
analogWrite(ENA, 128);放在电机停止后无作用,应提前设置转速:
analogWrite(ENA, 128); // 先设置电机转速 digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); delay(1000); digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); // 停止电机
4. 处理温度传感器读取异常
sensors.requestTemperatures() 默认阻塞约750ms,可能影响串口响应,同时添加读取失败判断:
sensors.requestTemperatures(); float temp = sensors.getTempCByIndex(0); if(temp == DEVICE_DISCONNECTED_C) { lcd.print("Err"); } else { lcd.print(temp); }
5. 检查引脚冲突
- Arduino Mega的10、11引脚是SPI引脚(SS、MOSI),确保未被其他外设占用;
- 用I2C扫描工具确认LCD的I2C地址是否为
0x27,避免地址错误导致初始化失败。
6. 解决电源负载问题
添加电机后电源负载增大,Arduino可能因供电不足崩溃。建议给L298N电机驱动模块单独供电,确保Arduino的5V/3.3V输出稳定。
内容的提问来源于stack exchange,提问作者acean
相关产品推荐
相关产品推荐

