class Timer
{
public:
void start() {timeStamp = millis();}
boolean operator() (const unsigned long duration) {
return (millis() - timeStamp >= duration) ? true : false;
}
private:
unsigned long timeStamp {0};
};
constexpr unsigned long TIMESPAN {10000}; // 10 Seconds (10000 ms)
constexpr unsigned long DEBOUNCE_TIME {30}; // Switch Debounce time 30 Milliseconds
enum class SensorState : byte {on, isOn, off, isOff};
Timer tDebounce;
Timer tSwitch;
const byte sensor_masa {2}; // pin de la entrada de señal del loop
const byte ledPin {13}; // pin del LED interno del arduino
const byte gobo {8}; // salida del relevador de control del GOBO proyector
byte estado_sensormasa {LOW}; // Estado de lectura del sensor Accesspro
unsigned long timeStamp;
// Function forward declaration
void checkState(byte, SensorState& );
void setup() {
pinMode(ledPin, OUTPUT); // Inicializacion de led interno Arduino como salida
pinMode(sensor_masa, INPUT); // Inicializacion de pin del sensor del Accesspro como entrada
pinMode(gobo, OUTPUT);
tDebounce.start();
// Inicializacion del pin de gobo como salida
Serial.begin(9600);
Serial.println(F("Start..."));
}
void loop() {
static SensorState sensorState {SensorState::isOff};
if (tDebounce(DEBOUNCE_TIME)) { // Debounce Button
checkState( digitalRead(sensor_masa), sensorState); // Lectura del estado del sensor de piso
tDebounce.start();
}
}
void checkState(byte pinState, SensorState& state) {
if (pinState == HIGH) { // Pin State change
switch (state) {
case SensorState::isOff:
Serial.print(F("Signal ON. Wait ")); Serial.print(TIMESPAN);
Serial.println(F(" Milliseconds to switch on."));
state = SensorState::on;
tSwitch.start();
break;
case SensorState::on:
if (tSwitch(TIMESPAN)) {
Serial.println(F("Switch On"));
digitalWrite(ledPin, HIGH);
digitalWrite(gobo, HIGH);
state = SensorState::isOn;
}
break;
default:
break;
}
} else { // PinState = LOW
switch (state) {
case SensorState::isOn:
Serial.println(F("Switch Off")); // Switch Fallthroug! (no break;)
case SensorState::on:
state = SensorState::off;
break;
case SensorState::off:
Serial.println(F("Released"));
digitalWrite(ledPin, LOW);
digitalWrite(gobo, LOW);
state = SensorState::isOff;
break;
default:
break;
}
}
}