Aggiungere un display alla nostra stazione meterologica

Rieccomi! E’ passato un pò di tempo dall’ultimo post. Per ricominciare ho pensato di modificare un progetto precedente, quello della stazione metereologica, aggiungendo un display informativo. Ecco l’aspetto finale:
La stazione metereologica nella sua nuova forma

Ma partiamo dall’inizio. Innazitutto ho scelto di ospitare il tutto in un contenitore per oggetti elettrici da esterno, fissando le varie componenti con del nastro biadesivo spesso. Dopodicchè ho montato sulla mia scheda arduino un proto-shield che mi permettere di avere una mini breadboard a disposizione sopra la scheda stessa. Quindi ho montato i vari componenti, il display OLED 128×32, il sensore di temperatura e umidità DHT11 e il sensore di pressione BMP180, che però si è rivelato non funzionante e quindi non verrà preso in considerazione 🙁

Il display si collega via I2C quindi usa i pin analogici 4-5 oltre a 3.3 V e GND, mentre il sensore DHT11 usa un pin digitale a scelta, nel mio caso il 4. Tutto qui. Se ci fosse stato anche il sensore BMP180 che usa anch’esso il protocollo I2C andrebbero messi due ponticelli verso la breadboard dai pin analogici 4-5 e poi collegare entrambi i device sulle stesse linee. Da codice poi si può distinguere i dispositivi con un indirizzo esadecimale.

Ma veniamo al codice. Questo è lo sketch da me utilizzato. Come si può vedere è molto straight-forward ed oltre a mostrare temperatura e umidità relativa (rilevata un pò per difetto a dire il vero), calcola anche il dew-point, ovvero il punto di rugiada, ed in base a questo mostra dei pallini ad indicare l’indice del calore percepito. Da due “oo” per molto confortevole a 8 “oo” per molto elevato.

#include <gfxfont.h>
#include <Adafruit_GFX.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_SSD1306.h>

#include <DHT.h>
#include <SPI.h>
#include <Wire.h>

#define DHTPIN 4
DHT dht(DHTPIN, 11);
Adafruit_SSD1306 display(4);

void setup() {
Serial.begin(9600);
dht.begin();
}

void loop() {
double temperature, humidity, dew_point;
temperature = dht.readTemperature();
humidity = dht.readHumidity();
dew_point = temperature - (80 - humidity) / 5;

Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(", temperature: ");
Serial.print(temperature);
Serial.print(", heat index: ");
Serial.println(dht.computeHeatIndex(dht.readTemperature(), dht.readHumidity(), false));

//display start
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.clearDisplay();

display.print("Temp: ");
display.println(temperature, 0);

display.setTextSize(1);
display.print("%humidity: ");
display.println(humidity, 0);

//display.print("Dew: ");
//display.println(dew_point, 0);

display.print("#index: ");
if (dew_point > 11) display.print("oo");
if (dew_point > 13) display.print("oo");
if (dew_point > 19) display.print("oo");
if (dew_point > 25) display.print("oo");

display.display();
delay(5000);
}

E questo è tutto. Alla prossima! 🙂

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *