Arduino Kurs Teil 4
Zwei Taster können zwei Interrupts auslösen.
Der eine Taster-Interrupt schaltet die LED ein und der andere Taster-Interrupt schaltet die LED aus.
Das Programm
// Zwei externe Taster schalten die LED 13 ein und aus per Interrupt // Beim Arduino Uno / Nano sind das Pin2 oder Pin3 für den Interrupt int LED=13, taster1=2, taster2=3; void setup() { pinMode(taster1,INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(taster1), isrLedEinschalten, FALLING); pinMode(taster2,INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(taster2), isrLedAusschalten, FALLING); } void loop() { delay(1000); } void isrLedEinschalten() { digitalWrite(LED,1); } void isrLedAusschalten() { digitalWrite(LED,0); }
von Matthias Busse
Hallo Herr Busse,
die Erklärungen sind toll. Habe schon mehrere Sachen ausprobiert. Habe bezüglich des Tastereinlesens eine spezielle Frage:
Kann ich mit dieser Abfrage wie oben dargestellt mehrere Funktionen („Unterprogramme“) aufrufen, anstatt eine LED zu steuern? Die Funktionen sehen wie folgt aus (Es handelt sich dabei um die Auswahl mehrerer Musikordner auf einer SD-Karte (DFPlayer Mini):
Innerhalb dieser Ordner kann ich mit 30 Tastern Musikstücke auswählen, das funktioniert bereits recht gut.
_______________________________________________________________________________________________________________
void Ordner01(){
for (int i=0; i<30; i++){ // wiederhole 30 Mal (für jeden Taster)
if (digitalRead(buttonPins[i]) == LOW){ // wenn ein Taster gedrückt wird
Serial.println(i);
myDFPlayer.playLargeFolder(1,i+1); // spiele das MP3 der Nummer des Tasters nach von der SD-Karte
delay(2000);
}
}
}
void Ordner02(){
for (int i=0; i<30; i++){ // wiederhole 30 Mal (für jeden Taster)
if (digitalRead(buttonPins[i]) == LOW){ // wenn ein Taster gedrückt wird
Serial.println(i);
myDFPlayer.playLargeFolder(2,i+1); // spiele das MP3 der Nummer des Tasters nach von der SD-Karte
delay(2000);
}
}
}
_______________________________________________________________________________________________________________
Meine bishere Lösung hat den Nachteil, dass egal welcher Taster gedrückt wurde, der Status nach dem Tastendruck nicht behalten wurde und somit (durch den Loop) die Ordner je nach Ablauf angesprochen wurden. Hier mein laienhaftes Vorgehen:
______________________________________________________________________________________________________________
void loop()
{
if (digitalRead(2) == LOW){
Serial.println(2);
{
Ordner01();
delay(200);
}
}
if(digitalRead(4) == LOW){
Serial.println(4);
{
Ordner02();
delay(200);
}
}
if(digitalRead(8) == LOW){
Serial.println(8);
{
Ordner03();
delay(200);
}
}
}
Vielleicht können sie mir ein Beispiel für das Ansteuern der Ordner01,02…. aufzeigen.
Würde mich sehr über eine Antwort freuen. Vielen Dank im Voraus.