Ciao a tutti
Vorrei esporvi un problema che non riesco a risolvere.
Sto costruendo un anemometro Datalogger che dovrà costantemente monitorare la velocità del vento, e dovrà farlo per svariati mesi consecutivamente.
Purtroppo però lo fa solo per pochi minuti. Legge la velocità, scrive sul display e fa il log correttamente su scheda SD. Purtroppo però dopo qualche minuto, va in errore durante la scrittura sulla SD. Ogni 2 secondi (così ho impostato il logging), quando tenta la scrittura l'errore continua per una decina di tentativi circa. Poi l'intero sistema si resetta, fa di nuovo il setup e ricomincia a lavorare correttamente come da programma.
e poi ricomincia il ciclo di errori sd e reset....
Ho riformattato la scheda (in fat32), ho eseguito il test fisico dei settori sulla SD, ma è tutto ok
vi allego il sorgente ed uno dei log
le righe vuote è dove lui tenta più volte la scrittura, e poi c'è un buco di circa un minuto dove lui si "riavvia"
Arduino UNO clone, Arduino IDE 2.3.2 da Flatpack su Linux Manjaro
Spero di non aver scordato nulla
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>
#define RXPin 6
#define TXPin 7
#define RTS 5 // RS485 Direction control (RE/DE of MAX485 - pins 2 e 3)
#define SQWinput 3 // Il Pin di Arduino che legge lo SQW dall'orologio
#define Interval 2 // ogni quanti cicli di SQW dell'orologio DS3231 devo leggere il vento e scriverlo su SD
// Interval 2 significa 2 interrupts quindi 2 secondi
SoftwareSerial RS485Serial(RXPin, TXPin);
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS3231 rtc;
volatile int cicli = 0; // in questa variabile metteremo il numero di cicli di SQW; conta quante volte scatta l'interrupt
byte Anemometer_buf[7]; //array dove verrà memorizzata tutta la catena di dati dall'anemometro
byte Anemometer_request[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A}; // inquiry frame
volatile float Anemometer = 0;
DateTime now;
File logFile;
String mese[12] = {"Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"};
void setup() {
/*
Serial.begin(9600);
Serial.println("Seriale Inizializzata");
*/
lcd.begin(16,2);
lcd.clear();
lcd.backlight();
pinMode(RTS, OUTPUT);
delay(300);
// initializing the rtc
if(!rtc.begin()) {
lcd.print("Couldn't find RTC!");
while (1) delay(500);
}
lcd.clear();
if (rtc.lostPower()) {
rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));
lcd.print("LostPower");
}
lcd.clear();
rtc.writeSqwPinMode(DS3231_SquareWave1Hz);
pinMode(SQWinput, INPUT);
digitalWrite(SQWinput, HIGH);
lcd.clear();
// Start the Modbus serial Port, for anemometer
RS485Serial.begin(4800);
delay(500);
while(!SD.begin()) {
lcd.print("Errore SD");
delay(500);
lcd.clear();
}
//lcd.clear();
attachInterrupt(digitalPinToInterrupt(SQWinput), clockInterrupt, FALLING);
}
void loop() {
if (cicli == Interval) {
cicli = 0;
String data = "";
String ora = "";
digitalWrite(RTS, HIGH); //pone il pin RTS alto, cioè indica all'RS485 che sto per trasmettere
RS485Serial.write(Anemometer_request, sizeof(Anemometer_request));
RS485Serial.flush();
digitalWrite(RTS, LOW); //pone il pin RTS basso, cioè indica all'RS485 che voglio ricevere
RS485Serial.readBytes(Anemometer_buf, 7);
Anemometer = Anemometer_buf[4]/10.0;
now = rtc.now();
char *res = malloc(5);
sprintf(res, "%02d", now.day());
data = res;
sprintf(res, "%02d", now.month());
data = data + "/" + res;
sprintf(res, "%04d", now.year());
data = data + "/" + res;
sprintf(res, "%02d", now.hour());
ora = res;
sprintf(res, "%02d", now.minute());
ora = ora + ":" + res;
sprintf(res, "%02d", now.second());
ora = ora + ":" + res;
lcd.setCursor(0,0);
lcd.print (pad2(now.day()) + " " + mese[(now.month()-1)] + " " + ora);
lcd.setCursor(0,1);
lcd.print (Anemometer*3.6);
lcd.print (" km/h");
String fileName = ""; // qui metto il nome del file cui vado a scrivere la riga
String log = ""; //qui metto la stringa della riga che vado a scrivere
fileName = String(now.year()) + "-" + pad2(now.month()) + ".log";
log = pad2(now.day()) + ";" + ora + ";" + String(Anemometer);
logFile = SD.open(fileName, FILE_WRITE);
if (logFile) {
logFile.println(log);
logFile.close();
} else {
lcd.clear();
lcd.print("Errore Scrittura");
}
}
}
void clockInterrupt() {
//questa è la routine di interrupt
//Serial.println("interrupt " + String(cicli));
cicli++;
//Serial.println("cicli = " + String(cicli));
}
String pad2(int n) {
String ret = "";
if (n<10) ret = "0" + String(n);
else ret = String(n);
return ret;
}
File 2024-04.LOG
03;21:33:38;3.80
03;21:33:40;3.80
03;21:33:42;3.60
03;21:33:44;3.80
03;21:33:46;3.80
03;21:33:48;4.10
03;21:33:50;3.80
03;21:33:52;3.60
03;21:33:54;3.30
03;21:33:56;3.40
03;21:33:58;3.20
03;21:34:00;3.60
03;21:34:02;3.60
03;21:34:04;3.80
03;21:34:06;3.90
03;21:34:08;4.20
03;21:34:10;4.20
03;21:34:12;4.10
03;21:34:14;4.20
03;21:34:16;4.60
03;21:34:18;5.10
03;21:34:20;5.10
03;21:34:22;5.10
03;21:34:24;5.10
03;21:34:26;5.00
03;21:34:28;5.20
03;21:34:30;5.00
03;21:34:32;5.10
03;21:34:34;5.10
03;21:34:36;5.10
03;21:34:38;5.10
03;21:34:40;5.00
03;21:34:42;5.10
03;21:34:44;5.20
03;21:34:46;5.10
;5.20
03;21:35:33;5.10
03;21:35:35;5.00
03;21:35:37;5.00
03;21:35:39;5.00
03;21:35:41;5.00
03;21:35:43;5.10
03;21:35:45;5.00
03;21:35:47;4.90
03;21:35:49;4.80
03;21:35:51;4.70
03;21:35:53;4.80
03;21:35:55;4.50
03;21:35:57;4.90
03;21:35:59;3.20
03;21:36:01;2.00
03;21:36:03;1.60
03;21:36:05;1.30
03;21:36:07;2.90
03;21:36:09;3.60
03;21:36:11;3.80
03;21:36:13;3.80
03;21:36:15;4.00
03;21:36:17;4.30
03;21:36:19;4.10
03;21:36:21;4.10
03;21:36:23;4.20
03;21:36:25;4.30
03;21:36:27;4.40
03;21:36:29;4.30
03;21:36:31;4.30
03;21:36:33;4.00
03;21:36:35;3.90
03;21:36:37;4.30
03;21:36:39;4.10
03;21:36:41;4.40
;3.90
03;21:37:28;3.60
03;21:37:30;3.60
03;21:37:32;3.70
03;21:37:34;3.90
03;21:37:36;3.70
03;21:37:38;3.80
03;21:37:40;3.90
03;21:37:42;3.70
03;21:37:44;3.40
03;21:37:46;3.50
03;21:37:48;3.50
03;21:37:50;3.60
03;21:37:52;3.30
03;21:37:54;3.40
03;21:37:56;3.50
03;21:37:58;3.40
03;21:38:00;3.40
03;21:38:02;3.80
03;21:38:04;3.80
03;21:38:06;3.60
03;21:38:08;3.70
03;21:38:10;4.00
03;21:38:12;4.00
03;21:38:14;4.10
03;21:38:16;4.40
03;21:38:18;4.50
03;21:38:20;4.30
03;21:38:22;4.20
03;21:38:24;4.00
03;21:38:26;3.90
03;21:38:28;3.90
03;21:38:30;3.90
03;21:38:32;3.70
03;21:38:34;3.80
03;21:38:36;3.80
;3.80
03;21:39:23;3.80
03;21:39:25;4.00
03;21:39:27;3.90
03;21:39:29;4.00
03;21:39:31;3.90
03;21:39:33;3.80
03;21:39:35;4.00
03;21:39:37;4.20
03;21:39:39;4.00
03;21:39:41;3.90
03;21:39:43;4.00
03;21:39:45;3.90
03;21:39:47;4.00
03;21:39:49;4.30
03;21:39:51;4.20
03;21:39:53;4.10
03;21:39:55;4.00
03;21:39:57;4.30
03;21:39:59;4.00
03;21:40:01;3.70
03;21:40:03;3.60
03;21:40:05;3.80
03;21:40:07;3.80
03;21:40:09;3.60
03;21:40:11;3.70
03;21:40:13;3.80
03;21:40:15;3.80
03;21:40:17;4.00
03;21:40:19;4.00
03;21:40:21;4.30
03;21:40:23;4.20
03;21:40:25;3.80
03;21:40:27;3.80
03;21:40:29;3.90
03;21:40:31;3.90
;3.80
03;21:41:18;4.30
03;21:41:20;4.20
03;21:41:22;4.20
03;21:41:24;4.30
03;21:41:26;4.20
03;21:41:28;4.10
03;21:41:30;3.80
03;21:41:32;4.00
03;21:41:34;3.90
03;21:41:36;4.10
03;21:41:38;4.00
03;21:41:40;3.50
03;21:41:42;2.70
03;21:41:44;2.50
03;21:41:46;2.50