IR Befehl während Programmablaufs stoppen

Hi atomicmate,
ja, hab da noch 2 ander Fehler drin gehabt.
Hab auch das Irrec.resume(); nochmals etwas anders plaziert.
Wenn ich die IR-Codes mittels tastern erzeuge, funktioniert es auf nem Nano. Hab taster-gedöns wieder entfernt aber die restlichen korrekturen gelassen.

Teste bitte und sag mir, ob der IR-Code im Serial-Monitor angezeigt wird.

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv (RECV_PIN);
decode_results results;

#define ein LOW
#define aus HIGH
long results_value =0;

int Cola = 4;
int Fanta = 5;
int Sprite = 6;
int Wasser = 7;

// steuervariablen
int Pumpe = 0 ;                     // Nummer der Pumpe (0 = keine Pumpe läuft)
bool Status = false;                // true = eine Pumpe wurde eingeschaltet,  false = es läuft grad keine Pumpe
bool Stop = false;                      // 1 = Stop gesendet, laufende Pumpe stoppen
unsigned long pumpDauer;            // gibt an wie lange gepumpt wird
unsigned long pumpStart;            //merkt sich, wan pumpe gestartet (um die Dauer des Pumpens messen zu können


void setup() {
  digitalWrite(Cola, HIGH);
  pinMode(Cola, OUTPUT);
  digitalWrite(Fanta, HIGH);
  pinMode(Fanta, OUTPUT);
  digitalWrite(Sprite, HIGH);
  pinMode(Sprite, OUTPUT);
  digitalWrite(Wasser, HIGH);
  pinMode(Wasser, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
Serial.println("Setup ok");

}

void loop() {
  if (irrecv.decode(&results)) {
Serial.println(results.value, DEC);
   
    if (results.value == 16753245)  Stop = true;
    
    if (Status == false) 
    {                       // folgende Zeilen nur ausführen, wenn keine Pumpe läuft)
      if (results.value == 16724175) Pumpe = 1;    // Cola läuft für 6sek, stoppt selbstständig // Zeit für ca 200ml
      if (results.value == 16718055) Pumpe = 2;    // Fanta läuft für 6sek, stoppt selbstständig
      if (results.value == 16743045) Pumpe = 3;    // Sprite läuft für 6sek, stoppt selbstständig
      if (results.value == 16716015) Pumpe = 4;    // Wasser läuft für 6sek, stoppt selbstständig
      if (results.value == 16726215) Pumpe = 5;    // Mezzo-Mix äuft für 6sek, stoppt selbstständig
      if (results.value == 16769565) Pumpe = 10;   // Spülen für 5sek
      if (results.value == 16734885) Pumpe = 11;   // Cola läuft für 8sek, stoppt selbstständig // Zeit für ca 260ml
      if (results.value == 16728765) Pumpe = 12;   // Fanta läuft für 8sek, stoppt selbstständig
      if (results.value == 16730805) Pumpe = 13;   // Sprite läuft für 8sek, stoppt selbstständig
      if (results.value == 16732845) Pumpe = 14;   // Wasser läuft für 8sek, stoppt selbstständig
  
      if (Pumpe) 
      {
        callPumpe(Pumpe);
        Stop = false;
        Status = true;
        pumpStart = millis();
      }   
    }
    irrecv.resume(); 
  }
  else if (Status == true) {                                     // prüfen ob eine Pumpe läuft
     if ((millis() - pumpStart) >= pumpDauer) Stop = true;       // hier wird geprüft, wie lange eine pumpe schon läuft
     if (Stop == true)
     {                                                           // oder ob das Stop gesendet wurde 
        callPumpe(Pumpe);                                        // Laufende Pumpe ausschalten
        Pumpe = 0;
        Stop = false;                                            // stop wieder auf null
        Status = false;                                          // Status wieder auf false alles bereit für nächstes Getränk
     }
  }
}  // loop end


void callPumpe(int Pump) {
    pumpDauer = 6000;                 // Zeit für ca 200ml
    if(Pump == 10) pumpDauer = 5000;  // Zeit für Spülen
    if(Pump > 10) {
      pumpDauer = 8000;       // Zeit für ca 260ml
      Pump -= 10;             // wenn Pump > 10 (Grosses Glas), 10 abziehen und dann entsprechende Pumpe starten 
    }
    
    switch(Pump) {    // Pumpennummer / Funktion
      case 1:   // Cola
      digitalWrite(Cola, aus);
      if(Status == false) digitalWrite(Cola, ein);
      break;

      case 2:   // Fanta
      digitalWrite(Fanta, aus);
      if(Status == false) digitalWrite(Fanta, ein);
      break;

      case 3:   // Sprite
      digitalWrite(Sprite, aus);
      if(Status == false) digitalWrite(Sprite, ein);
      break;

      case 4:   // Wasser
      digitalWrite(Wasser, aus);
      if(Status == false) digitalWrite(Wasser, ein);
      break;

      case 5:   // MezzoMix
      digitalWrite(Cola, aus);
      digitalWrite(Fanta, aus);
      pumpDauer = 3000; 
      if(Status == false) {
        digitalWrite(Cola, ein);
        digitalWrite(Fanta, ein);
      }
      break;

      case 10:   // Spuehlen
      digitalWrite(Cola, aus);
      digitalWrite(Fanta, aus);
      digitalWrite(Sprite, aus);
      digitalWrite(Wasser, aus);   
      if(Status == false) {
        digitalWrite(Cola, ein);
        digitalWrite(Fanta, ein);
        digitalWrite(Sprite, ein);
        digitalWrite(Wasser, ein);
      }
      break;      
   }
}

sorry wegen der Umstände.
LG Stefan

atomicmate:
ok, meinst das ändert was?

Ich würde es sonst nicht schreiben.
Aber ok, in deinem Fall nicht unbedingt wichtig, da du mit Relais schaltest, aber die Kondensatoren wie von Deltaflyer verlinkt, solltest du einsetzen.

Edit:
Im Schaltbild ist auch ein Fehler. Du gehst mit 5 Volt auf das Steckbrett und weiter auf Pin D3 vom Uno ?
Soll das so sein ?
Also übersichtlich ist was anderes.

HotSystems:
Ich würde es sonst nicht schreiben.
Aber ok, in deinem Fall nicht unbedingt wichtig, da du mit Relais schaltest, aber die Kondensatoren wie von Deltaflyer verlinkt, solltest du einsetzen.

Edit:
Im Schaltbild ist auch ein Fehler. Du gehst mit 5 Volt auf das Steckbrett und weiter auf Pin D3 vom Uno ?
Soll das so sein ?
Also übersichtlich ist was anderes.

Ok, schaue mal wegen den Kondensatoren.

Im Schaltbild ist kein Fehler...habe nur ausversehen die gleiche Farbe verwendet...Und bitte um nachsicht...Hab das erste mal mit Fritzing gearbeitet :slight_smile:

atomicmate:
Im Schaltbild ist kein Fehler...habe nur ausversehen die gleiche Farbe verwendet...Und bitte um nachsicht...Hab das erste mal mit Fritzing gearbeitet :slight_smile:

Hallo atomicmate,
Da bist Du mir voraus, ich habe noch gar nie mit Fritzing gearbeitet, ich zeichne Schaltpläne mit Eagle.

Hast Du die neueste Verison des Sketches, den ich am Freitag Nachmittag um 14:34 Uhr gepostet habe
schon getestet? wird da im Seriellen Monitor der IR-Code jeweils angezeigt?
Ich konnte den Sketch mangels der IR-Fernbedienung nur testen, indem ich mittels mehrerer Tasten die unterschiedlichen IR-Codes erzeugt und in die value-Variable geschrieben habe. Damit hat es dann sauber funktioniert, auch der Abbruch- (Stop)- Befehl.
Es gab nun auch keine unkontrolierten Pupmpen-Starts mehr.

LG Stefan