ESP8266: stabilesnis ryšys

Posted: 2018-03-22 in Darbeliai
Žymos:, , , , ,

Pasidariau temperatūros stebėjimą su ESP8266 valdikliu. Kabo jis ten sau katilinėje, siurbia duomenukus iš termometrų ir siunčia. Bet va, jei aš sugalvoju savo QNAP serverį atnaujint ar kažką jame pakrapštyt, valdiklis praranda ryšį su MQTT serveriu ir jau paskui be apsilankymo katilinėje ryšio pats nebeatgauna. Arba jei kokia velniava su rūteriu ir WiFi. Be abejo, taip neturi būti ir visokie nutolę valdikliai turi sugebėti ryšį atsistatyti, nebent jau tikrai nėra su kuo jo atsistatyti.

Mano temperatūros stebyklos firmwarėje tokia problema yra, kad ryšys dingsta ir viskas. Aš ten tokį lyg ir apdorojimą padariau, netgi funkciją valdiklio perkrovimui, kad jis viską iš naujo susiinicializuotų. Bet va, tas nesuveikdavo, nors lyg ir turėtų suveikti.

Nesuveikė, beje, grynai dėl mano paties žioplumo. Funkciją tai aš apsirašiau:

boolean restartFlag = false;

void check_restart()
{
  if (restartFlag) {
    Serial.println("Restarting the node...");
    delay(1000);
    ESP.restart();
    delay(2000);
  }
}

Aha. O pagrindiniam cikle jos kvietimą ir pamiršau įdėt 😀

Susilipdžiau greitai temperatūros stebyklos kloną ir pirmyn, aiškintis kampų:

Temperatūros stebykla su NodeMCU, ESP8266 ir Arduino kodu | Darau, blė

Visgi pagalvojau, kad nors valdiklio perkrovimas kaip ir geras dalykas, bet nenorėčiau to daryti kaskart jam ryšį praradus. Visų pirma, tai — bloga praktika. Antra, ryšio sutrikimus tikrai turėtų būti galima suvaldyti.

Sakykim, mano atveju, kai valdiklis daugiau nieko nedaro, o tik nuskaitinėja termometrus ir apie juos pirsčioja į serverį — su tuo perkrovimu viskas gerai. Bet įsivaizduokim, kad jis dar kažką ir valdo. Perkrausiu MQTT serverį, dings ryšys — ir persikraus. Arba jei rūterį sugalvosiu perkonfigūruot ir radijos persikraus. Jei valdiklis iš tikro kažką valdys, tai nuo ryšio sutrikimų jis tuos valdymus nustos atlikti. Sudurniuos rūteris ar MQTT serveris ir valdiklis papuls į amžino persikrovimo ciklą.

Su MQTT persijungimu susitvarkiau gan greitai. Iškėliau prisijungimą į atskirą funkciją. Ryšio patikrinimas, pasirodė, veikia be problemų. Tad truputį pasikrapštęs padariau, kad MQTT serveriui dingus valdiklis nepanikuotų, o tiesiog bandytų periodiškai iš naujo prisijungti. Padariau tą be jokių busy loop’ų, kad valdiklis galėtų dirbti vis pabandydamas persijungti.

Su WiFi, deja, šitas reikalas nepavyko. Išbandžiau gyvą velnią variantų, bet pavyko tik su ESP.reset(). Aišku, aš naudoju WiFiManager, o ne tiesiogiai WiFi biblioteką. Pagal WiFi bibliotekos aprašymą dingus rūteriui ir vėl atsiradus viskas turėtų būti automagiškai sutvarkoma. Bet man šitas nesuveikė.

Kaip minėjau, mano valdiklis nieko nevaldo, tad kai dingsta WiFi, jam leisti persikrauti ir bandyti taip prisijungti iš naujo — viskas ok. Bet rimtesniu atveju — ne ok. Todėl dar bandysiu ieškoti sprendimų, galbūt net ir WiFiManager atsisakyti. Dar įtariu, kad WiFi dingus ir ArduinoOTA gali sukvailiot ir pagalius į ratus kaišiot. Kol kas per daug nežinomųjų.

Kai per daug nežinomųjų, reikia pradėti nuo pradžios — banalaus, įhardkodinto prisijungimo prie WiFi ir žiūrėjimo, kaip jis veikia, o po to po truputį pridėti kitus elementus, lipdyti į viršų.

Sukišęs firmwarę porą kartų staiga pastebėjau, kad ESP.reset() neveikia. Divaisas lyg ir persikrauna, bet pakimba. Hmmm :-/ Deja, viskas pasirodė besą ne taip jau sudėtinga, kaip galvojau. Pasirodė, kad po firmwarės sukišimo kažkokie sraigteliai ESP valdiklyje susišika. Išjungus ir vėl įjungus pilnai visos bėdos dingo. Pradėjo sėkmingai prie WiFi prisijungt pats, automagiškai. Tiesa, aš dar autoConnect nustatymą įdėjau, bet su patikrinimu — patikrinimas nė karto nesuveikė, tai reiškia, kad automatinis prisijungimas sutvarkomas savaime.

Ką gi, tai tikslas pasiektas. Atsijungimai ir prisijungimai sutvarkyti. Labai norėjosi gražiai perrašyti visą savo stebyklos kodą, bet kol kas nusprendžiau to nedaryti, kad galėtumėte aiškesnį diff’ą pažiūrėt.

Beje, ArduinoOTA paleidusį įrenginį Arduino IDE turėtų automatiškai surasti tinkle. Tai man šitas nepavyko — neranda. Nežinau, kodėl, bet neranda. Todėl truputį pasiknisęs susiradau, kaip Arduino IDE daro įkėlimą į OTA įrenginį ir išbandžiau atnaujinimą iš komandinės eilutės, taip pat susiradęs, kur Arduino sukompiliuotą binarniką padeda:

$ python ~/.arduino15/packages/esp8266/hardware/esp8266/2.4.0/tools/espota.py -i 192.168.5.135 -p 8266 --auth=SlaptasZodis -f /tmp/arduino_build_467005/wifi-temp.ino.bin
Authenticating...OK
Uploading.....................................................................................................................................................................................................................................................................

Persikrovimas po OTA atnaujinimo suveikė irgi gerai. Dar įdėjau MQTT pranešimuką, kuris IP adresą prisiduoda — tiesiog dėl patogumo.

Tiesa, liko neišspręsta paskutinė problema: divaisas bent pirmą kartą turi užsikrauti su prieinamu WiFi ryšiu. Paskui jau tas ryšys gali atsirast, gali dingt — nebesvarbu. Bet užkuriant ir įjungiant turi būt ryšys prieinamas. Kitaip vis persistartuos, kol pavyks. Na, šiuo atveju, sakykim, viskas ok — sakykim, namuose dingo elektra, viskas nuėjo velniop. ESP8266 užsikraus tikrai daug kartų greičiau, nei maršrutizatorius. Tai tas užsikūrimas ir persikrovimo ciklas po kažkiek laiko baigsis. Kažkuria prasme tai nėra problema, nes jei valdikliui yra leidžiamas atsijungimas dingus elektrai, tai jis nėra toks jau kritiškas. O jei kabėtų ant UPS, tai tada ir problemos nebelieka — vėl prisijungtų automagiškai.

Pabaigai šiek tiek linksmybių iš šito temperatūrų vėpsojimo.

Garaže mašinas laikyti verta — gerai tą garažą pašildo, kai parvažiuoji:

Garažo temperatūros grafikas išvažiuojant ir grįžtant mašinoms | Darau, blė

Gykams čia viskas turėtų būti aišku. Na, bet paaiškinsiu. Pirmas iš kairės nukritimas — atsidarė garažo vartai, mašina išvažiavo. Toliau, popietę valandai su trupučiu mašina išvažiavo ir grįžo — po grįžimo aiškus temperatūros pakilimas. Vakare vėl mašina išvažiavo, bet grįžo vienu metu abi — šilumos dar daugiau.

Gerai, blė, kad mašinos kol kas ne elektrinės 😀

Palyginau mūsų kaimo realią temperatūrą su Yahoo. Šiaip Yahoo, be abejo, kažkiek grybauja, bet palyginus nėra taip jau blogai, tendencija netgi labai panaši (kartais):

Yahoo ir realios temperatūros grafikų palyginimas | Darau, blė

Kol kas tiek.

Komentarai
  1. Dovydas Zakas parašė:

    Ačiū, įdomu, pasigilinsiu 🙂
    Bet kaip iškart matosi, kad kodą profas rašo.. man dar taip toli š#%ais plaukt iki panašaus lygio. 🙂

    • Darau, Blė parašė:

      Gerbiamasai, čia ne kodas, o kratinys sukopijuotų pavyzdukų 🙂 Kai kurios mano vietos ten pusiau gražiai parašytos, bet tikrai daug meilės neįdėjau ir profesionaliai aš taip kodo nerašau 🙂 Kai rašinėju kažką savo malonumui, leidžiu sau pakankamai daug crapinti. Kaip minėjau įraše, kol kas aš to kodo negražinau, kad matytųsi skirtumas, kaip pasiekiau kažkokį stabilumą. Gal kada gražiai perrašysiu, kad gėda nebūtų 😀

  2. Dovydas Zakas parašė:

    Visgi kažkas dar nekorektiškai veikia. Perkrovus AP ne visada sugeba atsistatyt..

    • Darau, Blė parašė:

      Su ESP8266 yra toks reikalas, kad negalima jo labai apkraut. T.y. bet koks kodo apdorojimas turi būti trumpas ir greitas arba išskaidytas etapais. Aišku, naminiuose pažaidimuose su tuo susiduriama retai, bet pasitaiko, ypač, jei vietoj delay tiesiog busy loop panaudojamas 🙂 Ryšio dingimo metu tos apkrovos turėtų būti dar mažesnės. Tai čia teorija. Siūlau pabandyti kokį visai pliką projektėlį pasidaryti, kuris be prisijungimo prie WiFi daugiau nieko neveiktų — loop tik periodiškai (naudojant millis skirtumą, kas kokias 20 s) ryšio būseną patikrintų ir išspausdintų. Nu ir žiūrėt, ar taip veikia. Jei ne, tai tada nežinau, ką pasiūlyti :-/

  3. O Sole Mio parašė:

    Sveiki, megejo klausimelis profui. Ar daznas pastovus ESP.retart () arba ESP.reset () “degina“ EEPROM-o resursa? Be sios komandos man niekaip nesigauna esant Clientu apsiklausineti kelis AP-tus. Be problemu veike gal kokius du men. Po to Clientas pradejo strigineti.

    • Darau, Blė parašė:

      EEPROM resursas deginamas tik į jį rašinėjant, nuskaitinėti galima be galo be krašto. Restartuojant nieko ten neturėtų rašinėti, nebent kažkas prikodyta, kad ant startupo kažką įrašytų 🙂 Taip kad ne, normaliom salygom tas resetas nieko blogo nedaro.

  4. O Sole Mio parašė:

    Kazkur skaiciau, ir jei teisingai supratau, kad SSID ir PSW yra sistemiskais kisamas i EEPROMa. Gal cia tas variantas?

  5. O Sole Mio parašė:

    Sveiki, as senas zmogus, kad as atsiminciau kur dabar yra tas ‘kazkur’ :). Mano problema yra ta, kad budamas esp8266 client-u nemoku apsiklausti is eiles keliu Access Point-u. Pirma apsiklausiu, o prie sekancio nebeprisijungiu. Del sios priezasties naudojau ESP.reset (). Viskas veike iki minetu problemu. Gal priezastis ir ne EEPROM resurse. Taciau nusispjoviau ir apsukau viska 180 laipsniu – darau kelis client-us ir viena AP.

    • Darau, Blė parašė:

      Supratau mintį ir iš karto galiu pasakyt, kad ji neteisinga. Būtent antras atvejis (vienas AP ir daug klientų) yra tai, kaip ir reikėtų daryti. Plius klientus reikėtų ne apklausinėti, o jie patys turėtų prisiduoti. Nebent yra kažkokia ypač specifinė situacija elgtis priešingai — man sunku tokią įsivaizduoti.

  6. O Sole Mio parašė:

    Gud morning, na taip – clientas kreipiasi AP. Kodel pradzioje gavosi taip “neteisingai“.
    Pradejau no mazu dalyku – pasidariau termostata su HTTP, patogu – su bet kokia mobilka gali nustatineti reikiamus rezimus. Termostatas jungineja kambario radiatoriaus pavara. Tada sugalvojau, kad toks termostatas gali buti kiekviename kambaryje. Dar veliau sumasciau prie katilo prijungti dar viena zaisliuka, kuris susirinks info is kambariu ir jungines katila. Kadangi kabariuose jau buvo AP, tai katilo balalaika savaime tapo Clientu. Kaip jau rasiau – damusiau iki galo – sistema veike, bet tik su resetinimu po kiekvieno AP apklausimo. Dabar galvoju, kad ne resetinime buvo galimai eeprom “deginimo“ problema, o sioje vietoje WiFi.begin(ssid, password). Siuo metu darau viska teisingai, bus net patogiau – viename AP galima bus nustatineti visu termostatu rezimus.

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti /  Pakeisti )

Google photo

Jūs komentuojate naudodamiesi savo Google paskyra. Atsijungti /  Pakeisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti /  Pakeisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti /  Pakeisti )

Connecting to %s

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.