Bei unterbrechen einer Lichtschranke einmal Hochzählen

Hallo Miteinander,

Ich versuche für ein Projekt immer wenn mein MH-Sensor unterbrochen wird, um 1 Hochzuzählen bis zu einem maximum von 6 und dann wieder von vorne zu beginnen. Mit meinem aktuellen Code zählt mein Wert für count aber immer solange die Lichtschranke unterbrochen ist wie wild von 1- 6.
Wie kann ich dem Programm sagen, dass es bei jedem trigger nur einmal hochzählen soll?

if(count<6){

  switch (state)
  {
    case wait2start:
      if (wert <= 300)                    // Der Näherungssensor hat ausgelöst
      {
       state = triggerOne;
        }                                // ersten Schritt machen
      break;
    case triggerOne:
    count++;

      if (wert > 300)                    // Warten, das der Sensor frei ist
      {
        state = waitForAnker;            // nächsten Schritt machen
      }
      break;
    case waitForAnker:
       if (wert <= 300)                   // Der Näherungssensor hat zum zweiten Mal ausgelöst
      {
        state = triggerTwo;              // nächsten Schritt machen
      }
      break;
    case triggerTwo:
    count++;


      if (wert > 300)                    // Und hier ist der Punkt, wo was neues passieren muss
      {
        state = wait2start;
      }
      break;
  }}

Versuche es mal durch Versetzen von count++; (ungetestet):

if(count<6){

  switch (state)
  {
    case wait2start:
      if (wert <= 300)                    // Der Näherungssensor hat ausgelöst
      {
       count++;
       state = triggerOne;
        }                                // ersten Schritt machen
      break;
    case triggerOne:

      if (wert > 300)                    // Warten, das der Sensor frei ist
      {
        state = waitForAnker;            // nächsten Schritt machen
      }
      break;
    case waitForAnker:
       if (wert <= 300)                   // Der Näherungssensor hat zum zweiten Mal ausgelöst
      {
        count++;
        state = triggerTwo;              // nächsten Schritt machen
      }
      break;
    case triggerTwo:


      if (wert > 300)                    // Und hier ist der Punkt, wo was neues passieren muss
      {
        state = wait2start;
      }
      break;
  }}
1 Like

Scheint funktioniert zu haben danke dir :slight_smile:

Eine Hysterese bei Schaltschwellen ist nie verkehrt.

Außerdem habt ihr es mit den states etwas übertrieben.

Das hier sollte auch reichen:

void setup() {}
void loop() {
int wert = analogRead  (A0);
static byte count=0;
static enum { wait, trigger } state;
 if(count<6) {
  switch (state)
  {
    case wait:
       if (wert <= 300)  {
         // Der Näherungssensor hat ausgelöst
         count++;  // Schritt zaehlen
         Serial.println( count); // 1 .. 6
         state = trigger;
       }      
       break;                          
    case trigger:
       // Warten, bis Sensor frei ist
       if (wert > 330)    state = wait;      // Grundzustand 
       break;
   }
 } else count = 0;  // wieder von vorn
}
1 Like

Super das geht auch und ist etwas übersichtlicher :smiley:
Wie wäre es wenn ich zwei Sensoren an verschiedenen Positionen hab und jede Unterbrechung von einem dieser Sensoren den Zähler hochsetzen soll ginge das irgendwie mit einem Oder befehlt?
Also sozusagen Sensor 1 wird unterbrochen Zähler geht von 0 auf 1 dann wird Sensor 2 Unterbrochen und der zähler geht von 1 auf 2 usw.

"usw. " ist unklar.
Soll völlig egal sein, welcher Sensor wann anspricht ?
Können beide gleichzeitig, also ein Sensor geht in state = trigger, während der andere auch in trigger ist?
Und dann werden beide gezählt?
Im gleichen Zähler oder wäre nicht je ein Zähler für jeden Sensor netter?
Beide Zähler vergleichen oder zusammenaddieren?

Klar, alles geht. Nur nicht alles gleichzeitig.
Und ein "Oder-Befehl" alleine reicht nicht,
zwei analogRead Aufrufe brauchst du auch...

Ich habe einen Rotor mit 3 Ankern und jedes mal wenn einer dieser Anker einen der Sensoren Unterbricht soll der Zähler um eins hoch gehen. Es werden dabei nie beide Schranken gleichzeitig unterbrochen.

Und warum willst du bis 6 zählen ?

Soll das auf 12 erhöht werden?

Jeder Zahl ist ein bestimmter Befehl zugeschrieben und es soll weiterhin nur auf 6 hochgehen

Ja.
Wobei das mit dem befehl wohl eher nicht.
Frage sensor 1 ab.
Wenn der auslöst, incremtiere den counter.
Frage sensor 2 ab.
Wenn der auslöst, incremtiere den counter.

Mit welchem Befehl könnt ich denn dafür gut nehmen?

Bei C++ gibt es gar keine Befehle.
@my_xy_projekt hat dir 4 Zeilen hingeschrieben.
Die ersten zwei hast du schon realisiert.
Das musst du also für den zweiten Sensor also einfach nochmal machen.

Wobei "musst" eher "kannst du" heißt, eleganter gehts immer :wink:

Perfekt hat funktioniert Danke euch :smiley:

Ja schick.
Das Du Deinen ausgangscode schon nicht zur Verfügung gestellt hast, war schade. Aber dann präsentiere doch wenigstens die Lösung.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.