Anfängerfrage

Hi
für die meisten vermutlich offensichtlich, aber für mich leider noch nicht. Ich möchte LED Impulse mitloggen. Mein Counter bleibt aber auf 1. Wo ist mein Denkfehler? Brauch ich noch eine extra Do-while Schleife, damit der counter nicht mehr zurückgesetzt wird?

void setup() {
 Serial.begin(9600);   // initialize serial communication at 9600 BPS
}

void loop() {
  int sensorValue = analogRead(A0);// read the input on analog pin 0

   if (sensorValue < 150   ) {
   int impulse = impulse + 1;
    delay(1000);
    Serial.println(impulse);  
}

Du legst impulse bei jedem Durchlauf von loop neu an. Entweder global oder static anlegen.
z.B.

void loop() {
  static unsigned int impulse = 0;
  if (...) {
    impulse++;
    ...
  }
}

Gruß Tommy

eierfeile:
Wo ist mein Denkfehler?

Das ist kein Denkfehler, sondern Anfängerglück :slight_smile:

Variablen sind nur so lange gültig, wie der Kontext (geschweifte Klammern), in dem sie deklariert wurden. Du musst die Variable außerhalb von loop() deklarieren.

Gruß

Gregor

Hi

Auch wird es hinderlich sein, daß Du nach JEDEM erkannten Impuls eine ganze Sekunde NICHTS machst - was soll das delay() da?

Elektronik gibt keine prellen Signale zurück, wodurch Du auf ein Endprellen verzichten können dürftest (zumindest per delay(1000); )

MfG

ein impuls krieg ich im schnitt alle 10-15s. Der LDR nimmt pro Sekunde....mind 5 Messungen vor.

ich will damit vermeiden, dass ein Impuls mehrfach ausgewertet wird...daher der kleine delay

eierfeile:
ein impuls krieg ich im schnitt alle 10-15s. Der LDR nimmt pro Sekunde....mind 5 Messungen vor.

ich will damit vermeiden, dass ein Impuls mehrfach ausgewertet wird...daher der kleine delay

Indem Du auf die Flanken schaust. Den L-H Übergang zählst Du. Den H_L Übergang brauchst Du nur zum resettieren der Statusvariablen.

suche nach Arduino button toggle.

Grüße Uwe

Flanken erkennen:

static bool neu;
bool puls = analogRead (A0) < 150; // wie auch immer
if ( puls && neu ) {
   count++; // was immer einmal pro puls zu tun ist
   neu = false;
}
if ( ! puls ) neu=true; // scharf machen für den nächsten Puls

ok, verstehe. Klingt logisch. Aber wenn ich es so machen, passiert genau das Gegenteil was ich eigentlich damit bezwecken wollte. Lass ich den finger einfach mal 1s auf dem LDR, sieht das Ergebnis so aus:

16:33:25.347 -> 754
16:33:25.347 -> 755
16:33:25.347 -> 756
16:33:25.347 -> 757
16:33:25.347 -> 758
16:33:25.413 -> 759
16:33:25.447 -> 760
16:33:25.447 -> 761
16:33:25.481 -> 762
16:33:25.481 -> 763
16:33:25.481 -> 764
16:33:25.481 -> 765
16:33:25.481 -> 766
16:33:25.548 -> 767
16:33:25.581 -> 768

Der sketch sieht bei mir nun so aus:

void setup() {
 Serial.begin(9600); 

}

void loop() {
  static unsigned int pulscounter = 0;
static bool neu;

bool impulse = analogRead (A0) < 150; 
if ( impulse && neu ) {
   pulscounter++; 
   Serial.println(pulscounter);  
   neu = false;
}
if ( ! impulse ) neu=true; 
}

Hab ich etwas falsch umgesetzt?

Hi

Frage ich Mal anders: Was soll denn passieren, statt die Ausgaben, Die Du erhältst?
In Deinem Sketch sehe ich nicht, wie DIESE Ausgabe zustande kommen sollte - passt also nicht so wirklich zusammen, oder?

MfG

hi,
naja also die LED am Stromzähler blinkt. 1000 Impulse = 1kwh. Ergo EIN Impuls = Counter + 1. das isses schon.
Jetzt krieg ich aber für EIN Impuls = counter + 3 oder auch mal +4 oder +5. Da hat meine meine (ungenaue) variante mit dem delay besser funktioniert

Hallo,

ich glaube das kommt weil nur ein schaltpunkt da ist und die Abfrage macht. Wenn der analoge Wert gerade um die 150 ist kann das “prellen”.

Also entweder eine gescheite Hyterese einbauen oder wieder einen delay . Hysterese ist aber besser

ungetestet

Heinz

void setup() {
 Serial.begin(9600);

}

void loop() {
  static unsigned int pulscounter = 0;
  static bool neu;
  int impulse;

   impulse = analogRead (A0);
   if ( impulse <150 && neu ) {
      pulscounter++;
      Serial.println(pulscounter); 
      neu = false;
  }

  if (impulse >500 ) neu=true;

}

Hi

Warum sollte ich ein DIGITALES Signal analog einlesen?
LED AN --> Signal am Arduino
LED AUS --> KEIN Signal am Arduino
(oder anders herum)

Das lässt sich mit entsprechenden Widerständen einstellen.
1x eingestellt und Du hast Ruhe.
Dann erfasst Du die Flanken, also 1->0 Counter++, 0->1 nix, also nur Übernahme des 'Neu-Zustand'.

static boolean neuZustand=false;
neuZustand=digitalRead(BlinkeEngang);
if (altZustand!=neuZustand){
   if (altZustand==true){
      counter++;
   }
   altZustand=neuZustand;
}

MfG

Hallo,

@postmaster-ino

ich glaube wir reden aneinander vorbei. Ich dachte der T0 hat einen einzelnen LDR mittels Vorwiderstand als Spannungsteiler verbaut, desshalb das analogread. Wenn der wert < 150 ist “LDR belichtet” soll gezählt werden. Hat er denn einen Digitalausgang an dem Ding drann. ?

ich denke der triggrepunkt ist nicht eindeutig deshalb 3-4 oder mehr Zählwerte.

was soll sonst die Zeile

bool impulse = analogRead (A0) < 150;

Gruß Heinz

ja genau, Heinz. hab nur den LDR mit widerstand dran. wenn ldr <150 = licht aus. Momentan ist das verhalten nicht konstant. jetzt geht es. aber nur ein paar mal, dann geht gar nix mehr. muss ich mir näher ansehen