Es tracta de recuperar les dades del nostre canal i mostrar-les en una pantalla LCD.
Idea: Utilitzar 2 pantalles I2C, que tenen la mateixa adreça I2C.
Podem mostrar:
pantalla 1: temperatura i llum
pantalla 2: pressió i humitat
l'index UV el mostrarem amb una tira de leds Neopixel
vull utilitzar també una pantalla OLED per mostrar data i hora
LCD1 + OLED -> GPIO 21 (SDA), GPIO 22 (SCL). Pins I2C per defecte
LCD2 -> GPIO 19 (SDA), GPIO 18 (SCL). Nous pins I2C
Neopixel -> Pin 23
TBreak -> Pin 15
Recuperem les dades de Thingspeak
Comencem recuperant les dades del nostre canal i mostrant-les en la consola.
L'ESP32 pot recuperar les dades en format JSON (JavaScript Object Notation), un estàndard per codificar dades en text.
Podem accedir-hi a les dades JSON del nostre canal mitjançant la URL api.thingspeak.com/channels/IDdelcanal/feeds.json
Aquesta és la meva https://api.thingspeak.com/channels/1825502/feeds.json
Per recuperar només el darrer valor cal afegir ?results=1 a continuació de la URL. En el meu cas:
https://api.thingspeak.com/channels/1825502/feeds.json?results=1
Canal definitiu de l'estació meteorològica a Thingspeak:
Eliminem les pauses bloquejants
Usem ticks_ms per definir temps consultant el rellotge
Treballem amb pantalles LCD
Adreça I2C
Necessitarem conèixer l'adreça I2C de les pantalles.
Fem-ho executant el programa I2C scan
Llibreries
Necessitarem dues libreries: lcd_api.py i i2c_lcd.py
Copieu o descarregueu el codi d'aquests dos programes i deseu-los a la carpeta lib del vostre dispositiu MicroPython amb els noms lcd_api.py i i2c_lcd.py
Mostrem les dades en LCD
Utilitzem dues LCD, per visualitzar 2 dades en cadascuna
Treballem amb Neopixel
Nivell UV Color Significat
0–2 Verd Baix
3–5 Groc Moderat
6–7 Taronja Alt
8–10 Vermell Molt alt
11+ Violeta Extrem
Sobre els colors (intensitat de la llum):
np[0] = (255, 0, 0) # set to red, full brightness
np[1] = (0, 128, 0) # set to green, half brightness
np[2] = (0, 0, 64) # set to blue, quarter brightness
Mostrem l'index UV amb una tira de LEDs
Problema: volem associar els colors neopixel (núm enter) al valor recuperat de uv (text).
A la funció colors(), on fem aquesta associació, cal convertir-lo primer en nombre decimal (float), i després en enter (int). La conversió directa no funciona.
uv_num = float(uv) # coversió a nombre decimal
uv_int = int(uv_num) # conversió a nombre enter
if uv_int <= 2:
Treballem amb pantalles OLED
Adreça I2C
Necessitarem conèixer l'adreça I2C de la pantalla.
Fem-ho executant el programa I2C scan
Llibreries
Necessitarem la libreria ssd1306.py
Copieu o descarregueu el codi d'aquest programa i deseu-lo a la carpeta lib del vostre dispositiu MicroPython amb el nom ssd1306.py
OLED. Pautes generals de connexió i programació
La hora en España es UTC+1 en invierno y UTC+2 en verano
UTC: Universal Time Coordinated
Mostrem data i hora en OLED
Ara mateix la funció get_datetime() llegeix la data i hora local de l'RTC, però no fa una sincronització NTP. Si volem que mostri sempre l'hora correcta, podem afegir sincronització amb un servidor NTP.
Racionalitzem el consum
Mesures proposades per reduir el consum -> augmentar l'autonomia del sistema:
Reducció lluentor neopixels. FET
Connexió intermitent a WiFi
Mode light sleep en els períodes d'inactivitat
Pantalles LCD. Possible problema:
El backlight de les pantalles no s'encén. Segons ChatGPT, el possible problema és que no hagi suficient corrent disponible:
El pin 5V de l'ESP32 no pot subministrar molta potència. Normalment depèn de com l'alimentis (USB? font externa?).
Una pantalla LCD típica (especialment amb backlight) pot consumir 50-150 mA o més.
Dues pantalles sumades poden demanar més corrent del que l'ESP32 pot donar, provocant que no s'encenguin.
Se m'acudeixen algunes opcions:
Utilitzar només 1 LCD i alternar visualitzacions
Utilitzar 2 LCD i alternar funcionament (que no estiguin les dues funcionant a l'hora ni amb el backlight encés a l'hora)
Utilitzar una LCD de 20x4.
Podrem utilitzar un únic bus I2C per LCD i OLED.
Aconseguirem: < connexions + < consum