#include <DHT.h>
#include <DHT_U.h>
#include <ADS1115_WE.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include "RTClib.h"
#include <avr/wdt.h>
#define DHTTYPE DHT22 // DHT 22
#define I2C_ADDRESS 0x48 //definisce indirizzo ADC
#define S_WAIT 0 //stato di attesa interupt
#define S_SAVE 1 //stato di salvataggio dati
#define P_TEMP 7 //definisce pin per il sensore di temoperatura
#define P_INT 2 //definisce pin per Allarme RTC DS3231
#define P_CS 5 //Definisce il pin per il CS
#define P_RELAY 3 //definisce il pin per relè malfunzionamento
volatile int Status = S_WAIT; //devinisco la variabile che seziona lo stato in cui è la macchina
volatile bool isISR = false; //variabile che definisce se è avvenuto o no l'interupt
float voltage0 = 0;
float voltage1 = 0;
float voltage2 = 0;
float voltage3 = 0;
DHT dht(P_TEMP, DHTTYPE); //inizializza oggetto DHT
RTC_DS3231 rtc; //inizializza oggetto RTC
ADS1115_WE adc = ADS1115_WE(I2C_ADDRESS); //inizializza ADC
DateTime now;
File dataFile;
void setup() {
Serial.begin(9600); //avvia la seriale a 9600
delay(500); // attende la stabilizazione della seriale
InitSD();
InitRTC();
InitDHT();
InitADC();
pinMode(P_RELAY, OUTPUT);//imposto l'uscita del relay come OUTPUT
digitalWrite(P_RELAY, HIGH); //eccito il relè/chiudo il contatto NO
pinMode(P_INT, INPUT_PULLUP);//imposto l'uscita del Interupt ccome INPUT + Pullup
//wdt_enable(WDTO_8S); //avvia WDT 8 seocndi
Serial.println("Fase di inizializazione completata");
}
void loop() {
delay(100);
switch (Status) {
case S_WAIT:
unsigned long Ora = millis();
while(millis()<Ora+1000){
}
Serial.println("è passato un secondo in wait");// stampa ogni secondo per vedere se sta girando);
if(isISR){Status=S_SAVE;}
break;
case S_SAVE:
Serial.println("Sono in save");
StopISR();
Leggi();
Scrivi();
ImpostaAlarm();
StartISR();
Status = S_WAIT;
break;}}
float readChannel(ADS1115_MUX channel) {
float voltage = 0.0;
adc.setCompareChannels(channel);
adc.startSingleMeasurement();
while(adc.isBusy()){}
voltage = adc.getResult_V(); // alternative: getResult_mV for Millivolt
return voltage;
}
void AllarmISR() {
isISR = true;
}
void InitSD() {
while (!SD.begin(P_CS)) //attende che la SD si inizializzi
{
Serial.println("Impossibile trovare SD, Ritento tra 5 secondi");
Serial.flush();
delay(5000);
}
Serial.println("SD Inizializata");
}
void InitRTC() {
while (!rtc.begin()) //aspetta che RTC Risponda
{
Serial.println(("Impossibile trovare DS3231, Ritento tra 5 secondi"));
Serial.flush();
delay(5000);
}
rtc.disable32K(); // disabilita uscita 32K
rtc.writeSqwPinMode(DS3231_OFF); //disattiva uscita onda quadra
rtc.clearAlarm(1);
rtc.disableAlarm(1);
Serial.println("RTC Inizializato");
}
void InitDHT() {
dht.begin(); //inizializza DHT22
delay(100);
Serial.println("DHT22 Inizializato");
}
void InitADC() {
Wire.begin();
while (!adc.init()) //aspetta che ADC Risponda
{
Serial.println(("Impossibile inizializare ADC, Ritento tra 5 secondi"));
Serial.flush();
delay(5000);
}
adc.setVoltageRange_mV(ADS1115_RANGE_6144); //setta lettura +/- 6.114v
adc.setMeasureMode(ADS1115_SINGLE); //single shot
Serial.println("ADC Inizializato");
}
void StartISR() {
isISR = false;
attachInterrupt(digitalPinToInterrupt(P_INT), AllarmISR, FALLING);
}
void StopISR() {
detachInterrupt(digitalPinToInterrupt(P_INT));
}
void Leggi() {
Serial.print("Sono in Leggi");
voltage0 = readChannel(ADS1115_COMP_0_GND); //Avvia lettura canale 0
voltage1 = readChannel(ADS1115_COMP_1_GND); //Avvia lettura canale 1
voltage2 = readChannel(ADS1115_COMP_2_GND); //Avvia lettura canale 2
voltage3 = readChannel(ADS1115_COMP_3_GND); //Avvia lettura canale 3
Serial.print("letture ADC ok");
}
void Scrivi() {
while (bool FileReady = false)
if(dataFile){
dataFile = SD.open("datalog.txt", FILE_WRITE); //apre file csv
FileReady = true;
}else{
Serial.println("Errore apertura file Datalog.txt");
delay(100);
}
noInterrupts(); //disabilita gli interupts per evitare strane cose durante la scrittura
DateTime now = rtc.now(); //carica in now data e ora attuali
File dataFile;
dataFile = SD.open("datalog.txt", FILE_WRITE); //apre file csv
dataFile.print(now.day(), DEC);
dataFile.print('/');
dataFile.print(now.month(), DEC);
dataFile.print('/');
dataFile.print(now.year(), DEC);
dataFile.print(" ");
dataFile.print(now.hour(), DEC);
dataFile.print(':');
dataFile.print(now.minute(), DEC);
dataFile.print(':');
dataFile.print(now.second(), DEC);
dataFile.print(" ");
dataFile.print(voltage0);
dataFile.print(" ");
dataFile.print(voltage1);
dataFile.print(" ");
dataFile.print(voltage2);
dataFile.print(" ");
dataFile.println(voltage3);
dataFile.close(); //chiude file CSV
interrupts(); //riabilita gli interrupts per il normale funzionamento
Serial.flush(); // svuota seriale
Serial.println("scrittura file completata");
}
void ImpostaAlarm(){
//DateTime next = (DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute() + 1, 0));
// Io per aggiungere un minuto farei così, prova a vedere se funziona:
//DateTime next = DateTime(rtc.now() + 60);
// calculate a date which is 7 days, 12 hours, 30 minutes, and 6 seconds into the future
DateTime next (now + TimeSpan(0,0,1,0));
rtc.setAlarm1(next, DS3231_A1_Hour);
Serial.print("Imposta allarme alle ");
Serial.print(next.hour());
Serial.print(":");
Serial.println(next.minute());
}
Il programma compila ma non va......
è come se quando entra in S_SAVE, si blocchi....
Per vederlo ho forzato Status = S_WAIT e poi S_SAVE (dove dovrebbe essere)
Buon WE