INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
LED-Bilnker: Wechsel durch Interrupt
01.10.2017, 19:30
Beitrag #1
LED-Bilnker: Wechsel durch Interrupt
Guten Abend zusammen,

nachdem ich gestern ein kleines Script mit 3 Unterprogrammen (3 Blinkmodi) geschrieben habe & das jeweilige Programm über einen Codierschalter einstellen kann, würde ich gerne eine andere Variante nutzen. Und zwar soll mit Prog0 gestartet werden, mittels Tasterdruck dann aber sofort abgebrochen und in die nächste Schleife gewechselt werden. Nachdem ich einiges mit Interrupts probiert habe, bin ich leider nicht zu einem befriedigenden Ergebnis gekommen.

An PIN5 möchte ich nun einen Taster einbauen, der nach Wechsel auf HIGH dann entsprechend weiterspringt. Ist das letzte Programm erreicht, so soll er wieder von vorne beginnen. Dies möchte ich zusätzlich zum Codierschalter verwenden. Sobald Taster gedrückt, springe wieder zum Auslesen des Codierschalters.
Alternativ würde ich den Codierschalter gerne komplett aussen vor lassen und den Modi nur mittels Taster wählen. Dazu würde ich doch am besten eine Variable erstellen, die mit jedem Tasterdruck ++ hochzählt?

Anbei mein Code: Da ich blutiger Anfänger bin, darf ich euch bitten, mir einen Methode aufzuzeigen, welche ich einsetzen kann? Vielen Dank vorab.

Code:
int led1=2; // LED an PIN2
int led2=3; // LED an PIN3
int D0=7; // PIN1 des BCD_Schalters
int D1=8; // PIN2 des BCD_Schalters
int D2=9; // PIN3 des BCD_Schalters

void setup() {
  pinMode(led1, OUTPUT); //PIN2 ist OUTPUT
  pinMode(led2, OUTPUT); //PIN3 ist OUTPUT
  pinMode(D0, INPUT); //PIN7 ist INPUT
  pinMode(D1, INPUT); //PIN8 ist INPUT
  pinMode(D2, INPUT); //PIN9 ist INPUT
}

void prog0()
  {
  digitalWrite(led2, HIGH);
  delay(100);  
  digitalWrite(led2, LOW);  
  delay(40);  
  digitalWrite(led2, HIGH);  
  delay(100);  
  digitalWrite(led2, LOW);
  delay(700);
  digitalWrite(led1, HIGH);
  delay(40);
  digitalWrite(led1, LOW);
  delay(200);
  }
  
void prog1()
  {
  digitalWrite(led2, HIGH);
  delay(500);  
  digitalWrite(led2, LOW);  
  delay(500);  
  digitalWrite(led1, HIGH);  
  delay(500);  
  digitalWrite(led1, LOW);
  delay(500);
  }  

void prog2()
  {
  digitalWrite(led2, HIGH);
  delay(30);  
  digitalWrite(led2, LOW);  
  delay(30);  
  digitalWrite(led1, HIGH);
  delay(30);
  digitalWrite(led1, LOW);
  delay(400);
  }
  
void loop () {
  digitalRead(D0); //Wert wird eingelesen
  digitalRead(D1); //Wert wird eingelesen
  digitalRead(D2); //Wert wird eingelesen

  if((D0==LOW)&&(D1==LOW)&&(D2==LOW)) //if Bedingung mit eingelesenen Werten D0,D1,D2
  {
  prog0(); //Unterprogramm 0
  }
  else if((D0==HIGH)&&(D1==LOW)&&(D2==LOW))
  {
  prog1(); //Unterprogramm 1
  }
  else if((D0==HIGH)&&(D1==HIGH)&&(D2==LOW))
  {
  prog2(); //Unterprogramm 2
  }
}

Gruß & vielen Dank

Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2017, 20:13
Beitrag #2
RE: LED-Bilnker: Wechsel durch Interrupt
Was du mit Unterprogramm meinst, heißt in C++ "Funktionen".

Wenn du in deinem Sketch per Taster die Funktionen wechseln möchtest solltest du dich von allen delays verabschieden.
Jedes delay blockiert den Controller.
In der Zeit wartet dieser und führt keinerlei Anweisungen aus.
Du solltest deine delays durch Funktionen mit millis ersetzen.
Sieh dir dazu "BlinkWithoutDelay" an. Hier im Forum und in der IDE.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2017, 20:40 (Dieser Beitrag wurde zuletzt bearbeitet: 01.10.2017 20:59 von djculture2001.)
Beitrag #3
RE: LED-Bilnker: Wechsel durch Interrupt
OK, das habe ich mir schon fast gedacht...
den Code Blink without Delay habe ich mal wie folgt entschlackt.
Code:
const int ledPin =  13;    
int ledState = LOW;            
long previousMillis = 0;        
long interval = 1000;        

void setup() {
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;  

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    digitalWrite(ledPin, ledState);
  }
}

Wie würde denn das Ganze dann für ein Blinkmuster eines meiner Funktionen aussehen? Ich habe mir eindeutig zu viel heute angeschaut, absolute Blockade Sad.

Code:
if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;

Wenn currentMillis minus previousMillis, dann setze previousMills auf currentMillis

Gruß & Danke
Ralf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2017, 21:06
Beitrag #4
RE: LED-Bilnker: Wechsel durch Interrupt
(01.10.2017 20:40)djculture2001 schrieb:  Wenn currentMillis minus previousMillis, dann setze previousMills auf currentMillis

Und führe den Code der in der If-Abfrage direkt folgt auch direkt aus.
Die Zeit in interval legt den Intervall-Zeitpunkt fest.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2017, 21:12
Beitrag #5
RE: LED-Bilnker: Wechsel durch Interrupt
in meinem Fall wären das ja dann mehrere interval Variablen wenn man vom Code der einzelnen Funktionen ausgeht?
Die Ein-/Ausschaltverzögerung habe ich ja bisher über delay realisiert, wie würde ich das denn anhand der millis-Funktionen umsetzen? Kannst du mir das ggf. anhand einer Funktion aus meinetwegen prog0() erläutern?

Statt der Variable intervall kann ich da auch die Dauer in Millisekunden eingeben?

Vielen Dank vorab
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2017, 21:24
Beitrag #6
RE: LED-Bilnker: Wechsel durch Interrupt
Du musst das Blinken als eigenständige Routine in die Loop setzen, so wie es im Beispiel auch vorgegeben ist. Das jeweils für jede Led.
Per Statusvariable kannst du das Blinken dann ein bzw. ausschalten.

Da ich nicht am PC sitze, kann ich aktuell keinen Beispielsketch schreiben.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.10.2017, 07:28 (Dieser Beitrag wurde zuletzt bearbeitet: 02.10.2017 07:32 von djculture2001.)
Beitrag #7
RE: LED-Bilnker: Wechsel durch Interrupt
Guten Morgen,
das Ganze wäre dann also so, dass ich für jedes Ein- und Ausschalten eine Anfrage der prev und current millis machen muss?!

Code:
const int ledPin =  13;    
int ledState = LOW;            
long previousMillis = 0;        
long interval = 1000;    
long interval = 20;
unsigned long currentMillis = millis();    

void setup() {
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  

  if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;  

    if (ledState == LOW)
      ledState = HIGH;
    
    digitalWrite(ledPin, ledState);
}

   if(currentMillis - previousMillis > interval2) {
     previousMillis = currentMillis;

    if(ledState == HIGH)
      ledState = LOW;

    digitalWrite(ledPin, ledState);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.10.2017, 10:24
Beitrag #8
RE: LED-Bilnker: Wechsel durch Interrupt
Das muss dann in etwa so aussehen:
(Demo-Code - ungetestet)

Code:
void loop()
{
  if (currentMillis - previousMillis1 > interval1) {
    previousMillis = currentMillis1;

    if (ledState1 == LOW)
      ledState1 = HIGH;
    else
      ledState1 = LOW;

    digitalWrite(ledPin1, ledState1);
  }


  if (currentMillis - previousMillis2 > interval2) {
    previousMillis2 = currentMillis;

    if (ledState2 == LOW)
      ledState2 = HIGH;
    else
      ledState2 = LOW;

    digitalWrite(ledPin2, ledState2);
  }
}

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Loop-Teil mit Interrupt für bestimmte Zeit stoppen Alter Fritz 11 789 23.12.2019 23:10
Letzter Beitrag: hotsystems
  Lauflicht mit Interrupt senseman 18 1.241 09.12.2019 22:37
Letzter Beitrag: senseman
  AT90CAN Interrupt wird nicht ausgelöst slsb02 5 474 19.11.2019 15:04
Letzter Beitrag: slsb02
Lightbulb Abspielen einer Sounddatei durch Aktivierung eines Bewegungsmelders FeLu 6 692 03.09.2019 20:45
Letzter Beitrag: hotsystems
  Interrupt vs. LCD Nasenbär 10 1.196 22.08.2019 16:30
Letzter Beitrag: @Thomas
Sad Neuling verzweifelt braucht Hilfe delay durch timer ersetzen Lois 1 1.146 06.02.2019 16:15
Letzter Beitrag: Tommy56
  IR-Remote - Case abbruch durch anderes case Snekels 5 739 03.01.2019 19:08
Letzter Beitrag: Tommy56
  Interrupt und I2C gibt das Probleme? Badger1875 5 3.217 03.10.2017 23:26
Letzter Beitrag: GuaAck
  Problem mit externem Interrupt manfred474 13 4.343 13.08.2017 08:54
Letzter Beitrag: MicroBahner
  Taster an Interrupt - Prellen geschickter vermeiden als millis() zu prüfen? Flap 19 10.963 04.08.2017 08:10
Letzter Beitrag: Binary1

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste