Schlummerfunktion

Hallo,

ich bin noch ein ziemlicher Neuling in der Programmierung und versuche gerade eine Art Schlummerfunktion zu programmieren, zunächst im Kleinen mit einer LED. Dabei soll die LED am Anfang leuchten und nachdem man den Taster betätigt hat für einen definierten Zeitraum ausgehen bevor sie sich erneut anschaltet und erst nachdem man den Taster ein zweites mal betätigt hat, völlig ausbleiben.

Dabei bin ich bis jetzt soweit, wobei die LED jedoch nur einmal ganz aus geht:

int x=0;

int pinlrot=5;
bool rot=true;

int stat1;
int schaltr=9;

long Los;
long Start;

void setup() {

  Serial.begin(9600);
  
  pinMode(schaltr,INPUT_PULLUP);
  pinMode(pinlrot,OUTPUT);
  
  
}

void loop() {

  stat1=digitalRead(schaltr);
  
   
//---------------------------------------------------------
if(rot==true){
  digitalWrite(pinlrot, HIGH);
}
if(rot==false){
  digitalWrite(pinlrot, LOW);
}
//---------------------------------------------------------

Los=millis();

  
if((stat1==HIGH)&&(x==0))
{
  Start=millis();
  rot=false;

    if(Los-Start>1000){
    rot=true;
    x=1;
  }
}

if((stat1==HIGH)&&(x==1)){
  rot=false;
  Start=millis();
  x=2
}
}

Vielen Dank im Voraus.Vorformatierter Text

Verwenden Sie auch Englisch im Allgemeinen Forum.
Ich habe Ihren Post zum Deutschen Forum verschoben

PS: Haben Sie von Code-Tags Gehört?

Wie man dieses Forum benutzt - bitte lesen

Hallo bukzi
Das Zauberwort lautet "Schrittkette".
Die Schrittkette durchläuft die von dir aufgeführten Schritte. Diese ist formuliert in einer Switch/Case Struktur und kann die folgenden Schritte durchlaufen:

enum {LedOn, Wait4ButtonPressedFirst, ButtonPressedFirst, Wait4TimerFired, TimerFired, Wait4ButtonPressedSecond, ButtonPressedSecond}

Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren in C++.

p.s. Es wird noch ein Timer benötigt, der über die Schrittkette gestartet wird.

Ich denke, vor größeren Umbauten am Sketch (Bravo - Lob - erster Beitrag und kein delay() drin!!!) ist noch ein klitzekleines anderes Problem mit großer Auswirkung zu beseitigen:

void loop()
{
  stat1 = digitalRead(schaltr);
  rot = true;
  ...

Bei jedem Durchlauf der loop() wird rot gesetzt.
Eigentlich sollte das doch bestimmt weiter unten aufgrund der Werte von stat1 und x passieren (die genaue Logik habe ich mir noch nicht zu Gemüte geführt).
In anderen Worten: Alles was da unten gerechnet und geschaltet wird ist für die Katz.

 ...
 rot = true;
 //---------------------------------------------------------
  if (rot == true)
  {
    // HIER kommt das Programm immer hin!
    ...

Willkommen im Forum und Gruß!
Walter

Vielen Dank für die Antworten.

Ich bräuchte jedoch noch etwas mehr Erläuterungen zum Gedanken der Schrittkette und wie baue ich optimal einen Timer ein?

Ich habe jetzt diesen Quellcode geschrieben. Jedoch geht die Lampe dabei nur einmal aus und kein weiteres mal.


//---------------------------------------------------------
if(rot==true){
  digitalWrite(pinlrot, HIGH);
}
if(rot==false){
  digitalWrite(pinlrot, LOW);
}
//---------------------------------------------------------


Los=millis();

if(Los-Start>1000){
    rot=true;
}

if((stat1==HIGH)&&(x==0)){
  x=1;  
}

if((stat1==HIGH)&&(x==2)){
  x=3;  
}

if((stat1==HIGH)&&(x==4)){
  x=5;  
}

switch (x) {
  case 1:
    rot=false;
    x=2;
    Start=millis();// Tue etwas, wenn "var" 1 ist
    break;

  case 3:
    rot=false;
    x=4;
    Start=millis();
    // Tue etwas, wenn "var" 2 ist
    break;

   case 5:
    rot=false;
    x=6;
    Start=millis();
    // Tue etwas, wenn "var" 2 ist
    break;
    
}

Hallo
Hast du dich zum Thema Schrittkette oder Finite State Machine eingelesen?
Die Programmierung einer Schrittkette oder Finite State Machine wird durch die Verwendung der SWITCH/CASE Anweisung unterstützt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.