Code Hilfe Led dauerhaft umschalten mit Eprom Speicher bei Doppelklick

hallo Leute!

Ich mach so selten was und hab Probleme mit einer einfachen Anwendung

evtl könnt emir jemand hier helfen und die richtigen Schnipsel editieren oder Dreinkopieren.

Was will ich machen:

Ein Ausgang soll nur bei Doppelklick zwischen ein und aus wechseln
der Status soll nach Stromausfall gleich bleiben, also wenn vorher ein, dann wieder ein
ein zweiter Ausgang soll bei de rUmschaltung kurz reagieren (piezo sensor)

das haben wir bis jetzt, de rDoppelklickt funktioniert, der Ausgang bleibt aber nur ganz kurz an

danke
tom

#include <OneButton.h>
#include <EEPROM.h>

// 29.11

const int buttonPin = 2;
int merker;

OneButton button(buttonPin, false);

const int relais1 = 7;   
const int beeper = 8;   

void setup() {
  // put your setup code here, to run once:

  EEPROM.get(5, merker);
  pinMode(buttonPin, INPUT);

  pinMode(relais1, OUTPUT);
   pinMode(beeper, OUTPUT);
  

  button.attachClick(clickedIt);
  button.attachDoubleClick(doubleClickedIt);

//   Serial.begin(9600);    // Debugging only
  // Prints "Setup to the serial monitor"

}



void loop() {

if ((merker != 1) && (merker != 2) && (merker != 3)) {
    merker = 1;
  }


  button.tick();
  delay(10);

if (merker == 1) {
digitalWrite(relais1, LOW);
digitalWrite(beeper, HIGH);
delay(200);
digitalWrite(beeper, LOW);
delay(200);
digitalWrite(beeper, HIGH);
delay(200);
digitalWrite(beeper, LOW);
merker = 2;
EEPROM.put(5, merker);

}

if (merker == 3) {
digitalWrite(relais1, HIGH);
digitalWrite(beeper, HIGH);
delay(1000);
digitalWrite(beeper, LOW);
merker = 4;
EEPROM.put(5, merker);

}

if (merker == 5) {
  merker == 1;
}

  
}

void clickedIt() {

}

void doubleClickedIt() {

merker = merker + 1;  

}
void doubleClickedIt() {
merker = merker + 1;  }

Du könntest in void doubleClickedIt() die ganze Handlung unterbringen - inclusive dem aufs EEprom schreiben. Man weiß ja nie wo das Programm mal abgebrochen wird.
Durch Abfrage des Relaispin entscheidest du was gemacht wird.

if digitalRead(relais1) {digitalWrite(relais1,LOW);merker=0;}
else  {digitalWrite(relais1,HIGH);merker=1;}

Dein Merker bleibt nicht auf 4.

Danke
Muss gestehen der Code war von nen Kumpel der keine Zeit nun hat
Das mit den kerkern is mir zu hoch

Könnte es mir mal wer Komplett reinschreiben um den ganzen Code Posten.
Ich bin mehr der löter und gaaabz simple ide Anwender da ich fast nie was damit mache

Könnte es mir mal wer Komplett reinschreiben um den ganzen Code Posten

. Sicher, aber wozu?

Das ist ja offensichtlich eine Übungs-Spielerei, die keiner so braucht. Außer um es selbst zu schaffen.

Hallo,

du änderst den merker an zwei Stellen in loop bzw. möchtest ihn ändern.

Die erste merker Abfrage in loop bedeutet, wenn merker größer 3, dann setz ihn auf 1
Die letzte Abfrage in lopp ob er gleich 5 ist funktioniert nicht.
Bedeutung "=" ungleich "==" :wink: passiert jeden
Im Grunde solltest du nur eine Abfrage benötigen auf > 4 oder >= 5, je nach belieben.

Hallo,

nochwas wegen den tausenden delays. Irgendwann fällt dir das auf die Füße.
Erlerne millis zu nutzen um damit blockierfreie Zeitabläufe aufzubauen.

Theseus erklärt millis()
http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung
http://forum.arduino.cc/index.php?topic=423688.0

ein Bsp.

// pinMode(LED_BUILTIN, OUTPUT);  nicht vergessen

void heartbeat ()                         // Bspw. zur Kontrolle ob Sketch blockiert
{
  static unsigned long last_ms = 0;
  static bool state = LOW;
    
  if (millis() - last_ms > 499) {
    last_ms = millis();
    state = !state;
    digitalWrite(LED_BUILTIN, state);
  }
}

hi

wir sind eine Schritt weiter, hätten den code auf millis umgestellt jedoch ist scheinbar ein fahler drinnen denn damit schaltet nur noch der Ausgang des Summer/Pin 8 aber das Relay/Led auf Pin 7 nicht mehr ?!?

#include <OneButton.h>
#include <EEPROM.h>

// 29.11
// 1.12  ATTINY TEST  3 mal BEEPER = Adaptiv aus   
  //                   1 mal  1 sek Beepen = EIN
  // Umbau zu 1 MODUL

const int buttonPin = 2;
int merker;
int merka;

OneButton button(buttonPin, false);

const int relais1 = 7;   
const int beeper = 8;   

unsigned long delaytime;

int pause = 99;         ///////// ZEIZ um Anpassen


void setup() {
  // put your setup code here, to run once:

  EEPROM.get(5, merker);
  pinMode(buttonPin, INPUT);

  pinMode(relais1, OUTPUT);
   pinMode(beeper, OUTPUT);
  // Serial.begin(9600);
  

  button.attachClick(clickedIt);
  button.attachDoubleClick(doubleClickedIt);

//   Serial.begin(9600);    // Debugging only
  // Prints "Setup to the serial monitor"

}



void loop() {

if ((merker != 1) && (merker != 2) && (merker != 3) && (merker != 4) &&  (merker != 5)) {
    merker = 1;
  }

//Serial.print(merker);
  button.tick();
  // delay(10);

if (merker == 1) {
// digitalWrite(relais1, LOW);
digitalWrite(beeper, HIGH);
delay(200);
digitalWrite(beeper, LOW);
delay(200);
digitalWrite(beeper, HIGH);
delay(200);
digitalWrite(beeper, LOW);
delay(200);
digitalWrite(beeper, HIGH);
delay(200);
digitalWrite(beeper, LOW);
merker = 2;
EEPROM.put(5, merker);
}


if ((merker == 2) && (buttonPin == HIGH))                   ////////////////////// kein Adaptiv Licht 
{
  digitalWrite(relais1, HIGH);
}

if (((merker == 2) || (merker == 4)) && (buttonPin != HIGH))
{
  digitalWrite(relais1, LOW);
  merka = 1;
}                                                               ////////////////////// kein Adaptiv Licht 




if (merker == 3) {
digitalWrite(beeper, HIGH);
delay(1000);
digitalWrite(beeper, LOW);
merker = 4;
EEPROM.put(5, merker);

}
if ((merker == 4) && (buttonPin == HIGH)){                   ////////////// Adaptiv
//   digitalWrite(relais1, HIGH);
  merka = 1;
  if (merka == 1) {
      digitalWrite(relais1, HIGH); // turn the red light on              1
      delaytime = millis();
      merka = 1;
    }

    if (merka == 1 && millis() - delaytime > pause) {
      digitalWrite(relais1, LOW); // turn the red light off
      delaytime = millis();
      merka = 2;
    }

    if (merka == 2 && millis() - delaytime > pause) {
      digitalWrite(relais1, HIGH); // turn the red light off            2 
      delaytime = millis();
      merka = 3;
    }

    if (merka == 3 && millis() - delaytime > pause) {
      digitalWrite(relais1, LOW); // turn the red light off
      delaytime = millis();
      merka = 4;
    }
    if (merka == 4 && millis() - delaytime > pause) {
      digitalWrite(relais1, HIGH); // turn the red light off            3
      delaytime = millis();
      merka = 5;
    }

    if (merka == 5 && millis() - delaytime > pause) {
      digitalWrite(relais1, LOW); // turn the red light off
      delaytime = millis();
      merka = 6;
    }
    
    if (merka == 6) {
    digitalWrite(relais1, LOW);
    }
    


}




if (merker == 5) {
  merker = 1;
}

  
}

void clickedIt() {

}

void doubleClickedIt() {

merker = merker + 1;  

}

danke

tom

ihr habt auf millis() umgestellt, aber trotzdem noch die ganzen delay drin?