Probleme mit dem Zählen von Impulsen

Hi,

ich habe hier einen Abtastkopf an meinem Gaszähler hängen und versuche die Impulse zu zählen. Der Zähler arbeitet mit einem Magneten an der Walze und bei jeder Umdrehung wird im Abtastkopf ein Reed-Relais geschlossen und anschliessen wieder geöffnet. Ich habe dafür einen Jeenode Arduino Controller verwendet, der daran angeschlossen.
Das eigentliche Zählen sieht wie folgt aus:

Port connector(1);

static unsigned long last;

int gescount,bettersend = 0;

MilliTimer countsend1;

void setup () {

connector.mode2(INPUT); // Set AIO mode as input
connector.digiWrite2(0); // Activate pull-up resistor for

last = millis();
}

void loop () {

static boolean ledOn = false;

if (countsend1.poll(1000)) {
bettersend=0;

}

int pushed = connector.digiRead2();

if (!ledOn && pushed == 0) {
ledOn = true;

} else if (ledOn && pushed == 1 && bettersend == 0) {
ledOn = false;

gescount +=1;

bettersend=1;
}

}

Es handelt sich hierbei um eine verkürzt Version des Quellcodes der nur den wichtigen Teil des Zählens enthält.

Mein eigentlicher Gedanke ist nun das er nur nach eine steigenden Flanke und einer fallenden Flanke das ganze als Umlaufen zählt.
Außerdem soll durch "bettersend" eine 1 Sekunden Sperre eingestellt werden, damit er nur jede Sekunde maximal einen Impuls zählt. Das ganze klappt aber nicht und ich habe immer zuviele Impulse gezählt. Wenn ich das ganze händisch mit einem Magneten teste, finde ich keinen Fehler aber bei richtigen Test am Gaszähler habe müsste ich zum Beispiel 323 Impulse drauf haben, habe aber 510 gezählt. Eine direkte ungenauigkeit ist für mich nicht zu erkennen? Ich zähle also aus irgendeinem Grund nicht immer richtig.

Kann mir bitte jemand helfen, wie ich das richtig mache, mit dem Zählen.

Vielen Dank.

Gruß kami

Wenn ich ganz ehrlich bin, steige ich bei deinem Code nicht durch. Bin eh nicht so der Softwarecrack. Aber ich befürchte mal ganz vorsichtig, daß du das Entprellen nicht sauber gelöst hast.

Lass mal die Sicherheitsgeschichte (ich denke bettersend) weg und mach einen kleinen Kondensator parallel zum Reedrelais. Poste dann deine Erfahrungen hier oder zeige die verwendete Schaltung auf.

Hi,

okay ich habe jetzt mal mit der Software des Controllers versucht eine Entprellung zu schaffen. Zurzeit habe ich den Schalter wie hier bei dem Phototransitor zu sehen angeschlossen.

http://www.mikrocontroller.net/articles/Lichtsensor_/_Helligkeitssensor#Phototransistor

Wie sollte ich das entprellen mit HArdware richtig lösen? Kondensator parallel dazu schalten? Wenn ja wie groß?

Gruß kami

Hi,

der folgende Code ist ungetestet und nicht sehr elegant.

#define reedPin 2

int zaehler;

void setup(){
pinMode (reedPin,INPUT);
digitalWrite (reedPin,HIGH);
}

void loop(){
if (digitalRead(reedPin)==HIGH){
delay(2);
zaehler++;
while(digitalRead(reedPin)==HIGH){
}
delay(2);
}
}

Gruß

Sebastian

Das mit dem HW-Entprellen ist so ne Sache... 0,1 uF würde ich mal testen. Sicher bist du mit einer Softwarelösung in dem Fall besser bedient. Ich habs auch nur deswegen geschrieben, damit man die Falschzählungen wegen dem Prellen ausschließen kann (oder zumindest eingrenzen).

Bezieht sich auch am ehesten auf Reedrelais oder irgendwelche mechanischen Taster.

Kondensatoren sind dabei keine so eine schöne Lösung ich würde mit
http://arduino.cc/en/Reference/AttachInterrupt aus dem "Fundus" arbeiten.
Du kannst dann in der ausgeführten Funktion ein Bit setzten oder dirket Zählen und ein Bit zum "sperren" setzten für 10-30ms und dann somit "Blind" sein für das Prellen auch nichtr .
Der Vorteil an den Interrputs ist der das du wahlweise auf Wechseln des Zustandes oder auf die Steigende oder Fallende Flanke reagieren kannst.