C'è ancora qualche bega (il codice si blocca), i serial.print mi servono per vedere dove si blocca.
prima per qualche motivo faceva solo due cicli ora si impianta all'entrata di S_SAVE
#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_START 0 //stato di inizializazione
#define S_WAIT 1 //stato di attesa interupt
#define S_SAVE 2 //stato di salvataggio dati
#define PIN_Temp 7 //definisce pin per il sensore di temoperatura
#define PIN_Int 2 //definisce pin per Allarme RTC DS3231
#define CS 5 //Definisce il pin per il CS
#define RELAY 3 //definisce il pin per relè malfunzionamento
float voltage0 = 0;
float voltage1 = 0;
float voltage2 = 0;
float voltage3 = 0;
volatile byte Status = S_START;
DHT dht(PIN_Temp, DHTTYPE); //inizializza oggetto DHT
RTC_DS3231 rtc; //inizializza oggetto RTC
ADS1115_WE adc = ADS1115_WE(I2C_ADDRESS); //inizializza ADC
void setup() {
Serial.begin(9600); //avvia la seriale a 9600
delay(500); // attende la stabilizazione della seriale
while (!SD.begin(CS)) //attende che la SD si inizializzi
{
Serial.println("Impossibile trovare SD, Ritento tra 5 secondi");
Serial.flush();
delay(5000);
}
Serial.println("SD Inizializata");
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);
rtc.disable32K(); // disabilita uscita 32K
rtc.writeSqwPinMode(DS3231_OFF);
Serial.println("RTC OK");
dht.begin(); //inizializza DHT22
delay(100);
Serial.println("DHT22 OK");
Wire.begin();
while (!adc.init()) //aspetta che ADC Risponda
{
Serial.println(("Impossibile inizializare ADC, Ritento tra 5 secondi"));
Serial.flush();
delay(5000);
}
Serial.println("ADC Inizializato");
adc.setVoltageRange_mV(ADS1115_RANGE_6144); //setta lettura +/- 6.114v
adc.setMeasureMode(ADS1115_SINGLE); //single shot
pinMode(RELAY, OUTPUT);//imposto l'uscita del relay come OUTPUT
pinMode(PIN_Int, INPUT_PULLUP);//imposto l'uscita del Interupt ccome INPUT + Pullup
//wdt_enable(WDTO_8S); //avvia WDT 8 seocndi
}
void loop() {
switch(Status){
case S_START:
digitalWrite(RELAY, HIGH); //eccito il relè/chiudo il contatto NO
Serial.print("entro in save");
Status = S_SAVE;
break;
case S_WAIT:
long ora = millis;
long dopo = millis + 1000;
if(ora>=dopo){Serial.print(ora);}// stampa ogni secondo per vedere se sta girando
break;
case S_SAVE:
detachInterrupt(digitalPinToInterrupt(PIN_Int));
Serial.print("aono in save in save");
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");
Scrivi();
attachInterrupt(digitalPinToInterrupt(PIN_Int),AllarmISR, FALLING);
Status = S_WAIT;
break;
}
}
void Scrivi(){
// 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.println("scrittura file completata");
rtc.setAlarm1(DateTime(now.year(),now.month(),now.day(), now.hour(), now.minute()+1, 0), DS3231_A1_Hour);
DateTime next = (DateTime(now.year(),now.month(),now.day(), now.hour(), now.minute()+1, 0));
Serial.println(next.minute(), DEC);
}
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() {
Status=S_SAVE;
}
GRAZIE !!!!