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.

Ciele
naučiť sa pripojiť mikrokontrolér k WiFi v jazyku MicroPython
naučiť sa pracovať v oboch režimoch WiFi modulu
naučiť sa nainštalovať rozširujúce moduly na MicroPython zariadenie
naučiť sa synchronizovať čas pomocou prokolu NTP
naučiť sa základy práce s modulom reálneho času (RTC)
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:
- Zapnite WiFi modul do režimu
network.AP_IF
. - Vytvorte WiFi sieť s nasledovnými vlastnosťami:
- SSID siete nastavte na
thsensor-SID
, kdeSID
nech je váš jedinečný študentský identifikátor - heslo do siete nastavte na hodnotu
thsensor
- SSID siete nastavte na
- 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:
Vytvorte dva samostatné stavy -
Measurement
aConnecting WiFi
. V staveMeasurement
prebehne meranie. Po odmeraní sa pokúsite pirpojiť k WiFi, aby ste následne namerané údaje vedeli vypublikovať.rozšírte nastavenia používateľa o nastavenie WiFi pripojenia
v prípade, že sa nepodarí pripojiť, prejdite do stavu
Error
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 hodnotyntp_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.
Upozornenie
Keď budete experimentovať s aktuálnym časom a budete používať napr. REPL režim v editore Thonny, zistíte, že čas je vždy nastavený správne. A to aj napriek tomu, že USB kábel odpojíte, čím zresetujete vnútorný RTC modul, a pripojíte ho naspäť. Mikrokontrolér vám aj tak vráti aktuálny čas.
Toto správanie je spôsobené editorom Thonny. Rovnako tak môže byť spôsobené inými editormi alebo nástrojmi, ktoré používate na komunikáciu s mikrokontrolérom. V prípade editora Thonny ho môžete vypnúť v nastaveniach interpretera jazyka MicroPython .
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.

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…
Upozornenie
Ak máte dosku Raspberry Pi Pico 2 WH požičanú od cvičiaceho, tak pred odchodom z cvičenia si prosím:
- Uložte si vytvorený kód, ktorý ste na cvičení urobili.
- Zmažte obsah Flash pamäte mikrokontroléra nahratím fimrvéru flash_nuke.uf2. Pozor! Mikrokontrolér neodpájajte od počítača, pokiaľ sa vo vašom počítači znova neobjaví ako USB zariadenie.
- Nahrajte na mikrokontrolér najnovší firmvér.
Ďalšie úlohy
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
.V module
helpers.py
vytvorte funkciuto_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.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
Raspberry Pi Pico W: Getting Started with Wi-Fi (MicroPython)
MicroPython: Network basics
ISO 8601 - medzinárodný štandard pre zápis dátumu a času
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.
Last Minute Engineers: Interface DS3231 Precision RTC Module with Arduino
MicroPython Chapters: Práca s WiFi modulom
MicroPython Chapters: Čas a synchronizácia času
Peter Hinch’s Github: The DS3231 real time clock chip