Arduino mit 4 Tastern

Hallo,

ich möchte bei meinem Projekt mit dem Arduino Mega mehrere Motoren und RGB LED Stripes per Taster steuern.
Die Taster sind jeweils an digitalen Eingängen angeschlossen, ebenso wie die Stripes(Adafruit). Die Motoren werden über das Adafruit Motor Shield angesteuert.

Beispiel: Taster1 = Motor 1 dreht vorwärts, Stripe1 Lauflicht grün
Taster2 = Motor 1 und 2 drehen vorwärts, bei Stripe 1&2&3 sollen jeweils verschiedene Lauflichtprogramme ablaufen.

etc.

Die Befehle stehen größtenteils. Aber wie bekomme ich eine vernünftige Unterbrechung wenn z.B. die Befehle von Taster 1 ablaufen und ich Taster 3 drücke?
Bis jetzt habe ich es so gelöst das ich einen fünften Taster habe der das Board resettet und ich dann einen neuen Taster drücken kann.

Geht es das ich eine permanente Abfrage habe welche dann den aktuellen Programmablauf unterbricht und mit dem anderen Befehlen weitermacht?

MfG

smith998

Die Befehle stehen größtenteils. Aber wie bekomme ich eine vernünftige Unterbrechung wenn z.B. die Befehle von Taster 1 ablaufen und ich Taster 3 drücke?
Bis jetzt habe ich es so gelöst das ich einen fünften Taster habe der das Board resettet und ich dann einen neuen Taster drücken kann.
Geht es das ich eine permanente Abfrage habe welche dann den aktuellen Programmablauf unterbricht und mit dem anderen Befehlen weitermacht?

Anstatt

if (taste 1 gedrückt) ausgänge 1 setzen
if (taste 2 gedrückt) ausgänge 2 setzen
if (taste 3 gedrückt) ausgänge 3 setzen
if (taste 4 gedrückt) ausgänge 4 setzen
if (taste 5 gedrückt) alle ausgänge löschen

kannst Du:

if (taste 1 gedrückt) alle ausgänge löschen und ausgänge 1 setzen
if (taste 2 gedrückt) alle ausgänge löschen und ausgänge 2 setzen
if (taste 3 gedrückt) alle ausgänge löschen und ausgänge 3 setzen
if (taste 4 gedrückt) alle ausgänge löschen und ausgänge 4 setzen

Du darfst aber kein delay() verwenden sondern mit millis() arbeiten sodaß die Tasten immer wieder abgefragt werden.

Grüße Uwe

Lass uns doch mal einen Blick auf deinen derzeitigen Code werfen. Ich könnte mir gut vorstellen, dass du derzeit die Lauflichter in irgendwelchen (geschlossenen) Schleifen laufen lässt und dadurch nicht mehr auf andere Tastendrücke reagieren kannst. Vielleicht sind auch die bösen delays schuld, dass kein Tastendruck erkannt wird. :wink:

Danke erstmal für die Tipps.
Hier nun mein Code (ab dem loop-Teil) bisher. Ich habe erstmal nur 2 Taster in den Code gepackt, sonst wird es noch unübersichtlicher. :wink:

void loop() {
  
  
//TASTER 1 (Vorfüllung) HIGH
  if (digitalRead(Taster1)==HIGH)     //Wenn Taster 1 HIGH
{ 
  digitalWrite(LED1,HIGH);            //LED des Taster 1 AN 
  strip1.show();    
  delay(10);
  motorCP.run(FORWARD);               //Motor CP dreht vorwärts
  motorBP.run(FORWARD);               //Motor BP dreht vorwärts
  //colorWipe1(strip1.Color(0,0,127), 255);	
  
  int p;  
  for (p=0; p<1; p++){                                    //einmal colorWipe 1 und 2 ausführen
   colorWipe1(strip1.Color(0,0,127), 255);        //Farbe blau
  colorWipe2(strip2.Color(0,0,127), 255);		// Farbe blau
  delay(10);  
}
 for (int i=0; i<100; i++){                              //100-mal ColorDot 1 und 2 ausführen
// Anweisungen

  colorDot1(strip1.Color(127,50,127),255); 

  colorDot2(strip2.Color(127,50,127),255);
  	                // türkis
 }

}

//TASTER 2 (Blutentnahme) HIGH

 if (digitalRead(Taster2)==HIGH) 
{ 
  digitalWrite(LED2,HIGH);  
  strip2.show();

  delay(10);
  int p;  
  for (p=0; p<1; p++){  
  // fill the entire strip with...
  colorWipe2(strip2.Color(127,0,0), 255);		// red
  delay(10);
}
}
}



//Befehle
void colorWipe2(uint32_t c, uint8_t wait) {
    
  int i;
  int au = strip2.numPixels();
  for (i=0; i < au; i++) {
    
      strip2.setPixelColor(i, c);
      strip2.show();
  
      delay(wait);
      
  }
}
// Befehle für Strip 1 (Citrat)
void colorWipe1(uint32_t c, uint8_t wait) {
    strip1.setPixelColor(0, 0,0,127);             // setze die ersten drei Pixel auf blau
    strip1.setPixelColor(1, 0,0,127);                
    strip1.setPixelColor(2, 0,0,127);   
  int i;
  
  for (i=0; i < strip1.numPixels(); i++) {
    
      strip1.setPixelColor(i, c);
      strip1.show();
  
      delay(wait);     
  }
}
//Methoden

//Methoden Strip1
void colorDot1(uint32_t c, uint8_t wait) {

  int r;

  for (r=3; r < strip1.numPixels(); r++) {
      strip1.setPixelColor(r, c);
      if (r == 3) { 
       strip1.setPixelColor(strip1.numPixels()-1, 0,0,127);
       
          } else {
        strip1.setPixelColor(r-1, 0,0,127);
        strip1.show();
        delay(wait);
      }
     
      zaehl1++;
      Serial.println(zaehl1);
      if (zaehl1>12) {strip1.setPixelColor(0, 0,0,0);}
      else {strip1.setPixelColor(0, 0,0,127);}
      if (zaehl1>18) {strip1.setPixelColor(1, 0,0,0);}
         else {strip1.setPixelColor(1, 0,0,127);}
      if (zaehl1>180) {strip1.setPixelColor(2, 0,0,0);}
       else {strip1.setPixelColor(2, 0,0,127);}
        
     
  }

}

// Befehle für Strip 2 (Blut bis Zentrifuge)
void colorDot2(uint32_t c, uint8_t wait) {
  
  
  int r;
  
  int fill2=fill+1;
  for (r=0; r < strip2.numPixels()-fill; r++) {
      strip2.setPixelColor(r, c);
      if (r == 0) { 
       strip2.setPixelColor(strip2.numPixels()-fill2, 0,0,127);
      
     if (fill>0) {fill--;}  
  
      } else {
        strip2.setPixelColor(r-1, 0,0,127);
        
      }
      strip2.show();
    
      delay(wait);
  }
}


// Befehle für Strip 3 PLASMABEHAELTER

void colorDot3(uint32_t c, uint8_t wait) {
  
  
  int r;
  
  int fill2=fill+1;
  for (r=0; r < strip3.numPixels()-fill; r++) {
      strip3.setPixelColor(r, c);
      if (r == 0) { 
       strip3.setPixelColor(strip3.numPixels()-fill2, 127,127,0);

      } else {
        strip3.setPixelColor(r-1, 127,127,0);
        
      }
      strip3.show();
      delay(wait);
      zaehl3++;
      Serial.println(zaehl3);
      if (zaehl3>30) {strip3.setPixelColor(11, 0,0,127);}
      if (zaehl3>60) {strip3.setPixelColor(10, 0,0,127);}
      if (zaehl3>270) {strip3.setPixelColor(9, 0,0,127);}
  }
}
void colorWipe3(uint32_t c, uint8_t wait) {
    
  int i;
  int au = strip3.numPixels();
  for (i=0; i < au-4; i++) {
    
      strip3.setPixelColor(i, c);
      strip3.show();
  
      delay(wait);
      
  }
}

Das scheint mir eine Maschiene für Apherese zu werden.

Mein freundschaftlicher Ratschlag: Laß es bleiben.

Grüße Uwe

Ja so ähnlich.
Es soll ein Plasmapheresemodell werden.
Es ist ein Abschlussprojekt, welches nicht mehr geändert/abgebrochen werden kann.

Warum sollte ich es sein lassen? Zu komplex bzw. kompliziert?

Versuch die Abfrage der Unterbrechung doch mal mit Interrupts zu machen.

Gruß
Saasemer

smith998:
Ja so ähnlich.
Es soll ein Plasmapheresemodell werden.
Es ist ein Abschlussprojekt, welches nicht mehr geändert/abgebrochen werden kann.

Warum sollte ich es sein lassen? Zu komplex bzw. kompliziert?

Weil ein Mediznisches Gerät zu bauen sehr kompliziert ist. Außer der fachlichen Kompetenz und Fachwissen mussen auch jede Menge Normen und Gesetze berücksichtigt werden.

Wenn Du ein Modell bauen willst ,dann ist es etwas anderes.

Du kannst einen PCF8574 nehmen und die Tasten daran anschließen. Der kann 8 Eingänge haben und bei Pegeländerung einen Interrupt auslösen. Ansonsten alle elays durch millis() Kontrollen ersetzen und die Tasten dauern abfragen.

Viele Grüße Uwe

Du könntest "die Arbeit" auch in einem Interrupt erledigen lassen (ich empfehle die msTimer2 Library) und die Taster im Loop auswerten. So was Ähnliches mache ich hier: Flexible Sweep | Blinkenlight. Im Loop lese und parse ich die serielle Schnittstelle und in der Interruptroutine steuere ich die LEDs an.