Nell’articolo precedente ho descritto la costruzione di una Stazione meteo basata su Arduino utilizzando materiale di recupero o comunque presente nel mio laboratorio. L’appetito vien mangiando e mi sono posto una sfida….ne realizzo una da zero super economica….Wireless!
Apro il sito di e-commerce con gli occhi a mandorla e prendo la mia carta di credito ricaricabile…
Sulla carta c’erano ben 4,7 Euro!
E che ci fai? Direte voi….ma su questi siti sono un capitale! 🙂
Iniziamo con la lista della spesa.
- Scheda NodeMcu (cugino di Arduino, si programma con lo stesso IDE ma ha Wireless integrato, 80Mhz di controllore e tanta tanta memoria in più)
- Pannello solare da 6volt 100mA
- Sensore di Temperatura/Umidità/Pressione BME280
- Regolatore di carica per celle LiPo
Avanza ancora qualche centesimo….compro anche un secondo pannello solare e un secondo regolatore di carica. Totale spesa 4,6 Euro.
In città compro una normale cassetta stagna da elettricista e procuro una batteria a LiPo proveniente da un notebook.
Dopo 20 giorni arriva tutto….iniziamo a saldare!
Parto con una prima configurazione : Controllore Wifi + Scheda di regolazione di carica (D1 Battery shield) e un sensore di Temperatuta Umidità DHT11
Dovrebbe essere lavoro di un oretta…ma non e’ cosi!
La scheda che gestisce la tensione nasce per la famiglia Wemos di microcontrollori e oltre a gestire la carica di una sola cella LiPo (3,7Volt) ha incorporato un circuito di StepUp che porta la tensione a 5V che io collego direttamente alla Vin della scheda NodeMcu.
Il regolatore di carica non nasce per lavorare con un pannello solare…ma per essere alimentato/caricato da una sorgente a 5v proveniente da una presa USB. Il pannello solare sappiamo che fornisce una tensione variabile in base alla quantità di luce (sole) che lo colpisce….e questo al regolatore non andava giù!
Nello specifico se collegavamo il tutto con il sole o con la notte andava tutto bene…ma alla prossima transizione notte/giorno andava tutto in palla. Si creava un punto in cui come tensione di uscita c’erano solo 3 volt….troppo bassi per l’ingresso Vin di NodeMcu.
In fase di sperimentazione (e senza aver risolto il problema alimentazione) apporto le prime modifiche. Il sensore viene sostituito con un più performante BME280 che sfrutta il protocollo I2C per inviare oltre alla Temperatura e Umidità…anche la Pressione atmosferica.
Viene aggiunto anche un punto di controllo della tensione della batteria interna…finezze!
Ecco un primo schema
Troppi componenti e troppa poca corrente per alimentare il tutto….dobbiamo risparmiare!
La batteria fornisce circa 2000mA (non 110 come da immagine), NodeMcu ne consuma 100…il pannellino solare…ne fornisce 100 di giorno a sole pieno. C’e’ da spegnere qualcosa e utilizzare qualche trucchetto.
Iniziamo a spegnere! Avere tutti i dati inviati online ogni secondo non ha senso…diciamo che possiamo tranquillamente allungare il tempo tra una lettura e l’altra anche a 10 minuti.
A noi cambia poco….la durata della batteria di allunga in maniera esponenziale.
Tra una lettura e l’altra…spegniamo tutto. Mandiamo il microcontrollore in DeepSleep.
Tramite un comando (e un ponticello che connette il pin D0 al pin Reset) riusciamo a spegnere tutto e portare l’assorbimento a meno di 1mA.
Avremmo comunque il sensore sempre sotto tensione che assorbe preziosa energia.
Spostiamo (come da schema) il Vcc del BME280 su un Pin gestibile da codice e lo accendiamo solo quando serve.
Dopo ogni accensione ho aggiunto qualche secondo di attesa (delay) prima della lettura per far riscaldare il sensore e rendere le letture più veritiere.
Non contento aggiungo la lettura della tensione batteria. Per far ciò utilizzo il pin A0 (analogico) per leggere la tensione.
Il problema sta nel fatto che l’ingresso analogico restituisce un valore che va da 0 a 1023 leggendo rispettivamente da 0 a 1Volt.
Sul circuito stesso e’ presente un partitore resistivo formato da 2 resistenze da 220k e 100k che permettono di leggere da 0 a 3.3 volt…ma una batteria al Litio arriva al massimo della sua carica a 4.2Volt!
Carta, penna e calcolatrice alla mano….aggiungo una resistenza da altri 220K e alzo la lettura fino a 5Volt (più precisamente 5.1).
Iniziamo ad assemblare
Iniziamo a programmare…cercando di risolvere con qualche altro trucchetto da codice il problema dell’alimentazione.
Niente…al passaggio tra notte e giorno (e viceversa) si blocca tutto.
Mi viene in aiuto un altro gestore di carica della batteria il TP4056 al quale lascerò il pensiero della carica della batteria e utilizzerò il secondo gestore di carica solo come StepUp per portare la tensione a 5V.
Cambia lo schema
Sembra abbiamo risolto il tutto in questo modo non ci sono più sbalzi di tensione e il caro NodeMcu puo’ lavorare tranquillamente.
Ecco il risultato finale
Inseriti nel codice i dati della mia rete Wireless posso inviare i dati al portale Thingspeak
Di seguito il codice commentato per chi volesse cimentarsi nella replica…..mi raccomando le librerie!
#include <Wire.h> #include <Adafruit_BME280.h> #include <ESP8266WiFi.h> #include <ThingSpeak.h> unsigned long myChannelNumber = NUMERO CANALE; const char * myWriteAPIKey = "API KEY"; const char* ssid = "SSID WIRELESS"; const char* password = "CHIAVE WPA"; const char* server = "api.thingspeak.com"; WiFiClient client; Adafruit_BME280 bme; // I2C void setup() { pinMode(D1, OUTPUT); digitalWrite(D1, HIGH); // accendo e alimento il sensore delay(10000); //attendo 10 secondi per riscaldare il sensore Wire.begin(D3, D2); // cambio impostazioni I2C Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); if (!bme.begin()) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } ThingSpeak.begin(client); } void loop() { float t = bme.readTemperature(); float p = bme.readPressure(); float h = bme.readHumidity(); int s = analogRead(A0); float volt = s * (5.1 / 1024); // ricavo i volt dal partitore resistivo Serial.print("Temperatura: "); Serial.print(t); Serial.print(" °C Pressione: "); Serial.print(p); Serial.print(" Umidità: "); Serial.print(h); Serial.print(" Voltaggio: "); Serial.print(volt); Serial.println("V ... invio a Thingspeak"); ThingSpeak.setField(1, t); ThingSpeak.setField(2, p); ThingSpeak.setField(3, h); ThingSpeak.setField(4, volt); ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); delay(2000); ESP.deepSleep(10*60*1000000); // spengo tutto per 10 minuti }
Alla prossima!
Ho testato il tutto per qualche giorno e mi sono accorto che il modulo di ricarica della batteria…direttamente connesso al pannellino solare non funziona bene!
Con il sole presente alle mie latitudini il pannello solare arriva a sviluppare anche 7 volt a vuoto. Superati i 6v il modulo di ricarica va in protezione e stacca tutto.
Si perde così tantissimo sole prezioso e la stazione va a morire.
Ho risolto il tutto aggiungendo 3 diodi 1N4007 in serie sul positivo del pannello solare. La tensione totale si abbassa di circa 1,8volt e il tutto continua a funzionare anche con il sole a picco sulla stazione.
Buon lavoro!