ESP-01(NodeMCU)连接TCS3200传感器串口不显示RGB值且WDT复位问题
问题根因
你遇到的rst cause:4, wdt reset报错是ESP8266内置看门狗触发的强制复位,核心问题出在pulseIn()函数的阻塞特性:默认状态下pulseIn()最多会阻塞等待1秒来检测目标电平,这个时间刚好接近ESP8266看门狗的超时阈值,若传感器未正常输出对应电平,函数会一直阻塞,导致系统无法执行看门狗喂狗操作,最终触发复位。
修复步骤
1. 给pulseIn添加超时参数
将所有pulseIn(sensorOut, LOW)调用修改为带超时的版本,超时时间设置为20000微秒(20ms)即可覆盖TCS3200的正常输出频率范围,超时后函数会返回0,可自行加判断过滤无效值:
redFrequency = pulseIn(sensorOut, LOW, 20000);
2. 修正引脚映射
你代码中使用的D4/D5/D6/D7/D8是NodeMCU开发板的丝印标注,和ESP-01的GPIO编号不匹配,请根据实际接线,将宏定义替换为ESP-01对应引脚的GPIO编号,ESP-01可用引脚为GPIO0、GPIO1、GPIO2、GPIO3,示例如下(请根据实际接线调整):
#define S0 2 // 对应接在GPIO2的引脚 #define S1 0 // 对应接在GPIO0的引脚 // 其余引脚同理修改
3. 主动喂狗避免阻塞
每次调用pulseIn()后添加yield()语句,主动让系统执行喂狗操作,避免看门狗误触发。
4. 调整传感器频率缩放系数
你当前设置的20%输出缩放可以修改为100%,拉高输出频率,进一步降低pulseIn()的等待时间:
// 将原来的20%缩放配置替换为以下内容 digitalWrite(S0,HIGH); digitalWrite(S1,HIGH);
修复后的参考代码
// 请根据实际接线修改引脚编号为ESP-01对应的GPIO号 #define S0 2 #define S1 0 #define S2 3 #define S3 1 #define sensorOut 4 int redFrequency = 0; int greenFrequency = 0; int blueFrequency = 0; void setup() { pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(sensorOut, INPUT); // 设置100%频率缩放 digitalWrite(S0,HIGH); digitalWrite(S1,HIGH); Serial.begin(115200); } void loop() { // 读取红色通道 digitalWrite(S2,LOW); digitalWrite(S3,LOW); redFrequency = pulseIn(sensorOut, LOW, 20000); yield(); Serial.print("R = "); Serial.print(redFrequency); delay(100); // 读取绿色通道 digitalWrite(S2,HIGH); digitalWrite(S3,HIGH); greenFrequency = pulseIn(sensorOut, LOW, 20000); yield(); Serial.print(" G = "); Serial.print(greenFrequency); delay(100); // 读取蓝色通道 digitalWrite(S2,LOW); digitalWrite(S3,HIGH); blueFrequency = pulseIn(sensorOut, LOW, 20000); yield(); Serial.print(" B = "); Serial.println(blueFrequency); delay(100); }
内容的提问来源于stack exchange,提问作者Muhammad Alfahrezi
相关产品推荐
相关产品推荐

