Skip to content
This repository has been archived by the owner on Dec 21, 2023. It is now read-only.

Метеостанция - wdt reset! #13

Closed
CadilVB opened this issue Jan 15, 2018 · 12 comments
Closed

Метеостанция - wdt reset! #13

CadilVB opened this issue Jan 15, 2018 · 12 comments

Comments

@CadilVB
Copy link

CadilVB commented Jan 15, 2018

В свое время я с благодарностью воспользовался советом kumekay и ввел дополнительно несколько переменных, которые можно задать через Wi-Fi - по аналогии, например, с переменной blynk_token в скетче метеостанции. Скетчи с новыми переменными успешно работали.
Потом я занялся подключением других датчиков в схему метеостанции, но после возврата к старым скетчам выяснилось, что они не работают. После загрузки в ESP - wdt reset.
В Инете прочитал, что причиной сообщения wdt reset могут быть:

  • переполнение оперативной памяти,
  • кривые или "прожорливые" библиотеки,
  • кривой пользовательский код,,
  • слишком навороченная программа, с которой ESP не справляется.
    Два последних пункта отпадают - скетчи раньше работали.
    В приложении - код метеостанции с добавлением новой переменной address.
    В скетче я минимизировал количество переменных, чтобы уменьшить загрузку памяти. Глобальные переменные используют 39972 байт (48%) динамической памяти, оставляя 41948 байт для локальных переменных.
    На мой взгляд, наиболее вероятной причиной этой проблемы является автообновление библиотек в Arduino IDE, которое остановил с опозданием.
    Я, конечно, тестировал скетч со старыми версиями некоторых библиотек, но как только расскомметирую строку 267: strcpy(address, json["address"]) то все то же - wdt reset. Как выйти на работающую комбинацию библиотек? - не представляю (если причина в комбинации).
    Ниже - информация с монитора Arduino IDE при загрузке проблемного скетча. Возможно она что-то прояснит.
    Помогите решить проблему.

*WM: Adding parameter
*WM: blynk_token
*WM: Adding parameter
*WM: address
*WM:
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Using last saved values, should be faster
*WM: Connection result:
*WM: 3
*WM: IP Address:
*WM: 192.168.1.100
WiFi connected
IP address: 192.168.1.100
Load config...

Exception (28):
epc1=0x4000bf0e epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

ctx: cont
sp: 3fff1010 end: 3fff1310 offset: 01a0

stack>>>
3fff11b0: 3fffdad0 3fff022c 3fff2c3c 4020c5e9
3fff11c0: 3ffe89c8 3fff11c0 3fff11cc 3fff11dc
3fff11d0: 3fff2c3c 00000002 3fff2c49 00000000
3fff11e0: 3fff2c59 00000002 3fff2c65 40201c2c
3fff11f0: 00000018 00000008 3ffefae0 40201d40
3fff1200: 3fff004c 3ffefae0 3ffefb44 402015c9
3fff1210: 3fff1260 00000000 3ffefae0 4020ba34
3fff1220: 00000009 00000011 3fff022c 40201e06
3fff1230: 19082e00 00ffffff 0101a8c0 00000000
3fff1240: 00000007 0000000f 3ffefae0 40201ea3
3fff1250: 00000007 00000007 3ffefae0 4020ba64
3fff1260: 3ffeffec 00070010 3ffefae0 40201834
3fff1270: 3fff1c56 0000005a 3ffefae0 3fff02e8
3fff1280: 3fffdad0 00000010 3ffefae0 00000028
3fff1290: 3ffe94f0 00000000 000003e8 4010020c
3fff12a0: 3fff2bfc 3fff1c4c 3fff12d0 4010068c
3fff12b0: 3ffe889c 3ffe889c 3ffefae0 3fff02e8
3fff12c0: 3fffdad0 3ffe889c 3fff022c 4020d265
3fff12d0: 00000000 00000000 00000000 feefeffe
3fff12e0: feefeffe feefeffe feefeffe 3fff02e8
3fff12f0: 3fffdad0 00000000 3fff02e0 4021537c
3fff1300: feefeffe feefeffe 3fff02f0 40100718
<<<stack<<<

ets Jan 8 2013,rst cause:2, boot mode:(1,3)

ets Jan 8 2013,rst cause:4, boot mode:(1,3)

wdt reset

@kumekay
Copy link
Owner

kumekay commented Jan 18, 2018

Добрый день,
Думаю, это из-за того что у вас на чипе в SPIFFS уже сохранены настройки в которых нет ключа address.

Как вариант, добавьте временно сброс до заводских настроек первой строкой в setup, а после сброса удалите

void setup() {
  factoryReset();

@CadilVB
Copy link
Author

CadilVB commented Jan 18, 2018

Фантастика! Без этой подсказки - я бы еще долго кувыркался. Успехов!

@kumekay
Copy link
Owner

kumekay commented Jan 18, 2018

Спасибо, и вам

@kumekay kumekay closed this as completed Jan 18, 2018
@CadilVB
Copy link
Author

CadilVB commented Jan 24, 2018

Подскажите, пожалуйста, в какую библиотеку входит функция factoryReset()?

@kumekay
Copy link
Owner

kumekay commented Jan 24, 2018

Она прямо в коде main.cpp

https://github.com/kumekay/kuhomon/blob/master/src/main.cpp#L104-L109

@CadilVB
Copy link
Author

CadilVB commented Jan 24, 2018

Спасибо!
Извините за дилетантские вопросы. Инерция мышления - должен был сам проверить прежде, чем задавать вопрос.

@CadilVB
Copy link
Author

CadilVB commented Feb 4, 2018

В метеостанции на основе скрипта kumekay с датчиком температуры и влажности DHT22, датчиком содержания CO2 MH-Z19 и отправкой данных на Blynk зависают показания MH-Z19, при этом, значения температуры и влажности отправляются на сервер Блинка нормально. После перезагрузки устройства информация с MH-Z19 снова нормально отправляется на Блинк и читается на экране 128*64 какое-то время, затем снова показания с MH-Z19 "замерзают".
Детали - тут.
Тема на esp8266.ru висит с пятницы, но до сих пор - ни одного ответа по существу.
Помогите, пожалуйста, в очередной раз!

@kumekay
Copy link
Owner

kumekay commented Feb 4, 2018

Вам нужно дожидаться начала пакета данных от сенсора. Либо скопируйте из моего кода
https://github.com/kumekay/kuhomon/blob/master/src/main.cpp#L123-L128
либо используйте
Serial.readBytesUntil() (https://www.arduino.cc/reference/en/language/functions/communication/serial/readbytesuntil/)

@CadilVB
Copy link
Author

CadilVB commented Feb 10, 2018

Использовал вашу функцию readCO2() в целом. К сожалению, положительного результата не добился - метеостанция работает не более 3 часов без перезагрузки. На мой взгляд, условие поиска старта пакета по сути похоже на проверку контр. суммы.
Протестировал другие подходы - безрезультатно.
И еще. Рекомендованный период обращения к датчику MH Z-19 - не менее 10 сек. Организовал цикл, в котором считывание данных с DHT - 1 сек, а с MH Z-19 - 20 сек - не помогло.
Что думаете?

@kumekay
Copy link
Owner

kumekay commented Feb 10, 2018

Думаю, что где-то течет память. Может в моем коде (что вероятнее), может в библиотеках. Нужно будет повнимательнее мне глянуть

@CadilVB
Copy link
Author

CadilVB commented Feb 12, 2018

Прошу прощения, но я заблуждался, поверив то, что решение найдено после 24 часов работы простого скетча, в котором разнесено считывание с датчика и отправка на сервер, датчик
подключен непосредственно к UART без библиотеки SoftwareSerial.h и добавлено условие поиска старта пакета считывания данных с датчика. Оказалось, что сутки работы - это мало, чтобы делать однозначный вывод.
Метеостанция kumekay, с этими решениями проработала без малого 2 суток.

Сейчас отформатировал память модуля и загрузил простой скетч, который раньше проработал сутки. После нескольких ресетов (откл/вкл питания) скетч работает 6 часов. Перед этим после каждого ресета скетч работал 0,5...1 час. Буду ждать очередного зависания, но то, что проблема не в коде метеостанции - это очевидно. К тому же, судя по скринам в статье, метеостанция беспрерывно проработала по крайней мере 10 суток.

Ниже код загруженного скетча. Вас в нем ничего не настораживает?

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(13, 15); // GPIO15 (TX) and GPIO13 (RX) 
#define mySerial Serial 

char auth[] = "b0bf3e0d02f648c6b7aff07028хххххх";

//static byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; //команда чтения
//byte response[9];
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char response[7];
byte crc = 0;
int co2, ppm;
int i = 0;

//kuh
void readCO2() {
        // CO2
        bool header_found {false};
      //  char tries {0};

        mySerial.write(cmd, 9);
        memset(response, 0, 7);

        // Looking for packet start
        while(mySerial.available() && (!header_found)) {
                if(mySerial.read() == 0xff ) {
                        if(mySerial.read() == 0x86 ) header_found = true;
                }
        }

        if (header_found) {
                mySerial.readBytes(response, 7);

                byte crc = 0x86;
                for (char i = 0; i < 6; i++) {
                        crc+=response[i];
                }
                crc = 0xff - crc;
                crc++;

                if ( !(response[6] == crc) ) {
                        Serial.println("CO2: CRC error: " + String(crc) + " / "+ String(response[6]));
                } else {
                        unsigned int responseHigh = (unsigned int) response[0];
                        unsigned int responseLow = (unsigned int) response[1];
                        unsigned int ppm = (256*responseHigh) + responseLow;
                        co2 = ppm;
                        Serial.println("CO2:" + String(co2));
                }
        } else {
                Serial.println("CO2: Header not found");
        }
}

/* void readCO2() 
{
  while (mySerial.available())mySerial.read();//очистка буфера UART перед запросом
  memset(response, 0, 9);// очистка ответа
  mySerial.write(cmd,9);// запрос
  mySerial.readBytes(response, 9);//чтение 9 байт сенсора
  //расчет CRC
  crc = 0;
  for (int i = 1; i <= 7; i++)
  {
    crc += response[i];
  }
  crc = ((~crc)+1);
  {
  //проверка CRC
  if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) 
  {
    Serial.println("CRC error");
  } else 
      {
       
      ppm = (((unsigned int) response[2])<<8) + response[3];
  
        Blynk.virtualWrite(V4, ppm);
        Serial.println("CO2: " + String(ppm) + "ppm");
        }
  }
}  */

void setup() 
{   
   mySerial.begin(9600); 
   Serial.begin(9600); 

Blynk.begin(auth, "ххххххххх", "ххххххххх", "blynk-cloud.com", 8442);
}

void loop(){
   Blynk.run(); 
   i++;
   Serial.println("time: " + String(i) + " *10s");
if (i>=60)  i = 0;
   readCO2(); 
   Blynk.virtualWrite(V4, co2); 
   delay(10000);   
}

@kumekay
Copy link
Owner

kumekay commented Feb 13, 2018

Код выглядит в порядке. Может что-то из библиотек?

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants