Ciao a tutti, sono nuovo sul forum e colgo l'occasione per presentarmi.
Ho costruito un programma che mi monitori temperatura ed umidità attraverso il dht11 e che me la stampi sul lcd 16x2, sul monitor seriale e su un file di testo su una SD.
come slitta SD compresa di RTC usa una dollatek x-502.
il programma si compila senza nessun errore e va alla perfezione se non fosse per il display, che fa visualizzare solo ciò che è scritto nel setup. Appena entro nel loop il display si accende tutto con i numeri 3.
Premetto che non ho utilizzato il collegamento i2c e che se è possibile vorrei non utilizzarlo poichè non arriverei con i tempi in quanto dovrei acquistarlo su internet.
spero che qualcuno di voi possa aiutarmi, vi lascio a seguire lo sketch;
#include <LiquidCrystal.h> //libreria del display LCD
#include <dht11.h> //libreria del sensore temperatura ed umidità
#include <SD.h> //libreria per la SD
#include <SPI.h> //libreria per la SD
#include "RTClib.h" //libreria RTC (real time clock)
#define DHT11_PIN A3 // definizione del sensore sul pin analogico A3
dht11 DHT; //definizione del tipo di sensore dht utilizzato
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //dichiarazione pin del display
RTC_DS1307 rtc; //definizione del tipo di sensore RTC utilizzato
DateTime now;
const int chipSelect = 10; //riferito alla slitta SD
File file;
int temp = 0; //variabile che ospita il valore della temperatura
int um = 0; //variabile che ospita il valore dell'umidità
int temp_min = 0; //variabile che ospita il valore della temperatura min. registrata
int um_min = 0; // variabile che ospita il valore dell'umidità min. registrata
int temp_max = 0; //variabile che ospita il valore della temperatura max. registrata
int um_max = 0; //variabile che ospita il valore dell'umidità min. registrata
int c1, c2; //variabili iniziali per umidità min. e temperatura min.
char set [7][4] = { "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"}; //array che contiene al suo interno i giorni della settimana
void setup() {
//inizializzazione del display con prima scritta
lcd.begin(16, 2); //inizializzazione del display. Il display LCD usato è un 16x2
Serial.begin(9600); //apertura della porta seriale alla velocità di 9600kb
lcd.setCursor(0, 0); //prima scritta all'avvio di arduino, riga 0 colonna 0
lcd.print(" Stazione meteo ");
lcd.setCursor(0, 1); //seconda scritta all'avvio di arduino, riga 1 colonna 0
lcd.print(" Classe 5^B ");
delay(2000); //delay di 2000ms prima che il programma esegui il loop
//verifica rtc
if (!rtc.begin()) {
Serial.println("Errore RTC");
return;
}
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// verifica SD
if (!SD.begin(10)) {
Serial.println ("Errore SD");
return;
}
Serial.println ("Inizializazione SD");
if (SD.exists ("example.txt")) {
SD.remove ("example.txt");
}
file = SD.open ("example.txt", FILE_WRITE);
file.write ("Benvenuti nella stazione meteorologica");
file.close();
}
void loop() {
lcd.clear(); //pulizia dello schermo
int lett = DHT.read(DHT11_PIN); //abilito lettura dht11
temp = DHT.temperature; //la variabile temp sarà uguale alla temperatura registrata dal sensore
um = DHT.humidity; //la variabile um sarà uguale alla umidità registrata dal sensore
//stampo valori sul display lcd
lcd.setCursor(0, 0);
lcd.print("Umidita' : "); //stampa la frase umidità alla riga 0 e colonna 0
lcd.print(DHT.humidity); //stampa il valore che il sensore ha immagazzinato nella variabile um
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Temperat.: "); //stampa la frase Temperat alla riga 1 e colonna 0
lcd.print(DHT.temperature); //stampa il valore che il sensore ha immagazzinato nella variabile temp
lcd.print((char)223); //stampa il simbolo del centigrado
lcd.print("C");
delay(3000); //delay prima di visualizzare a schermo temp,um max e min
//riempio variabili um_min e tem_min per la misura iniziale
//concatenazione di if per stabilire la temperatura e l'umidità massima e minima
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
//la sintassi utilizzata è la stessa di quella adoperata per stampare la temperatura e l'umidità istantanee
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Umid. max.: ");
lcd.print(um_max);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Temp. max.: ");
lcd.print(temp_max);
lcd.print((char)223);
lcd.print("C");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Umid. min.: ");
lcd.print(um_min);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Temp. min.: ");
lcd.print(temp_min);
lcd.print((char)223);
lcd.print("C");
delay(3000);
//scrittura su monitor seriale
DateTime now = rtc.now();
if (mytimer(57000)) {
Serial.print(now.year(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.day(), DEC);
Serial.print("(");
Serial.print(set[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(":");
Serial.print(now.second(), DEC);
Serial.print(" Temperatura:");
Serial.print(DHT.temperature);
Serial.print("^");
Serial.print("C");
Serial.print(" Umidita':");
Serial.print(DHT.humidity);
Serial.print("%");
Serial.println();
}
//scrittura su sd
if (mytimer2(57000)) {
file = SD.open ("example.txt", FILE_WRITE);
file.print(now.year(), DEC);
file.print("/");
file.print(now.month(), DEC);
file.print("/");
file.print(now.day(), DEC);
file.print("(");
file.print(set[now.dayOfTheWeek()]);
file.print(") ");
file.print(now.hour(), DEC);
file.print(":");
file.print(now.minute(), DEC);
file.print(":");
file.print(now.second(), DEC);
file.print(" Temperatura:");
file.print(DHT.temperature);
file.print("^");
file.print("C");
file.print(" Umidita':");
file.print(DHT.humidity);
file.print("%");
file.println();
file.close();
}
}
//funzione per il timer della scrittura sulla seriale
int mytimer (int timer1) {
static unsigned long t1, ddt;
int ret = 0;
ddt = millis() - t1;
if (ddt >= 57000) {
t1 = millis();
ret = 1;
}
return ret;
}
//funzione per il timer della scrittura su sd
int mytimer2 (int timer2) {
static unsigned long t2, ddt;
int ret = 0;
ddt = millis() - t2;
if (ddt >= 57000) {
t2 = millis();
ret = 1;
}
return ret;
}