Hallo,
ich versuche gerade mein allererstes Arduino Nano Projekt umzusetzen, und zwar das Auslesen eines S0 Zählers (1000 Pulse pro kW). Dabei habe ich dasselbe Referenzprojekt genommen wie der Autor dieses älteren Threads hier, und auch die gleiche Schaltung wie der Verfasser des Beitrags:
Auch bei mir ist es so, dass ich alle paar Sekunden, manchmal auch nur alle paar Minuten einen Interrupt bekomme obwohl kein Zählimpuls generiert wurde. Nun wird in dem Posting oben eine Schaltungsalternative genannt, aber nur verbal beschrieben, und ich bin mir nicht sicher ob ich den Vorschlag richtig verstanden habe, und vor allem wie groß der Widerstand eigentlich sein sollte. Daher habe ich das mal so aufgezeichnet, wie ich das als Laie verstanden habe, und bitte um sachdienliche Korrekturen und Hinweise, wie ich die Schaltung so störsichier wie möglich machen kann:
Derzeit versuche ich, die Störimpulse durch mein Programm etwas zu filtern und abzumildern, auch hier mal mein "Sketch" basierend auf dem ursprünglichen Code, aber mit einigen Abwandlungen. Auch hier bin ich, als wie gesagt absoluter Neuling auf dem Gebiet, für Vorschläge und Korrekturen sehr dankbar
#include <EEPROM.h>
#define SAVEMULT 10
#define ERRORTHRESHOLD 25
#define SAVETHRESHOLD 100
int interval = 5; //Counter refresh and save interval
int savemultiplier = 0;
long counter;
long prevSavedCounter;
int pulseCount, crontimer;
byte prevLEDStatus;
void setup()
{
Serial.begin(9600);
attachInterrupt(0, onPulse, FALLING);
counter = read_counter(0);
prevSavedCounter = counter;
pinMode(LED_BUILTIN, OUTPUT);
prevLEDStatus = LOW;
//save_counter(0, 40047100);
}
void loop() {
if(millis()/1000 > crontimer+interval)
{
prevLEDStatus = LOW;
digitalWrite(LED_BUILTIN, LOW);
crontimer = millis()/1000;
if (savemultiplier > SAVEMULT)
{
long counterdiff = counter - prevSavedCounter;
if (counterdiff < ERRORTHRESHOLD)
{
counter = prevSavedCounter;
Serial.print("Counter difference too low, error signals assumed, reset counter to prev value, diff = ");
Serial.println(counterdiff);
}
else if (counterdiff > SAVETHRESHOLD)
{
save_counter(0, counter);
prevSavedCounter = counter;
Serial.print("Counter difference high enough to save, so saving, diff = ");
Serial.println(counterdiff);
Serial.print("Saved to EEPROM: ");
Serial.println(counter);
}
else
{
Serial.print("Counter difference too low to save, wait for next saving cycle, diff = ");
Serial.println(counterdiff);
}
savemultiplier = 0;
}
pulseCount = 0;
savemultiplier++;
Serial.println(counter);
}
}
void save_counter(int adr, long lo)
{
byte by;
for(int i=0;i< 4;i++)
{
by = (lo >> ((3-i)*8)) & 0x000000ff;
EEPROM.write(adr+i, by);
}
}
long read_counter(int adr)
{
long lo=0;
for(int i=0;i< 3;i++){
lo += EEPROM.read(adr+i);
lo = lo << 8;
}
lo += EEPROM.read(adr+3);
return lo;
}
void onPulse()
{
pulseCount++;
counter++;
if (prevLEDStatus == LOW)
{
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
prevLEDStatus = HIGH;
}
else
{
digitalWrite(LED_BUILTIN, LOW);
prevLEDStatus = LOW;
}
}