Advertisement
HelioxLab

Coeurs Connectés

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