Глюки в поведении программы и вечный ребут ESP8266
- Войдите на сайт для отправки комментариев
Чт, 20/02/2020 - 11:32
Всем привет!
Имеется на руках NodeMCU. Программирую в среде Ардуино. Вот весь код:
// // Libraries needed: // Time.h & TimeLib.h: https://github.com/PaulStoffregen/Time // Timezone.h: https://github.com/JChristensen/Timezone // SSD1306.h & SSD1306Wire.h: https://github.com/squix78/esp8266-oled-ssd1306 // NTPClient.h: https://github.com/arduino-libraries/NTPClient // ESP8266WiFi.h & WifiUDP.h: https://github.com/ekstrand/ESP8266wifi // #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <String.h> #include <epd.h> #include "DHT.h" #include <Ticker.h> #include <stdio.h> #include "string.h" // Define NTP properties #define NTP_OFFSET 60 * 60 // In seconds #define NTP_INTERVAL 60 * 1000 // In miliseconds #define NTP_ADDRESS "ua.pool.ntp.org" // change this to whatever pool is closest (see ntp.org) #define DHTPIN 13 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); Ticker ClockTimer; #define ssid "DIR-615" // insert your own ssid #define pass "HomeMade" // and password #define mqtt_server "hairdresser.cloudmqtt.com" // Имя сервера MQTT #define mqtt_port 18608 // Порт для подключения к серверу MQTT #define mqtt_user "user" // Логин от сервер #define mqtt_pass "pass" // Пароль от сервера byte ss = 0; byte mm = 0; byte hh = 0; byte tu = 0; float Hum = 0.0; float Temp = 0.0; char str_temp[6]; float hic = 0.0; byte d1 = 1; byte d2 = 1; byte d3 = 1; byte d4 = 20; //const char * days[] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"} ; //const char * months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} ; //const byte monthsCodes[] = {1, 4, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6}; float Voltage = 0.0; boolean DisplayUpdate = true; boolean WIFITimeUpdate = true; boolean WiFiConected = false; boolean MQTTConected = false; boolean epdStopmode = false; byte epdStopmodeCount = 0; byte m1; byte h1; byte d21 = 1; byte d31 = 1; float WStationVoltage = 0.0; char DateString[] = "00.00.0000"; char TimeString[] = "00.00.00"; #define wake_up 14 char Buffer[] = ""; void timerIsr() { if (epdStopmode){ epdStopmodeCount++; if (epdStopmodeCount > 1){ epdStopmodeCount = 0; epdStopmode = false; epd_enter_stopmode(); } } ss++; // Seconds if (ss > 59){ ss = 0; mm++; // Minutes DisplayUpdate = true; if (mm > 59){ mm = 0; hh++; // Hours if (hh > 23){ hh = 0; d1++; // Day of week d2++; // Day of month //d3++; // Month if (d1 > 6) d1 = 0; if (d2 > 31) d2 = 0; if (d3 > 11) d3 = 0; } tu++; if (tu > 20){ // Pause update via WiFi (*hours) tu = 0; WIFITimeUpdate = true; } } } } void callback(const MQTT::Publish& pub) // Функция получения данных от сервера { Serial.print(pub.topic()); // выводим в сериал порт название топика Serial.print(" => "); Serial.println(pub.payload_string()); // выводим в сериал порт значение полученных данных String payload = pub.payload_string(); if(String(pub.topic()) == "WStation/Battery") // получаем данные из топика о напряжении аккумулятора { WStationVoltage = payload.toFloat(); // преобразуем полученные данные в тип integer } if(String(pub.topic()) == "WStation/Date") // получаем данные из топика Даты { payload.toCharArray(DateString, 11); } if(String(pub.topic()) == "WStation/Time") // получаем данные из топика Времени { //TimeString = payload; payload.toCharArray(TimeString, 9); } } WiFiClient wclient; PubSubClient client(wclient, mqtt_server, mqtt_port); void setup () { //Serial.begin(115200); // most ESP-01's use 115200 but this could vary // Инициализация Serial есть в библиотеке дисплея - epd.h pinMode(2, OUTPUT); epd_init(); pinMode(wake_up, OUTPUT); wakeup(); epd_set_memory(MEM_TF); delay(1000); epd_clear(); epd_set_color(BLACK, WHITE); epd_set_en_font(ASCII64); sprintf(Buffer,"Connecting to: %s . . .", ssid); epd_disp_string(Buffer, 0, 0); epd_udpate(); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); d31++; if (d31 > 100){ break; } } d31=1; epd_disp_string("Connected.", 0, 80); epd_disp_string("Connecting to: MQTT...", 0, 160); epd_udpate(); Serial.println(""); Serial.print("Connected to WiFi at "); Serial.print(WiFi.localIP()); Serial.println(""); ClockTimer.attach(1, timerIsr); dht.begin(); delay(2000); epd_clear(); digitalWrite(2, HIGH); } void loop() { WiFiupd(); if (DisplayUpdate){ DisplayUpdate = false; wakeup(); epd_disp_bitmap("FON1.BMP", 0, 0); if (WiFiConected){ epd_disp_bitmap("WON.BMP", 582, 0); // выводим картинку подключенного WiFi if (MQTTConected){ epd_disp_bitmap("MQON.BMP", 0, 136); // выводим картинку подключенного WiFi }else{ epd_disp_bitmap("MQOF.BMP", 0, 136); // выводим картинку подключенного WiFi } }else{ epd_disp_bitmap("WOFF.BMP", 582, 0); // Выводим кортинку отключенного WiFi с переподключением epd_disp_bitmap("MQOF.BMP", 0, 136); // выводим картинку подключенного WiFi } drawWStationData(); yield(); drawTime(); yield(); sonsorDHT(); yield(); drawBattery(); yield(); epd_set_color(DARK_GRAY, WHITE); epd_set_en_font(ASCII32); sprintf(Buffer,"%02d.%02d %02d:%02d", d21, d31+1, h1, m1); epd_disp_string(Buffer, 25, 320); //sprintf(Buffer,"%02d.%02d", d21, d31); //epd_disp_string(Buffer, 30, 320); epd_set_color(BLACK, WHITE); epd_set_en_font(ASCII64); epd_udpate(); epdStopmode = true; } } void drawWStationData(){ yield(); Serial.println("-1-"); dtostrf(WStationVoltage, 4, 2, str_temp); sprintf(Buffer,"%s V", str_temp); // напряжение на аккумуляторе погодной станции epd_disp_string(Buffer, 62, 35); } void wakeup() { yield(); digitalWrite(wake_up, LOW); delayMicroseconds(10); digitalWrite(wake_up, HIGH); delayMicroseconds(500); digitalWrite(wake_up, LOW); delay(10); } void sonsorDHT(){ yield(); Hum = dht.readHumidity(); Temp = dht.readTemperature(); //hic = dht.computeHeatIndex(Temp, Hum, false); if (isnan(Hum) || isnan(Temp)) { epd_disp_string("ERR", 265, 495); epd_disp_string("ERR", 565, 495); }else{ dtostrf(Temp, 4, 1, str_temp); sprintf(Buffer,"%s", str_temp); epd_disp_string(Buffer, 265, 495); dtostrf(Hum, 4, 1, str_temp); sprintf(Buffer,"%s", str_temp); epd_disp_string(Buffer, 565, 495); } } void drawTime(){ Date_Time(); yield(); m1 = mm; h1 = hh; d21 = d2; d31 = d3; /*epd_disp_string(days[d1-1], 317, 300); sprintf(Buffer,"%d", d2); epd_disp_string(Buffer, 649, 273); epd_set_en_font(ASCII32); epd_disp_string(months[d3-1], 622, 342); epd_set_en_font(ASCII64); */ epd_disp_string(DateString, 360, 300); byte NunbH = hh / 10; byte NunbL = hh % 10; sprintf(Buffer,"%d.BMP", NunbH); epd_disp_bitmap(Buffer, 212, 84); sprintf(Buffer,"%d.BMP", NunbL); epd_disp_bitmap(Buffer, 345, 84); NunbH = mm / 10; NunbL = mm % 10; sprintf(Buffer,"%d.BMP", NunbH); epd_disp_bitmap(Buffer, 545, 84); sprintf(Buffer,"%d.BMP", NunbL); epd_disp_bitmap(Buffer, 679, 84); } void drawBattery(){ yield(); float sample = 0.0; // 3.3 = 1024 for(int i=0;i< 50;i++) { sample = sample + analogRead(A0); //read the voltage from the divider circuit delay (2); } sample = sample / 50; Voltage = 1.5 * (sample * 3.3 / 1024.0); if (Voltage > 4.6){ epd_disp_bitmap("BAT1.BMP", 681, 0); }else if (Voltage > 4.1){ epd_disp_bitmap("BAT8.BMP", 681, 0); }else if (Voltage > 3.98){ epd_disp_bitmap("BAT7.BMP", 681, 0); }else if (Voltage > 3.87){ epd_disp_bitmap("BAT6.BMP", 681, 0); }else if (Voltage > 3.75){ epd_disp_bitmap("BAT5.BMP", 681, 0); }else if (Voltage > 3.64){ epd_disp_bitmap("BAT4.BMP", 681, 0); }else if (Voltage > 3.52){ epd_disp_bitmap("BAT3.BMP", 681, 0); }else if (Voltage > 3.41){ epd_disp_bitmap("BAT2.BMP", 681, 0); }else{ epd_clear(); // Выключение epd_udpate(); delay(2000); epd_disp_bitmap("BATLOW.BMP", 0, 0); epd_set_color(GRAY, WHITE); epd_set_en_font(ASCII32); sprintf(Buffer,"Shutdown time: %02d.%02d %02d:%02d", d2, d3+1, hh, mm); epd_disp_string(Buffer, 0, 0); sprintf(Buffer,"%02d.%02d %02d:%02d", d21, d31+1, h1, m1); epd_disp_string(Buffer, 0, 40); epd_udpate(); delay(2000); epd_enter_stopmode(); delay(1000); ESP.deepSleep(0); } } void Date_Time(){ yield(); String myString; //char myChar; // = DateString.charAt(0); //int myNum; // = String(myChar).toInt(); /*if (myNum > 0){ myString = DateString.substring(0,2); d2 = myString.toInt(); }else{ myChar = DateString.charAt(1); d2 = String(myChar).toInt(); } myChar = DateString.charAt(3); myNum = String(myChar).toInt(); if (myNum > 0){ myString = DateString.substring(3,5); d3 = myString.toInt(); }else{ myChar = DateString.charAt(4); d3 = String(myChar).toInt(); } myString = DateString.substring(8); d4 = myString.toInt(); d1 = ((d2 + monthsCodes[d3-1] + ((6 + d4 + (d4/4))%7)) % 7)-1; // https://lifehacker.ru/kakoj-den-nedeli/ */ char _el[3] =""; int myNum = String(TimeString[0]).toInt(); if (myNum > 0){ strncpy(_el,&TimeString[0],2); printf("%s",_el); hh = String(_el).toInt(); }else{ hh = String(TimeString[0]).toInt(); } yield(); myNum = String(TimeString[3]).toInt(); if (myNum > 0){ //_el[3] =""; strncpy(_el,&TimeString[3],2); printf("%s",_el); mm = String(_el).toInt(); }else{ mm = String(TimeString[4]).toInt(); } } void WiFiupd(){ if (WiFi.status() != WL_CONNECTED) // attempt to connect to wifi again if disconnected { Serial.print("Connecting to "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); WiFiConected = false; } if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status { WiFiConected = true; if (!client.connected()) { yield(); Serial.println("Connecting to MQTT server"); if (client.connect(MQTT::Connect("WStationDisplay") .set_auth(mqtt_user, mqtt_pass))) { Serial.println("Connected to MQTT server"); client.set_callback(callback); client.subscribe("WStation/Time"); // подписывааемся по топик времени client.subscribe("WStation/Battery"); // подписывааемся по топик с данными аккумулятора client.subscribe("WStation/Date"); // подписывааемся по топик даты MQTTConected = true; } else { Serial.println("Could not connect to MQTT server"); MQTTConected = false; } } if (client.connected()){ MQTTConected = true; yield(); client.loop(); } } }
К ЕСП подключен E-Paper дисплей и датчик температуры и влажности DHT22. Больше никакой электроники нет. Устройство подключается по WiFi к MQTT серверу и получает оттуда данные. Наблюдаются очень странные глюки:
1) При запуске программы идет подключение к WiFi, только после этого программа идет дальше:
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
d31++;
if (d31 > 100){
break;
}
}
то есть, подключение установлено. Дальше, в основном цикле программы первым вызывается функция на проверку подключения: WiFiupd(); Иногда это впадает в бесконечный цикл повторного подключения. Попробую пояснить. Подключение установлено (это видно на роутере), но все равно происходит бесконечная попытка подключения, которое, естественно, будет неудачным. Почему срабатывает условие
if (WiFi.status() != WL_CONNECTED)
для меня не понятно, ведь подключение уже есть....
второе:
При старте программа ловит ошибку и уходит в "вечный" ребут. Пробовал на другой ESP - результат тот же. Проблема точно не в питании, так как я пробовал на "голой" ESP. с хорошим питанием. Да и осциллографом смотрел - стабильное и без пульсаций
Вот лог:
Exception (9): epc1=0x372e3835 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000005 depc=0x00000000 >>>stack>>> ctx: sys sp: 3fffed70 end: 3fffffb0 offset: 01a0 3fffef10: 40231c1c 3ffee5d4 3ffedf50 40207d4e 3fffef20: 60000600 3ffee5d4 3ffedf50 40231c29 3fffef30: 40231c6e 3fffdab0 00000000 3fffdcb0 3fffef40: 3ffedf68 3fffdad0 3ffee964 40205e13 3fffef50: 40000f49 40000f49 3fffdab0 40000f49 3fffef60: 40000e19 40001878 00000004 00000000 3fffef70: 3fffff10 aa55aa55 000000ab 401049d5 3fffef80: 401049db 00000004 00000000 5f3b002b 3fffef90: 4010000d de4cd58a eaf2637a e02954ea 3fffefa0: 402299b4 3fffef3c 4022996d 3fffff48 3fffefb0: 3fffffc0 00000000 00000000 feefeffe 3fffefc0: feefeffe feefeffe feefeffe feefeffe 3fffefd0: feefeffe feefeffe feefeffe feefeffe 3fffefe0: feefeffe feefeffe feefeffe feefeffe 3fffeff0: feefeffe feefeffe feefeffe feefeffe 3ffff000: feefeffe feefeffe feefeffe feefeffe 3ffff010: feefeffe feefeffe feefeffe feefeffe 3ffff020: feefeffe feefeffe feefeffe feefeffe 3ffff030: feefeffe feefeffe feefeffe feefeffe 3ffff040: feefeffe feefeffe feefeffe feefeffe 3ffff050: feefeffe feefeffe feefeffe feefeffe 3ffff060: feefeffe feefeffe feefeffe feefeffe 3ffff070: feefeffe feefeffe feefeffe feefeffe 3ffff080: feefeffe feefeffe feefeffe feefeffe 3ffff090: feefeffe feefeffe feefeffe feefeffe 3ffff0a0: feefeffe feefeffe feefeffe feefeffe 3ffff0b0: feefeffe feefeffe feefeffe feefeffe 3ffff0c0: feefeffe feefeffe feefeffe feefeffe 3ffff0d0: feefeffe feefeffe feefeffe feefeffe 3ffff0e0: feefeffe feefeffe feefeffe feefeffe 3ffff0f0: feefeffe feefeffe feefeffe feefeffe 3ffff100: feefeffe feefeffe feefeffe feefeffe 3ffff110: feefeffe feefeffe feefeffe feefeffe 3ffff120: feefeffe feefeffe feefeffe feefeffe 3ffff130: feefeffe feefeffe feefeffe feefeffe 3ffff140: feefeffe feefeffe feefeffe feefeffe 3ffff150: feefeffe feefeffe feefeffe feefeffe 3ffff160: feefeffe feefeffe feefeffe feefeffe 3ffff170: feefeffe feefeffe feefeffe feefeffe 3ffff180: feefeffe feefeffe feefeffe feefeffe 3ffff190: feefeffe feefeffe feefeffe feefeffe 3ffff1a0: feefeffe feefeffe feefeffe feefeffe 3ffff1b0: feefeffe feefeffe feefeffe feefeffe 3ffff1c0: feefeffe feefeffe feefeffe feefeffe 3ffff1d0: feefeffe feefeffe feefeffe feefeffe 3ffff1e0: feefeffe feefeffe feefeffe feefeffe 3ffff1f0: feefeffe feefeffe feefeffe feefeffe 3ffff200: feefeffe feefeffe feefeffe feefeffe 3ffff210: feefeffe feefeffe feefeffe feefeffe 3ffff220: feefeffe feefeffe feefeffe feefeffe 3ffff230: feefeffe feefeffe feefeffe feefeffe 3ffff240: feefeffe feefeffe feefeffe feefeffe 3ffff250: feefeffe feefeffe feefeffe feefeffe 3ffff260: feefeffe feefeffe feefeffe feefeffe 3ffff270: feefeffe feefeffe feefeffe feefeffe 3ffff280: feefeffe feefeffe feefeffe feefeffe 3ffff290: feefeffe feefeffe feefeffe feefeffe 3ffff2a0: feefeffe feefeffe feefeffe feefeffe 3ffff2b0: feefeffe feefeffe feefeffe feefeffe 3ffff2c0: feefeffe feefeffe feefeffe feefeffe 3ffff2d0: feefeffe feefeffe feefeffe feefeffe 3ffff2e0: feefeffe feefeffe feefeffe feefeffe 3ffff2f0: feefeffe feefeffe feefeffe feefeffe 3ffff300: feefeffe feefeffe feefeffe feefeffe 3ffff310: feefeffe feefeffe feefeffe feefeffe 3ffff320: feefeffe feefeffe feefeffe feefeffe 3ffff330: feefeffe feefeffe feefeffe feefeffe 3ffff340: feefeffe feefeffe feefeffe feefeffe 3ffff350: feefeffe feefeffe feefeffe feefeffe 3ffff360: feefeffe feefeffe feefeffe feefeffe 3ffff370: feefeffe feefeffe feefeffe feefeffe 3ffff380: feefeffe feefeffe feefeffe feefeffe 3ffff390: feefeffe feefeffe feefeffe feefeffe 3ffff3a0: feefeffe feefeffe feefeffe feefeffe 3ffff3b0: feefeffe feefeffe feefeffe feefeffe 3ffff3c0: feefeffe feefeffe feefeffe feefeffe 3ffff3d0: feefeffe feefeffe feefeffe feefeffe 3ffff3e0: feefeffe feefeffe feefeffe feefeffe 3ffff3f0: feefeffe feefeffe feefeffe feefeffe 3ffff400: feefeffe feefeffe feefeffe feefeffe 3ffff410: feefeffe feefeffe feefeffe feefeffe 3ffff420: feefeffe feefeffe feefeffe feefeffe 3ffff430: feefeffe feefeffe feefeffe feefeffe 3ffff440: feefeffe feefeffe feefeffe feefeffe 3ffff450: feefeffe feefeffe feefeffe feefeffe 3ffff460: feefeffe feefeffe feefeffe feefeffe 3ffff470: feefeffe feefeffe feefeffe feefeffe 3ffff480: feefeffe feefeffe feefeffe feefeffe 3ffff490: feefeffe feefeffe feefeffe feefeffe 3ffff4a0: feefeffe feefeffe feefeffe feefeffe 3ffff4b0: feefeffe feefeffe feefeffe feefeffe 3ffff4c0: feefeffe feefeffe feefeffe feefeffe 3ffff4d0: feefeffe feefeffe feefeffe feefeffe 3ffff4e0: feefeffe feefeffe feefeffe feefeffe 3ffff4f0: feefeffe feefeffe feefeffe feefeffe 3ffff500: feefeffe feefeffe feefeffe feefeffe 3ffff510: feefeffe feefeffe feefeffe feefeffe 3ffff520: feefeffe feefeffe feefeffe feefeffe 3ffff530: feefeffe feefeffe feefeffe feefeffe 3ffff540: feefeffe feefeffe feefeffe feefeffe 3ffff550: feefeffe feefeffe feefeffe feefeffe 3ffff560: feefeffe feefeffe feefeffe feefeffe 3ffff570: feefeffe feefeffe feefeffe feefeffe 3ffff580: feefeffe feefeffe feefeffe feefeffe 3ffff590: feefeffe feefeffe feefeffe feefeffe 3ffff5a0: feefeffe feefeffe feefeffe feefeffe 3ffff5b0: feefeffe feefeffe feefeffe feefeffe 3ffff5c0: feefeffe feefeffe feefeffe feefeffe 3ffff5d0: feefeffe feefeffe feefeffe feefeffe 3ffff5e0: feefeffe feefeffe feefeffe feefeffe 3ffff5f0: feefeffe feefeffe feefeffe feefeffe 3ffff600: feefeffe feefeffe feefeffe feefeffe 3ffff610: feefeffe feefeffe feefeffe feefeffe 3ffff620: feefeffe feefeffe feefeffe feefeffe 3ffff630: feefeffe feefeffe feefeffe feefeffe 3ffff640: feefeffe feefeffe feefeffe feefeffe 3ffff650: feefeffe feefeffe feefeffe feefeffe 3ffff660: feefeffe feefeffe feefeffe feefeffe 3ffff670: feefeffe feefeffe feefeffe feefeffe 3ffff680: feefeffe feefeffe feefeffe feefeffe 3ffff690: feefeffe feefeffe feefeffe feefeffe 3ffff6a0: feefeffe feefeffe feefeffe feefeffe 3ffff6b0: feefeffe feefeffe feefeffe feefeffe 3ffff6c0: feefeffe feefeffe feefeffe feefeffe 3ffff6d0: feefeffe feefeffe feefeffe feefeffe 3ffff6e0: feefeffe feefeffe feefeffe feefeffe 3ffff6f0: feefeffe feefeffe feefeffe feefeffe 3ffff700: feefeffe feefeffe feefeffe feefeffe 3ffff710: feefeffe feefeffe feefeffe feefeffe 3ffff720: feefeffe feefeffe feefeffe feefeffe 3ffff730: feefeffe feefeffe feefeffe feefeffe 3ffff740: feefeffe feefeffe feefeffe feefeffe 3ffff750: feefeffe feefeffe feefeffe feefeffe 3ffff760: feefeffe feefeffe feefeffe feefeffe 3ffff770: feefeffe feefeffe feefeffe feefeffe 3ffff780: feefeffe feefeffe feefeffe feefeffe 3ffff790: feefeffe feefeffe feefeffe feefeffe 3ffff7a0: feefeffe feefeffe feefeffe feefeffe 3ffff7b0: feefeffe feefeffe feefeffe feefeffe 3ffff7c0: feefeffe feefeffe feefeffe feefeffe 3ffff7d0: feefeffe feefeffe feefeffe feefeffe 3ffff7e0: feefeffe feefeffe feefeffe feefeffe 3ffff7f0: feefeffe feefeffe feefeffe feefeffe 3ffff800: feefeffe feefeffe feefeffe feefeffe 3ffff810: feefeffe feefeffe feefeffe feefeffe 3ffff820: feefeffe feefeffe feefeffe feefeffe 3ffff830: feefeffe feefeffe feefeffe feefeffe 3ffff840: feefeffe feefeffe feefeffe feefeffe 3ffff850: feefeffe feefeffe feefeffe feefeffe 3ffff860: feefeffe feefeffe feefeffe feefeffe 3ffff870: feefeffe feefeffe feefeffe feefeffe 3ffff880: feefeffe feefeffe feefeffe feefeffe 3ffff890: feefeffe feefeffe feefeffe feefeffe 3ffff8a0: feefeffe feefeffe feefeffe feefeffe 3ffff8b0: feefeffe feefeffe feefeffe feefeffe 3ffff8c0: feefeffe feefeffe feefeffe feefeffe 3ffff8d0: feefeffe feefeffe feefeffe feefeffe 3ffff8e0: feefeffe feefeffe feefeffe feefeffe 3ffff8f0: feefeffe feefeffe feefeffe feefeffe 3ffff900: feefeffe feefeffe feefeffe feefeffe 3ffff910: feefeffe feefeffe feefeffe feefeffe 3ffff920: feefeffe feefeffe feefeffe feefeffe 3ffff930: feefeffe feefeffe feefeffe feefeffe 3ffff940: feefeffe feefeffe feefeffe feefeffe 3ffff950: feefeffe feefeffe feefeffe feefeffe 3ffff960: feefeffe feefeffe feefeffe feefeffe 3ffff970: feefeffe feefeffe feefeffe feefeffe 3ffff980: feefeffe feefeffe feefeffe feefeffe 3ffff990: feefeffe feefeffe feefeffe feefeffe 3ffff9a0: feefeffe feefeffe feefeffe feefeffe 3ffff9b0: feefeffe feefeffe feefeffe feefeffe 3ffff9c0: feefeffe feefeffe feefeffe feefeffe 3ffff9d0: feefeffe feefeffe feefeffe feefeffe 3ffff9e0: feefeffe feefeffe feefeffe feefeffe 3ffff9f0: feefeffe feefeffe feefeffe feefeffe 3ffffa00: feefeffe feefeffe feefeffe feefeffe 3ffffa10: feefeffe feefeffe feefeffe feefeffe 3ffffa20: feefeffe feefeffe feefeffe feefeffe 3ffffa30: feefeffe feefeffe feefeffe feefeffe 3ffffa40: feefeffe feefeffe feefeffe feefeffe 3ffffa50: feefeffe feefeffe feefeffe feefeffe 3ffffa60: feefeffe feefeffe feefeffe feefeffe 3ffffa70: feefeffe feefeffe feefeffe feefeffe 3ffffa80: feefeffe feefeffe feefeffe feefeffe 3ffffa90: feefeffe feefeffe feefeffe feefeffe 3ffffaa0: feefeffe feefeffe feefeffe feefeffe 3ffffab0: feefeffe feefeffe feefeffe feefeffe 3ffffac0: feefeffe feefeffe feefeffe feefeffe 3ffffad0: feefeffe feefeffe feefeffe feefeffe 3ffffae0: feefeffe feefeffe feefeffe feefeffe 3ffffaf0: feefeffe feefeffe feefeffe feefeffe 3ffffb00: feefeffe feefeffe feefeffe feefeffe 3ffffb10: feefeffe feefeffe feefeffe feefeffe 3ffffb20: feefeffe feefeffe feefeffe feefeffe 3ffffb30: feefeffe feefeffe feefeffe feefeffe 3ffffb40: feefeffe feefeffe feefeffe feefeffe 3ffffb50: feefeffe feefeffe 4022bc2f 00000001 3ffffb60: ffffffff 00000000 3ffe8d91 00000008 3ffffb70: 4022bc7e 3ffec3d8 3ffef06c 00000001 3ffffb80: 00000002 00000000 00000020 4010017c 3ffffb90: 00000005 00000005 00000002 40101624 3ffffba0: 3ffe8c42 4022ad3b 3ffec3d8 00000020 3ffffbb0: 00000000 4021e2e3 3ffed868 3ffef06c 3ffffbc0: 00000000 00000002 00000000 3ffec3d8 3ffffbd0: 3fff0222 40104f1f 3fff01ac 3ffeea2c 3ffffbe0: 00000005 00000000 00000020 4010017c 3ffffbf0: 3ffe8c42 4020f901 00000005 40101624 3ffffc00: 3ffe8c45 401048cf 3ffec6d0 4010017c 3ffffc10: 401021bb 3ffec6d0 00000000 00000000 3ffffc20: 00000024 004a252b 3ffed0e8 40102398 3ffffc30: 00000000 00000000 00000020 4010017c 3ffffc40: 00000024 004a252b 00000000 40101624 3ffffc50: 3ffe8c40 401048b7 3ffefec4 00000001 3ffffc60: 00000001 40103a92 3ffecdc0 40101624 3ffffc70: 00000000 00000000 0000001f 4010017c 3ffffc80: 3ffe94cc 00000000 3fffc228 40105175 3ffffc90: 4000050c 00000000 0000001f 4010017c 3ffffca0: 4000dcfe 00000030 00000010 ffffffff 3ffffcb0: 4000066d 004cb8bd 4bc6a7f0 0000004c 3ffffcc0: 00000000 00000000 00000000 fffffffe 3ffffcd0: ffffffff 3fffc6fc 00000001 004cb8bd 3ffffce0: 4bc6a7f0 004cb8bd 00000000 00000030 3ffffcf0: ffffffff 3fffc6fc 00000001 004c7b17 3ffffd00: 00000000 00000000 0000001f 4010017c 3ffffd10: 00000000 00000000 3fffc228 40105175 3ffffd20: 4000050c 00000000 0000000a 00000000 3ffffd30: 40204c44 00000030 00000013 ffffffff 3ffffd40: 40204c3a 0000002f 00000000 00000001 3ffffd50: 60000808 00000004 00000020 00000009 3ffffd60: 00000009 3fffc6fc 00000001 3ffee5e8 3ffffd70: 3fffff70 3fffff70 3ffee964 00000030 3ffffd80: 0000a000 3ffffe73 3ffffee0 4020e066 3ffffd90: 00000c30 3ffffe83 40209f79 00000001 3ffffda0: 00000000 4bc6a7f0 a76c8b43 00000000 3ffffdb0: 00000000 00000000 4bc6a7f0 00000000 3ffffdc0: 40105035 0017fecc 40100274 000013c8 3ffffdd0: 00000000 181fef1c 0017fe00 00000000 3ffffde0: 0016e001 0017fecc 3ffee9c4 00000000 3ffffdf0: 3ffedf50 3ffee9c4 00000001 3ffee5e8 3ffffe00: 00000000 00000000 3ffee5e8 40204b7d 3ffffe10: 401002cc 3ffee5e8 00000000 401002f5 3ffffe20: 3fffff70 3fffff68 3ffee5e8 40204c3a 3ffffe30: 0000004f 00000028 0000004e 00000029 3ffffe40: 00000054 00000029 00000054 00000029 3ffffe50: 00000054 00000029 00000054 00000029 3ffffe60: 00000054 00000075 00000054 00000027 3ffffe70: 0000006a 00000028 00000055 00000074 3ffffe80: 00000055 00000074 00000055 00000074 3ffffe90: 00000055 00000028 00000055 00000074 3ffffea0: 00000055 00000074 00000055 00000027 3ffffeb0: 0000006a 00000028 00000055 00000028 3ffffec0: 00000055 00000028 00000055 00000028 3ffffed0: 00000055 00000028 00000055 00000028 3ffffee0: 00000055 00000028 00000055 00000026 3ffffef0: 0000006a 00000075 00000054 00000075 3fffff00: 4023da25 00000004 00000000 00000075 3fffff10: 4023dccb 00000004 00000000 0000002b 3fffff20: 4023df00 00000004 00000000 4023718a 3fffff30: 401052b9 00181b32 3ffee9c4 00000000 3fffff40: 3ffedf50 3ffee9c4 00000002 3ffee9c4 3fffff50: 0000002a 3ffee964 40205e64 3fffefa0 3fffff60: 3ffee9c4 0000002a 3ffee964 40206676 3fffff70: 3ffee5e8 00000000 45e4b800 402014ff 3fffff80: 3fffdad0 00000000 00000001 3ffee964 3fffff90: 3fffdad0 00000000 00000001 40201cf8 3fffffa0: 3fffdad0 00000000 3ffee924 40205f7c <<<stack<<< ets Jan 8 2013,rst cause:4, boot mode:(3,6) wdt reset load 0x4010f000, len 1392, room 16 tail 0 chksum 0xd0 csum 0xd0 v3d128e5c ~ld
Нашел одну странность. У меня есть еще одна ESP, которая шлет данные на MQTT сервер. Если код приемника (приведенный выше) запустить раньше чем передатчика (вторая ESP, которая шлет данные), то приемник уходит в вечный ребут, и выходит из него как только начинают приходить данные с MQTT сервера...
Такое чувство, что в коде идет попытка чтения несуществующих данных от MQTT...
Может вы увидите где ошибка?
Код делает что хочет... И ведет себя совершенно странно.
я сделал условие на вызов функции только 1 раз:
if (GetNewDateTimeData){
GetNewDateTimeData = false;
Date_Time();
}
Но каждый раз, как только программа доходит до этого участка, переменная GetNewDateTimeData оказывается "True", и опять вызывается функция Date_Time();....
Жаль нет смайлика бьющегося головой об стену....
Разрешение происходит только при получении данных от MQTT:
void callback(const MQTT::Publish& pub) // Функция получения данных от сервера
{
Serial.print(pub.topic()); // выводим в сериал порт название топика
Serial.print(" => ");
Serial.println(pub.payload_string()); // выводим в сериал порт значение полученных данных
String payload = pub.payload_string();
if(String(pub.topic()) == "WStation/Battery") // получаем данные из топика о напряжении аккумулятора
{
WStationVoltage = payload.toFloat(); // преобразуем полученные данные в тип integer
}
if(String(pub.topic()) == "WStation/Date") // получаем данные из топика Даты
{
payload.toCharArray(DateString, 11);
GetNewDateTimeData = true;
Serial.println("-3-");
}
if(String(pub.topic()) == "WStation/Time") // получаем данные из топика Времени
{
//TimeString = payload;
payload.toCharArray(TimeString, 9);
GetNewDateTimeData = true;
Serial.println("-2-");
}
}
Но в сериал ничего не выводится, а значит переменная значения "True" не принимает... ТО КАКИМ ЖЕ ОБРАЗОМ ОНА СТАНОВИТСЯ "True" ПОСЛЕ ОБНУЛЕНИЯ????? Уже два дня эти глюки вылавливаю...
То вообще программа вылетала просто при обращении к конкретной переменной.... Не смог это победить, пришлось переменную напрочь убрать :(
И памяти вроде хватает :( Компилятор выдает следующее:
Executable segment sizes: IROM : 260592 - code in flash (default or ICACHE_FLASH_ATTR) IRAM : 27720 / 32768 - code in IRAM (ICACHE_RAM_ATTR, ISRs...) DATA : 1296 ) - initialized variables (global, static) in RAM/HEAP RODATA : 1272 ) / 81920 - constants (global, static) in RAM/HEAP BSS : 25880 ) - zeroed variables (global, static) in RAM/HEAP Скетч использует 290880 байт (27%) памяти устройства. Всего доступно 1044464 байт. Глобальные переменные используют 28448 байт (34%) динамической памяти, оставляя 53472 байт для локальных переменных. Максимум: 81920 байт. esptool.py v2.8 Serial port COM35 Connecting.... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: b4:e6:2d:23:37:0a Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Compressed 295040 bytes to 213055... Writing at 0x00000000... (7 %) ... Writing at 0x00034000... (100 %) Wrote 295040 bytes (213055 compressed) at 0x00000000 in 19.0 seconds (effective 124.4 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin...
Вот один из примеров (Картинка кликабельна):
Это лог старта программы. "Кракозюбры" - это команды для дисплея, он работает через Сериал, не обращайте на них внимания.
Красным обведена переменная GetNewDateTimeData, которая объявляется в начале программы:
Но в сериал видно что переменная равна сначала 54, а при повторном цикле - 50, хотя оба раза переменная обнулялась в цикле...
Второе: Синим обведена переменная WStationVoltage, которая тоже объявлена в начале программы:
Но, как видно, вначале эта переменная равна ХЗ чему... а точнее: 18465454836807817073918158.71. Потом, по ходу программы "исправляется"....
Вот что это за глюки???
Сделайте как можно более простой минималистский код, показывающий проблему и выложите его целиком. По кускам судить ни о чём невозможно.
Включите отладку. Посмотрите, что пишет. Лампочка но роутере - не показатель. То что она горит не говорит о наличии подключения, точнее не говорит о том , что попытка была удачна. Кроме того вам не плоохо бы почитать чего нибудь про эту есп, в частности про необходимость использования yield().
brokly, на роутере подключение видно в "Вебморде", среди подключенных устройств. То есть, подключение установлено, но ESP все равно пытается подключиться.
То же самое относительно подключения к MQTT. Может нормально подключиться, а может войти в цикл постоянных переподключений (мгновенных). То есть только подается запрос на подключение как сразу же подается следующий и так далее...
О yield() знаю, если обратите внимание, он у меня натыкан везде...
Еще страннось: Не обрабатываются переменные если им присваивается boolean значение типа TRUE или FALSE. Пример я приводил выше. Если переменной хотя бы 1 раз присвоилось значение в "текстовом" виде (будь то при инициализации, или по ходу программы) то эта переменная ВСЕГДА будет иметь какое угодно значение, но не то что ей присваивается.
Если же переменной будет присваиваться значение "0" или "1" (вместо TRUE или FALSE) то тогда таких проблем нет....
Такое чувство что не обрабатываются нормально переменные типа boolean, и из-за этого повторное переподключение к WiFi, MQTT и другие глюки...
Пробовал отдельно части программы, работают нормально. По крайней мере пока что не обнаружил явных глюков. Попробую включить отладку. Может это даст какое-то понимание происходящего.
ТС, мне кажется у вас с логикой скетча проблемы, при любом сборе он должен переподключаться, esp8266 может месяцами стабильно работать и это уже на практике проверено.
Вот простенький пример, возьмите его например за основу http://arduino.ru/forum/programmirovanie/snova-mqtt-1#comment-404716
Возможно. Не исключаю этого. А какую библиотеку MQTT вы использовали?
В логе все четко сказано
wdt reset
Из личного опыта работы с ESP8266 решил что не надо задерживать завершение сетапа и лопа
потому ожидание конекта так
в сетапе просто WiFi.begin(ssid, password);
Возможно. Не исключаю этого. А какую библиотеку MQTT вы использовали?
Никакую, почитайте тему, там все разжевано.