// 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;
}