Pripojenie do internetu

o pripojení do internetu, vytvorení vlastného hotspot-u, synchronizácii času, externom module reálneho času, a stiahnutí rozširujúcich modulov pre MicroPython

Videá pre cvičenie

Motivácia

Na predchádzajúcom cvičení sme navrhli základnú verziu stavového stroja pre naše inteligentné zariadenie. Vytvorili sme v ňom niekoľko stavov a zabezpečili sme, aby po zapnutí zariadenie vykonalo samodiagnostiku, overilo potrebu obnovenia výrobných nastavení a následne zmeralo teplotu a vlhkosť.

V tomto cvičení pripojíme zariadenie k sieti WiFi a zosynchronizujeme jeho vnútorné hodiny s reálnym časom. Zároveň ho pripravíme na možnosť používateľskej konfigurácie prostredníctvom webového rozhrania.

Diagram stavov: konceptuálny diagram stavov chytrého senzora

Ciele

  1. naučiť sa pripojiť mikrokontrolér k WiFi v jazyku MicroPython

  2. naučiť sa pracovať v oboch režimoch WiFi modulu

  3. naučiť sa nainštalovať rozširujúce moduly na MicroPython zariadenie

  4. naučiť sa synchronizovať čas pomocou prokolu NTP

  5. naučiť sa základy práce s modulom reálneho času (RTC)

  6. zoznámiť sa s projektom Awesome MicroPython

Postup

Vytvorenie WiFi prístupového bodu

Pri krátkom podržaní tlačidla počas zapínania inteligentného senzora sa zariadenie prepne do špeciálneho konfiguračného režimu, v ktorom je možné upravovať jeho nastavenia. V tomto režime sa WiFi modul prekonfiguruje tak, aby fungoval ako prístupový bod. Používateľ sa k nemu môže pripojiť a prostredníctvom webového prehliadača zmeniť správanie zariadenia.

V tomto kroku preto zabezpečte:

  1. Zapnite WiFi modul do režimu network.AP_IF.
  2. Vytvorte WiFi sieť s nasledovnými vlastnosťami:
    • SSID siete nastavte na thsensor-SID, kde SID nech je váš jedinečný študentský identifikátor
    • heslo do siete nastavte na hodnotu thsensor
  3. Vytvorte predvolenú podobu používateľských nastavení a uložte ich do súboru.

Webové rozhranie pre nastavenie chytrého senzora

Používateľ však bude môcť vytvoriť a hlavne zmeniť nastavenia chytrého senzora kedykoľvek. Stačí, ak pri spustení podrži tlačidlo dostatočne dlho, aby sa senzor dostal do režimu konfigurácie. V tomto kroku preto vytvorte webové rozhranie, pomocou ktorého umožníte zmeniť nastavenie zariadenia. Medzi hlavné úlohy tohto rozhrania bude patriť:

  • nastavenie vlastností chytrého senzora, ako napr. konfigurácia WiFi a MQTT pripojenia, aktuálny čas a pod.
  • zobrazenie aktuálnych hodnôt zariadenia s možnosťou ich otestovania (hlavne v prípade LED diódy a tlačidla)
  • zobrazenie systémových informácií zariadenia, ako napr. pracovná frekvencia, aktuálny čas, dôvod posledného reštartu, logy a pod.

Pri vytváraní webového rozhrania zabezpečte nasledovné:

  • Prístup k nemu a vykonanie akýchkoľvek úprav podmieňte zadaním prihlasovacieho mena a hesla. Tým zvýšite bezpečnosť a zabezpečíte, aby nedošlo k neoprávnenému zásahu do konfigurácie alebo k neoprávnenému získaniu citlivých údajov.

  • Keďže rozhranie nebude reprezentované len jedným formulárom, použite pre jeho vytvorenie existujúce rámce/knižnice. Zoznam niektorých z nich môžete nájsť napr. na stránke Awesome MicroPython. Najviac možností vám ponúkne komplexný rámec Microdot.

  • Nezabúdajte na to, že flash pamäť zariadenia je malá. Ak budete hľadať vhodný CSS rámec alebo nejakú JS knižnicu, nezabúdajte na ich veľkosť. Príkladom môže byť napr. rámec Pico CSS, ktorého minifikovaná verzia má zhruba 10kB.

  • Súčasťou rozhrania budú aj tieto stránky:

    cesta prihlásenie význam
    / nie info stránka zariadenia
    /diagnostics nie stránka s diagnostikou, kde bude možné vidieť aktuálne hodnoty zo senzorov, prípadne sa tu bude nachádzať rozhranie na otestovanie komponentov, ktoré sa nedajú otestovať automaticky (napr. tlačidlo na rozsvietenie/zhasnutie LED diódy, alebo informácia o stlačení tlačidla)
    /sysinfo áno/nie stránka so systémovými informáciami (napr. uptime, dôvod posledného reštartu, posledné chyby, verzia vašej aplikácie, a pod.)
    /setup áno zmena nastavení zariadenia
    /login nie prihlásenie

Senzor ako WiFi klient

Jednou z úloh senzora bude posielať dáta do internetu prostredníctvom komunikačného protokolu MQTT. Aby sme túto komunikáciu mohli zabezpečiť, potrebujeme senzor pripojiť do existujúcej WiFi siete.

Aby to bolo možné, tak:

  1. Vytvorte dva samostatné stavy - Measurement a Connecting WiFi. V stave Measurement prebehne meranie. Po odmeraní sa pokúsite pirpojiť k WiFi, aby ste následne namerané údaje vedeli vypublikovať.

  2. rozšírte nastavenia používateľa o nastavenie WiFi pripojenia

  3. v prípade, že sa nepodarí pripojiť, prejdite do stavu Error

  4. v stave Sleep sa nezabudnite odpojiť a vypnúť WiFi modul

Na pripojenie do siete môžete použiť funkciu s názvom do_connect(), ktorá sa nachádza priamo v dokumentácii jazyka MicroPython. Jej kód vhodne upravte a použite v novom stave Connecting WiFi.

Synchronizácia času pomocou protokolu NTP

Pri odosielaní nameraných dát budeme do správy pridávať aj informáciu o čase, kedy k meraniu došlo. To, kedy boli údaje namerané, je dôležité vedieť najmä vtedy, keď budeme údaje merať, alebo ich pošleme neskôr ako súbor meraní.

Pre úplnosť je potrebné dodať, že čas pri odosielaní, prijímaní a ukladaní do databázy budeme reprezentovať v štandarde UTC.

Vo vašom riešení preto zebezpečte:

  • Po pripojení zariadenia k WiFI automaticky zosynchronizujte čas pomocou protokolu NTP.

  • Server, voči ktorému sa hodiny synchronizujú predvolene, je pool.ntp.org. Umožnite používateľovi použiť vlastný server nastavením hodnoty ntp_host v používateľských nastaveniach. Následne v inicializácii zariadenia hodnotu tohto nastavenia použite.

  • Vytvorte si samostatný validátor s názvom validate_host_address(), ktorý overí, či zadaný reťazec je platná adresa pre NTP server. Tá môže byť samozrejme zadaná buď vo forme IP adresy alebo doménového názvu.

Správny čas s externým modulom RTC

Mikrokontroléry triedy RP2 síce obsahujú modul reálneho času (RTC), avšak tento modul nemá vlastné záložné napájanie. To znamená, že pri výpadku napájania – napríklad po odpojení mikrokontroléra od USB – sa informácia o aktuálnom čase stratí. Zariadenie tak nebude poznať správny čas, kým ho opäť nenastaví prostredníctvom NTP protokolu. Ak však zariadenie nemá pripojenie k sieti WiFi, synchronizácia času sa neuskutoční.

Preto potrebujeme mať k nášmu chytrému senzoru pripojené aj externý RTC modul, ktorý si bude aktuálny čas pamätať vždy aj po strate napájania chytrého senzora. Externý RTC modul je totiž štandardne vybavený samostatnou baterkou.

Pre naše potreby budeme používať RTC modul DS3231, ktorý komunikuje pomocou zbernice I2C.

Rozloženie pinov RTC modulu DS3231

Tento modul však nemá priamu podporu vo firmvéri jazyka MicroPython a preto treba osobitne stiahnuť modul s jeho podporou. Na tento účel sa dá využiť projekt Awesome MicroPython, ale my použijeme implementáciu od Petra Hincha.

V tomto kroku teda:

  • Stiahnite modul ds3231_gen.py a umiestnite ho do priečinku /lib/ na vašom chytrom zariadení.

  • Inicializujte RTC modul v stave Init.

  • Urobte jeho diagnostiku v state Diagnostics.

  • Nastavte čas okamžite po sieťovej synchronizácii pomocou protokolu RTC.

Stav ConnectionCheck

V tomto kroku rozšírite stavový stroj zariadenia o nový stav s názvom ConnectionCheck. Do tohto stavu sa zariadenie dostane po ukončení stavu Configuration. Bude to v momente, keď používateľ uloží konfiguráciu, prípadne keď vo webovom používateľskom rozhraní stlačí tlačidlo Restart. Zariadenie sa však hneď nereštartuje, ale prejde do stavu ConnectionCheck.

V tomto stave dôjde k overeniu nastavených vlastností pre pripojenie do WiFi. Ak sa zariadeniu podarí pripojiť, môže sa rovno reštartovať a teda začne normálne pracovať. V opačnom prípade, ak sa mu s nastavenými vlastnosťami nepodarilo pripojiť k WiFi sieti, sa vráti naspäť do stavu Configuration. Tu je potrebné používateľa informovať o vzniknutom stave so zodpovedajúcou hláškou.

V prípade, že sa zariadeniu podarí pripojiť k WiFi sieti nezabudnite rovno nastaviť aj čas interného ako aj externého RTC modulu.

Pred odchodom z cvičenia…

Ďalšie úlohy

  1. Aktuálna implementácia funkcie na pripojenie do siete WiFi nie je dobrá, pretože pokiaľ sa funkcii nepodarí pripojiť do siete, funkcia uviazne v nekonečnej slučke. Upravte preto túto funkciu tak, aby sa o pripojenie pokúsila 3x v niekoľkosekundových intervaloch. Pokiaľ k pripojeniu do siete nedôjde, ukončite funkciu zariadenia prechodom do stavu Error.

  2. V module helpers.py vytvorte funkciu to_iso8601(), ktorá prevedie n-ticu reprezentujúcu aktuálny dátum a čas alebo časovú značku na reťazec reprezentujúci dátum a čas vo formáte podľa štandardu ISO 8601.

  3. Vytvorte potrebné validátory pre nové používateľské nastavenia (napr. na overenie, či sa jedná o platnú doménu alebo IP adresu pri definovaní adresy NTP servera).

Ďalšie zdroje

  1. Raspberry Pi Pico W: Getting Started with Wi-Fi (MicroPython)

  2. MicroPython: Network basics

  3. ISO 8601 - medzinárodný štandard pre zápis dátumu a času

  4. Random Nerd Tutorials: MicroPython: ESP32/ESP8266 with DS3231 Real Time Clock (Get Time and Set Alarms) - Learn how to interface the DS3231 Real Time Clock Module with the ESP32 and ESP8266 boards programmed with MicroPython.

  5. Last Minute Engineers: Interface DS3231 Precision RTC Module with Arduino

  6. MicroPython Chapters: Práca s WiFi modulom

  7. MicroPython Chapters: Čas a synchronizácia času

  8. Peter Hinch’s Github: The DS3231 real time clock chip