From df8061018c515997c99621f610629980dcb707f3 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Mon, 24 Apr 2017 15:35:18 +0200 Subject: [PATCH 1/5] =?UTF-8?q?WIP=20:=20=C3=A0=20tester?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++--- arduino/alarmclock/alarmclock.cpp | 35 +++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7eab500..8d1d2a2 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,9 @@ Médias Avancement ========== WIP. -Le partie arduino fonctionne, mais dès récéption de l'allumage t'as un breath plein pot. +Le partie arduino fonctionne, mais pour le moment il n'y a pas d'arret automatique de l'alarme. La partie home-assistant fonctionne, le reveil configuré est bien envoyé à l'arduino. TODO: Utiliser ArduinoOTA pour gérer les mises à jours sans fil. TODO: gitlab-ci : on peut checker la syntax en lancant un docker home-assistant !!! -TODO: HA Il faut des scenes pour retrouver les couleurs classiques -TODO: Ard pas de progression du brightness au cour du temps +TODO: HA Il faut des scenes pour retrouver les couleurs classiques TODO: Ard pas d'arret une fois le reveil lancé diff --git a/arduino/alarmclock/alarmclock.cpp b/arduino/alarmclock/alarmclock.cpp index 2ef0882..f18d7df 100644 --- a/arduino/alarmclock/alarmclock.cpp +++ b/arduino/alarmclock/alarmclock.cpp @@ -9,7 +9,7 @@ // LED // Corresponds à un max brightness configurable via HA -int brightness = LED_BRIGHTNESS_DEFAULT; +int maxBrightness = LED_BRIGHTNESS_DEFAULT; // Utilisé pour définir le seuil actuel de brightness int curbrightness = 0; int color = LED_COLOR_DEFAULT; @@ -33,7 +33,6 @@ void setup() LEDS.addLeds(leds, LED_NUM).setCorrection(TypicalSMD5050); ledBlackAll(); - FastLED.setBrightness(brightness); // MQTT client.setServer(MQTT_SERVER, MQTT_PORT); @@ -124,8 +123,7 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length) } mqttSendState(); } else if (stopic == MQTT_LED_BRIGHTNESS_COMMAND) { - brightness = msgString.toInt(); - FastLED.setBrightness(brightness); + maxBrightness = msgString.toInt(); mqttSendBrightnessState(); } else if (stopic == MQTT_LED_COLOR_COMMAND) { // Sample : 134,168,255 @@ -146,7 +144,7 @@ void mqttSendState() void mqttSendBrightnessState() { char buff[4]; - itoa(brightness, buff, 10); + itoa(maxBrightness, buff, 10); client.publish(MQTT_LED_BRIGHTNESS_STATE, buff, true); } @@ -194,11 +192,28 @@ void ledError() */ void ledDisplay() { - // Source : http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/ - float breath = (exp(sin(millis() / 4000.0 * PI)) - 0.3678794) * 108.4; + /* Natural Breathing LED + * Source : http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/ + * La formule : (exp(sin(x / freq)) - (1/e)) * (maxBrightness/(e-(1/e)) + * freq = 2000.0 * PI (-> interval de 4sec) + * Fréquence respiratoire : https://fr.wikipedia.org/wiki/Fr%C3%A9quence_respiratoire + * Test perso rapide révéillé : 18 cycles par minutes -> interval de 3.33sec. + * + * En remplaçant 1/e par 0.349 on arrive à un minimal de 1.00x ce qui permet d'avoir les leds qui ne s'éteignent pas + * Il faut alors remplacer maxBrightness par maxBrightness - 1 dans la dernière partie de l'équation + */ + //float breath = (exp(sin(millis() / 4000.0 * PI)) - 0.36787944) * 108.0; + float breath = (exp(sin(millis() / 4000.0 * PI)) - 0.349) * ((maxBrightness - 1) / (EULER - (1 / EULER))); fill_solid(leds, LED_NUM, color); - FastLED.setBrightness(map(breath, 0, 255, 0, curbrightness)); + FastLED.setBrightness(breath); + EVERY_N_SECONDS(1) { + Serial.print(breath); + Serial.print(" | "); + Serial.print(curbrightness); + Serial.print("/"); + Serial.println(maxBrightness); + } FastLED.show(); } @@ -207,7 +222,9 @@ void loop() { // TODO : ou de manière moins fréquence mais en faisant un saut de palier. // TODO : la solution peut aussi etre un mix des deux EVERY_N_SECONDS(10) { - curbrightness++; + if (curbrightness <= maxBrightness) { + curbrightness++; + } } // MQTT From b2f2e4a5ddb3caf9c4a142d4cc0e747d1a581375 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Mon, 24 Apr 2017 16:19:10 +0200 Subject: [PATCH 2/5] =?UTF-8?q?WIP:=20=C3=A0=20tester?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arduino/alarmclock/alarmclock.cpp | 19 ++++--------------- arduino/alarmclock/alarmclock.exemple.h | 13 +++++++++++-- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/arduino/alarmclock/alarmclock.cpp b/arduino/alarmclock/alarmclock.cpp index f18d7df..5b58a8d 100644 --- a/arduino/alarmclock/alarmclock.cpp +++ b/arduino/alarmclock/alarmclock.cpp @@ -7,15 +7,6 @@ #include "alarmclock.h" -// LED -// Corresponds à un max brightness configurable via HA -int maxBrightness = LED_BRIGHTNESS_DEFAULT; -// Utilisé pour définir le seuil actuel de brightness -int curbrightness = 0; -int color = LED_COLOR_DEFAULT; -CRGB leds[LED_NUM]; -boolean ledState = false; - void setup() { Serial.begin(SERIAL_SPEED); @@ -25,11 +16,10 @@ void setup() setupWifi(); // LED - /* - brightness = LED_BRIGHTNESS_DEFAULT; + maxBrightness = LED_MAXBRIGHTNESS_DEFAULT; + curbrightness = LED_BRIGHTNESS_DEFAULT; color = LED_COLOR_DEFAULT; ledState = false; - */ LEDS.addLeds(leds, LED_NUM).setCorrection(TypicalSMD5050); ledBlackAll(); @@ -118,7 +108,7 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length) ledState = true; } else { ledState = false; - curbrightness = 0; + curbrightness = LED_BRIGHTNESS_DEFAULT; ledBlackAll(); } mqttSendState(); @@ -202,8 +192,7 @@ void ledDisplay() * En remplaçant 1/e par 0.349 on arrive à un minimal de 1.00x ce qui permet d'avoir les leds qui ne s'éteignent pas * Il faut alors remplacer maxBrightness par maxBrightness - 1 dans la dernière partie de l'équation */ - //float breath = (exp(sin(millis() / 4000.0 * PI)) - 0.36787944) * 108.0; - float breath = (exp(sin(millis() / 4000.0 * PI)) - 0.349) * ((maxBrightness - 1) / (EULER - (1 / EULER))); + float breath = (exp(sin(millis() / 4500.0 * PI)) + 1.2) * ((curbrightness - 1) / (EULER - (1 / EULER))); fill_solid(leds, LED_NUM, color); FastLED.setBrightness(breath); diff --git a/arduino/alarmclock/alarmclock.exemple.h b/arduino/alarmclock/alarmclock.exemple.h index b01479f..f2462af 100644 --- a/arduino/alarmclock/alarmclock.exemple.h +++ b/arduino/alarmclock/alarmclock.exemple.h @@ -1,13 +1,22 @@ #define SERIAL_SPEED 115200 // LED -#define LED_NUM 300 +#define LED_NUM 30 #define LED_PIN 5 // = D1 #define LED_CHIPSET WS2812B #define LED_COLOR_ORDER GRB -#define LED_BRIGHTNESS_DEFAULT 0 +#define LED_MAXBRIGHTNESS_DEFAULT 80 +#define LED_BRIGHTNESS_DEFAULT 6 #define LED_COLOR_DEFAULT CRGB::Red +// Corresponds à un max brightness configurable via HA +int maxBrightness; +// Utilisé pour définir le seuil actuel de brightness +int curbrightness; +int color; +CRGB leds[LED_NUM]; +boolean ledState; + // WIFI #define WIFI_SSID "XXX" #define WIFI_PASSWORD "XXX" From aa6e34bdfb27e8572764fbaa431cd0cd6e89b597 Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Mon, 24 Apr 2017 16:29:19 +0200 Subject: [PATCH 3/5] --debug --- arduino/alarmclock/alarmclock.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arduino/alarmclock/alarmclock.cpp b/arduino/alarmclock/alarmclock.cpp index 5b58a8d..d81213c 100644 --- a/arduino/alarmclock/alarmclock.cpp +++ b/arduino/alarmclock/alarmclock.cpp @@ -196,6 +196,7 @@ void ledDisplay() fill_solid(leds, LED_NUM, color); FastLED.setBrightness(breath); + /* Debug EVERY_N_SECONDS(1) { Serial.print(breath); Serial.print(" | "); @@ -203,6 +204,7 @@ void ledDisplay() Serial.print("/"); Serial.println(maxBrightness); } + */ FastLED.show(); } From 4d946c0ab682f47c5de797d039e20d9e2fcf7c1b Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Mon, 24 Apr 2017 16:40:35 +0200 Subject: [PATCH 4/5] ajout fps --- arduino/alarmclock/alarmclock.cpp | 21 ++++++++++++++++++--- arduino/alarmclock/alarmclock.exemple.h | 4 ++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/arduino/alarmclock/alarmclock.cpp b/arduino/alarmclock/alarmclock.cpp index d81213c..de6115b 100644 --- a/arduino/alarmclock/alarmclock.cpp +++ b/arduino/alarmclock/alarmclock.cpp @@ -29,6 +29,7 @@ void setup() client.setCallback(callbackMQTT); testConnectMQTT(); + fps = 0; Serial.println("Ready"); /* MQTT @@ -115,6 +116,7 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length) } else if (stopic == MQTT_LED_BRIGHTNESS_COMMAND) { maxBrightness = msgString.toInt(); mqttSendBrightnessState(); + doPrecalcBreath(); } else if (stopic == MQTT_LED_COLOR_COMMAND) { // Sample : 134,168,255 int red = msgString.substring(0, msgString.indexOf(',')).toInt(); @@ -193,6 +195,7 @@ void ledDisplay() * Il faut alors remplacer maxBrightness par maxBrightness - 1 dans la dernière partie de l'équation */ float breath = (exp(sin(millis() / 4500.0 * PI)) + 1.2) * ((curbrightness - 1) / (EULER - (1 / EULER))); + // float breath = (exp(sin(millis() / 4500.0 * PI)) + 1.2) * precalcBreath fill_solid(leds, LED_NUM, color); FastLED.setBrightness(breath); @@ -205,13 +208,25 @@ void ledDisplay() Serial.println(maxBrightness); } */ + // TODO : il faut voir combien de temps prends le calcul de la formule. + // En effet on pourrais precalculer la valeur de fin au moment d'un changement de brightness. + fps++; + if (SHOW_FPS) { + EVERY_N_SECONDS(1) { + Serial.print("FPS : "); + Serial.println(fps); + fps=0; + } + } FastLED.show(); } +void doPrecalcBreath() +{ + precalcBreath = ((curbrightness - 1) / (EULER - (1 / EULER))); +} + void loop() { - // TODO : à voir s'il est plus interressant d'augmenter vite mais graduellement - // TODO : ou de manière moins fréquence mais en faisant un saut de palier. - // TODO : la solution peut aussi etre un mix des deux EVERY_N_SECONDS(10) { if (curbrightness <= maxBrightness) { curbrightness++; diff --git a/arduino/alarmclock/alarmclock.exemple.h b/arduino/alarmclock/alarmclock.exemple.h index f2462af..d629e19 100644 --- a/arduino/alarmclock/alarmclock.exemple.h +++ b/arduino/alarmclock/alarmclock.exemple.h @@ -1,5 +1,9 @@ #define SERIAL_SPEED 115200 +#define SHOW_FPS 1 +int fps; +float precalcBreath; + // LED #define LED_NUM 30 #define LED_PIN 5 // = D1 From 49dc5182fec3ac42f33be6e156d5235e625468ba Mon Sep 17 00:00:00 2001 From: Julien Cabillot Date: Mon, 24 Apr 2017 17:42:53 +0200 Subject: [PATCH 5/5] =?UTF-8?q?precalc=20ne=20sert=20=C3=A0=20rien?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arduino/alarmclock/alarmclock.cpp | 11 ++--------- arduino/alarmclock/alarmclock.exemple.h | 1 - 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/arduino/alarmclock/alarmclock.cpp b/arduino/alarmclock/alarmclock.cpp index de6115b..e7d68b5 100644 --- a/arduino/alarmclock/alarmclock.cpp +++ b/arduino/alarmclock/alarmclock.cpp @@ -116,7 +116,6 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length) } else if (stopic == MQTT_LED_BRIGHTNESS_COMMAND) { maxBrightness = msgString.toInt(); mqttSendBrightnessState(); - doPrecalcBreath(); } else if (stopic == MQTT_LED_COLOR_COMMAND) { // Sample : 134,168,255 int red = msgString.substring(0, msgString.indexOf(',')).toInt(); @@ -194,8 +193,9 @@ void ledDisplay() * En remplaçant 1/e par 0.349 on arrive à un minimal de 1.00x ce qui permet d'avoir les leds qui ne s'éteignent pas * Il faut alors remplacer maxBrightness par maxBrightness - 1 dans la dernière partie de l'équation */ + // J'ai essayé en précalculant la dernière partie à chaque changement de brightness. + // Cela ne change rien on nombre de frames traitées (400). float breath = (exp(sin(millis() / 4500.0 * PI)) + 1.2) * ((curbrightness - 1) / (EULER - (1 / EULER))); - // float breath = (exp(sin(millis() / 4500.0 * PI)) + 1.2) * precalcBreath fill_solid(leds, LED_NUM, color); FastLED.setBrightness(breath); @@ -208,8 +208,6 @@ void ledDisplay() Serial.println(maxBrightness); } */ - // TODO : il faut voir combien de temps prends le calcul de la formule. - // En effet on pourrais precalculer la valeur de fin au moment d'un changement de brightness. fps++; if (SHOW_FPS) { EVERY_N_SECONDS(1) { @@ -221,11 +219,6 @@ void ledDisplay() FastLED.show(); } -void doPrecalcBreath() -{ - precalcBreath = ((curbrightness - 1) / (EULER - (1 / EULER))); -} - void loop() { EVERY_N_SECONDS(10) { if (curbrightness <= maxBrightness) { diff --git a/arduino/alarmclock/alarmclock.exemple.h b/arduino/alarmclock/alarmclock.exemple.h index d629e19..0ee94a5 100644 --- a/arduino/alarmclock/alarmclock.exemple.h +++ b/arduino/alarmclock/alarmclock.exemple.h @@ -2,7 +2,6 @@ #define SHOW_FPS 1 int fps; -float precalcBreath; // LED #define LED_NUM 30