Hallo,
Wieder ein mal eine Frage “nur zum Verstehen weshalb”:
Ich habe einen Sketch mit welchem ich alle 1000 Millis einen Messwert auf eine SD Karte schreibe.
Im ganzen Sketch gibt es kein Delay, deshalb sollte das doch auch wirklich alle Sekunde passieren.
Wenn ich die Messergebnise auslese, dann sehe ich allerdings, dass etwa alle 7 Minuten eine Sekunde fehlt. Das führt letzten Endes dazu, dass ich nach einem Tag nicht wie erwartet 86400 Messwerte auf der Karte habe sondern nur rund 86000 (± 2).
Die Frage ist jetzt: Ist das einfach eine Toleranz mit der man leben (oder welche man herausrechnen) muß, oder habe ich in den Sketch doch etwas eingebaut wo ich Zeit verbummle?
Hier der Sketch “zum mal drübergucken”:
/*
Data logging to the Deek-Robot shields with RTC for the Arduino Nano.
Btw.: Because i found no informations which card size can be used: i use a Fat32 formated 8GB noname.
The sketch reads the value of 2 current sensors, writes the result as mA to an SD card und shows it at an 4 lines
i2C display. Current sensors are INA282 modules (unidirectional, Ref1 andRef2 to GND) with replaced shunt, new shunt has 0.0167 Ohm, so it's possible to measure
current up to 4,4 A .
The base of the storge and RTC part i found at https://publiclab.org/notes/cfastie/04-30-2017/data-logger-shield-for-nano .
created 2021
by Herbert Kozuschnik
This code is in the public domain.
*/
#include <SdFat.h>
#include <SPI.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 20, 4); // Display Adresse und Größe deffinieren.
float mAps = 4.3; // Miliampere per analogRead Step, muss an jeden Sensor angepasst werden
float korrekturwert = 0.975; // zum Angleichen der beiden Sensoren
int adwert = 0; // für Displayausgabe des durchschnittlichen AD Wertes, nur zur Kontrolle
long sensorsumme1 = 0;
long sensorsumme2 = 0;
long mAmp1 = 0;
long mAmp2 = 0;
long mAhmin1 = 0;
long mAhmin2 = 0;
unsigned int j = 0;
unsigned int k = 0;
unsigned long currentMillis;
unsigned long previousMillis = 0;
const int interval = 1000;
SdFat SD;
const byte MOSIpin {11};
const byte MISOpin {12};
RTC_DS1307 RTC;
#define DS1307_I2C_ADDRESS 0x68
char TmeStrng[20];
char mAsStrng[16];
char mAmStrng[16];
void setup() {
lcd.init(); // LCD aktivieren
lcd.backlight(); // Hintergrundbeleuchtung einschalten (lcd.noBacklight(); schaltet die Beleuchtung aus).
Wire.begin(); // start the i2c interface
RTC.begin(); // start the RTC
// RTC.adjust(DateTime((__DATE__), (__TIME__))); // !! Zeile nach erstem Upload auskommentieren und Sketch noch einmal hochladen, - setzt die Zeit auf dem RTC
SD.begin();
} // end of setup
void loop() {
read_ampere();
currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ausgabe();
}
}
void ausgabe() {
get_time();
calc_strom();
calc_mAhmin();
displayausgabe();
write_data();
j = 0;
}
void calc_strom() { // Strom aus Sensorwerten berechnen
sensorsumme1 = sensorsumme1 / j;
adwert = sensorsumme1;
mAmp1 = sensorsumme1 * mAps;
sensorsumme1 = 0;
sensorsumme2 = sensorsumme2 / j;
mAmp2 = sensorsumme2 * (mAps * korrekturwert);
sensorsumme2 = 0;
}
void calc_mAhmin() { // Berechnen wie viele mAh in einer Minute geflossen sind.
mAhmin1 = mAhmin1 + mAmp1;
mAhmin2 = mAhmin2 + mAmp2;
k = k + 1;
if (k == 60) {
mAhmin1 = mAhmin1 / 3600;
mAhmin2 = mAhmin2 / 3600;
write_mAhmin();
}
}
void displayausgabe() {
lcd.setCursor(0, 0); //Display leeren
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 0); // Messwerte Anzeigen
lcd.print(TmeStrng);
lcd.setCursor(0, 1);
lcd.print(mAmp1);
lcd.print(" mA");
lcd.setCursor(0, 2);
lcd.print(mAmp2);
lcd.print(" mA");
lcd.setCursor(0, 3);
lcd.print(j);
lcd.setCursor(10, 3);
lcd.print(adwert);
}
void get_time() { //Datum und Zeit auslesen Zeit auslesen
DateTime now = RTC.now();
sprintf(TmeStrng, "%02d.%02d.%04d,%02d:%02d:%02d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second());
sprintf(mAsStrng, "%04d%02d%02dAs.txt", now.year(), now.month(), now.day());
sprintf(mAmStrng, "%04d%02d%02dAm.txt", now.year(), now.month(), now.day());
}
void write_data() { //auf SD Karte schreiben
String dataString = ""; //erst mal vorherigen string löschen
dataString += TmeStrng; //und neuen string zusammensetzen
dataString += ",";
dataString += String(mAmp1);
dataString += ",";
dataString += " mA";
dataString += ",";
dataString += String(mAmp2);
dataString += ",";
dataString += " mA";
File dataFile = SD.open(mAsStrng, FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
else {
// Displayausgabe wenn schreiben nicht möglich
lcd.setCursor(0, 0); // Zeile löschen
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 0); // Messwerte mit Fehlermeldung anzeigen
lcd.print(TmeStrng);
lcd.setCursor(0, 1);
lcd.print(mAmp1);
lcd.print(" mA");
lcd.setCursor(0, 2);
lcd.print(mAmp2);
lcd.print(" mA");
lcd.setCursor(0, 3);
lcd.print("SD Schreibfehler");
}
}
void write_mAhmin() { //auf SD Karte schreiben
String dataString = ""; //erst mal vorherigen string löschen
dataString += TmeStrng; //und neuen string zusammensetzen
dataString += ",";
dataString += String(mAhmin1);
dataString += ",";
dataString += " mAh";
dataString += ",";
dataString += String(mAhmin2);
dataString += ",";
dataString += " mAh";
File dataFile = SD.open(mAmStrng, FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
else {
lcd.setCursor(0, 3);
lcd.print("SD Schreibfehler mAhmin");
}
k = 0;
mAhmin1 = 0;
mAhmin2 = 0;
}
void read_ampere() {
int sensorwert1 = 0; // Sensorwert rücksetzen
int sensorwert2 = 0;
sensorwert1 = analogRead(A1);
sensorsumme1 = sensorsumme1 + sensorwert1;
sensorwert2 = analogRead(A2);
sensorsumme2 = sensorsumme2 + sensorwert2;
// delay (1);
j = j + 1;
}
Beim Code einfügen ist mir noch etwas aufgefallen:
Wenn man in der IDE die Funktion “für Forum kopieren” verwendet, werden massenhaft Leerzeilen eingefügt, - ich denke das ist nicht so gewollt…