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