Strip led rgb et bluetooth

Salut à tous !

Je vous explique mon projet. Je souhaite avoir un strip Led rgb contrôlé par bluetooth avec une application Android. Pour l'instant tout ce passe bien, mais j'ai un soucis avec les animations.
En effet, je voudrai que dès le moment où j'appuie sur une animation, cette animation se lance.
Le problème est que si j'ai déjà une animation de lancée sur mon arduino, je suis obligé d'attendre qu'elle soit finie pour en lancer une autre.

Avez-vous une idée ?

Merci !

bonjour,
il suffit de mettre dans l'animation lancée une vérification de réception d'une commande BT.

Bonjour,

Merci de votre réponse.

J'y ai pensé à cette idée mais le problème est que si je veux prendre en compte le changement d'animation le plus rapidement possible, je dois le faire à chaque ligne de code, et même si je veux le faire, comment dire que je veux stopper l'animation ?

Merci.

Tu utilises surement des delays qui bloquent ton code , non ?

Bonjour,

Oui voilà ! Par exemple si je veux faire une animation qui me fait toutes les couleurs, je vais faire une boucle for qui va balayer toutes les couleurs et je vais faire un delay(100) par exemple pour que l'utilisateur voit passer les couleurs.
Si je veux donc changer d'animation, je suis obligé d'attendre la fin de mon animation.

Avez-vous une idée ?

Merci.

Bonjour,

Merci de ta réponse.

Je pense du coup que je vais mettre une interruption sur la broche de réception et changer une variable globale, et donc tester cette variable dans la boucle for. J'hésite entre ça ou tester dans ma boucle si le port série de mon module bluetooth est rempli. Qu'en pensez-vous ?

Merci.

J'ai donc mis un test pour savoir si le buffer série de mon bluetooth est vide ou non. Si il ne l'est pas, je casse ma boucle for avec un break. Ca marche.

J'ai une question, au cas où j'ai ce problème plus tard. Peut-on faire quelque chose si j'ai un delay assez grand, par exemple 5 secondes ?

Merci.

Ah oui, je n'avais pas pensé à scinder ce delay en plusieurs, plus petit !

Merci!

Salut à tous, je reviens en force ! :slight_smile:

J'ai fait des animations, qui utilisent un delay. Cependant, je voudrai changer la vitesse avec la variable qui se trouve dans le delay. Cependant, je ne vois pas comment changer cette variable sans casser mon animation. Ma variable est changée quand quelque chose arrive sur le port série de mon module bluetooth.

Ce qu'il m'intéresse, ce sont les 4 dernières fonctions, sur les animations fondus et anim2 et sur l'augmentation ou la diminution de la vitesse.

Avez-vous une idée ?

Merci !

Voici le code du côté de l'arduino :

#include <SoftwareSerial.h>
#include <avr/interrupt.h>
#define led_rouge 10
#define led_vert 9
#define led_bleu 6

SoftwareSerial bluetooth(3, 4); // Broche Tx - 11 et Rx - 10

volatile byte rouge_int = 0;
volatile byte vert_int = 0;
volatile byte bleu_int = 0;
volatile byte luminosite_int = 0;
volatile boolean allume = false;
volatile byte timer = 0;

void setup() {
 // put your setup code here, to run once:
 pinMode(led_rouge, OUTPUT);
 digitalWrite(led_rouge, LOW);
 pinMode(led_vert, OUTPUT);
 digitalWrite(led_vert, LOW);
 pinMode(led_bleu, OUTPUT);
 digitalWrite(led_bleu, LOW);


 bluetooth.begin(9600);
 Serial.begin(9600);
}

void loop() {
 // put your main code here, to run repeatedly:
 static byte luminosite = 255;
 static boolean on_off = true;
 static boolean cligno = false;
 static byte rouge = 255;
 static byte vert = 255;
 static byte bleu = 255;
 static unsigned int tempo = 500;

 if (bluetooth.available())
 {
   String donnees = "";
   donnees = lecture_bluetooth();
   //Serial.println(donnees);
   traitement_donnees(donnees, &luminosite, &on_off, &rouge, &vert, &bleu, &cligno, &tempo);
   rouge_int = rouge;
   vert_int = vert;
   bleu_int = bleu;
   luminosite_int = luminosite;
 }
}

String lecture_bluetooth()
{
 String s = "";
 char c = ' ';
 while (bluetooth.available())
 {
   c = bluetooth.read();
   s = s + c;
 }
 return s;
}

long stringToLong(String value) {
 long outLong = 0;
 long inLong = 1;
 int c = 0;
 int idx = value.length() - 1;
 for (int i = 0; i <= idx; i++) {

   c = (int)value[idx - i];
   outLong += inLong * (c - 48);
   inLong *= 10;
 }

 return outLong;
}

void traitement_donnees(String s, byte* luminosite, boolean* on_off, byte* rouge, byte* vert, byte* bleu, boolean* cligno, unsigned int* tempo)
{
byte c_rouge = (*rouge);  // Variables pour ne pas changer les vraies valeurs pendant le map
 byte c_vert = (*vert);
 byte c_bleu = (*bleu);

if (s.equals("fondu"))
 {
   TCCR2B &= 0xF8; // Stop timer
   digitalWrite(led_rouge, LOW);
   digitalWrite(led_vert, LOW);
   digitalWrite(led_bleu, LOW);
   (*cligno) = false;
   int i = 0;
   int r = 0, v = 0, b = 0;
   (*rouge) = 0;
   (*vert) = 0;
   (*bleu) = 0;
   while (!bluetooth.available())
   {
     for (r = 0; r < 255; r++)
     {
       Serial.println("Rouge");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (v = 0; v < 255; v++)
     {
       Serial.println("Vert");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (b = 0; b < 255; b++)
     {
       Serial.println("Bleu");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (r = 255; r > 0; r--)
     {
       Serial.println("Rouge");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (v = 255; v > 0; v--)
     {
       Serial.println("Vert");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (b = 255; b > 0; b--)
     {
       Serial.println("Bleu");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
   }
 }
 else if (s.equals("anim2"))
 {
   TCCR2B &= 0xF8; // Stop timer
   digitalWrite(led_rouge, LOW);
   digitalWrite(led_vert, LOW);
   digitalWrite(led_bleu, LOW);
   (*cligno) = false;
   int i = 0;
   int r = 0, v = 0, b = 0;
   (*rouge) = 0;
   (*vert) = 0;
   (*bleu) = 0;
   while (!bluetooth.available())
   {
     for (r = 0; r < 255; r++)
     {
       Serial.println("Rouge");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (r = 255; r > 0; r--)
     {
       Serial.println("Rouge");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (v = 0; v < 255; v++)
     {
       Serial.println("Vert");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (v = 255; v > 0; v--)
     {
       Serial.println("Vert");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (b = 0; b < 255; b++)
     {
       Serial.println("Bleu");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
     for (b = 255; b > 0; b--)
     {
       Serial.println("Bleu");
       analogWrite(led_rouge, r);
       analogWrite(led_vert, v);
       analogWrite(led_bleu, b);
       delay((int)((*tempo) / 100));
       if (bluetooth.available()) break;
     }
   }
 }


 else if (s.equals("vitesse_moins"))
 {
   if ((*tempo) + 250 < 3000) (*tempo) += 250;
   else (*tempo) = 3000;
 }

 else if (s.equals("vitesse_plus"))
 {
   if ((*tempo) - 250 > 250) (*tempo) -= 250;
   else (*tempo) = 250;
 }
}

Bonjour_pepe_

Merci de ta réponse. Tu dis que ce que je demande entre en contradiction avec mon programme, c'est pour celà que je demande de l'aide car je ne vois pas comment faire d'autre ! :wink:

Cependant, je ne veux pas que lorsque je change la vitesse (donc la variable "tempo"), l'animation en cours recommence où quelque chose dans ce genre. Je voudrai modifier la variable "tempo" puis reprendre où j'en étais. Je pensais à une interruption ou quelque chose dans ce genre mais je ne vois pas comment faire avec le bluetooth.

Merci !

Merci de ta réponse pepe

Désolé, je n'avais pas bien compris ce que tu voulais dire par là !
Si je comprends bien, lorsque dans mes animations je teste si il y a quelque chose sur le port série du bluetooth et que je casse l'animation, il faudrait plutôt regarder quel est le message et si c'est la vitesse, changer la variable "tempo" et si c'est autre chose, casser l'animation ?

Merci.

D'accord, je testerai ça quand j'aurai le temps.

Merci beaucoup !