neuron74:
button lo --> relais 1 an , led 1 blinkt während des drückens
button lu kurz ---> relais 1 aus. led 1 wie oben
button lu lang ---> relais 1 aus nach 30 sekunden, led 1&2 blinken abwechselnd wenn timer aktiviert
den aus der Nacht verwertet
// Forensketch - basiert auf https://forum.arduino.cc/index.php?topic=733809.msg4937469#msg4937469
// nur links
// kommentiert und kompiliert
const byte lo = 2;
const byte lu = 3;
const byte led1 = 10;
const byte rel1 = 11;
const byte led2 = 9;
const byte rel2 = 12;
const unsigned int ontime = 1000 * 30;
unsigned long bouncetime = 50; // Zeit in ms
void setup()
{
Serial.begin(115200);
Serial.println(F("Start"));
pinMode(lo, INPUT_PULLUP);
pinMode(lu, INPUT_PULLUP);
digitalWrite(led1, LOW);
digitalWrite(rel1, LOW);
pinMode(led1, OUTPUT);
pinMode(rel1, OUTPUT);
}
void loop() {
readTasterlu();
readTasterlo();
}
void readTasterlo()
{
if (!digitalRead(lo)) // Taste gedrückt?
{
Serial.println(F("Tastendruck lo erkannt"));
digitalWrite(rel1, HIGH);
blinkled(1, 50); // LED1, kurzes flimmern
}
}
byte readTasterlu()
{
static bool laststate = HIGH;
static bool langgedrueckt = false;
static unsigned long lastmillis = 0;
static unsigned long relaisstarttime = 0;
const unsigned long langgedrueckttime = 2000; // Zeit in ms
if (!digitalRead(lu)) // Taste gedrückt?
{
if (millis() - lastmillis > bouncetime && laststate) // Kein Bounce zu erwarten?
{
Serial.println(F("Tastendruck lu erkannt"));
laststate = LOW; // merke Status
lastmillis = millis(); // Merke Zeit
}
if (!laststate) // Wenn Taste gedrückt
{
blinkled(1, 50); // LED1, kurzes flimmern
}
}
else // Taste nicht (mehr) gedrückt?
{
if (!laststate) // War vorher gedrückt?
{
Serial.println(F("Taste losgelassen"));
digitalWrite(led1, LOW); // sicherstellen das aus
laststate = HIGH; // setze Status
if (millis() - lastmillis < langgedrueckttime) // Abfrage wie lange wurde tatsächlich gedrueckt?
{
Serial.println(F("kurz gedrückt erkannt"));
// einkommentieren, wenn Zeitschaltung vorzeitig ausgehen soll
/*
if (langgedrueckt)
{
langgedrueckt = false;
digitalWrite(rel1, LOW);
}
else
*/
{
digitalWrite(rel1, LOW); // Abschalten
}
return 1; // kurz gedrückt
}
else
{
Serial.println(F("lang gedrückt erkannt"));
digitalWrite(rel1, HIGH); // aktivieren für Zeitschalter
langgedrueckt = true; // Merker das Zeitschalter ein
relaisstarttime = millis();// Startzeit Zeitschalter
return 2; // lang gedrückt
}
}
}
if (langgedrueckt) // Prüfung ob Zeitschalter aktiv
{
if (millis() - relaisstarttime > ontime) // Zeit abgelaufen?
{
Serial.println(F("Zeit abgelaufen"));
digitalWrite(rel1, LOW);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
langgedrueckt = false;
}
else // lang gedrueckt aber Zeit nicht abgelaufen
{
blinkled(0, 500); // Wechselblinker
}
}
return 0; // nicht gedrückt
}
void blinkled(const byte led, const int timer)
{
static unsigned long lastmillis = 0;
if (millis() - lastmillis > timer)
{
lastmillis = millis();
switch (led)
{
case 0: // Wechselblinken
Serial.println(F("Wechselblink"));
digitalWrite(led1, !digitalRead(led1));
digitalWrite(led2, !digitalRead(led1));
break;
case 1: // LED1
Serial.println(F("blink LED1"));
digitalWrite(led1, !digitalRead(led1));
break;
case 2: // lED2
Serial.println(F("blink LED2"));
digitalWrite(led2, !digitalRead(led2));
break;
}
}
}