diff --git a/include/pwm.h b/include/pwm.h index 68e7c3e..846adec 100644 --- a/include/pwm.h +++ b/include/pwm.h @@ -2,6 +2,9 @@ #include "PCA9685.h" +#define SENSOR1 15 +#define SENSOR2 12 + class Treppe { private: uint8_t stairs; @@ -10,8 +13,10 @@ class Treppe { uint16_t active_brightness = 2048; uint8_t direction = 0; + uint8_t switch_direction = 0; uint8_t state = 0; uint8_t switch_state = 0; + uint8_t finish = 1; // initialize with i2c-Address 0, use Wire Library PCA9685 pwmController; diff --git a/src/main.cpp b/src/main.cpp index c77f429..82b4c00 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -104,16 +104,17 @@ void setup() { os_timer_setfn(&timer1, timerCallback, &timer_flag); os_timer_arm(&timer1, 20, true); - stairs.setState(1); - stairs.setDirection(1); + //stairs.setState(1); + //stairs.setDirection(1); } void loop() { - if(millis() > 25000 && stairs.getState() == 1 && stairs.getDirection() == 1) stairs.setState(0); + /*if(millis() > 25000 && stairs.getState() == 1 && stairs.getDirection() == 1) stairs.setState(0); if(millis() > 45000 && stairs.getDirection() == 1){ stairs.setState(1); stairs.setDirection(0); } + */ TIMEIF_US(ArduinoOTA.handle(), 1000, "OTA"); TIMEIF_US(httpServer.handleClient(), 1000, "HTTP"); } \ No newline at end of file diff --git a/src/pwm.cpp b/src/pwm.cpp index a217124..d3a6870 100644 --- a/src/pwm.cpp +++ b/src/pwm.cpp @@ -41,7 +41,6 @@ void Treppe::ledsequence(){ static int8_t led = 0; static uint16_t brightness = 0; static uint16_t lastbrightness = 0; - static uint8_t finish = 1; static uint16_t status = 0; uint16_t status_build = 0; status_build |= direction << 8; @@ -94,17 +93,54 @@ void Treppe::ledsequence(){ void Treppe::setup(){ pwmController.resetDevices(); - // Deactive PCA9685 due to LED Flickering + // Deactive PCA9685 Phase Balancer due to LED Flickering // https://github.com/NachtRaveVL/PCA9685-Arduino/issues/15 // see also lib/PCA9685-Arduin/PCA9685.h:204 pwmController.init(PCA9685_PhaseBalancer_None); pwmController.setPWMFrequency(200); + + pinMode(SENSOR1, INPUT); + pinMode(SENSOR2, INPUT); Serial.println("Hello from Treppe"); Serial.print("Treppe: initial parameters: stairs="); Serial.println(stairs); } void Treppe::task(){ - ledsequence(); + + if(finish){ + direction = switch_direction; + state = switch_state; + } + static uint8_t last_sensor_state[2] = {0,0}; + uint8_t current_sensor_state[2] = {0,0}; + current_sensor_state[0] = digitalRead(SENSOR1); + current_sensor_state[1] = digitalRead(SENSOR2); + + if(current_sensor_state[0] && !last_sensor_state[0] && state == 0){ + setDirection(1); + setState(1); + } + + if(current_sensor_state[1] && !last_sensor_state[1] && state == 0){ + setDirection(0); + setState(1); + } + + // first switch - off approach, use timer later + if(!current_sensor_state[0] && last_sensor_state[0] && state == 1){ + setDirection(1); + setState(0); + } + + if(!current_sensor_state[1] && last_sensor_state[1] && state == 1){ + setDirection(0); + setState(0); + } + + last_sensor_state[0] = current_sensor_state[0]; + last_sensor_state[1] = current_sensor_state[1]; + ledsequence(); + } uint16_t Treppe::setIdle(uint16_t _idle_brightness){ @@ -124,17 +160,21 @@ uint16_t Treppe::setTime(uint16_t _time_per_stair){ } uint8_t Treppe::setDirection(uint8_t _direction){ - direction = _direction; + switch_direction = _direction; Serial.println("Treppe: Direction changed!"); + if(finish) Serial.println("apply direction request immediately"); + else Serial.println("currently active, dir change afterwards"); // to do: implement state command variable to determine dimm-state - return direction; + return switch_direction; } uint8_t Treppe::setState(uint8_t _state){ if(state == _state) return 1; else{ - state = _state; - Serial.println("Treppe: State changed!"); + switch_state = _state; + Serial.println("Treppe: State Request changed!"); + if(finish) Serial.println("apply state request immediately"); + else Serial.println("currently active, state changes after activity"); } return 0; } \ No newline at end of file