#pragma once #include "FSMTreppe2/FSMTreppe2.h" #include "PCA9685.h" // #define LDRDEBUG // comment in to override LDR measurement #define LDR_HYS 1 // Hysteresis for switching off FSM [lux] #define SENSOR_OBEN 16 #define SENSOR_UNTEN 12 #define OE 14 #define INT_TIME 20 // interrupt intervall [ms] class Treppe { private: const uint8_t stufen; uint16_t time_per_stair = 300; // dimmtime per stair [ms] uint16_t idle_pwm = 100; uint16_t idle_pwm_internal = 0; uint16_t active_pwm = 700; uint16_t ldr_schwelle = 2; // activation value for FSM [lx] uint16_t start_pwm = 0; uint16_t ziel_pwm = 0; bool anim_beendet = true; uint8_t stufe = 0; uint16_t current_tick = 0; float current_pwm = 0.0; uint16_t ticks_pro_stufe = 0; float differenz_pwm_pro_tick = 0.0; // initialize with i2c-Address 0, use Wire Library PCA9685 pwmController; FSMTreppeModelClass FSMTreppe_Obj; FSMTreppeModelClass::ExtU_FSMTreppe_T fsm_inputs; FSMTreppeModelClass::ExtY_FSMTreppe_T fsm_outputs; enum fsm_status_t { ST_INAKTIV_LDR =0, ST_RUHEZUSTAND =1, ST_AUFDIMMEN_HOCH =2, ST_WARTEN_HOCH =3, ST_ABDIMMEN_HOCH =4, ST_AUFDIMMEN_RUNTER =5, ST_WARTEN_RUNTER =6, ST_ABDIMMEN_RUNTER =7 }; enum fsm_laufrichtung_t { LR_RUNTER=0, LR_HOCH=1 }; enum fsm_dimmrichtung_t { DR_ABDIMMEN=0, DR_AUFDIMMEN=1 }; /* DIMM */ bool dimm_stufe(uint8_t stufe); bool dimm_treppe(); void anim_tick(); void start_animation(); void berechne_dimmer(); void print_state_on_change(); /* LDR */ bool read_sensor(int sensor); float read_ldr(); bool check_ldr(); public: Treppe(uint8_t _stufen) : stufen(_stufen){ FSMTreppe_Obj.initialize(); berechne_dimmer(); } ~Treppe() { FSMTreppe_Obj.terminate(); } void setup(); void task(); // call periodically // Parameter section void set_idle_prozent(int prozent); void set_idle_pwm(uint16_t _idle_pwm); void activate_idle_pwm(bool active); void set_active_pwm(uint16_t _active_pwm); void set_time_per_stair(uint16_t _time_per_stair); };