Глюки в поведении программы и вечный ребут ESP8266

forfrends
Offline
Зарегистрирован: 24.02.2015
Всем привет!
Имеется на руках 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&#39;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...

 

 

forfrends
Offline
Зарегистрирован: 24.02.2015

Вот один из примеров (Картинка кликабельна):

Это лог старта программы. "Кракозюбры" - это команды для дисплея, он работает через Сериал, не обращайте на них внимания.

Красным обведена переменная GetNewDateTimeData, которая объявляется в начале программы:

volatile boolean GetNewDateTimeData = 0;

Но в сериал видно что переменная равна сначала 54, а при повторном цикле - 50, хотя оба раза переменная обнулялась в цикле... 

Второе: Синим обведена переменная WStationVoltage, которая тоже объявлена в начале программы:

 float WStationVoltage = 0.0;

Но, как видно, вначале эта переменная равна ХЗ чему... а точнее: 18465454836807817073918158.71. Потом, по ходу программы "исправляется"....

Вот что это за глюки???

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сделайте как можно более простой минималистский код, показывающий проблему и выложите его целиком. По кускам судить ни о чём невозможно.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Включите отладку. Посмотрите, что пишет. Лампочка но роутере - не показатель. То что она горит не говорит о наличии подключения, точнее не говорит о том , что попытка была удачна. Кроме того вам не плоохо бы почитать чего нибудь про эту есп, в частности про необходимость использования yield().

forfrends
Offline
Зарегистрирован: 24.02.2015

brokly, на роутере подключение видно в "Вебморде", среди подключенных устройств. То есть, подключение установлено, но ESP все равно пытается подключиться. 

То же самое относительно подключения к MQTT. Может нормально подключиться, а может войти в цикл постоянных переподключений (мгновенных). То есть только подается запрос на подключение как сразу же подается следующий и так далее...

О yield() знаю, если обратите внимание, он у меня натыкан везде...

Еще страннось: Не обрабатываются переменные если им присваивается boolean значение типа TRUE или FALSE. Пример я приводил выше. Если переменной хотя бы 1 раз присвоилось значение в "текстовом" виде (будь то при инициализации, или по ходу программы) то эта переменная ВСЕГДА будет иметь какое угодно значение, но не то что ей присваивается. 

Если же переменной будет присваиваться значение "0" или "1" (вместо TRUE или FALSE) то тогда таких проблем нет....

Такое чувство что не обрабатываются нормально переменные типа boolean, и из-за этого повторное переподключение к WiFi, MQTT и другие глюки...

Пробовал отдельно части программы, работают нормально. По крайней мере пока что не обнаружил явных глюков. Попробую включить отладку. Может это даст какое-то понимание происходящего.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ТС, мне кажется у вас с логикой скетча проблемы, при любом сборе он должен переподключаться, esp8266 может месяцами стабильно работать и это уже на практике проверено.
Вот простенький пример, возьмите его например за основу http://arduino.ru/forum/programmirovanie/snova-mqtt-1#comment-404716

forfrends
Offline
Зарегистрирован: 24.02.2015

Возможно. Не исключаю этого. А какую библиотеку MQTT вы использовали?

Logik
Offline
Зарегистрирован: 05.08.2014

В логе все четко сказано 

wdt reset

Из личного опыта работы с ESP8266 решил что не надо задерживать завершение сетапа и лопа

потому ожидание конекта так

в сетапе просто   WiFi.begin(ssid, password);

 
в лопе 
  static bool FlStart=true;
  
 if((WiFi.status() == WL_CONNECTED) && (FlStart))
 {
  FlStart=false;
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  }
 
если нет коннекта - в другой раз при проходе лопа проверим.
Дело в том что время на установление коннекта - как бог на душу пошлет, иногда мгновенно, иногда секунды. Ваш код отрабатывает при быстром коннекте и валится при медленном.
 
 
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

forfrends пишет:

Возможно. Не исключаю этого. А какую библиотеку MQTT вы использовали?

Никакую, почитайте тему, там все разжевано.