Buona sera a tutti, seguendo vari tutorial in rete sono riuscito a mettere insieme
uno sketch per un termometro che mi vizualizza ora, data, temp, temp minima e max idem per l'umidità
avendo usato un dht11.
A tale termometro vorrei aggiungere un relè in modo da eccitarlo sopra una certa soglia.
Nello sketch ho inserito in fondo al codice la funzione if per determinare il range di temperatura
purtroppo non capisco perché il relè si ecciti in modo casuale e non segua il range di temperatura impostata.. vi è qualche anima pia che potrebbe dare un occhiattina al codice e dirmi dove sbaglio?
Sono giorni che ci sbatto la testa.. un grazie anticipato.
/* Stazione meteo Arduino v1.0
*
*/
#include <Wire.h> //libreria che consente la comunicazione con i2c
#include <LiquidCrystal_I2C.h> //libreria display i2c
#include "RTClib.h"
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN A2
//////////////////////addr, en,rw,rs,d4,d5,d6,d7,bl, blpol
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //impostazione indirizzo del display e pin del display LCD collegati all'i2c
RTC_DS1307 RTC;
int temp=0; //raccoglie misura temperatura
int um=0; //raccoglie misura umidità
int temp_min=0; //si ricorda della temperatura min. registrata
int um_min=0; //si ricorda dell'umidità min. registrata
int temp_max=0; //si ricorda della temperatura max. registrata
int um_max=0; //si ricorda dell'umidità min. registrata
int c1, c2; //variabili iniziali per um_min e temp_min
int rele=13;
void setup() {
lcd.begin(16,2); //inizializzo il display. Il display LCD usato è 16x2
Serial.begin(9600);
lcd.setCursor(3,0); //scritta all'avvio di arduino
lcd.print(" Meteo ");
lcd.setCursor(11,1);
lcd.print(" 1.0 ");
delay(3000);
pinMode(rele, OUTPUT);
}
void loop() {
DateTime now = RTC.now();
lcd.clear();
int chk = DHT.read(DHT11_PIN); //abilito lettura dht11
temp=DHT.temperature; //raccolgo misura temperatura
um=DHT.humidity; //raccolgo misura umidità
//stampo valori sul display lcd
lcd.setCursor(1, 0);
if ( now.hour() < 10)
{
lcd.print(" ");
lcd.print(now.hour(), DEC);
}
else
{
lcd.print(now.hour(), DEC);
}
lcd.print(":");
if ( now.minute() < 10)
{
lcd.print("0");
lcd.print(now.minute(), DEC);
}
else
{
lcd.print(now.minute(), DEC);
}
lcd.setCursor(10, 0);
lcd.print("T:");
lcd.print(DHT.temperature,1);
lcd.write(0b11011111);
lcd.print("C");
lcd.setCursor(0, 1);
if ( now.day() < 10)
{
lcd.print("0");
lcd.print(now.day(), DEC);
}
else
{
lcd.print(now.day(), DEC);
}
lcd.print("/");
if ( now.month() < 10)
{
lcd.print("0");
lcd.print(now.month(), DEC);
}
else
{
lcd.print(now.month(), DEC);
}
lcd.print("/");
lcd.print(now.year(), DEC);
lcd.print("");
lcd.setCursor(11, 1);
lcd.print("U:");
lcd.print(DHT.humidity,1);
lcd.print("%");
delay(25000);
//riempio variabili um_min e tem_min per la misura iniziale
if (c1==0) {
um_min=um;
}
if (c2==0) {
temp_min=temp;
}
if (temp>temp_max) {
temp_max=temp;
}
if (um>um_max) {
um_max=um;
}
if (um_min>=um) {
um_min=um;
c1++;
}
if (temp_min>=temp) {
temp_min=temp;
c2++;
}
//stampo statistiche: um_max, um_min, temp_max, temp_min
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp. max.: ");
lcd.print(temp_max);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Umid. max.: ");
lcd.print(um_max);
lcd.print("%");
delay(9000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp. min.: ");
lcd.print(temp_min);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Umid. min.: ");
lcd.print(um_min);
lcd.print("%");
if (temp >28) {
digitalWrite(rele, LOW );
}
else {
digitalWrite(rele, HIGH );
delay(2000);
}
}