folgendes Problem...Ich verhaspel mich anscheinend immer bei den ganzen Zeitabfragen Zuständen (current, last ,State)
Folgendes habe ich vor:
Ich möchte einen Wandserienschalter (4 micrswitches...links oben, links unten, rechts oben und unten(buttonlo, lu ro, ru) dazu nutzen 2 Relais zu schalten. So weit kein Problem...
Allerdings hätte ich auch gern ein zeitverzögertes ausschalten, wenn ich die tasten unten länger drücke...
Vielleicht hätte ich mal lieber case switch genommen, statt der ganzen if else Befehle...aber ich brauch mal jmd der mir auf die Sprünge hilft...DANKE
Ich raffs irgendwie nicht und hatte gehofft, dass ichs vielleicht mit der ezbutton library besser hinbekomme, aber ich scheitere an diesenblöden Zeitdingern, vor allem weil ich ja auch ne rückmeldung bekommen will, über LEDs
DANKE nochmal
#include <ezButton.h>
ezButton buttonlo(2); // create ezButton object that attach to pin 6;
ezButton buttonlu(3); // create ezButton object that attach to pin 7;
ezButton buttonro(4); // create ezButton object that attach to pin 8;
ezButton buttonru(5); // create ezButton object that attach to pin 8;
unsigned long startlu = 0;//press
unsigned long endlu = 0;//release
unsigned long zeitlu = 0;//
unsigned long startru = 0;
unsigned long endru = 0;
unsigned long zeitru = 0;
unsigned long lastledmillis = 0;
unsigned long cdmillisl = 0; //start millis countdownlinks
unsigned long cdmillisr = 0; //"" countdownrechts
const int countdown = 30000; //countdown dauer
int cdstatel = 0; //Countdown?
int cdstater = 0;
int ledStatel = 0;
int ledStater = 0;
int ledinterval = 100;
const int relais1 = 11;
const int relais2 = 12;
const int Led1 = 10;
const int Led2 = 9;
int re1 = 1;
int re2 = 1;
int buttonl = 0; //schalter links gedrückt?
int buttonr = 0; //s r gedrückt?
const int interval = 3000;//langdruck Taster
int ispressedl = 0; //links gedrückt (lu)
int ispressedr = 0; //rechts""(ru)
void setup() {
Serial.begin(9600);
buttonlo.setDebounceTime(50); // set debounce time to 50 milliseconds
buttonlu.setDebounceTime(50); // set debounce time to 50 milliseconds
buttonro.setDebounceTime(50); // set debounce time to 50 milliseconds
buttonru.setDebounceTime(50); // set debounce time to 50 milliseconds
pinMode (relais1, OUTPUT);
pinMode (relais2, OUTPUT);
pinMode (Led1, OUTPUT);
pinMode (Led2, OUTPUT);
}
void loop() {
buttonlo.loop(); // MUST call the loop() function first
buttonlu.loop(); // MUST call the loop() function first
buttonro.loop(); // MUST call the loop() function first
buttonru.loop(); // MUST call the loop() function first
int btnloState = buttonlo.getState();
int btnluState = buttonlu.getState();
int btnroState = buttonro.getState();
int btnruState = buttonru.getState();
Serial.print("button 1 state: ");
Serial.println(btnloState);
Serial.print("button 2 state: ");
Serial.println(btnluState);
Serial.print("button 3 state: ");
Serial.println(btnroState);
if (buttonlo.isPressed()) {
re1 = LOW;
digitalWrite (Led1, HIGH);
Serial.println("The button 1 is pressed");
}
if (buttonlo.isReleased())
Serial.println("The button 1 is released");
if (buttonlu.isPressed()) {
Serial.println("The button 2 is pressed");
startlu = millis();
ispressedl = 1;
}
if (buttonlu.isReleased()) {
Serial.println("The button 2 is released");
endlu = millis();
buttonl = 1;
}
if (buttonro.isPressed())
Serial.println("The button 3 is pressed");
if (buttonro.isReleased())
Serial.println("The button 3 is released");
//Zeitabfrage der schalter wenn lu released erfolgt
if (buttonl == 1) {
if (endlu - startlu < interval)re1 = HIGH; //kurz links
buttonl = 0;
Serial.println("The button LINKSUNTEN RELAIS AUS is released");
}
else if (buttonl == 1) {
if (endlu - startlu > interval) {
cdstatel = 1; //Countdown gestartet
cdmillisl = millis();
Serial.println("COUNTDOWN LINKS!");
buttonl = 0; //schaltstatus zurücksetzen
}
}
//zeitabfrage während des gedrückt haltens zur info des bedieners über LED
if (ispressedl = 1 && (millis - startlu > interval)) {
if (lastledmillis + ledinterval > millis()) {
ledStatel != ledStatel;
digitalWrite(Led1, ledStatel);
Serial.println("L`EDBLINKEN COUNTDOWN ");
}
}
if (cdstatel = 1) { // Countdown LÄUFT!
if (lastledmillis + millis() > ledinterval)
{
ledStatel != ledStater; //beide LEDs blinken abwechselnd
lastledmillis = millis();
}
if (cdmillisl + countdown > millis()) {
re1 = HIGH;
ledStatel = LOW;
ledStater = LOW;
ispressedl = 0;
cdstatel = 0;
}
}
digitalWrite(relais1, re1);
digitalWrite(relais2, re2);
}
Hallo
ich habe mir zum Kaffee am Morgen deinen Sketch angeschaut.
Unter welchen Bedingungen sollen die Ausgänge, LED´s und Relais´s, auf die Eingänge, buttonlo, lu ro und ru, reagieren?
Am besten du zeichnest eine Wahrheitstabelle mit den zeitlichen Abhängigkeiten, dann läßt sich der kunstvoll verknoteten Sketch entwirren
button lo --> relais 1 an , led 1 blinkt während des drückens
button lu kurz ---> relais 1 aus. led 1 wie oben
button ro --> relais 2 an. led 2 blinkt während des drückens
button ru --> relais 2 aus . led 2 wie oben
button lu lang ---> relais 1 aus nach 30 sekunden, led 1&2 blinken abwechselnd wenn timer aktiviert
button ru lang ---> relais 2 aus nach 30 sekunden, led 1&2 blinken abwechselnd wenn timer aktiviert
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;
}
}
}
der Wahnsinn, danke my_xy_projekt!
ich werd das dann mal doppeln....und lernen!
bin gespannt, ob ich jetzt noch ins stolpern komme, wenn ichs jetzt von einem arduino mit den switches und LEDs auf nen 2. schicke mit LED und Relais...
ich werd berichten
neuron74:
ich werd das dann mal doppeln....und lernen!
Das Ding ist nur ne Anregung, wie es gehen kann.
Da ist ganz sicher noch viel Potential um das übersichtlicher zu bekommen. Aber ich wollte das nur mal zeigen, das sowas auch selbstgebaut geht.