Merge branch 'betterbreath' into 'master'

Betterbreath

See merge request !1
This commit is contained in:
Julien Cabillot 2017-04-24 17:44:11 +02:00
commit 1f39d905cf
3 changed files with 56 additions and 29 deletions

View File

@ -35,10 +35,9 @@ Médias
Avancement Avancement
========== ==========
WIP. 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. 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: 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: 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: HA Il faut des scenes pour retrouver les couleurs classiques
TODO: Ard pas de progression du brightness au cour du temps
TODO: Ard pas d'arret une fois le reveil lancé TODO: Ard pas d'arret une fois le reveil lancé

View File

@ -7,15 +7,6 @@
#include "alarmclock.h" #include "alarmclock.h"
// LED
// Corresponds à un max brightness configurable via HA
int brightness = 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() void setup()
{ {
Serial.begin(SERIAL_SPEED); Serial.begin(SERIAL_SPEED);
@ -25,21 +16,20 @@ void setup()
setupWifi(); setupWifi();
// LED // LED
/* maxBrightness = LED_MAXBRIGHTNESS_DEFAULT;
brightness = LED_BRIGHTNESS_DEFAULT; curbrightness = LED_BRIGHTNESS_DEFAULT;
color = LED_COLOR_DEFAULT; color = LED_COLOR_DEFAULT;
ledState = false; ledState = false;
*/
LEDS.addLeds<LED_CHIPSET,LED_PIN, LED_COLOR_ORDER>(leds, LED_NUM).setCorrection(TypicalSMD5050); LEDS.addLeds<LED_CHIPSET,LED_PIN, LED_COLOR_ORDER>(leds, LED_NUM).setCorrection(TypicalSMD5050);
ledBlackAll(); ledBlackAll();
FastLED.setBrightness(brightness);
// MQTT // MQTT
client.setServer(MQTT_SERVER, MQTT_PORT); client.setServer(MQTT_SERVER, MQTT_PORT);
client.setCallback(callbackMQTT); client.setCallback(callbackMQTT);
testConnectMQTT(); testConnectMQTT();
fps = 0;
Serial.println("Ready"); Serial.println("Ready");
/* MQTT /* MQTT
@ -119,13 +109,12 @@ void callbackMQTT(char* topic, byte* payload, unsigned int length)
ledState = true; ledState = true;
} else { } else {
ledState = false; ledState = false;
curbrightness = 0; curbrightness = LED_BRIGHTNESS_DEFAULT;
ledBlackAll(); ledBlackAll();
} }
mqttSendState(); mqttSendState();
} else if (stopic == MQTT_LED_BRIGHTNESS_COMMAND) { } else if (stopic == MQTT_LED_BRIGHTNESS_COMMAND) {
brightness = msgString.toInt(); maxBrightness = msgString.toInt();
FastLED.setBrightness(brightness);
mqttSendBrightnessState(); mqttSendBrightnessState();
} else if (stopic == MQTT_LED_COLOR_COMMAND) { } else if (stopic == MQTT_LED_COLOR_COMMAND) {
// Sample : 134,168,255 // Sample : 134,168,255
@ -146,7 +135,7 @@ void mqttSendState()
void mqttSendBrightnessState() void mqttSendBrightnessState()
{ {
char buff[4]; char buff[4];
itoa(brightness, buff, 10); itoa(maxBrightness, buff, 10);
client.publish(MQTT_LED_BRIGHTNESS_STATE, buff, true); client.publish(MQTT_LED_BRIGHTNESS_STATE, buff, true);
} }
@ -194,20 +183,47 @@ void ledError()
*/ */
void ledDisplay() void ledDisplay()
{ {
// Source : http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/ /* Natural Breathing LED
float breath = (exp(sin(millis() / 4000.0 * PI)) - 0.3678794) * 108.4; * 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
*/
// 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)));
fill_solid(leds, LED_NUM, color); fill_solid(leds, LED_NUM, color);
FastLED.setBrightness(map(breath, 0, 255, 0, curbrightness)); FastLED.setBrightness(breath);
/* Debug
EVERY_N_SECONDS(1) {
Serial.print(breath);
Serial.print(" | ");
Serial.print(curbrightness);
Serial.print("/");
Serial.println(maxBrightness);
}
*/
fps++;
if (SHOW_FPS) {
EVERY_N_SECONDS(1) {
Serial.print("FPS : ");
Serial.println(fps);
fps=0;
}
}
FastLED.show(); FastLED.show();
} }
void loop() { 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) { EVERY_N_SECONDS(10) {
curbrightness++; if (curbrightness <= maxBrightness) {
curbrightness++;
}
} }
// MQTT // MQTT

View File

@ -1,13 +1,25 @@
#define SERIAL_SPEED 115200 #define SERIAL_SPEED 115200
#define SHOW_FPS 1
int fps;
// LED // LED
#define LED_NUM 300 #define LED_NUM 30
#define LED_PIN 5 // = D1 #define LED_PIN 5 // = D1
#define LED_CHIPSET WS2812B #define LED_CHIPSET WS2812B
#define LED_COLOR_ORDER GRB #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 #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 // WIFI
#define WIFI_SSID "XXX" #define WIFI_SSID "XXX"
#define WIFI_PASSWORD "XXX" #define WIFI_PASSWORD "XXX"