1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <math.h>
#include <Adafruit_NeoPixel.h>
//LEFT = indice pour la partie gauche, RIGHT pour la partie droite.
#define LEFT 0
#define RIGHT 1
#define NPIXELS 5 //nombre de pixels
#define PINL 5 //pin à laquelle est connectée la patte DIN du ruban de gauche / Pin 5 = D1 sur le Wemos
#define PINR 4 //idem pour le ruban de droite / Pin 4 = D2 sur le Wemos
//tableau contenant les instances, une par côté de manière à pouvoir contrôler les deux indépendemment.
Adafruit_NeoPixel strips[2] = {
Adafruit_NeoPixel(NPIXELS, PINL, NEO_GRB + NEO_KHZ800), //left
Adafruit_NeoPixel(NPIXELS, PINR, NEO_GRB + NEO_KHZ800) //right
};
char auth[] = "AumOjuVUh-xxxxxxxxxxxxxxxxxx "; //token généré par le projet Blynk sur le smartphone
char ssid[] = "Bbox-xxxxxxxxx"; //SSID du réseau WiFi auquel se connecte l'ESP
char pass[] = "XXXXXXXXX"; //clé du réseau WiFi
//Valeurs de la couleur actuelle, une pour le côté gauche, une pour le côté droit
uint8_t r[2] = {0};
uint8_t g[2] = {0};
uint8_t b[2] = {0};
//quand isShowing = true, l'effet de "respiration" s'affiche
bool isShowing[2] = {false};
//moment à partir duquel on a lancé l'effet. Sert à savoir quand l'arrêter
uint32_t startTime[2] = {0};
unsigned long breathe_time[2] = {millis(), millis()};
//délai entre deux tours de boucle de l'animation "respiration". Plus la valeur est faible, plus la respiration est rapide
int breathe_delay = 10;
//durée de l'effet de respiration, en millisecondes
uint32_t duration = 13.1 * 1000L;
#define EFFECT_START_VALUE 100
int i[2]={EFFECT_START_VALUE};
//fonction appelée lorsque la variable V0 est modifiée dans l'application Blynk
BLYNK_WRITE(V0) {
r[LEFT] = (uint8_t)param[0].asInt();
g[LEFT] = (uint8_t)param[1].asInt();
b[LEFT] = (uint8_t)param[2].asInt();
isShowing[LEFT] = true;
}
BLYNK_WRITE(V1) {
r[RIGHT] = (uint8_t)param[0].asInt();
g[RIGHT] = (uint8_t)param[1].asInt();
b[RIGHT] = (uint8_t)param[2].asInt();
isShowing[RIGHT] = true;
}
void setup() {
Serial.begin(115200);
Serial.println(F("\n\nconnexion à blynk en cours...")); Serial.flush();
Blynk.begin(auth, ssid, pass);
Serial.println(F("... connecté.")); Serial.flush();
//initialisation des deux rubans de LED
for(uint8_t side=0; side<2; side++) {
strips[side].begin();
strips[side].Color(0, 0, 0);
strips[side].setBrightness(0);
strips[side].show();
}
}
void loop() {
Blynk.run();
//ce passage permet de lancer l'effet pour un certain temps.
//lorsque le temps est écoulé, on conserve la couleur avec la luminosité au max.
for(uint8_t side=0; side<2; side++) {
if (isShowing[side] == true) {
if (startTime[side] == 0) {
startTime[side] = millis();
i[side]=EFFECT_START_VALUE;
}
//on vérifie ici si le temps aloué est écoulé.
if ((millis() - startTime[side]) < duration) {
nonBlockingBreath(side);
} else {
startTime[side] = 0;
isShowing[side] = false;
}
}
}
}
//cette fonction gère l'effet de "respiration" en calculant, à partir d'une fonction
//à base sinusoïdale.
//Source: <a href="https://arduinoelectronics.wordpress.com/2015/05/12/non-blocking-breathing-led/" target="_blank">https://arduinoelectronics.wordpress...breathing-led/</a>
void nonBlockingBreath(uint8_t side) {
if( (breathe_time[side] + breathe_delay) < millis() ){
breathe_time[side] = millis();
float val = (exp(sin(i[side]/2000.0*PI*10)) - 0.36787944)*108.0;
for (int n=0; n<NPIXELS; n++) {
strips[side].setPixelColor(n, strips[side].Color(r[side], g[side], b[side]));
}
//Serial.println(String(i[side]) + "-" + String(val));
strips[side].setBrightness(val);
strips[side].show();
i[side]++;
}
} |
Partager