Arduino & éclairage DMX

Bonjour, Bonsoir

J’ai réaliser un programme en Arduino.

L’Arduino communique avec un smartphone en Bluetooth et avec un projecteur en DMX.

Je voudrais savoir s’il n’y a pas d’erreurs dans mon programme et s’il y aurait des choses à alléger.

Ce qui m’interesses surtout, c’est de savoir si ce que j’ai fait pour que les valeurs restent en mémoire (avec valeur1, valeur2 …) est correct.

Je ne peux pas le tester immédiatement, je vous demande donc si c’est juste.

Merci.

Le programme Arduino :

//*************INCLUSION DES BIBLIOTHEQUES***************// 
 
 
#include <SoftwareSerial.h>
#include <DmxSimple.h>
#define RxD 6   // RxD sur la borne 6 (borne où on branche le module sur l'Arduino)
#define TxD 7   // TxD sur la borne 7
 
 
//******************************************************//
 
 
  
const int Projecteur = A1 ; // Défintion de la variable "Projecteur" qui a pour valeur la broche A1
 
  
SoftwareSerial blueToothSerial(RxD,TxD) ; // Création de l'objet "blueToothSerial" par instantiation de la classe SoftwareSerial
 
  
void setup()
{
  Serial.begin(9600) ; // Initialisation de la liaison série
  pinMode(RxD, INPUT) ;  // Initialisation des directions (E/S) des bornes de commande du projecteur
  pinMode(TxD, OUTPUT) ;
  setupBlueToothConnection() ;
  pinMode(Projecteur, OUTPUT) ;
  DmxSimple.maxChannel(5) ;  // Nombre de canaux maximum à générer dans la trame DMX
  DmxSimple.usePin(A1) ;  // L'Arduino génère la trame en broche 'A1'
}
 
 
void setupBlueToothConnection()
 
  // Séquence d'initialisation "mode slave" pour module blutooth groove
   
  {
    blueToothSerial.begin(38400) ; // Configuration de la vitesse de transmission série par défaut
    blueToothSerial.print("\r\n+STWMOD=0\r\n") ; // Config. du module en mode "slave"
    blueToothSerial.print("\r\n+STNA=SoundLight\r\n") ; // Config. du nom module "SoundLight"
    blueToothSerial.print("\r\n+STPIN=0000\r\n") ;// Config. du pincode"0000"
    blueToothSerial.print("\r\n+STOAUT=1\r\n") ; // Autorisation de connection d'un module appairé
    blueToothSerial.print("\r\n+STAUTO=0\r\n") ; // Interdiction de l'Auto-connection
    delay(2000) ; // Délai requis.
    blueToothSerial.print("\r\n+INQ=1\r\n") ; // Positionne le module en mode  attente de connection.
    Serial.println("Le module bluetooth est en attente de connexion !") ;
    delay(2000) ; // Délai requis.
    blueToothSerial.flush() ;
  }
 
 
 
 
 
 
 
  ////////////////////////////////////////
 //////////PROGRAMME DE COMMANDE/////////
////////////////////////////////////////
 
 
void loop()
  {
     
     char recvChar ;
     int valeur1 ;
     int valeur2 ;
     int valeur3 ;
     int valeur4 ;
     int valeur5 ;
 
      
    if(blueToothSerial.available()) // Test si reception sur la liaison Bluetooth
    {
      recvChar = blueToothSerial.read() ; // Récupération du caractère reçu
      Serial.print(recvChar) ; // Envoi du caractère sur la sortie debug
    }  
      
    switch (recvChar)  // Traitement en fonction du caractère reçu
    {
 
 
//*************POWER***************// 
 
       
      case 'h': //ON
        blueToothSerial.print("\nPOWER : ON\n") ;
        DmxSimple.write(1,50) ;   // Mode RVB
        DmxSimple.write(2,255) ;  // Rouge
        DmxSimple.write(3,255) ;  // Vert
        DmxSimple.write(4,255) ;  // Bleu
        valeur1=50 ;
        valeur2=255 ;
        valeur3=255 ;
        valeur4=255 ;
        break ;
         
         
      case 'l': //OFF
        blueToothSerial.print("\nPOWER: OFF\n") ;      
        DmxSimple.write(1,50) ;
        DmxSimple.write(2,0) ;
        DmxSimple.write(3,0) ;
        DmxSimple.write(4,0) ;
        valeur1=50 ;
        valeur2=0 ;
        valeur3=0 ;
        valeur4=0 ;   
        break ;
 
 
//*************INTENSITES***************// 
 
 
      case 'y': //  Intensité 25%
        blueToothSerial.print("\nIntensité : 25%\n") ;     
        valeur2 = valeur2 / 4 ;
        valeur3 = valeur3 / 4 ;
        valeur4 = valeur4 / 4 ;
        DmxSimple.write(1,50) ;
        DmxSimple.write(2,valeur2) ;
        DmxSimple.write(3,valeur3) ;
        DmxSimple.write(4,valeur4) ;
        break ; 
 
      case 's': //  Intensité 50%
        blueToothSerial.print("\nIntensité : 50%\n") ;     
        valeur2 = valeur2 / 2 ;
        valeur3 = valeur3 / 2 ;
        valeur4 = valeur4 / 2 ;
        DmxSimple.write(1,50) ;
        DmxSimple.write(2,valeur2) ;
        DmxSimple.write(3,valeur3) ;
        DmxSimple.write(4,valeur4) ;
        break ;
 
      case 'w': //  Intensité 75%
        blueToothSerial.print("\nIntensité : 75%\n");     
        valeur2 = valeur2 / 1.33 ;
        valeur3 = valeur3 / 1.33 ;
        valeur4 = valeur4 / 1.33 ;
        DmxSimple.write(1,50) ;
        DmxSimple.write(2,valeur2) ;
        DmxSimple.write(3,valeur3) ;
        DmxSimple.write(4,valeur4) ;
        break ;
 
      case 'q': //  Intensité 100%
        blueToothSerial.print("\nIntensité : 100%\n") ;     
        valeur2 = valeur2 / 1 ;
        valeur3 = valeur3 / 1 ;
        valeur4 = valeur4 / 1 ;
        DmxSimple.write(1,50) ;
        DmxSimple.write(2,valeur2) ;
        DmxSimple.write(3,valeur3) ;
        DmxSimple.write(4,valeur4) ;
        break ;    
 
 
//*************COULEURS***************// 
                           
 
      case 'r': //  Couleur rouge
        blueToothSerial.print("\nCouleur : Rouge\n") ;     
        DmxSimple.write(1,50) ;
        DmxSimple.write(2,255) ;
        DmxSimple.write(3,0) ;
        DmxSimple.write(4,0) ;
        valeur1=50 ;
        valeur2=255 ;
        valeur3=0 ;
        valeur4=0 ; 
        break ;
 
 
      case 't': //  Couleur verte
        blueToothSerial.print("\nCouleur : Vert\n") ;     
        DmxSimple.write(1,50) ;
        DmxSimple.write(2,0) ;
        DmxSimple.write(3,255) ;
        DmxSimple.write(4,0) ;
        valeur1=50 ;
        valeur2=0 ;
        valeur3=255 ;
        valeur4=0 ;          
        break ;
 
         
      case 'b': //  Couleur bleue
        blueToothSerial.print("\nCouleur : Bleu\n") ;     
        DmxSimple.write(1,50) ;
        DmxSimple.write(2,0) ;
        DmxSimple.write(3,0) ;
        DmxSimple.write(4,255) ; 
        valeur1=50 ;
        valeur2=0 ;
        valeur3=0 ;
        valeur4=255 ;
        break ;
         
 
//*************CLIGNOTEMENTS***************//     
     
 
      case 'a': // Clignotement lent
        blueToothSerial.print("\nClignotement : Lent\n") ;     
        DmxSimple.write(1, 50) ;
        DmxSimple.write(2,valeur2) ;
        DmxSimple.write(3,valeur3) ;
        DmxSimple.write(4,valeur4) ; 
        delay(1000) ;
        DmxSimple.write(2,0) ;
        DmxSimple.write(3,0) ;
        DmxSimple.write(4,0) ; 
        delay(1000) ;
        break ;
         
         
      case 'z': //  Clignotement medium
        blueToothSerial.print("\nClignotement : Medium\n") ; 
        DmxSimple.write(1, 50) ;           
        DmxSimple.write(2,valeur2) ;
        DmxSimple.write(3,valeur3) ;
        DmxSimple.write(4,valeur4) ; 
        delay(500) ;
        DmxSimple.write(2,0) ;
        DmxSimple.write(3,0) ;
        DmxSimple.write(4,0) ;
        delay(500) ;
        break ;
         
      
      case 'e': //  Clignotement rapide
        blueToothSerial.print("\nClignotement : Rapide\n") ; 
        DmxSimple.write(1, 50) ;           
        DmxSimple.write(2,valeur2) ;
        DmxSimple.write(3,valeur3) ;
        DmxSimple.write(4,valeur4) ; 
        delay(250) ;
        DmxSimple.write(2,0) ;
        DmxSimple.write(3,0) ;
        DmxSimple.write(4,0) ;
        delay(250) ;
        break ;
         
       
       
    }
 
     
}

Votre

 switch (recvChar)  // Traitement en fonction du caractère reçu

devrait se trouver dans le bloc de {} du 'si j'ai reçu quelque chose'
if(blueToothSerial.available()) // Test si reception sur la liaison Bluetooth sinon vous envoyez constamment les ordres tant qu'il n'y a pas de nouveau caractere qui arrive

D'autre part vos variables valeurs sont locales à la loop() donc ne conservent pas leur valeurs entre deux tours de loop(). Si vous voulez les mémoriser il faut les déclarer soit en variables globales, soit avec le mot clé static devant la déclaration

Enfin ces valeurs tiennent sur un octet non signé et sont utilisées comme tel, donc autant utiliser un type byte plutôt que int

==> static byte valeur1 = xx; // profitez en pour les initialiser correctement

Merci beaucoup pour votre aide, je voulais vraiment savoir comment garder les valeurs en mémoire et vous m'avez donné la réponse.

Les déclarations de variable, je les laisse tout de même dans le void loop() ?

Oui puisque vous ne les utilisez pas ailleurs, autant les laisser là

J'ai donc fait le changement.
Mais en testant, il s'est avéré que les commandes clignotements lent, medium et rapide ne fonctionnent pas. J'ai donc mis une boucle while dans les cases concernés mais ducoup les boucles bloquent tout je ne peux plus rien faire, je peux plus envoyer d'autres caractères sur la liaison bluetooth ducoup à partir du moment que je fais clignoter je suis bloqué.

Donc comment faire pour que je puisse faire clignoter tant qe je ne renvoi pas d'autre caractère mais qu'aussi quand sa clignote je puisse arrêter le clignotement, je puisse donc envoyer un autre caractère ?

Merci,
Peut-être pas très clair... excusez-moi

Lisez l'exemple blink without delay