Go Down

Topic: Arduino mit 4 Tastern (Read 2882 times) previous topic - next topic

smith998

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


uwefed

#1
Mar 13, 2013, 09:14 am Last Edit: Mar 13, 2013, 09:16 am by uwefed Reason: 1
Quote
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
Code: [Select]
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:
Code: [Select]
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

sth77

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. ;)
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

smith998

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. ;-)



Code: [Select]


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);
     
  }
}

uwefed

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

Mein freundschaftlicher Ratschlag: Laß es bleiben.

Grüße Uwe

smith998

#5
Mar 13, 2013, 10:26 am Last Edit: Mar 13, 2013, 10:28 am by smith998 Reason: 1
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?


Saasemer

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

Gruß
Saasemer

uwefed


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.
http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Viele Grüße Uwe

udoklein

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: http://blog.blinkenlight.net/experiments/measurements/flexible-sweep/. Im Loop lese und parse ich die serielle Schnittstelle und in der Interruptroutine steuere ich die LEDs an.
Check out my experiments http://blog.blinkenlight.net

Go Up