HelioxLab

Coeurs Connectés

Feb 9th, 2019
3,135
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×