Buongiorno ragazzi,
ho provato di tutto (entro le mie piccole conoscenze) e non sono riuscito a risolvere il mio problema.
Questo è lo sketch completo:
/*
PIN SD CARD: 10-11-12-13
PIN LCD: 9-8-6-5-4-3
PIN POMPA: 2
PIN VENTOLA: 1
PIN DHT: 7
PIN DIGITALI LIBERI: 0
PIN RTC: A4-A5
PIN TERRENO ANALOGICO: A3
PIN ANALOGICI LIBERI: A0-A1-A2
*/
#include <SD.h>
#include <Wire.h>
#include "DHT.h"
#include <HCRTC.h>
#include <LiquidCrystal.h>
#include "RTClib.h"
#define I2CDS1307Add 0x68
#define SD_CS_DIO 10
#define DHTPIN 7
#define DHTTYPE DHT22
int umidita = 0;
int siccita = 0;
int pompa = 2;
int ventola = 1;
int ht = A3;
const int chipSelect = 10;
Sd2Card card;
SdVolume volume;
SdFile root;
HCRTC HCRTC;
File DataFile;
DHT dht(7, DHT22);
LiquidCrystal lcd(9, 8, 6, 5, 4, 3);
void setup() {
pinMode(pompa, OUTPUT);
pinMode(ventola, OUTPUT);
pinMode(ht, INPUT);
pinMode(DHT22, INPUT);
pinMode(10, OUTPUT);
RTC_DS1307 rtc;
RTC_DS1307 RTC;
Serial.begin(9600);
SD.begin();
lcd.begin(8, 2);
dht.begin();
RTC.begin();
Wire.begin();
/*/.......PRESENTAZIONE..........
lcd.setCursor(0, 0);
lcd.print("Prog per");
lcd.setCursor(0, 1);
lcd.print("semenzai");
delay( 2500 );
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("...by...");
lcd.setCursor(1, 1);
lcd.print("gianky");
delay( 2500 );
lcd.clear();
.....FINE PRESENTAZIONE......
*/
analogReference(INTERNAL);
RTC.adjust(DateTime(__DATE__, __TIME__));
//HCRTC.RTCWrite(I2CDS1307Add, 17, 2, 18, 00, 0, 0, 2); impostare una data predefinita
Serial.begin(9600);
pinMode(10, OUTPUT);// change this to 53 on a meg
}
void loop(){
//LETTURE SENSORI
//temperatura e umidità dell'aria
float sommagradi = 0;
float sommaumidita = 0;
float mediagradi = 0;
float mediaumidita = 0;
float hterreno = 0;
float h = dht.readHumidity();//con DHT22 modificare a float
float t = dht.readTemperature();//con DHT22 modificare a float
if (isnan(h) || isnan(t)) {
Serial.println("Errore lettura DHT");
lcd.setCursor(0, 0);
lcd.println("Err lett");
lcd.setCursor(0, 1);
lcd.println("DHT");
delay(2500);
lcd.clear();
return;
}
//calcolo media umidità
for(int i=0;i<=4;i++){
h = dht.readHumidity();
sommaumidita = sommaumidita +h;
delay(2000);
}
mediaumidita = sommaumidita/5;
//calcolo media temperatura
for(int i=0;i<=4;i++){
t = dht.readTemperature();
sommagradi = sommagradi + t;
delay(2000);
}
mediagradi = sommagradi/5;
//lettura e dichiarazioni variabili di sensore umidità terreno
int terreno = A3;
int valterreno = 0;
int sommavalterreno = 0;
float mediavalterreno = 0;
valterreno = analogRead(terreno);
siccita = map (mediavalterreno, 0, 1023, 0, 100);
hterreno = 100-siccita;
if (mediaumidita >= 80 || t > 30) {
digitalWrite(ventola, HIGH);
} else {
digitalWrite(ventola, LOW);
}
if (hterreno <=50) {
digitalWrite(pompa, HIGH);
} else {
digitalWrite(pompa, LOW);
}
//PRINT LCD P: POMPA
// V: VENTOLA
if(pompa==HIGH){
lcd.setCursor(0, 0);
lcd.print("P:ACCESA");
}else{
lcd.setCursor(0, 0);
lcd.print("P:SPENTA");
}
if(ventola==HIGH){
lcd.setCursor(0, 1);
lcd.print("V:ACCESA");
}else{
lcd.setCursor(0, 1);
lcd.print("V:SPENTA");
delay(2000);
lcd.clear();
}
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.print(mediagradi);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Haria");
lcd.print(mediaumidita);
lcd.print("%");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hterreno");
lcd.setCursor(0, 1);
lcd.print(hterreno);
lcd.print("%");
lcd.clear();
PRINT SERIAL
Serial.print("Umidita' terreno: ");
Serial.println(hterreno);
delay(1000);
Serial.print("Umidita' aria: ");
Serial.print(mediaumidita);
Serial.println("%");
Serial.print("Temperatura aria: ");
Serial.print(mediagradi);
Serial.println("C");
Serial.println("");
//PRINT SD-CARD
DataFile = SD.open("dati.csv",FILE_WRITE);
HCRTC.RTCRead(I2CDS1307Add);
DataFile = SD.open("dati.csv",FILE_WRITE);
if(DataFile){
if (HCRTC.GetMinute() == 0 || (HCRTC.GetMinute() == 30)){
DataFile.print(HCRTC.GetDateString());
DataFile.print(";");
DataFile.print(HCRTC.GetTimeString());
DataFile.print(";");
DataFile.print(mediagradi);
DataFile.print(";");
DataFile.print(mediaumidita);
DataFile.println(";");
DataFile.close();
}
else{
DataFile.close();
}
}
}
Questo sketch è ambientato in un semenzaio per automatizzarlo e memorizzarne i dati raccolti cosi da fare un grafico giornaliero, settimanale, mensile, annuo.
Ho fatto uno sketch in cui con un dht22 misuro temperatura e umidità, successivamente fa la media di 5 valori e li stampa sull'LCD, infine in base all'umidità e temperatura vengono attivate due ventole e una pompa. ma questo poco importa.
Quando l'RTC da il minuto 0 oppure 30, mi memorizza data, ora e la media in una scheda SD.
quindi:
HCRTC.RTCRead(I2CDS1307Add);
DataFile = SD.open("dati.csv",FILE_WRITE);
if(DataFile){
if (HCRTC.GetMinute() == 0 || (HCRTC.GetMinute() == 30)){
DataFile.print(HCRTC.GetDateString());
DataFile.print(HCRTC.GetTimeString());
DataFile.print(";");
DataFile.print(mediagradi);
DataFile.print(";");
DataFile.print(mediaumidita);
DataFile.println(";");
DataFile.close();
Serial.println("Memory");
Serial.println();
}
else{
DataFile.close();
Serial.println();
}
}
Ho utilizzato la libreria HCRTC perchè molto intuitiva.
andiamo al problema:
il loop dura 27s quindi quando l'orologio sarà al minuto 0 oppure 30, riesce a memorizzare due dati in un minuto...perché semplicemente in un minuto riesce a fare due loop. E non va bene. Allora ho pensato di "risolvere" aggiungendo delle pause, ma prima o poi, ci sarà un minuto in cui riuscirà a fare due loop...ho pensato di poter fare un interrupt ma non ci ho capito molto (su come applicarlo)...
Ci sarebbero poi altri problemi di "grafica" con excel ma quello poi lo affrontiamo magari più avanti..
Vorrei ringraziarvi, il karma lo metterò a chi risponde