Zähler mit Analogem Input als "trigger"

Hallo
Ich hab seit gestern mein Arduino und viel Spass an der Sache. Getting started with Arduino hab ich durch (ausser die Letzte Aufgabe). Bisher haben ach meine erweiterungen der Gestellten Aufgaben funktioniert.

Nun stehe ich aber an:
(Das Projekt hat keinen Nutzen auser dem Lerneffekt)

Ein Potentiometer ist in vier Bereiche aufgeteilt:

bis val <250 leuchtet die grüne LED
bei val>250 aber <500 die Gelbe
bei val>500 aber <750 die Rote
und bei val>750 blinkt die Rote LED und ein Signalton piepst.

alles kein Problem.

Jetzt hab ich das ganze erweitert, dass ein 7digit Display angeschlossen ist das anzeigen soll wie oft der Bereich >750 erreicht wurde.
wenn dies mehr als 3 mal passiert ist blinken alle LEDs zusammen und eine Nachricht wird via SerialPort an den Computer geschickt.

wenn ich jetzt aber zum ersten mal den Bereich >750 erreiche zählt das Ding sofort bis 3 hoch. Gibts da eine Möglichkeit das erreichen eines Analogen Wertes nur einmal zu zählen, bzw. erst ein zweites mal zu zählen wenn dieser zuerst wieder unterschritten wurde?

Danke schonmal

const int GRUN = 13;
const int GELB = 12;
const int ROT = 11;
const int SPK = 10; //Lautsprecher
const int DIS1 = 53; //mitte
const int DIS2 = 51; //oben links
const int DIS3 = 49; //oben
const int DIS4 = 47; //oben rechts
const int DIS5 = 45; //unten links
const int DIS6 = 43; //unten
const int DIS8 = 39; //unten rechts
const int DIS9 = 37; //punkt
int val = 0;
int maxNum = 4;
int count = 0;
int lastCount= 0;



void setup() {
 pinMode (GRUN, OUTPUT);
 pinMode (GELB, OUTPUT);
 pinMode (ROT, OUTPUT);
 pinMode (SPK, OUTPUT);
 pinMode (DIS1, OUTPUT);
 pinMode (DIS1, OUTPUT);
 pinMode (DIS2, OUTPUT);
 pinMode (DIS3, OUTPUT);
 pinMode (DIS4, OUTPUT);
 pinMode (DIS5, OUTPUT);
 pinMode (DIS6, OUTPUT);
 pinMode (DIS8, OUTPUT);
 pinMode (DIS9, OUTPUT);
 Serial.begin (9600);
}

void loop() {

 val = analogRead (0);
  if (count == 1)
 { 
 digitalWrite (DIS1, LOW);
 digitalWrite (DIS2, LOW);
 digitalWrite (DIS3, LOW);
 digitalWrite (DIS4, HIGH);
 digitalWrite (DIS5, LOW);
 digitalWrite (DIS6, LOW);
 digitalWrite (DIS8, HIGH);}
  if (count == 2)
 { 
 digitalWrite (DIS1, HIGH);
 digitalWrite (DIS2, LOW);
 digitalWrite (DIS3, HIGH);
 digitalWrite (DIS4, HIGH);
 digitalWrite (DIS5, HIGH);
 digitalWrite (DIS6, HIGH);
 digitalWrite (DIS8, LOW);}
 if (count == 3)
 { 
 digitalWrite (DIS1, HIGH);
 digitalWrite (DIS2, LOW);
 digitalWrite (DIS3, HIGH);
 digitalWrite (DIS4, HIGH);
 digitalWrite (DIS5, LOW);
 digitalWrite (DIS6, HIGH);
 digitalWrite (DIS8, HIGH);}
if (count >3)
{
  digitalWrite (GRUN, HIGH);
digitalWrite (GELB, HIGH);
digitalWrite (ROT, HIGH);
delay (50);
  digitalWrite (GRUN, LOW);
digitalWrite (GELB, LOW);
digitalWrite (ROT, LOW);
delay (50);
}
if (count>3)
{
  Serial.print ("Nachricht 1 ");
  delay (500);
  Serial.print ("Nachricht 2 ");
  delay (500);
  Serial.print ("Nachricht 3");
  delay(500);
  Serial.print ("Nachricht 4 ");
  delay(500);
  }
if (count == 0) {
 digitalWrite (DIS1, LOW);
 digitalWrite (DIS2, HIGH);
 digitalWrite (DIS3, HIGH);
 digitalWrite (DIS4, HIGH);
 digitalWrite (DIS5, HIGH);
 digitalWrite (DIS6, HIGH);
 digitalWrite (DIS8, HIGH);
}
 if (val < 250) {
digitalWrite (GRUN, HIGH);
digitalWrite (GELB, LOW);
digitalWrite (ROT, LOW);
}
if ((val > 250)&& (val < 500)){
digitalWrite (GRUN, LOW);
digitalWrite (GELB, HIGH);
digitalWrite (ROT, LOW);
}
if ((val > 500) && (val < 750)){
digitalWrite (GRUN, LOW);
digitalWrite (GELB, LOW);
digitalWrite (ROT, HIGH);
} 

if (val > 750){
  digitalWrite (GRUN, LOW);
digitalWrite (GELB, LOW);
digitalWrite (ROT, HIGH);
digitalWrite (SPK, HIGH); 
delay (100);
digitalWrite (ROT, LOW);
digitalWrite (SPK, LOW);
delay (100);

}
if (val > 750){
  (count ++);
 }
}

Hallo und willkommen im Forum!

Du brauchst eine Flankenerkennung. Dazu merkt man sich den alten und den aktuellen Zustand und vergleicht diese. Wenn der alte Zustand false und der aktuelle true sind, dann wird gezählt. In der nächsten Runde sind beide true und es wird nicht gezählt. Mein Testsketch:

int val = 0;
int count = 0;
bool aktZustand;
bool altZustand;

void setup() {
  Serial.begin (9600);
  Serial.println("Programmanfang");
}

void loop() {
  val = analogRead (A0);
  Serial.print(val);
  Serial.print("  ");
  aktZustand = (val > 750);
  if (aktZustand && !altZustand) {
    count++;
    Serial.print(count);
  }
  altZustand = aktZustand;
  Serial.println();
  delay(500);
}

Danke für die schnelle Antwort.
Leider war ich nicht fähigdas Problem mit der von dir vorgeschlagenen Methode zu lösen.
Aber dank Hilfe einer Mitbewohnerin hab ich es jetzt auf folgende Weise gelöst:

const int GRUN = 13;
const int GELB = 12;
const int ROT = 11;
const int SPK = 10; //Lautsprecher
const int DIS1 = 53; //mitte
const int DIS2 = 51; //oben links
const int DIS3 = 49; //oben
const int DIS4 = 47; //oben rechts
const int DIS5 = 45; //unten links
const int DIS6 = 43; //unten
const int DIS8 = 39; //unten rechts
const int DIS9 = 37; //punkt
int val = 0;
int maxNum = 4;
int count = 0;
bool wasbelow750;



void setup() {
 pinMode (GRUN, OUTPUT);
 pinMode (GELB, OUTPUT);
 pinMode (ROT, OUTPUT);
 pinMode (SPK, OUTPUT);
 pinMode (DIS1, OUTPUT);
 pinMode (DIS1, OUTPUT);
 pinMode (DIS2, OUTPUT);
 pinMode (DIS3, OUTPUT);
 pinMode (DIS4, OUTPUT);
 pinMode (DIS5, OUTPUT);
 pinMode (DIS6, OUTPUT);
 pinMode (DIS8, OUTPUT);
 pinMode (DIS9, OUTPUT);
 Serial.begin (9600);
}

void loop() {

 val = analogRead (A0);
 if (wasbelow750 && val>750) {
  count++;}
 if (count == 1)
 { 
 digitalWrite (DIS1, LOW);
 digitalWrite (DIS2, LOW);
 digitalWrite (DIS3, LOW);
 digitalWrite (DIS4, HIGH);
 digitalWrite (DIS5, LOW);
 digitalWrite (DIS6, LOW);
 digitalWrite (DIS8, HIGH);}
  if (count == 2)
 { 
 digitalWrite (DIS1, HIGH);
 digitalWrite (DIS2, LOW);
 digitalWrite (DIS3, HIGH);
 digitalWrite (DIS4, HIGH);
 digitalWrite (DIS5, HIGH);
 digitalWrite (DIS6, HIGH);
 digitalWrite (DIS8, LOW);}
 if (count == 3)
 { 
 digitalWrite (DIS1, HIGH);
 digitalWrite (DIS2, LOW);
 digitalWrite (DIS3, HIGH);
 digitalWrite (DIS4, HIGH);
 digitalWrite (DIS5, LOW);
 digitalWrite (DIS6, HIGH);
 digitalWrite (DIS8, HIGH);}
if (count >3)
{
  digitalWrite (GRUN, HIGH);
digitalWrite (GELB, HIGH);
digitalWrite (ROT, HIGH);
delay (50);
  digitalWrite (GRUN, LOW);
digitalWrite (GELB, LOW);
digitalWrite (ROT, LOW);
delay (50);
}
if (count>3)
{
  Serial.print ("Nachricht 1 ");
  delay (500);
  Serial.print ("Nachricht 2 ");
  delay (500);
  Serial.print ("Nachricht 3");
  delay(500);
  Serial.print ("Nachricht 4 ");
  delay(500);
  }
if (count == 0) {
 digitalWrite (DIS1, LOW);
 digitalWrite (DIS2, HIGH);
 digitalWrite (DIS3, HIGH);
 digitalWrite (DIS4, HIGH);
 digitalWrite (DIS5, HIGH);
 digitalWrite (DIS6, HIGH);
 digitalWrite (DIS8, HIGH);
}
 if (val < 250) {
  wasbelow750 = true;
digitalWrite (GRUN, HIGH);
digitalWrite (GELB, LOW);
digitalWrite (ROT, LOW);
}
if ((val > 250)&& (val < 500)){
  wasbelow750 = true;
digitalWrite (GRUN, LOW);
digitalWrite (GELB, HIGH);
digitalWrite (ROT, LOW);
}
if ((val > 500) && (val < 750)){
  wasbelow750 = true;
digitalWrite (GRUN, LOW);
digitalWrite (GELB, LOW);
digitalWrite (ROT, HIGH);
} 

if (val > 750){
  wasbelow750 = false;
  digitalWrite (GRUN, LOW);
digitalWrite (GELB, LOW);
digitalWrite (ROT, HIGH);
digitalWrite (SPK, HIGH); 
delay (100);
digitalWrite (ROT, LOW);
digitalWrite (SPK, LOW);
delay (100);

} }

Wenn es funktioniert, ist es doch gut :slight_smile: Der persönliche Kontakt ist eh besser, kann man noch einen Wein oder einen Smoothie zusammen trinken.

Die vielen wasbelow750 = true; könnte man durch eins ersetzen:

if (val > 750){
  wasbelow750 = false;
  ...
} else {
  wasbelow750 = true;
}

Ah danke, das bringt etwas mehr Ordung ins Geschehen.

Super Forum

Achtung. Ein Analogwert ist trotz konstantem Analogsignal selten konstant und kann um einen Wert herum gelesen werden (+/-1) Zusammen mit einer nicht ganz konstanten Versorgungsspannung ergeben sich dadurch leicht verschiedene Werte. Das kann dazu führen daß ein Wert der zufällig in der Nähe von 750 liegt mehrfach als Änderung gelesen wird obwohl er sich nicht ändert.

Du mußt eine Hysterese einbauen: ein bei 750, aus bei 720

Grüße Uwe