====== 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