Problème passage 0/1 avec code perso.

Bonjours ou bonsoirs,

voila j’aimerai mettre au point un petit programme de communication entre mon arduino uno et mon ordi.

  1. Définir mes pins avec un string envoyé par port série.
  2. Mettre mes pins à 0/1 avec un string envoyé par port série.
String commandHeater = "heater";
String commandLight = "light"; 

String argumentOn = "on";
String argumentOff = "off";

String DefinePin = "definepin";

int pinLight= 0;
int pinHeater= 0;

char spacePositionLight1 = 0;
char spacePositionLight2 = 5;
char spacePositionHeater1 = 0;
char spacePositionHeater2 = 6;

String commandArgument;

int a = 0;
int i;
char inChar;


void setup() {

  pinMode ( 1,OUTPUT );
  pinMode ( 2,OUTPUT);

  digitalWrite( 1, LOW);
  digitalWrite( 2, LOW);

  Serial.begin(4800);
  commandArgument.reserve(200);
}




void loop()
{

delay (500);
  
}




void serialEvent () {

        
 if (Serial.available() > 6 ){
   
   a = Serial.available ();
   
   for ( i=0; i < a; i++)
   {
    inChar  = (char) Serial.read(); 
    commandArgument += inChar;
   }
    
    Serial.print ("\n" + commandArgument ) ; 

   

delay (500);

    if ( commandArgument.substring( spacePositionLight1,spacePositionLight2 ) == commandLight ){
        
      char spacePositionOn1 = 5; 
      char spacePositionOn2 = 7;
      char spacePositionOff1 = 5; 
      char spacePositionOff2 = 8;

      if ( commandArgument.substring( spacePositionOn1,spacePositionOn2 ) == argumentOn){

        digitalWrite( pinLight, HIGH );   
        Serial.print("UNDERSTOOD LIGHT ON \n");
        commandArgument = "";
      }

      else if ( commandArgument.substring( spacePositionOff1,spacePositionOff2) == argumentOff)
      {

        digitalWrite( pinLight, LOW );   
        Serial.print("UNDERSTOOD LIGHT OFF\n");
        commandArgument = "";

      }

      else  
      {
        Serial.print ( "command error\n"  );
        commandArgument = "";
      }

    }

    else if  ( commandArgument.substring( spacePositionHeater1,spacePositionHeater2 ) == commandHeater)
    { 
      
      char spacePositionOn1 = 6; 
      char spacePositionOn2 = 8 ;
      char spacePositionOff1 = 6; 
      char spacePositionOff2 = 9;

      if ( commandArgument.substring( spacePositionOn1,spacePositionOn2 ) == argumentOn)
      {

        digitalWrite( pinHeater, HIGH );   
        Serial.print("UNDERSTOOD HEATER ON \n");
        commandArgument = "";
      }

      else if ( commandArgument.substring( spacePositionOff1,spacePositionOff2 ) == argumentOff)
      {

        digitalWrite( pinHeater, LOW );   
        Serial.print("UNDERSTOOD HEATER OFF\n");
        commandArgument = "";

      }
      
      else  
      {
        Serial.print ( "command error\n"  );
        commandArgument = "";
      }
    }   

   else if ( commandArgument.substring (0,9) == DefinePin){
     Serial.print ( "UNDERSTOOD DEFINE PIN\n"  );
     
        if ( commandArgument.substring (9,15)== commandHeater ){
          
           Serial.print ( "UNDERSTOOD DEFINE PIN HEATER \n"  );
           pinHeater = 0; 
           
          if ( commandArgument.substring (15,16) == "1"){
              pinHeater = 1;
             
             }
             else if ( commandArgument.substring (15,16) == "2"){
              pinHeater = 2;
              
             }
             else if ( commandArgument.substring (15,16) == "3"){
              pinHeater = 3;
              
             }
             else if ( commandArgument.substring (15,16) == "4"){
              pinHeater = 4;
              
             }
             else if ( commandArgument.substring (15,16) == "5"){
              pinHeater = 5;
              
             }
             else if ( commandArgument.substring (15,16) == "6"){
              pinHeater = 6;
              
             }            
             else if ( commandArgument.substring (15,16) == "7"){
              pinHeater = 7;
              
             }
             else if ( commandArgument.substring (15,16) == "8"){
              pinHeater = 8;
              
             }
             else if ( commandArgument.substring (15,16) == "9"){
              pinHeater = 9;
              
             }
             
             delay (500);
             pinMode ( pinHeater,OUTPUT );
             delay (500);
             digitalWrite( pinHeater, LOW);
             commandArgument = "";
             
             Serial.print ( "UNDERSTOOD DEFINE PIN HEATER\n" );
             Serial.print ( pinHeater);
             Serial.print("\n");
          }
          
        else if ( commandArgument.substring (9,14)== commandLight){
          
        pinLight = 0;
         Serial.print ( "UNDERSTOOD DEFINE PIN LIGHT\n"  );
         
          if ( commandArgument.substring (14,15) == "1"){
            delay (500);
             pinLight = 1;
             }
             else if ( commandArgument.substring (14,15) == "2"){
              pinLight = 2;
              
             }
             else if ( commandArgument.substring (14,15) == "3"){
              pinLight = 3;
              
             }
             else if ( commandArgument.substring (14,15) == "4"){
              pinLight = 4;
              
             }
             else if ( commandArgument.substring (14,15) == "5"){
              pinLight = 5;
              
             }
             else if ( commandArgument.substring (14,15) == "6"){
              pinLight = 6;
              
             }            
             else if ( commandArgument.substring (14,15) == "7"){
              pinLight = 7;
              
             }
             else if ( commandArgument.substring (14,15) == "8"){
              pinLight = 8;
              
             }
             else if ( commandArgument.substring (14,15) == "9"){
              pinLight = 9;
              
             }
             
             delay (500);
             pinMode ( pinLight,OUTPUT );
             delay (500);
             digitalWrite( pinLight, LOW);
             commandArgument = "";
             
             Serial.print ( "UNDERSTOOD DEFINE PIN LIGHT\n" );
              Serial.print ( pinLight );
               Serial.print("\n");
             
        }
        
         else 
        {
         Serial.print ( "define pin error\n");
        commandArgument = "";
        } 
      }
     else if (commandArgument.substring(0,11) == "pinlocation")
     {
       Serial.print ( "Pin Heater location :");
       Serial.print ( pinHeater );
       Serial.print ( "\nPin Light location :" );
       Serial.print ( pinLight );
       commandArgument = "";

     }
 
 
    else 
    {
      Serial.print ( "command error\n"  );
      commandArgument = "";
    }
  }


}

Ce que j’ai fait ci-dessus ( n’hésitez pas a critiquer je suis preneur :wink: !). me permet bien de faire ce que j’ai dit plus haut avec par exemple : definepinlight1 qui va définir mon pin 1 comme étant le PinLight pareille pour heater ex: definpinheater2. Après en envoyant LightOn j’aimerai passé mon pin à 1. C’est la que le bas blesse… impossible de faire changer mon pin d’état. Est ce par ce que je ne peut que définir le pinMode dans le void Setup ? Enfin pouvez m’aidez la je galère.

Et en passant peut-être une manière de raccourcir la partie ou je définis le numéro du pin.

PS: désolé pour la grande clarté du tire mais j’ai pas trouver mieux ^^’.

Salut,

La première erreur que je vois est tout simplement l’emploi des String xD Sinon un pinMode peut s’executer n’importe quand.

Comme je ne m’en sers jamais en plus j’ai du mal à comprendre ton code puisqu’il utilise plein de fonction de la classe … Du coup je prefère te donner mon approche qui réduirait considérablement la taille du code :

La trame serait de la forme 000101001 pour la définition des directions des pin + à la suite une autre pour leurs états. Côté arduino tu n’as plus qu’à réceptionner cette trame dans un tableau de char, puis faire une boucle pour tout configurer, genre :

for (int i=0;i<10;i++){   // je suppose que tu as 10 pins à configurer

pinMode(MappingPin[i],byte(Buffer[i])); // MappingPin[] contiendra les numéros de tes ports, ça permet de ne pas être obliger qu'ils se suivent, Buffer[] contient la trame série. INPUT=0 OUTPUT=2 INPUT_PULLUP=2

digitalWrite(MappingPin[i],byte(Buffer[i+10]));

}

je suis juste pas sûr de mon coup du byte(Buffer), et j’ai pas de board la pour vérifier.