完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嗨,
我有一个通过 Android 应用程序管理的 nodemcu,但是,我不明白为什么我的代码在运行两三天后冻结,而且我不明白为什么(没有显示告诉我错误)。 即使我不使用该应用程序,几天后它也会冻结...... 有什么想法吗? 代码:全选#include #include #include #include <time.h> #include #include #include "DHT.h" #include "EEPROM.h" // Define NTP properties #define NTP_OFFSET 60 * 60 // In seconds #define NTP_INTERVAL 60 * 1000 // In miliseconds #define NTP_ADDRESS "ca.pool.ntp.org" // change this to whatever pool is closest (see ntp.org) // Set up the NTP UDP client WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL); #define DHTPIN 4 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); #define ComCaldaia 2 const char* ssid = "XXXXXXXX"; const char* password = "XXXXXXXX"; String date; String istante; const char * days[] = {"Domenica", "Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato"} ; const char * months[] = {"Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"} ; const char * ampm[] = {"AM", "PM"} ; unsigned long millisOrario=999999; unsigned long millisSonde=999999; unsigned long millisthings=999999; unsigned long MinutiOnTotali=0; unsigned long MinutiOnAvvio=0; int IndirizzoMem; int MinutiOn =0; int Comando = 0; int ComandoPrec = 2; String ComandoTXT = ""; // ThingSpeak Settings const int channelID = 999999999; String apiKey = "XXXXXXXX"; // write API key for your ThingSpeak Channel const char* serverTS = "api.thingspeak.com"; String postStr = apiKey; // variabili di funzionamento boolean Abilitazione = false; boolean ManualeCom = false; boolean CheckOrario1 = false; boolean CheckOrario2 = false; boolean CheckOrario3 = false; int Orario1Avvio = 0; int Orario2Avvio = 0; int Orario3Avvio = 0; int Orario1Durata = 0; int Orario2Durata = 0; int Orario3Durata = 0; int OrarioAttuale = 9999; int VirtOraAttuale = 0; boolean CambioOra = false; int ManualeAvvio = 0; int ManualeFine = 0; WiFiServer server(80); void setup() { delay(500); Serial.begin(115200); delay(500); timeClient.begin(); // Prepara Uscita pinMode(ComCaldaia, OUTPUT); digitalWrite(ComCaldaia, 0); //pinMode(2, INPUT_PULLUP); //pinMode(0, INPUT_PULLUP); Connessione(); EEPROM.begin(512); EEPROM.get(1, Abilitazione); EEPROM.get(2, ManualeCom); EEPROM.get(3, CheckOrario1); EEPROM.get(4, CheckOrario2); EEPROM.get(5, CheckOrario3); EEPROM.get(11, Orario1Avvio); EEPROM.get(15, Orario2Avvio); EEPROM.get(19, Orario3Avvio); EEPROM.get(23, Orario1Durata); EEPROM.get(27, Orario2Durata); EEPROM.get(31, Orario3Durata); EEPROM.get(35, ManualeAvvio); EEPROM.get(39, ManualeFine); ESP.wdtDisable(); ESP.wdtEnable(WDTO_8S); } String OkInvio = "HTTP/1.1 200 OKrnContent-Type: text/htmlrnrn"; String InviaLettura = ""; int pStart = -1; int pEnd = -1; String dato = ""; String risultato = "-"; float TempAmb; float TempAmbPrec; float UmidAmb; float TempPerc; void loop() { delay(1000); if (WiFi.status() == WL_CONNECTED) //Check connessione WiFi { ESP.wdtFeed(); if ((millis()>(millisOrario+60000)) || (millis()<(millisOrario))) { millisOrario=millis(); CheckOrario();} if ((millis()>(millisSonde+30000)) || (millis()<(millisSonde))) { millisSonde=millis(); CheckSonde();} if ((millis()>(millisthings+900000)) || (millis()<(millisthings))) { millisthings = millis(); postStr = apiKey; postStr += "&field1="; postStr += String(TempAmb); postStr += "&field2="; postStr += String(UmidAmb); postStr += "&field3="; postStr += String(TempPerc); //postStr += "&field4="; //postStr += String((Comando*100)); things(postStr); } //----- Inizio codice logiche funzionamento if (OrarioAttuale >= (ManualeAvvio-5) && OrarioAttuale < ManualeFine) { ManualeCom = true;} else { ManualeCom = false;} if ((Orario3Avvio+Orario3Durata) > 1440 && OrarioAttuale < (Orario3Avvio+Orario3Durata-1440)) { CambioOra=true; } else { CambioOra=false; } if (Abilitazione && (ManualeCom || (CheckOrario3 && CambioOra) || (CheckOrario1 && (OrarioAttuale >= Orario1Avvio) && (OrarioAttuale < (Orario1Avvio+Orario1Durata))) || (CheckOrario2 && (OrarioAttuale >= Orario2Avvio) && (OrarioAttuale < (Orario2Avvio+Orario2Durata))) || (CheckOrario3 && (OrarioAttuale >= Orario3Avvio) && (OrarioAttuale < (Orario3Avvio+Orario3Durata))))) { if (Comando != 0) { ComandoTXT = "ON"; Comando = 0; MinutiOnAvvio = OrarioAttuale; postStr = apiKey; postStr += "&field4="; postStr += String(0); things(postStr); } } else { if (Comando != 1) { ComandoTXT = "OFF"; Comando = 1; MinutiOn = int(OrarioAttuale - MinutiOnAvvio); postStr = apiKey; postStr += "&field4="; postStr += String(100); postStr += "&field5="; postStr += String(MinutiOn); things(postStr); MinutiOnAvvio=0; } } if (Comando != ComandoPrec) { ComandoPrec = Comando; digitalWrite(ComCaldaia, Comando); Serial.print("Comando: "); Serial.println(ComandoTXT); } //----- Inizio codice webserver WiFiClient client = server.available(); if (!client) { return; } while (!client.available()) { delay(500); } Serial.println("- - - - - - - Nuova connessione - - - - - - -"); String req = client.readStringUntil('r'); client.flush(); // Ricezione aggiornamento dati scrittura(req, "Abilitazione"); if (risultato != "NO") { if (risultato=="true") { Abilitazione=true;} else {Abilitazione=false;} client.print(OkInvio); IndirizzoMem = 1; EEPROM.put(IndirizzoMem, Abilitazione);EEPROM.commit(); return; } scrittura(req, "CheckOrario1"); if (risultato != "NO") { if (risultato=="true") { CheckOrario1=true;} else {CheckOrario1=false;} client.print(OkInvio); IndirizzoMem = 3; EEPROM.put(IndirizzoMem, CheckOrario1);EEPROM.commit(); return; } scrittura(req, "CheckOrario2"); if (risultato != "NO") { if (risultato=="true") { CheckOrario2=true;} else {CheckOrario2=false;} client.print(OkInvio); IndirizzoMem = 4; EEPROM.put(IndirizzoMem, CheckOrario2);EEPROM.commit(); return; } scrittura(req, "CheckOrario3"); if (risultato != "NO") { if (risultato=="true") { CheckOrario3=true;} else {CheckOrario3=false;} client.print(OkInvio); IndirizzoMem = 5; EEPROM.put(IndirizzoMem, CheckOrario3);EEPROM.commit(); return; } scrittura(req, "Orario1Avvio"); if (risultato != "NO") { Orario1Avvio = risultato.toInt(); client.print(OkInvio); IndirizzoMem = 11; EEPROM.put(IndirizzoMem, Orario1Avvio);EEPROM.commit(); return; } scrittura(req, "Orario2Avvio"); if (risultato != "NO") { Orario2Avvio = risultato.toInt(); client.print(OkInvio); IndirizzoMem = 15; EEPROM.put(IndirizzoMem, Orario2Avvio);EEPROM.commit(); return; } scrittura(req, "Orario3Avvio"); if (risultato != "NO") { Orario3Avvio = risultato.toInt(); client.print(OkInvio); IndirizzoMem = 19; EEPROM.put(IndirizzoMem, Orario3Avvio);EEPROM.commit(); return; } scrittura(req, "Orario1Durata"); if (risultato != "NO") { Orario1Durata = risultato.toInt(); client.print(OkInvio); IndirizzoMem = 23; EEPROM.put(IndirizzoMem, Orario1Durata);EEPROM.commit(); return; } scrittura(req, "Orario2Durata"); if (risultato != "NO") { Orario2Durata = risultato.toInt(); client.print(OkInvio); IndirizzoMem = 27; EEPROM.put(IndirizzoMem, Orario2Durata);EEPROM.commit(); return; } scrittura(req, "Orario3Durata"); if (risultato != "NO") { Orario3Durata = risultato.toInt(); client.print(OkInvio); IndirizzoMem = 31; EEPROM.put(IndirizzoMem, Orario3Durata);EEPROM.commit(); return; } scrittura(req, "ManualeAvvio"); if (risultato != "NO") { ManualeAvvio = risultato.toInt(); client.print(OkInvio); IndirizzoMem = 35; EEPROM.put(IndirizzoMem, ManualeAvvio);EEPROM.commit(); return; } scrittura(req, "ManualeFine"); if (risultato != "NO") { ManualeFine = risultato.toInt(); client.print(OkInvio); IndirizzoMem = 39; EEPROM.put(IndirizzoMem, ManualeFine);EEPROM.commit(); return; } lettura(req); if (pStart != -1) { client.print(risultato); Serial.println(risultato); return; } } else // Disconnessione { Serial.println("--> WiFi disconnesso... Ritento la connessione <--"); server.stop(); WiFi.disconnect(); WiFi.mode(WIFI_OFF); Serial.println("--> TRA 3 MINUTI <--"); delay(170000); Serial.println("--> MANCANO 10 SECONDI <--"); delay(10000); Connessione(); } delay(1000); // Ritardo di fine loop } void Connessione() { Serial.println(); Serial.print("Connessione a "); Serial.println(ssid); WiFi.hostname("ESP_Caldaia"); WiFi.begin(ssid, password); IPAddress ip(192,168,1,77); IPAddress gateway(192,168,1,254); IPAddress subnet(255,255,255,0); WiFi.config(ip, gateway, subnet); int i = 0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); if(i>40) ESP.restart(); i++; } Serial.println(""); Serial.println("WiFi connesso"); server.begin(); Serial.println("Server avviato"); Serial.println(WiFi.localIP()); } void CheckOrario() { timeClient.update(); unsigned long epochTime = timeClient.getEpochTime(); time_t local, utc; utc = epochTime; TimeChangeRule usEDT = {"EDT", Last, Sun, Mar, 2, 60}; TimeChangeRule usEST = {"EST", Last, Sun, Oct, 3, 0}; Timezone usEastern(usEDT, usEST); local = usEastern.toLocal(utc); date = days[weekday(local)-1]; date += ", "; date += day(local); date += " "; date += months[month(local)-1]; date += " "; date += year(local); istante = year(local); istante += "-"; istante += month(local); istante += "-"; istante += day(local); istante += " "; istante += hour(local); istante += ":"; istante += (minute(local)<10) ? "0" : ""; istante += minute(local); OrarioAttuale = (hour(local)*60)+minute(local); // Orario di riferimento Serial.println(""); Serial.print(istante);Serial.print(" ");Serial.println(date); } void CheckSonde() { TempAmb = dht.readTemperature(); if ((TempAmb>(TempAmbPrec+2) || TempAmb<(TempAmbPrec-2)) && TempAmbPrec>5) { Serial.print("Lettura scartata: ");Serial.print(TempAmb); Serial.println("°C"); TempAmb=TempAmbPrec; } else { TempAmbPrec = TempAmb; UmidAmb = dht.readHumidity(); TempPerc = dht.computeHeatIndex(TempAmb, UmidAmb, false); } /* Serial.print("Abilitazione: ");Serial.println(Abilitazione); Serial.print("Manuale: ");Serial.println(ManualeCom); Serial.print("Manuale Fine: ");Serial.println(ManualeFine); Serial.print("CheckOrario1: ");Serial.println(CheckOrario1); Serial.print("CheckOrario2: ");Serial.println(CheckOrario2); Serial.print("CheckOrario3: ");Serial.println(CheckOrario3); Serial.print("Orario1Avvio: ");Serial.println(Orario1Avvio); Serial.print("Orario2Avvio: ");Serial.println(Orario2Avvio); Serial.print("Orario3Avvio: ");Serial.println(Orario3Avvio); Serial.print("Orario1Durata: ");Serial.println(Orario1Durata); Serial.print("Orario2Durata: ");Serial.println(Orario2Durata); Serial.print("Orario3Durata: ");Serial.println(Orario3Durata); Serial.print("Orario Attuale: ");Serial.println(OrarioAttuale); Serial.print("Comando: "); Serial.println(ComandoTXT); */ Serial.print("Temperatura: "); Serial.print(TempAmb); Serial.print("°C |"); Serial.print(" Umidità: "); Serial.print(UmidAmb); Serial.print("% |"); Serial.print(" Percepita: "); Serial.print(TempPerc); Serial.println("°C"); } void scrittura(String req, String dato) { pStart = req.indexOf("/XXXXXXXX/"+dato); pEnd = req.indexOf("HTTP/"); if (pStart != -1) { risultato = req.substring((pStart + 4 + dato.length()), (pEnd - 1)); Serial.print(dato); Serial.println(": |" + risultato + "|"); } else { risultato = "NO"; } } void lettura(String req) { pStart = req.indexOf("/XXXXXXXX/Leggi"); if (pStart != -1) { InviaLettura = OkInvio; InviaLettura += istante; InviaLettura += " |Abil:";InviaLettura += Abilitazione; InviaLettura += "|Manu:";InviaLettura += ManualeCom; InviaLettura += "|Comando:"; InviaLettura += ComandoTXT; InviaLettura += "|Check1:";InviaLettura += CheckOrario1; InviaLettura += "|Check2:";InviaLettura += CheckOrario2; InviaLettura += "|Check3:";InviaLettura += CheckOrario3; InviaLettura += "|Orario1:";InviaLettura += Orario1Avvio; InviaLettura += "|Orario2:";InviaLettura += Orario2Avvio; InviaLettura += "|Orario3:";InviaLettura += Orario3Avvio; InviaLettura += "|Durata1:";InviaLettura += Orario1Durata; InviaLettura += "|Durata2:";InviaLettura += Orario2Durata; InviaLettura += "|Durata3:";InviaLettura += Orario3Durata; InviaLettura += "|OraAttuale:";InviaLettura += OrarioAttuale; InviaLettura += "|Temp:"; InviaLettura += String(TempAmb); InviaLettura += " °C"; InviaLettura += "|Umid:"; InviaLettura += String(int(UmidAmb)); InviaLettura += " %"; InviaLettura += "|Perc:"; InviaLettura += String(TempPerc); InviaLettura += "° C|"; risultato = InviaLettura; } } void things(String postStr) { WiFiClient client; if (client.connect(serverTS, 80)) { // use ip 184.106.153.149 or api.thingspeak.com Serial.println("Connesso con api.thingspeak.com"); postStr += "rnrn"; client.print("POST /update HTTP/1.1n"); client.print("Host: api.thingspeak.comn"); client.print("Connection: closen"); client.print("X-THINGSPEAKAPIKEY: " + apiKey + "n"); client.print("Content-Type: application/x-www-form-urlencodedn"); client.print("Content-Length: "); client.print(postStr.length()); client.print("nn"); client.print(postStr); } client.stop(); } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
309浏览 6评论
266浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
257浏览 5评论
259浏览 4评论
238浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-6-24 03:02 , Processed in 0.778785 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号