diff --git a/doku.md b/doku.md index 43ec0ad..f1665a3 100644 --- a/doku.md +++ b/doku.md @@ -54,6 +54,12 @@ else server.streamFile(f, mime::getContentType(SRH::_path), requestMethod); ``` +LED_sequence_v1: +TODO: +- disable led stripes after defined time (webserver paramter?) +- define what to do if people enter stairs from different directions +- CAUTION: Sensor-Deadtime at LEAST 8 seconds +- --> switch off with person leaving stairs might not be possible Webserver on v0.3.0 now working with LittleFS TODO: diff --git a/lib/treppe/treppe.cpp b/lib/treppe/treppe.cpp index 2fb6612..6059e50 100644 --- a/lib/treppe/treppe.cpp +++ b/lib/treppe/treppe.cpp @@ -159,7 +159,7 @@ void Treppe::setup(){ void Treppe::task(){ //ledsequence(); - elelel(); + task_2(); } uint16_t Treppe::setIdle(uint16_t _idle_brightness){ diff --git a/lib/treppe/treppe.cpp~HEAD b/lib/treppe/treppe.cpp~HEAD new file mode 100644 index 0000000..c08afe5 --- /dev/null +++ b/lib/treppe/treppe.cpp~HEAD @@ -0,0 +1,256 @@ +#include "treppe.h" + +uint8_t Treppe::softstart_led(uint8_t led, uint16_t startval, uint16_t stopval){ + /* + softstart task + + - get's called at regular intervals (1ms at the moment) + - dimms single led (0 - 15, PCA9685 outputs) with linear intervals vom startval to stopval + - calculates pwm steps depending on startval, stopval and timeinterval + - -> results in constanst speed + - returns 1 if led dimming is running + - returns 0 if led dimming is finished + + */ + + static uint8_t lastled = 255; + static float current_pwm = 0; + static float stepsize = 0.5; + if(led != lastled){ + pwmController.setChannelPWM(led, (uint16_t)startval); + lastled = led; + current_pwm = startval; + stepsize = INT_TIME*abs(stopval - startval)/(float)time_per_stair; // only valid at 1ms function call interval + return 1; + } + + if(startval > stopval){ + current_pwm -= stepsize; + } + else { + current_pwm += stepsize; + } + Serial.println((uint16_t)current_pwm); + pwmController.setChannelPWM(led, (uint16_t)current_pwm); + if(current_pwm > stopval - stepsize && current_pwm < stopval + stepsize){ + if(stopval == 0) pwmController.setChannelPWM(led, 0); + return 0; + } + return 1; +} + +void Treppe::ledsequence(){ + static int8_t led = 0; + static uint16_t brightness = 0; + static uint16_t lastbrightness = 0; + static uint16_t status = 0; + uint16_t status_build = 0; + + status_build |= direction << 8; + status_build |= state; + if(status_build != status){ // check if any parameter changed + finish = 0; // set state unfinished -> start action + if(direction) led = 0; // reset led counter depending of direction + else led = stairs-1; + if(state){ + brightness = active_brightness; // set brightness value depending of on/off + lastbrightness = idle_brightness; + } + else{ + brightness = idle_brightness; + lastbrightness = active_brightness; + } + status = status_build; // set parameter memory + Serial.print("----Status Changed! onoff: "); + Serial.print(state); + Serial.print(" dir: "); + Serial.println(direction); + + } + if(!finish){ // finish == 0 -> action pending + if(!softstart_led(led,lastbrightness, brightness)){ + Serial.print("one LED finished: "); + Serial.print(led); + Serial.print(" last: "); + Serial.print(lastbrightness); + Serial.print(" curr: "); + Serial.println(brightness); + if(direction){ + led++; + if(led >= stairs) { + finish = 1; + //lastbrightness = brightness; + } + } + else{ + led--; + if(led < 0){ + //lastbrightness = brightness; + finish = 1; + } + } + } + } +} + + + + + +void Treppe::elelel() +{ + if(state) { + if(direction) { // aufwärts + if(tick >= ticks_treppe-1) { // ziel erreicht + Serial.println("[Treppe] oberster tick !"); + state = 0; + return; + } + tick++; // eins hoch + } + else { // abwärts + if(tick <= 0) { // ziel erreicht + Serial.println("[Treppe] unterster tick !"); + state = 0; + return; + } + tick--; // eins runter + } + + stufe = tick / ticks_pro_stufe; + float new_pwm = differenz_pwm_pro_tick * (tick - ticks_pro_stufe*stufe); + if(direction) + new_pwm += differenz_pwm_pro_tick; + new_pwm += idle_brightness; + + pwmController.setChannelPWM(stufe, (uint16_t) new_pwm); + Serial.printf("tick %04u, led %02d:%02u, pwm %4.1f\n", + tick, + stufe, + (tick - ticks_pro_stufe*stufe), + new_pwm + ); + } +} + +// if(stufe > stairs || stufe < 0 || tick < 0 || tick > ticks_treppe-1) { +// Serial.println("[Treppe] ERROR, Something went wrong !"); +// state = 0; +// return; +// } + +void Treppe::setup(){ + Serial.printf("differenz_pwm_pro_tick %f\n", differenz_pwm_pro_tick); + + pwmController.resetDevices(); + +<<<<<<< HEAD:lib/treppe/treppe.cpp + // Deactivate PCA9685_PhaseBalancer due to LED Flickering +======= + // Deactive PCA9685 Phase Balancer due to LED Flickering +>>>>>>> master:src/pwm.cpp + // https://github.com/NachtRaveVL/PCA9685-Arduino/issues/15 + // see also lib/PCA9685-Arduin/PCA9685.h:204 + pwmController.init(PCA9685_PhaseBalancer_None); + pwmController.setPWMFrequency(200); + pwmController.setAllChannelsPWM(idle_brightness); + + pinMode(SENSOR1, INPUT); + pinMode(SENSOR2, INPUT); + Serial.println("Hello from Treppe"); + Serial.print("Treppe: initial parameters: stairs="); + Serial.println(stairs); + + for(uint8_t i=0; i>>>>>> master:src/pwm.cpp +} + +uint16_t Treppe::setIdle(uint16_t _idle_brightness){ + idle_brightness = _idle_brightness; + Serial.println("Treppe: idle brightness changed!"); + return idle_brightness; +} +uint16_t Treppe::setActive(uint16_t _active_brightness){ + active_brightness = _active_brightness; + Serial.println("Treppe: active brightness changed!"); + return active_brightness; +} +uint16_t Treppe::setTime(uint16_t _time_per_stair){ + time_per_stair = _time_per_stair; + Serial.println("Treppe: time changed!"); + return time_per_stair; +} + +uint8_t Treppe::setDirection(uint8_t _direction){ +<<<<<<< HEAD:lib/treppe/treppe.cpp + direction = _direction; + Serial.printf("Treppe: Direction: %d!\n",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"); +>>>>>>> master:src/pwm.cpp + // to do: implement state command variable to determine dimm-state + return switch_direction; +} + +uint8_t Treppe::setState(uint8_t _state){ + if(state == _state) return 1; + else{ +<<<<<<< HEAD:lib/treppe/treppe.cpp + state = _state; + Serial.printf("Treppe: State: %d!\n",state); +======= + 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"); +>>>>>>> master:src/pwm.cpp + } + return 0; +} diff --git a/lib/treppe/treppe.h b/lib/treppe/treppe.h index 1246728..7992d86 100644 --- a/lib/treppe/treppe.h +++ b/lib/treppe/treppe.h @@ -37,7 +37,7 @@ public: void task(); // call periodically void setup(); - void elelel(); + void task_2(); // Parameter section uint16_t setIdle(uint16_t _idle_brightness); diff --git a/lib/treppe/treppe.h~HEAD b/lib/treppe/treppe.h~HEAD new file mode 100644 index 0000000..c555c11 --- /dev/null +++ b/lib/treppe/treppe.h~HEAD @@ -0,0 +1,73 @@ +#pragma once + +#include "PCA9685.h" + +#define SENSOR1 15 +#define SENSOR2 12 + +#define INT_TIME 20 // interrupt intervall [ms] +class Treppe { +private: + uint8_t stairs; +<<<<<<< HEAD:lib/treppe/treppe.h + uint16_t time_per_stair = 300; // dimmtime per stair [ms] + uint16_t idle_brightness = 0; + uint16_t active_brightness = 500; +======= + uint16_t time_per_stair = 200; // dimmtime per stair [ms] + uint16_t idle_brightness = 0; + uint16_t active_brightness = 1048; +>>>>>>> master:include/pwm.h + + uint8_t direction = 0; + uint8_t switch_direction = 0; + uint8_t state = 0; + uint8_t switch_state = 0; + uint8_t finish = 1; + + uint32_t tick = 0; + uint32_t stufe = 0; + + uint32_t ticks_treppe = 0; + uint32_t ticks_pro_stufe = 0; + float differenz_pwm_pro_tick = 0.0; + + // initialize with i2c-Address 0, use Wire Library + PCA9685 pwmController; + uint8_t softstart_led(uint8_t led, uint16_t startval, uint16_t stopval); + void ledsequence(); + +public: + Treppe(uint8_t _stairs) : stairs(_stairs){ + ticks_pro_stufe = time_per_stair / 20; // [ms] + ticks_treppe = ticks_pro_stufe * stairs; + + differenz_pwm_pro_tick = (float) (active_brightness - idle_brightness) + / (float) ticks_pro_stufe; + } + + void task(); // call periodically + + void setup(); + void elelel(); + + // Parameter section + uint16_t setIdle(uint16_t _idle_brightness); + uint16_t setActive(uint16_t _active_brightness); + uint16_t setTime(uint16_t _time_per_stair); + + void setTick(uint32_t _tick) { + tick = _tick; + Serial.printf("Treppe: Tick: %u!\n", tick); + } + uint32_t getTicks() { + return ticks_treppe; + } + + // Runtime Parameter section + uint8_t setDirection(uint8_t _direction); + uint8_t setState(uint8_t _state); + + uint8_t getState() { return state;}; + uint8_t getDirection() {return direction;}; +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index dd8c09e..03f850b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -103,9 +103,6 @@ void setup() { os_timer_setfn(&timer1, timerCallback, &timer_flag); os_timer_arm(&timer1, 20, true); - - stairs.setState(1); - stairs.setDirection(1); } #include