Guuten Tach, Jung´s!
Euch geht´s noch allen gut? Alles im grünen Bereich und reichlich Erfahrungen
mit dem Arduino gesammelt?
Rabenauge, was macht Deine GPS-Karre? Findet sie jetzt den kürzesten und
genausten Weg nach Hause?
Bin ja lange nicht mehr dabei gewesen und jetzt verzweifel ich an etwas
leichten. Bei mir will der Groschen nicht fallen...
Ich habe hier so meine Probleme mit dem erkennen eines S0-Impuls am Mega 2560.
Ich habe nachfolgenden Sketch, der die Impulse von 8-S0-WSZ empfängt.
Das funktioniert bis jetzt recht zuverlässig und genau...
/** Hilfsprogramm zur Auswertung der Zähler
* Maximal 8 SO-Zähler können angeschlossen werden, die mit folgendem Protokoll
* an die serielle Schnittstelle ausgegeben werden:
*
* byte0 byte1 byte2 byte3 ...
* A-H 0-9 0-9 0-9 n
* Kanal Millis Newline
*
* Die Millis sind dabei die Millisekunden zwischen den letzten beiden Low-High-Flanken
* auf dem angegebenen Kanal.
*/
const byte counterPins[8] = { 2,3,4,5,6,7,8,9 };
unsigned long millisBetween[8];
unsigned long lastMillis[8];
byte lastState[8];
void setup() {
for (byte i = 0; i < sizeof(counterPins); i++) {
pinMode(counterPins[i], INPUT);
digitalWrite(counterPins[i], LOW);
millisBetween[i] = 0;
lastMillis[i] = 0;
lastState[i] = 0;
}
Serial.begin(9600);
}
void loop() {
unsigned char bitMaskToSend = 0;
unsigned long time = millis();
for (byte i = 0; i < 8; i++) {
byte val = digitalRead(counterPins[i]);
if (val == HIGH && lastState[i] == LOW) {
millisBetween[i] = time-lastMillis[i];
lastMillis[i] = time;
bitSet(bitMaskToSend, i);
}
lastState[i] = val;
}
for (byte i = 0; i < 8; i++) {
unsigned long dataToWrite = millisBetween[i];
if (bitRead(bitMaskToSend,i)) {
Serial.print((char)('A'+i));
Serial.println(dataToWrite);
}
}
}
An den S0+ habe ich 5v anliegen, S0- geht über einen 4,5k gegen Masse und auf
die Pin´s. Das funktioniert.
Nun habe ich:
const byte counterPins[8] = { 2,3,4,5,6,7,8,9 };
in
const byte counterPins[1] = {30};
geändert- und den Rest dazu, das funktioniert auch.
Die Impulse werden zuverlässig empfangen. Die Länge des Impuls beträgt 30ms.
Bei 5v kommt da nicht mehr viel an, aber es wird zuverlässig erkannt.
Jetzt mein Problem.
Wie kann ich Pin 30 mit einer einfachen "if-Abfrage" abfragen:
If (pin30 == xx)
{
mache was
}
Frage ich den Pin mit "if" ab, dann werden die Impulse nicht erkannt. Selbst
wenn der Sketch nur aus der Abfrage besteht.
Warum funktioniert das mit dem Sketch, aber nicht mit einer "if-Abfrage"?
Ich kapier´s nicht?
Wie kann ich das denn mit "if" erschlagen? Das muss doch möglich sein.
Gruß und Dank
Andreas
Quelle des Ganzen:
https://blog.elektrowolle.de/2011/07/26/s0-messwerterfassung-von-stromzahlern/