Sistemato un qualche micro errore, Aggiustata la funzione Scrivi aggiunti serial.print per capire dove va in blocco il programma. Al inizio mi tagliava le parole, pensavo fosse un problema di baud rate e lo ho alzato...... nessun miglioramento aggiunto qualche serial.flush la situazione si è sistemata. rimossi anche nointterupts e interupts
Ad un certo punto è uscito il messaggio: Memoria scarsa, potrebbe compromettere il sistema. quanto mi devo preoccupare ? all'ultima compilazione non è uscito
Al momento sembra che salti completamente lo switch....case, non riesco a capire l'errore, se per assurdo commento via lo switch e lascio solo il contenuto di S_SAVE il programma gira (ovviamente senza interrupt). per ora le funzioni sono miste, andrò a metterle a posto in seguito....
Ora come ora l'ultimo messaggio(ciclico) su seriale è "qualcosa non va" che è giusto dopo lo switch
EDIT: altro errore i serial.flush vanno dopo i seral.print fate finta che sia sistemato ![]()
#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 char Status = S_SAVE; //devinisco la variabile che seziona lo stato in cui è la macchina
volatile bool isISR = false; //variabile che definisce se è avvenuto o no l'interupt
volatile float voltage0 = 0; //variabile per acquisizione tensione ADC canale 0
volatile float voltage1 = 0; //variabile per acquisizione tensione ADC canale 1
volatile float voltage2 = 0; //variabile per acquisizione tensione ADC canale 2
volatile float voltage3 = 0; //variabile per acquisizione tensione ADC canale 3
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; //inizializza la variabile now che andra a contenere l'orario
void setup() {
Serial.begin(74880); //avvia la seriale a 74880
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_1S); //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;
default:
Serial.print("blocco base, nessun case");
break;
}
Serial.print("qualcosa non va");
}
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.flush();
Serial.println("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
delay(100);
Serial.println("letture ADC ok");
Serial.flush();
}
void Scrivi() {
Serial.println("Sono in Scrivi");
Serial.flush();
File dataFile;
dataFile = SD.open("datalog.txt", FILE_WRITE); //apre file csv
if (!dataFile) {
Serial.println("Errore apertura file Datalog.txt");
delay(100);
return; // ritorna alla funzione chiamante
}
// noInterrupts(); //disabilita gli interupts per evitare strane cose durante la scrittura
DateTime now = rtc.now(); //carica in now data e ora attuali
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, 10, 0));
rtc.setAlarm1(next, DS3231_A1_Hour);
Serial.print("Imposta allarme alle ");
Serial.print(next.hour());
Serial.print(":");
Serial.println(next.minute());
}
aggiungo il contenuto del monitor seriale
SD Inizializata
RTC Inizializato
DHT22 Inizializato
ADC Inizializato
Fase di inizializazione completata
qualcosa non va
qualcosa non va
qualcosa non va
qualcosa non va
qualcosa non va
qualcosa non va
qualcosa non va
Grazie ThEnGi