Stack overflow - NodeMCU.. Ako to vyriešiť?

Odpovědět
martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Stack overflow - NodeMCU.. Ako to vyriešiť?

Příspěvek od martinius96 » 25 bře 2018, 16:54

Ahoj, tvorím projekt s NodeMCU v3 Lolin a programujem klasicky cez ArduinoIDE. Mám problém so stack overflow. Vytvoril som 2 totožné projekty, pričom jeden ide a druhý hlási stack overflow a dosku v nekonečnej slučke reštartuje. V provom projekte mám len iné moduly. V druhom projekte mám DHT22 (vlhkosť a teplota) a BMP280 (atmo. tlak a teplota).

Najprv som skúšal výpis na serial monitor, je to ok. Problém je keď pridám knžinicu ESP8266wifi a WificlientSecure (pre https spojenia). Problém je vždy keď kód príde k slučke loop. Setup sa vykoná, teda všetky senzory sa inicializujú a aj na wifi sa doska napojí a potom príde stack overflow, doska sa reštartuje a všetko sa opakuje. Nejaký tip, kde môže byť problém? Ten kód je veľmi jednoducho napísaný. Používam digitálny pin (D4) na údaj z DHT22 a I2C zbernicu (piny D1 a D2). Program nie je pamäťovo náročný a neviem, kde mám hľadať chybu. ďakujem vám pekne za pomoc/postrehy.

Kód, ktorý do dosky nahrávam:

Kód: Vybrat vše

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h> //KNIZNICA pre HTTPS spojenia
#include "Adafruit_BMP280.h"         //bmp280 kniznica s upravou na 0x76 adresu
#include "DHT.h"
#define DHTPIN 2     // what digital pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP280 bmp; //inicializacia BMP senzora
const char * ssid = "moj-xxxxxxxx-2929"; //meno wifi siete
const char * password = "xxxx"; //Heslo na wifi siet
const char * host = "sadsda.xxx.sk"; //bez https a www
const int httpsPort = 443; //https port zabezpeceny prenos
const char * fingerprint = "‎13 9f 87 1d b1 85 be e6 bd 73 c1 8d 04 63 58 99 f0 32 43 92"; //odtlacok HTTPS certifikatu v SHA1 formate
void setup() {          
  bmp.begin();        //start snimaca BMP
      dht.begin();              
  Serial.begin(9600);    //SPUSTENIE SERIOVEJ LINKY --UART-- NA CITACIU RYCHLOST 9600
  while (!Serial) {
    ;                                        
  }
 
 WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
  while (WiFi.status() != WL_CONNECTED) { //pokial sa nepripojime na wifi opakuj pripajanie a spustaj funkcie pre ovladanie v offline rezime
    delay(500);
    Serial.println(".");
  }
  Serial.println("");
  Serial.println("WiFi pripojene"); //uspesne pripojenie na wifi siet
  Serial.println("IP adresa: ");
  Serial.println(WiFi.localIP()); // pridelena IP adresa pre dosku
 
}
 
void loop() {                                      //ZACIATOK SLUCKY
  delay(5000);
 if (WiFi.status() != WL_CONNECTED) {
odoslat_data();  
    WiFi.begin(ssid, password);
  } else {
    odoslat_data(); 
  }
  }
  
void odoslat_data(){
   WiFiClientSecure client;
  if (client.verify(fingerprint, host)) {} else {}
  if (client.connect(host, httpsPort)) {
    String teplota1 = String(dht.readTemperature());
    String teplota2 = String(bmp.readTemperature());
    String vlhkost = String(dht.readHumidity());
    String tlak = String((bmp.readPressure() / 100) + 103,855);
 
    String url = "/podstranky/system/nodemcu/zapishodnoty.php?teplota1=" + teplota1 + "&teplota2=" + teplota2 + "&vlhkost=" + vlhkost + "&tlak=" + tlak; //--------------------------------------------------------------------------------DOPLN LINK
    client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");
    Serial.println("Odoslane teploty do db:");
     Serial.println("Atmosfericky tlak: ");           //SERIOVY VYPIS TEXT O TLAKU VZDUCHU
    Serial.println((bmp.readPressure() / 100) + 103,855); //SERIOVY VYPIS STAVU RELATIVNEHO TLAKU 30,... je konstanta pre nadmorsku vysku, ktora sa prirata k teplote. (Použite pri nadmorskej do 1000m nadmorska vyska/8,3 tuto hodnotu napiste namiesto 30,...)
    Serial.println("Teplota: "); 
    Serial.println(bmp.readTemperature());
    Serial.println("Vlhkost: "); 
    Serial.println(dht.readHumidity());
        Serial.println("Teplota DHT: "); 
    Serial.println(dht.readTemperature());    
  } else if (!client.connect(host, httpsPort)) {
    Serial.println("Neuspesne pripojenie pre odoslanie teplot do DB - offline rezim aktivny");
  }
  }
Chybová hláška (serial monitor):

Kód: Vybrat vše

WiFi pripojene
IP adresa: 
192.168.2.24
 
Exception (0):
epc1=0x30303030 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
 
ctx: cont 
sp: 3fff0df0 end: 3fff1040 offset: 01a0
 
>>>stack>>>
3fff0f90:  31333032 30303532 30303030 30303030  
3fff0fa0:  30303030 30303030 30303030 30303030  
3fff0fb0:  30303030 30303030 30303030 3fff0000  
3fff0fc0:  3fffdad0 0000000c 3ffeff5c 40204fe9  
3fff0fd0:  40105ec0 002c07f7 3ffefe98 00000000  
3fff0fe0:  3fff5584 0000005f 0000005c 3fff556c  
3fff0ff0:  0000000f 00000005 3fff5554 0000000f  
3fff1000:  00000005 3fff20c4 0000000f 00000005  
3fff1010:  3fffdad0 00000000 3ffefdd0 4020277c  
3fff1020:  feefeffe 00000000 3fff0010 4020596c  
3fff1030:  feefeffe feefeffe 3fff0020 40100718  
<<<stack<<<
Ďakujem za pomoc. Problém bude zrejme v DHT22, pretože v druhom projekte, kde nie je problém používam BMP280 taktiež a dallas DS18B20 senzory.. Neviem ale ako sa dopátrať k príčine.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Stack overflow - NodeMCU.. Ako to vyriešiť?

Příspěvek od jankop » 25 bře 2018, 17:21

Nevím proč ti to padá, ale v každém případě by ses měl vyvarovat takovýchto konstrukcí:

Kód: Vybrat vše

while (!Serial) {
    ;                                        
  }
A ještě dost dobře nechápu smysl tohohle:

Kód: Vybrat vše

void loop() {                                      //ZACIATOK SLUCKY
  delay(5000);
 if (WiFi.status() != WL_CONNECTED) {
odoslat_data();  
    WiFi.begin(ssid, password);
  } else {
    odoslat_data(); 
  }
  }
  
Proč se mermomocí snažíš odeslat data, když nemáš connect? Pak se nediv, že ti to v konečným důsledku padá jak hruška. No a tvrdíš, že používáš pro DHT D4 a v programu máš D2.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Stack overflow - NodeMCU.. Ako to vyriešiť?

Příspěvek od martinius96 » 25 bře 2018, 18:05

jankop píše:
25 bře 2018, 17:21
Nevím proč ti to padá, ale v každém případě by ses měl vyvarovat takovýchto konstrukcí:

Kód: Vybrat vše

while (!Serial) {
    ;                                        
  }
A ještě dost dobře nechápu smysl tohohle:

Kód: Vybrat vše

void loop() {                                      //ZACIATOK SLUCKY
  delay(5000);
 if (WiFi.status() != WL_CONNECTED) {
odoslat_data();  
    WiFi.begin(ssid, password);
  } else {
    odoslat_data(); 
  }
  }
  
Proč se mermomocí snažíš odeslat data, když nemáš connect? Pak se nediv, že ti to v konečným důsledku padá jak hruška. No a tvrdíš, že používáš pro DHT D4 a v programu máš D2.
Ahoj, vyhodil som časti kódu, ako si písal, ale tam problém nebol :-)
Väčšinou používam kódy s tým zápisom wifi statusu a myslím si, že to funguje ok. Tá doska sa pripája na wifi aj počas toho, ako to niečo meria a viackrát to dokázalo počas merania aj pripojiť sa na wifi a danú informáciu odoslať...
Problém nájdený..

Kód: Vybrat vše

  String tlak = String((bmp.readPressure() / 100) + 103,855);
Keď som konštantu vyhodil a vnútorné zátvorky tiež, funguje to bez problému. Budem teda musieť pretypovať na float a prispôsobiť tomu zápis.. :)
Inak.. ten PIN 2 pri DHT znamená pin D4.. Číslo je pre GPIO2 = D4.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Stack overflow - NodeMCU.. Ako to vyriešiť?

Příspěvek od jankop » 25 bře 2018, 18:24

Kód: Vybrat vše

String tlak = String((bmp.readPressure() / 100) + 103,855);
Nemá tam být náhodou desetinná tečka? Tedy po vašem bodka?
Inak.. ten PIN 2 pri DHT znamená pin D4.. Číslo je pre GPIO2 = D4.
V Arduinu platí že GPIO1=1, GPIO2=2 a GPIO4=4 atp.
Tak se tak nějak divím, že ti to funguje.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Stack overflow - NodeMCU.. Ako to vyriešiť?

Příspěvek od martinius96 » 25 bře 2018, 18:28

Tak chyba bude zrejme v tom, že je tam čiarka a nie bodka
NodeMCU má trošku iný pinout.
Obrázek
Takže chyba bude presne tam :) Vďaka za postreh.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 12 hostů