硬件入门 + 单片机基础(第23天)本地设备逻辑调试
一、核心功能你要的验收点DHT11 温湿度采集 数据滤波过滤跳变、异常值本地温控逻辑温度超阈值 → 继电器自动开回差回落 → 自动关断网完全独立运行不依赖云端、不依赖 WiFi不掉线、不卡死、不抖动同时保留上云功能联网自动上报断网自动本地运行二、硬件接线不变DHT11 DATA→ GPIO4继电器 IN→ GPIO2共 GND、3.3V三、可直接上传完整代码滤波 本地逻辑 断网自愈#include WiFi.h #include PubSubClient.h #include AliyunIoTSDK.h #include DHT.h // 配置区 #define WIFI_SSID 你的WiFi #define WIFI_PASSWD 你的密码 #define PRODUCT_KEY PK #define DEVICE_NAME DN #define DEVICE_SECRET DS #define REGION_ID cn-shanghai #define DHTPIN 4 #define DHTTYPE DHT11 #define RELAY_PIN 2 // 本地温控阈值 #define TEMP_ON 30 // 超过30度 开继电器 #define TEMP_OFF 26 // 低于26度 关继电器 #define FILTER_COUNT 5 // 滤波次数防抖 // DHT dht(DHTPIN, DHTTYPE); WiFiClient espClient; PubSubClient client(espClient); AliyunIoTSDK iot; float temp_list[FILTER_COUNT]; // 滤波数组 float temp 0, humi 0; bool relayState false; bool cloudSwitch false; // 云端下发回调 void callback(char* topic, byte* payload, unsigned int length) { String data; for(int i0;ilength;i) data (char)payload[i]; Serial.println(云端data); if(data.indexOf(DeviceSwitch\:true)!-1) cloudSwitch 1; if(data.indexOf(DeviceSwitch\:false)!-1) cloudSwitch 0; } // WiFi连接 void connectWiFi(){ WiFi.begin(WIFI_SSID, WIFI_PASSWD); unsigned long t millis(); while(WiFi.status()!WL_CONNECTED millis()-t5000){ delay(500); } } // 阿里云连接 void connectMQTT(){ if(WiFi.status()WL_CONNECTED){ iot.connect(client, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID); client.setCallback(callback); client.connect(DEVICE_NAME); } } // 滤波读取温度防抖核心 float readTempFiltered(){ float sum 0; int err 0; for(int i0;iFILTER_COUNT;i){ temp_list[i] dht.readTemperature(); if(isnan(temp_list[i]) || temp_list[i]0 || temp_list[i]80) err; else sum temp_list[i]; delay(50); } if(err 3) return temp; // 异常过多保持上一次值 return sum/(FILTER_COUNT-err); } // 本地独立温控逻辑断网也能跑 void localTempControl(){ if(temp TEMP_ON){ relayState true; } if(temp TEMP_OFF){ relayState false; } digitalWrite(RELAY_PIN, relayState ? HIGH : LOW); } // 上报云端 void upload(){ if(client.connected()){ char buf[256]; sprintf(buf,{\params\:{\Temperature\:%.1f,\Humidity\:%.1f,\DeviceSwitch\:%s}}, temp,humi,relayState?true:false); iot.postProperty(client, buf); } } void setup() { Serial.begin(115200); pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); dht.begin(); connectWiFi(); connectMQTT(); } void loop() { // 1. 无论是否联网都读取滤波温湿度 temp readTempFiltered(); humi dht.readHumidity(); // 2. 本地独立温控逻辑断网也执行 localTempControl(); // 3. 网络重连 上报有网才跑 client.loop(); static unsigned long t 0; if(millis()-t3000){ t millis(); if(WiFi.status()!WL_CONNECTED) connectWiFi(); if(!client.connected()) connectMQTT(); upload(); Serial.print(温度:);Serial.print(temp); Serial.print( 湿度:);Serial.print(humi); Serial.print( 继电器:);Serial.println(relayState); } }四、验收标准全部满足✅断网情况下设备完全自主判断温度✅自动控温超阈值开、低阈值关✅数据滤波不抖动、不误动作✅不依赖云端、不依赖 MQTT✅本地逻辑 100% 独立运行✅恢复网络后自动重连、自动上报五、测试方法直接照做上传代码用手捂住 DHT11 升温 →超过 30℃继电器自动打开降温 →低于 26℃继电器自动关闭拔掉 WiFi 路由器→ 设备继续正常自动控温重新插上网 → 自动重连阿里云