Ja. Das Problem ist nur wenn ich dann eine Erklärung auf Englisch zu einem Befehl nachlese und das dann nicht verstehe, dann nützt mir das nicht viel. Darum versuche ich erstmal so zurecht zu kommen.
Nochmals Danke für die Mühen.
Moin Tommy,
danke für den Hinweis.
Ich habe aus der Beschreibung abgeleitet.
Für den ELS gibt er Pegel an, für den Taster die Anschaltung.
Da ich nicht ausschliessen kann, das da ein 1xUM zwischen V+ und GND umschaltet....
Vielleicht äussert sich ja @greendragon1 dazu, wie der Schalter tatsächlich angeschlossen ist. Ach hat er ja schon...
Dann wäre jetzt interessant, ob Du den Schalter nach + oder nach GND angeschlossen hast.
Am besten wäre, wenn der ELS nach GND schliesst (oder öffnet) und Du den INPUT_PULLUP nutzt.
Ich habe aus der Signalbeschreibung abgeleitet (geschätzt), dass der nach GND schaltet.
Gruß Tommy
Ich habe den Endlagenschalter genau wie die Taster an GND angeschlossen.
Soweit hat's bei mir nicht gereicht.
Ok, um das zu vereinfachen, habe ich den Code von oben genommen.
Es gibt eine Konstante elsClose die inhaltlich LOW entspricht.
Wenn die Logik wann auf und wann zu andersrum ist, bauchst Du der nur HIGH zuweisen und im Code nix ändern.
// Forensketch bedingter Start
// https://forum.arduino.cc/t/tastersignal-von-high-auf-low-erst-auswerten-wenn-das-tursignal-anliegt-anfanger
// kompiliert fehler- und warnungsfrei
#include <Streaming.h> // https://github.com/janelia-arduino/Streaming
//#define DEBUG // Wenn aktiviert, werden Zwischenwerte ausgegeben
#ifdef DEBUG
#define DBG_PRINTLN(...) Serial << __VA_ARGS__ << endl
#else
#define DBG_PRINTLN(...)
#endif
const byte endlagenSchalterPin = 8;
const bool elsClose = LOW;
const byte tasterPin = A0;
const byte anzeigePin {LED_BUILTIN};
uint32_t startTime;
enum STATE {waitButton, waitOpen, waitClose};
byte state = waitClose;
void setup()
{
Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
delay(300);
#endif
Serial << (F("\r\nStart...\r\n")) << endl;
DBG_PRINTLN(__FILE__);
DBG_PRINTLN( __TIMESTAMP__);
pinMode(endlagenSchalterPin, INPUT_PULLUP);
pinMode(tasterPin, INPUT_PULLUP);
pinMode(anzeigePin, OUTPUT);
if (digitalRead(endlagenSchalterPin) != elsClose) // Endlagenschalter ist geöffnet
{ state = STATE::waitClose; }
}
void loop()
{
stateMachine();
}
void stateMachine()
{
switch (state)
{
case waitButton:
digitalWrite(anzeigePin, LOW);
if (digitalRead(endlagenSchalterPin) != elsClose) // Tür nicht geschlossen?
{
Serial << F("Tür unbefugt geöffnet") << endl;
state = STATE::waitClose;
}
else if (!digitalRead(tasterPin)) // Taste gedrückt?
{
startTime = millis();
Serial << F("Öffner ausgelöst bei ") << startTime << endl;
state = STATE::waitOpen;
}
break;
case waitOpen:
if (!digitalRead(tasterPin)) // Taste noch immer gedrückt?
{
if (millis() - startTime > 2000) // Zeit abgelaufen?
{
digitalWrite(anzeigePin, HIGH);
Serial << F("geöffnet bei ") << millis() << endl;
state = STATE::waitClose;
}
}
else // zu früh losgelassen
{
Serial << F("Taster zu früh losgelassen") << endl;
state = STATE::waitButton;
}
break;
case waitClose:
if (digitalRead(tasterPin) && // taste losgelassen UND
digitalRead(endlagenSchalterPin) == elsClose) // Tür geschlosen?
{
Serial << F("Tür ist zu und Taste losgelassen") << endl;
state = STATE::waitButton;
}
break;
}
}
Vielen Dank für die ganze Mühe. Ich werde das heute Abend nach der Arbeit mir Mal genau anschauen.
Ich will mich hier nun bei allen nochmal bedanken das Sie mir geholfen haben. Es hatte noch nicht ganz funktioniert was @my_xy_projekt geposatet hat habe es nun angepasst. Es hatte nur noch gefehlt das wenn die Tür in den 2 Sekunden Wartezeit geöffnet wird das dann abgebrochen wird.
Hier nun der Code wie er richtig funktioniert:
// Forensketch bedingter Start
// https://forum.arduino.cc/t/tastersignal-von-high-auf-low-erst-auswerten-wenn-das-tursignal-anliegt-anfanger
// kompiliert fehler- und warnungsfrei
#include <Streaming.h> // https://github.com/janelia-arduino/Streaming
//#define DEBUG // Wenn aktiviert, werden Zwischenwerte ausgegeben
#ifdef DEBUG
#define DBG_PRINTLN(...) Serial << __VA_ARGS__ << endl
#else
#define DBG_PRINTLN(...)
#endif
const byte TTuerOffne = 8;
const bool elsClose = LOW;
const byte TStart = A0;
const byte RMagnet12V = 12;
uint32_t startTime;
enum STATE {waitButton, waitOpen, waitClose};
byte state = waitClose;
byte running = false;
void setup()
{
Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
delay(300);
#endif
Serial << (F("\r\nStart...\r\n")) << endl;
DBG_PRINTLN(__FILE__);
DBG_PRINTLN( __TIMESTAMP__);
pinMode(TTuerOffne, INPUT_PULLUP);
pinMode(TStart, INPUT_PULLUP);
pinMode(RMagnet12V, OUTPUT);
if (digitalRead(TTuerOffne) != elsClose) // Endlagenschalter ist geöffnet
{ state = STATE::waitClose; }
}
void loop()
{
if ( running==false ) {
stateMachine();
}
} //void loop
void stateMachine()
{
switch (state)
{
case waitButton:
digitalWrite(RMagnet12V, LOW);
if (digitalRead(TTuerOffne) != elsClose) // Tür nicht geschlossen?
{
Serial << F("Tür unbefugt geöffnet") << endl;
state = STATE::waitClose;
}
else if (!digitalRead(TStart)) // Taste gedrückt?
{
startTime = millis();
Serial << F("Öffner ausgelöst bei ") << startTime << endl;
state = STATE::waitOpen;
}
break;
case waitOpen:
if (digitalRead(TTuerOffne) != elsClose) {
state = STATE::waitClose;
Serial << F("Tür geöffnet, während Schalterzeit läuft bei ") << startTime << endl;
return;
}
if (!digitalRead(TStart)) // Taste noch immer gedrückt?
{
if (millis() - startTime > 2000) // Zeit abgelaufen?
{
digitalWrite(RMagnet12V, HIGH);
Serial << F("starten bei ") << millis() << endl;
state = STATE::waitClose;
Start();
}
}
else // zu früh losgelassen
{
Serial << F("Taster zu früh losgelassen") << endl;
state = STATE::waitButton;
}
break;
case waitClose:
if (digitalRead(TStart) && // taste losgelassen UND
digitalRead(TTuerOffne) == elsClose) // Tür geschlosen?
{
Serial << F("Tür ist zu und Taste losgelassen") << endl;
state = STATE::waitButton;
}
break;
}
}
void Start()
{
running=true;
}
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.