Hallo zusammen,
ich möchte gerne mit einem Arduino Nano die Einschaltdauer meines Ölbrenners messen um den Ölverbrauch zu bestimmen. Dazu möchte ich gerne Interrupts und eine RTC verwenden, scheitere aber bisher, weil offensichtlich Parameter nicht übergeben werden. Die Grundidee: Zeit erfassen bei steigender Flanke mit Interrupt 1. Zeit übergeben an Interrupt 2, dort 2. Zeit erfassen mit fallender Flanke, Laufzeit ausrechnen, Verbrauch ausrechnen und irgendwann in eine Datenbank schreiben (das ist dann der nächste Schritt).
Zum Testen möchte ich jeweils die Parameter auf dem COM-Port ausgeben. Die Überlegung Interrupts zu verwenden kommt daher, weil millis() oder micros() ja irgendwann überlaufen und von vorne anfangen und ich das da nicht brauchen kann. Der Brenner läuft ca. 20 - 40 Minuten. Nun bin ich Anfänger und noch nicht so firm in den Details und bitte um Hilfe.
Mein Sketch sieht so aus:
// RTC DS1307 Chip - Datum und Zeit ausgeben
//
#include "RTClib.h" // Library https://github.com/adafruit/RTClib
float Laufsec_L, Laufsec_R;
volatile float spezVerbrauch = 2.2; // l/h entspr. 1.87 kg/h
volatile double Verbrauch = 0;
volatile int t, j, M, d, h, m, delaytime = 1000;
volatile float s;
RTC_Millis rtc;
void setup () {
//volatile DateTime Startzeit_L, Startzeit_IRon, Endzeit_L, Endzeit_IRoff;
//volatile TimeSpan Laufzeit_L, Laufzeit_dispRes;
rtc.begin(DateTime(F(__DATE__), F(__TIME__)));
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(3, INPUT);
attachInterrupt(digitalPinToInterrupt(2), PrintOnTime, RISING);
attachInterrupt(digitalPinToInterrupt(3), PrintOffTime, FALLING);
}
void loop () {
volatile DateTime Startzeit_L = rtc.now(); // RTC einlesen
Serial.print("Startzeit_L = ");
d = Startzeit_L.day(); // Tag
if (d < 10)Serial.print(" "); Serial.print(d);
Serial.print(".");
M = Startzeit_L.month(); // Monat
if (M < 10)Serial.print("0"); Serial.print(M);
Serial.print(".");
Serial.print(Startzeit_L.year(), DEC); // Jahr
Serial.print(" ");
h = Startzeit_L.hour(); // Stunde
if (h < 10)Serial.print(" "); Serial.print(h);
Serial.print(":");
m = Startzeit_L.minute(); // Minute
if (m < 10)Serial.print("0"); Serial.print(m);
Serial.print(":");
s = Startzeit_L.second(); // Sekunde
if (s < 10)Serial.print("0"); Serial.print(s);
Serial.println();
delay(10000);
volatile DateTime Endzeit_L = rtc.now(); // RTC einlesen
Serial.print("Endzeit_L = ");
d = Endzeit_L.day(); // Tag
if (d < 10)Serial.print(" "); Serial.print(d);
Serial.print(".");
M = Endzeit_L.month(); // Monat
if (M < 10)Serial.print("0"); Serial.print(M);
Serial.print(".");
Serial.print(Endzeit_L.year(), DEC); // Jahr
Serial.print(" ");
h = Endzeit_L.hour(); // Stunde
if (h < 10)Serial.print(" "); Serial.print(h);
Serial.print(":");
m = Endzeit_L.minute(); // Minute
if (m < 10)Serial.print("0"); Serial.print(m);
Serial.print(":");
s = Endzeit_L.second(); // Sekunde
if (s < 10)Serial.print("0"); Serial.print(s);
Serial.println();
// delay(10000);
volatile TimeSpan Laufzeit_L = Endzeit_L - Startzeit_L;
Serial.print("Laufzeit_L = ");
h = Laufzeit_L.hours(); // Stunde
if (h < 10)Serial.print(" "); Serial.print(h);
Serial.print(":");
m = Laufzeit_L.minutes(); // Minute
if (m < 10)Serial.print("0"); Serial.print(m);
Serial.print(":");
s = Laufzeit_L.seconds(); // Sekunde
if (s < 10)Serial.print("0"); Serial.print(s);
Serial.println();
Serial.print("Laufzeit_L in Sekunden = ");
Laufsec_L = h * 3600 + m * 60 + s;
Serial.println(Laufsec_L, 4);
Verbrauch = spezVerbrauch * Laufsec_L / 3600;
Serial.print("Verbrauch = ");
Serial.print(Verbrauch, 4);
Serial.println(" l");
delay(10000);
}
void PrintOnTime()
{
volatile DateTime StartzeitIRon = rtc.now();
Serial.print("Startzeit IRon= ");
d = StartzeitIRon .day(); // Tag
if (d < 10)Serial.print(" "); Serial.print(d);
Serial.print(".");
M = StartzeitIRon .month(); // Monat
if (M < 10)Serial.print("0"); Serial.print(M);
Serial.print(".");
Serial.print(StartzeitIRon .year(), DEC); // Jahr
Serial.print(" ");
h = StartzeitIRon .hour(); // Stunde
if (h < 10)Serial.print(" "); Serial.print(h);
Serial.print(":");
m = StartzeitIRon .minute(); // Minute
if (m < 10)Serial.print("0"); Serial.print(m);
Serial.print(":");
s = StartzeitIRon .second(); // Sekunde
if (s < 10)Serial.print("0"); Serial.print(s);
Serial.println();
delayMicroseconds(delaytime);
}
void PrintOffTime()
{
volatile DateTime EndzeitIRoff = rtc.now(), StartzeitIRon;
Serial.print("Endzeit IRoff= ");
d = EndzeitIRoff.day(); // Tag
if (d < 10)Serial.print(" "); Serial.print(d);
Serial.print(".");
M = EndzeitIRoff.month(); // Monat
if (M < 10)Serial.print("0"); Serial.print(M);
Serial.print(".");
Serial.print(EndzeitIRoff.year(), DEC); // Jahr
Serial.print(" ");
h = EndzeitIRoff.hour(); // Stunde
if (h < 10)Serial.print(" "); Serial.print(h);
Serial.print(":");
m = EndzeitIRoff.minute(); // Minute
if (m < 10)Serial.print("0"); Serial.print(m);
Serial.print(":");
s = EndzeitIRoff.second(); // Sekunde
if (s < 10)Serial.print("0"); Serial.print(s);
Serial.println();
displayResult();
delayMicroseconds(delaytime);
}
void displayResult()
{
volatile TimeSpan Laufzeit_dispRes = volatile DateTime EndzeitIRoff - volatile DateTime StartzeitIRon;
Serial.print("Laufzeit dispRes= ");
h = Laufzeit_dispRes.hours(); // Stunde
if (h < 10)Serial.print(" "); Serial.print(h);
Serial.print(":");
m = Laufzeit_dispRes.minutes(); // Minute
if (m < 10)Serial.print("0"); Serial.print(m);
Serial.print(":");
s = Laufzeit_dispRes.seconds(); // Sekunde
if (s < 10)Serial.print("0"); Serial.print(s);
Serial.println();
Serial.print("Laufzeit in Sekunden = ");
Laufsec_R = h * 3600 + m * 60 + s;
Serial.println(Laufsec_R, 4);
Verbrauch = spezVerbrauch * Laufsec_R / 3600;
Serial.print("Verbrauch = ");
Serial.print(Verbrauch, 4);
Serial.println(" l");
}
Beim Kompilieren bekomme ich einige Fehlermeldungen. Z.B.
"... 31:23: warning: passing 'volatile DateTime' as 'this' argument discards qualifiers [-fpermissive]
d = Startzeit_L.day(); // Tag"
oder
"76:11: note: in call to 'uint8_t DateTime::day() const'
uint8_t day() const { return d; }"
oder
"34:25: warning: passing 'volatile DateTime' as 'this' argument discards qualifiers [-fpermissive]
M = Startzeit_L.month(); // Monat"
Der komplette Output vom Kompilieren ist in der Anlage.
Meine Fragen:
- Kann ich prinzipiell mit Interrupts Zeiten erfassen und übergeben ? Oder bin ich da auf dem Holzweg ?
- Kann ich aus dem ersten Interrupt einen ermittelten Zeitwert in den zweiten Interrupt zur Weiterverarbeitung übergeben ?
Bin für Hinweise dankbar.
Vielen Dank
debug.txt (28.3 KB)