## RPi Pi Pico W 101 [mirek](https://bletvaska.github.io) / [**Namakaný webinár**](http://www.namakanyden.sk)
notes: * https://projects.raspberrypi.org/en/projects/get-started-pico-w/0
## Vlastnosti RP2040 * mikrokontrolér RP2040 * Dual-Core Arm Cortex-M0+ @ 133MHz * 264kB pamäť SRAM, 2MB flash pamäť
![Infineon Logo](images/logo-infineon.png) [CYW43439](https://www.infineon.com/cms/en/product/wireless-connectivity/airoc-wi-fi-plus-bluetooth-combos/wi-fi-4-802.11n/cyw43439/) (jednopásmové **WiFi** 4 (802.11n) + **Bluetooth®** 5.2)
[![](images/citron.base.board.jpg)](https://rpishop.cz/pico-karty/3854-cytron-maker-pi-pico-base-deska-pro-pi-pico-pro-zacatecniky.html)
![](images/etl.png) note: * https://www.fivetran.com/learn/data-pipeline-vs-etl
``` [ extract_data ] --> [ transform_data ] --> [ load_data ] ```
## Pico Projekt 0. príprava prostredia 1. pripojenie k WiFi 2. stiahnutie aktuálneho počasia zo služby [openweathermap.org](https://openweathermap.org/) cez HTTP 3. odoslanie údajov do [Adafruit IO](https://io.adafruit.com/) cez HTTP 4. odoslanie údajov do [Adafruit IO](https://io.adafruit.com/) cez MQTT * stiahnutie knižnice 5. pravidelné spúšťanie * cez nekonečnú slučku * uspatím
## 1. Príprava prostredia
[![McroPython](images/logo-micropython.png)](https://micropython.org/) [![Thonny](images/logo-thonny.png)](https://thonny.org/) notes: * inštalácia prostredia Thonny
### MicroPython -> Pico [![](images/flashing.micropython.gif)](https://www.raspberrypi.com/documentation/microcontrollers/micropython.html) notes: * inštalácia MicroPython-u * stlačenie `Bootsel` tlačidla na doske * inštalácia cez tlačidlo vpravo dole * nebáť sa nainštalovať nočné zostavenie * Hello, world!
## 2. Pripojenie k WiFi
```python def do_connect(ssid, password): import network wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print(f'>> Connecting to network "{ssid}"...') wlan.connect(ssid, password) while not wlan.isconnected(): pass print('>> Network config:', wlan.ifconfig()) ``` zdroj: [docs.micropython.org](https://docs.micropython.org/en/latest/esp32/quickref.html#wlan)
## 3. Stiahnutie aktuálneho počasia
```python import requests def extract_data(query: str, units: str, appid: str) -> dict: url = ( 'https://api.openweathermap.org/data/2.5/weather?' f'q={query}&units={units}&appid={appid}' ) response = requests.get(url) data = response.json() response.close() return data ```
[![Adafruit IO](images/logo-adafruitio.png)](https://io.adafruit.com/) Cloudová služba pre projekty Internetu vecí notes: * https://io.adafruit.com/api/docs/#adafruit-io-http-api * ukážka rozhrania * predstaviť koncept `Feeds` a `Groups` * vytvoriť skupinu `weather` a feed-y pre teplotu, vlhkosť a tlak * ukázať _Feed Info_ s tým, že nás bude zaujímať linka na API: `https://io.adafruit.com/api/v2/bletvaska/feeds/weather.humidity`
## 4. Odoslanie údajov do [Adafruit IO](https://io.adafruit.com/) cez protokol HTTP
### Odoslanie metriky cez protokol HTTP ```bash $ http post \ https://io.adafruit.com/api/v2/{user}/feeds/{group}.{feed}/data \ X-AIO-Key:{aio_key} \ datum:='{ "lat": 48.6667, "lon": 21.3333, "value": 6.86, "created_at": "2024-10-1T20:36:22Z" }' ```
### Spracovanie údajov ```python def to_iso8601(ts: int) -> str: dt = time.gmtime(ts) return f'{dt[0]:04}-{dt[1]:02}-{dt[2]:02}T{dt[3]:02}:{dt[4]:02}:{dt[5]:02}Z' ``` ```python def transform_data(data: dict) -> dict: return { 'dt' : to_iso8601(data['dt']), 'lat' : data['coord']['lat'], 'lon' : data['coord']['lon'], 'metrics' : { 'temp' : data['main']['temp'], 'humidity' : data['main']['humidity'], 'pressure' : data['main']['pressure'] } } ```
### Odoslanie údajov cez HTTP ```python def load_data(aio_username: str, aio_key: str, group: str, data: dict): headers = {'X-AIO-Key': aio_key} for feed in data['metrics']: url = f'https://io.adafruit.com/api/v2/{aio_username}/feeds/{group}.{feed}/data' payload = { 'value': data['metrics'][feed], 'lat': data['lat'], 'lon': data['lon'], 'created_at': data['dt'] } response = requests.post(url, headers=headers, json=payload) response.close() ```
## 5. Odoslanie údajov do [Adafruit IO](https://io.adafruit.com/) cez protokol MQTT
## [`pipkin`](https://github.com/aivarannamaa/pipkin) nástroj na inštaláciu balíkov pre [MicroPython](https://micropython.org/) a [CircuitPython](https://circuitpython.org/) (podpora v editore [Thonny](https://thonny.org/)) notes: * instalovat modul `umqtt.simple` * ak nepojde, tak rucne: ```python import mip mip.install('umqtt.simple') ```
### Odoslanie metriky cez protokol MQTT ```bash $ mosquitto_pub -h io.adafruit.com -u {user} -P {key} \ -t {user}/feeds/{group}.{feed} \ -m '{ "lat": 48.6667, "lon": 21.3333, "value": 6.86, "created_at": "2024-10-1T20:36:22Z" }' ```
### Odoslanie skupiny metrík cez protokol MQTT ```bash $ mosquitto_pub -h io.adafruit.com -u {user} -P {key} \ -t {user}/groups/{group} \ -m '{ "feeds": { "pressure": 1016, "humidity": 94, "temp": 7.54 }, "location": { "lat": 48.6667, "lon": 21.3333 } }' ```
### Odoslanie údajov cez [MQTT](https://github.com/micropython/micropython-lib/tree/master/micropython/umqtt.simple) ```python from umqtt.simple import MQTTClient def load_data_mqtt(aio_username: str, aio_key: str, group: str, data: dict): topic = f'{aio_username}/groups/{group}' payload = { "feeds": { "temp": data['metrics']['temp'], "humidity": data['metrics']['humidity'], "pressure": data['metrics']['pressure'], }, "location": { 'lat': data['lat'], 'lon': data['lon'], } } client = MQTTClient(unique_id(), 'io.adafruit.com', 1883, aio_username, aio_key) client.connect() client.publish(topic, json.dumps(payload)) client.disconnect() ```
## 6. Pravidelné spúšťanie
### ...v nekonečnej slučke ```python if __name__ == '__main__': while True: main() print(f'>> going to sleep for {INTERVAL} minuts') time.sleep(INTERVAL * 60) ```
### ...hlbokým uspaním ```python if __name__ == '__main__': main() print(f'>> going to sleep for {INTERVAL} minutes') machine.deepsleep(INTERVAL * 60 * 1000) ```
### Bonus: Dekorátor osvietenia
```python from machine import Pin def enlight(func): def wrapper(*args, **kwargs): led = Pin('LED', Pin.OUT) led.on() func(*args, **kwargs) led.off() return wrapper ```
## Otázky?
## Kde kúpiť? * [RPishop.cz](https://rpishop.cz/raspberry-pi-pico/5074-raspberry-pi-pico-wh.html) - 8.04 Eur * [RLX.sk](https://rlx.sk/sk/raspberry-pi-pico-rp2040/8944-raspberry-pi-pico-w-pico-rp2040-incl-header-wireless-lan-and-bluetooth-52-cyw43439.html) - 13.10 Eur
notes: * https://www.hackster.io/news/raspberry-pi-unveils-the-pico-2-powered-by-the-dual-architecture-quad-core-rp2350-605253ab1235
![qr code](https://api.qrserver.com/v1/create-qr-code/?data=https://bit.ly/3Y5Xv3j&size=300x300) (**https://bit.ly/3Y5Xv3j**)