#ifndef __TREPPE_H #define __TREPPE_H #include "FSMTreppe4/FSMTreppe4.h" #include "PCA9685.h" #include // #define LDR_REGELUNG // comment in to activate LDR control // #define LDRDEBUG // comment in to show LDR measurement #define LDR_HYS 5 // Hysteresis for switching off FSM [lux] #define LDR_AVERAGE_SAMPLES 50 #define SENSOR_OBEN 16 #define SENSOR_UNTEN 12 #define OE 14 #define INT_TIME 20 // interrupt intervall [ms] #define TIME_MS_MAX 5000 // maximum time for animation [ms] enum vorgabe_typ_t { VORGABE_PROZENT = 0, VORGABE_12BIT = 1 }; #define EEP_START_ADDR 100 // define Start Address for "EEPROM" storage -> depends on size of "wifi_data"! class Treppe { private: const uint8_t stufen; struct stairway_param_t { uint16_t time_ldr = 500; uint16_t time_per_stair = 300; // dimmtime per stair [ms] uint16_t idle_pwm_max = 100; uint16_t active_pwm = 2000; uint16_t ldr_schwelle = 30; // activation value for FSM [lx] }; stairway_param_t param; stairway_param_t param_pend; // zwischenspeicher änderungen bool param_changed = false; float ldr_average = 0.0; uint16_t ldr_average_cnt = 0; uint16_t idle_pwm_ist = 0; uint16_t idle_pwm_soll = 0; struct fsm_pending_inputs_t { bool anim_beendet = true; bool sensor_unten = false; bool last_s_unten = false; bool web_ctrl_s_unten = false; bool sensor_oben = false; bool last_s_oben = false; bool web_ctrl_s_oben = false; bool ldr_changed = false; }; fsm_pending_inputs_t fsm_pend; struct dimmer_t { uint8_t stufe = 0; uint16_t ticks = 0; uint16_t tick = 0; float delta_pwm = 0.0; float pwm = 0.0; uint16_t start_pwm = 0; uint16_t ziel_pwm = 0; }; enum dimmer_type_t { DIM_STUFEN = 0, DIM_LDR = 1 }; dimmer_t dimmer_stufen; dimmer_t dimmer_ldr; // 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_AUFDIMMEN_LDR = 1, ST_ABDIMMEN_LDR = 2, ST_RUHEZUSTAND = 3, ST_AUFDIMMEN_HOCH = 4, ST_WARTEN_HOCH = 5, ST_ABDIMMEN_HOCH = 6, ST_AUFDIMMEN_RUNTER = 7, ST_WARTEN_RUNTER = 8, ST_ABDIMMEN_RUNTER = 9, ST_LDR_CHANGED = 10 }; enum fsm_laufrichtung_t { LR_RUNTER = 0, LR_HOCH = 1 }; enum fsm_dimmrichtung_t { DR_ABDIMMEN = 0, DR_AUFDIMMEN = 1 }; void read_sensors(); void print_state_on_change(); /* DIMM */ bool dimmer_tick(dimmer_t *dimmer, bool dim_type); void start_animation(dimmer_t *dimmer, bool dim_type, uint16_t on_pwm, uint16_t off_pwm); /* LDR */ bool read_sensor(int sensor); float read_ldr(); void sample_ldr(); bool check_ldr(float ldr_avg); void update_soll_pwm_with_ldr(float ldr_avg); public: Treppe(uint8_t _stufen) : stufen(_stufen) { FSMTreppe_Obj.initialize(); } ~Treppe() { FSMTreppe_Obj.terminate(); } void setup(); void task(); // call periodically // Parameter section void save_param_to_eeprom(); void param_to_json(char* json_str, size_t sz); void set_idle_pwm_max(const uint16_t value, const vorgabe_typ_t vorgabe_typ); void set_active_pwm(const uint16_t value, const vorgabe_typ_t vorgabe_typ); void set_time_ldr(const uint16_t value); void set_time_per_stair(const uint16_t value); void set_ldr_schwelle(const uint16_t value, const vorgabe_typ_t vorgabe_typ); void overwrite_sensors(bool s_oben, bool s_unten); }; #endif // __TREPPE_H