//https://forum.arduino.cc/t/aufzugsteuerung-modell/1006327
//code duplicated - deleteable
#include <Servo.h>
Servo myservo;
constexpr byte openPin = 4; // open door
constexpr byte closePin = 3; // force close
constexpr byte servoPin = 8; // GPIO des Servos
enum class State {DOOR_CLOSED, DOOR_OPENED} state = State::DOOR_CLOSED;
uint32_t previousMillis = 0; // time management
constexpr uint16_t intervalDoorOpen = 5000; // wie lange soll die Tür offen bleiben
void setup() {
Serial.begin(115200);
myservo.attach(servoPin);
pinMode(openPin, INPUT_PULLUP);
pinMode(closePin, INPUT_PULLUP);
doorClose();
}
void doorOpen()
{
myservo.write(90);
state = State::DOOR_OPENED;
}
void doorClose()
{
myservo.write(0);
state = State::DOOR_CLOSED;
}
void showRestInterval()
{
static uint32_t previousMillisShow = 0;
if (millis() - previousMillisShow > 1000)
{
previousMillisShow = millis();
Serial.print(F("remaining interval in sec:"));
Serial.println((intervalDoorOpen - (millis() - previousMillis)) / 1000);
}
}
void loop() {
switch (state)
{
case State::DOOR_CLOSED :
if (digitalRead(openPin) == LOW)
{
previousMillis = millis();
Serial.println(F("Tür auf"));
doorOpen();
}
break;
case State::DOOR_OPENED :
if (digitalRead(closePin) == LOW)
{
Serial.println(F("Tür zu forced"));
doorClose();
}
if (millis() - previousMillis > intervalDoorOpen)
{
Serial.println(F("Tür zu timeout"));
doorClose();
}
showRestInterval(); // optional
break;
}
}