Arduino Forum

International => Deutsch => Topic started by: smith998 on Mar 13, 2013, 08:57 am

Title: Arduino mit 4 Tastern
Post by: smith998 on Mar 13, 2013, 08:57 am
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

Title: Re: Arduino mit 4 Tastern
Post by: uwefed on Mar 13, 2013, 09:14 am
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
Title: Re: Arduino mit 4 Tastern
Post by: sth77 on Mar 13, 2013, 09:30 am
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. ;)
Title: Re: Arduino mit 4 Tastern
Post by: smith998 on Mar 13, 2013, 10:03 am
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);
     
  }
}
Title: Re: Arduino mit 4 Tastern
Post by: uwefed on Mar 13, 2013, 10:20 am
Das scheint mir eine Maschiene für Apherese zu werden.

Mein freundschaftlicher Ratschlag: Laß es bleiben.

Grüße Uwe
Title: Re: Arduino mit 4 Tastern
Post by: smith998 on Mar 13, 2013, 10:26 am
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?

Title: Re: Arduino mit 4 Tastern
Post by: Saasemer on Mar 13, 2013, 10:40 am
Versuch die Abfrage der Unterbrechung doch mal mit Interrupts zu machen.

Gruß
Saasemer
Title: Re: Arduino mit 4 Tastern
Post by: uwefed on Mar 13, 2013, 12:52 pm

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
Title: Re: Arduino mit 4 Tastern
Post by: udoklein on Mar 13, 2013, 10:38 pm
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/ (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.