====== 7. IoT zařízení - RPi Pico - WiFi ======
===== Cíle cvičení =====
* Připojení RPI Pico k IoT Brokeru, odesílání zpráv z RPI Pico
* Zachytávání zpráv z vlastního topicu
* Připojení DHT k RPI Pico
* Publikování a zachytávání dat z DHT
===== Důležité odkazy =====
* [[https://mqtt.eclipseprojects.io/|Eclipse MQTT broker]]
* [[https://docs.micropython.org/en/latest/esp8266/tutorial/dht.html|MicroPython - modul DHT]]
* [[https://github.com/micropython/micropython-lib/tree/master/micropython/umqtt.simple|GitHub - umqtt.simple]]
* [[https://cw.fel.cvut.cz/wiki/courses/b0b37nsi/hw/99|Lokální broker v učebně]]
===== Raspberry Pi Pico W =====
Import balíčků:
* [[https://github.com/micropython/micropython-lib/blob/master/micropython/umqtt.simple/umqtt/simple.py|umqtt.simple]] - pro práci s MQTT protokolem.
* [[https://docs.micropython.org/en/latest/esp8266/tutorial/network_basics.html|network]] - pro práci s Wi-Fi sítí.
* [[https://docs.micropython.org/en/latest/library/time.html|time]] - pro práci s časem.
* [[https://docs.micropython.org/en/latest/library/json.html|json]] - pro práci s JSON daty.
* [[https://docs.micropython.org/en/latest/library/machine.html|machine]] - přístup k nízkoúrovňovým funkcím zařízení.
Přehled modulů instalovaných na zařízení lze získat příkazem '''help('modules')'''.
==== Raspberry Pi Pico W - konfigurace Wi-Fi ====
**Aktivace Wi-Fi rozhraní:**
Aktivace Wi-Fi rozhraní na Raspberry Pi Pico. ''network.WLAN(network.STA_IF)'' vytvoří instanci Wi-Fi rozhraní pro STA (Station) režim, což znamená, že zařízení bude fungovat jako klient Wi-Fi sítě. ''wlan.active(True)'' pak aktivuje toto rozhraní.
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
**Přípojení k Wi-Fi síti:**
Pokus o připojení Raspberry Pi Pico k Wi-Fi síti s daným SSID a heslem.
wlan.connect(SSID, PASSWORD)
**Čekání na připojení:**
Kontorla, zda je Raspberry Pi Pico úspěšně připojen k Wi-Fi síti. Pokud není, program čeká na dobu 1 sekundy a poté zkontroluje znovu. Tento proces se opakuje, dokud není připojení úspěšné.
while wlan.isconnected() == False:
print('Waiting for connection...')
sleep(1)
**Výpis konfigurace síťového rozhraní**
Po úspěšném připojení k Wi-Fi síti se vypíše konfiguraci síťového rozhraní, která zahrnuje IP adresu, masku podsítě, bránu a DNS servery.
print(wlan.ifconfig())
==== Raspberry Pi Pico W - konfigurace MQTT ====
**Inicializace MQTT klienta**
Inicializace MQTT klienta s daným client_id, adresou SERVER a PORT MQTT brokeru. client_id je jedinečný identifikátor klienta v síti MQTT.
client = MQTTClient(client_id="RaspberryPiPico", server=SERVER, port=PORT)
client.connect()
**Příprava zprávy**
Zpráva je vytvořena jako JSON objekt, který obsahuje aktuální časové razítko a teplotu. Časové razítko je převedeno na celé číslo pro kompatibilitu s JSON.
current_timestamp = int(time())
MESSAGE = json.dumps({"time": current_timestamp, "temp": 23.5})
**Publikování zprávy**
''client.publish()'' publikuje připravenou zprávu na daný TOPIC pomocí MQTT klienta.
client.publish(TOPIC, MESSAGE)
**Výpis publikované zprávy**
print(f'Published message [{TOPIC}]: {MESSAGE}')
Tento kód vypíše publikovanou zprávu a její topic pro potvrzení, že zpráva byla úspěšně odeslána.
==== Raspberry Pi Pico W - Ukončení spojení ====
# Odpojení od MQTT brokeru
client.disconnect()
# Odpojení od Wi-Fi sítě
wlan.disconnect()
==== Připojení DHT11/22 ====
Pro měření teploty a vlhkosti lze využít DHT11/22, který je připojen prostřednictvím 1-wire sériové sběrnice. Modul '''dht''' je v Micropythonu vestavěn.
Pokud má senzor 4 vývody, jedná se o starší typ a je třeba použit externí pull-up rezistor nebo zapnout interní. Modul s třemi vývody má pull-up rezistor integrován, takže je možné připojení přímo k GPIO pinu mikrokotroléru, v tomto případě GP4.
from dht import DHT22
from machine import Pin
p = Pin(4)
d = DHT22(p)
d.measure()
d.temperature()
d.humidity()
Při připojování dejte pozor na volbu správných vývodů. GP4 je fyzicky 6. vývod, pro napájení využijte pin ''VBUS'' na 40. vývodu, na který je routováno napěti +5V z mikroUSB konektoru. Pin GND volte dle potřeby, např. 3. vývod.
Pokud čtení informace ze senzoru trvá příliš dlouho a docházi k timeoutu, lze kód zlepšit:
from machine import Pin
from dht import DHT22
import time, sys
p = Pin(4)
d = DHT22(p)
while True:
try:
d.measure()
time.sleep(2)
tem = d.temperature()
hum = d.humidity()
print('Temp:', hum, 'C\tHumidity', tem, '%')
time.sleep(1)
except OSError as e:
print("Cant read:", e)
sys.print_exception(e)
Další informace:
* https://docs.micropython.org/en/latest/esp8266/tutorial/dht.html
* https://randomnerdtutorials.com/micropython-mqtt-publish-dht11-dht22-esp32-esp8266/
===== Zadání 5. miniprojektu =====
Rozšiřte svou IoT platformu o podporu MQTT komunikace přes internet. Vytvořte program pro Raspberry Pi Pico W který se přípojí k dostupné Wi-Fi sítí pomocí které bude Pico publikovat zprávy s daty (timestamp, teplota) do MQTT topicu. Z tohoto topicu bude Flask aplikace odebírat zprávy nad kterými provede kontrolu, zda jsou ve správném formátu. Pokud budou data správně formátovaná, pak se uloží do databáze a budou dostupna skrze webové rozhraní i REST API.
MQTT komunikace NENAHRAZUJE UART komunikaci. Bude možné posílat data jak prostřednictvím MQTT, tak i UART.
Bonus:
* Vytvořte obousměrnou komunikaci tak, aby bylo možné měnit periodu odesílání dat z Raspberry Pi
* Do webového rozhraní implemetujte indikaci komunikace na rozhraní. Na webovém rozhraní bude zobrazeno, jaké komunikační rozhraní je aktivní (UART, MQTT) a kdy z daného rozhraní přišla poslední data