Serial moniteur module bluetooth HC06

Bonjour à tous,

J'ai découvert l'application RC car (Android) Bluetooth pour contrôler une voiture a distance avec le module Bluetooth HC06
J'ai trouvé un code sur internet, celui ci marche mais j'essaye de comprendre le code.
Et je ne comprend pas pourquoi en voulant afficher "state" (message envoyer du module) je reçoit 7070 au lieu de 'F'

Est-ce dans un autre format (HEX...) ?

  const int motorA1  = 5;  // Pin  2 of L293
  const int motorA2  = 6;  // Pin  7 of L293
  const int motorB1  = 10; // Pin 10 of L293
  const int motorB2  = 9;  // Pin 14 of L293
//Leds connected to Arduino UNO Pin 12
  const int lights  = 12;
//Buzzer / Speaker to Arduino UNO Pin 3
  const int buzzer = 3 ;   
//Bluetooth (HC-06 JY-MCU) State pin on pin 2 of Arduino
  const int BTState = 2;
//Calculate Battery Level
  const float maxBattery = 8.0;// Change value to your max battery voltage level! 
  int perVolt;                 // Percentage variable 
  float voltage = 0.0;         // Read battery voltage
  int level;
// Use it to make a delay... without delay() function!
  long previousMillis = -1000*10;// -1000*10=-10sec. to read the first value. If you use 0 then you will take the first value after 10sec.  
  long interval = 1000*10;       // interval at which to read battery voltage, change it if you want! (10*1000=10sec)
  unsigned long currentMillis;   //unsigned long currentMillis;
//Useful Variables
  int i=0;
  int j=0;
  int state;
  int vSpeed=200;     // Default speed, from 0 to 255

void setup() {
    // Set pins as outputs:
    pinMode(motorA1, OUTPUT);
    pinMode(motorA2, OUTPUT);
    pinMode(motorB1, OUTPUT);
    pinMode(motorB2, OUTPUT);
    pinMode(lights, OUTPUT); 
    pinMode(BTState, INPUT);    
    // Initialize serial communication at 9600 bits per second:
    Serial.begin(9600);
}
 
void loop() {
  //Stop car when connection lost or bluetooth disconnected
     if(digitalRead(BTState)==LOW) { state='S'; }

  //Save income data to variable 'state'
    if(Serial.available() > 0){     
      state = Serial.read();
        
    }
  
  //Change speed if state is equal from 0 to 4. Values must be from 0 to 255 (PWM)
    if (state == '0'){
      vSpeed=0;}
    else if (state == '1'){
      vSpeed=100;}
    else if (state == '2'){
      vSpeed=180;}
    else if (state == '3'){
      vSpeed=200;}
    else if (state == '4'){
      vSpeed=255;}
 	  
  /***********************Forward****************************/
  //If state is equal with letter 'F', car will go forward!
    if (state == 'F') {
    	analogWrite(motorA1, vSpeed); analogWrite(motorA2, 0);
        analogWrite(motorB1, 0);      analogWrite(motorB2, 0); 
        Serial.print(state);
    }
  /**********************Forward Left************************/
  //If state is equal with letter 'G', car will go forward left
    else if (state == 'G') {
    	analogWrite(motorA1, vSpeed); analogWrite(motorA2, 0);  
        analogWrite(motorB1, 200);    analogWrite(motorB2, 0); 
       
    }
  /**********************Forward Right************************/
  //If state is equal with letter 'I', car will go forward right
    else if (state == 'I') {
      	analogWrite(motorA1, vSpeed); analogWrite(motorA2, 0); 
        analogWrite(motorB1, 0);      analogWrite(motorB2, 200); 
       
    }
  /***********************Backward****************************/
  //If state is equal with letter 'B', car will go backward
    else if (state == 'B') {
    	analogWrite(motorA1, 0);   analogWrite(motorA2, vSpeed); 
        analogWrite(motorB1, 0);   analogWrite(motorB2, 0); 
        
    }
  /**********************Backward Left************************/
  //If state is equal with letter 'H', car will go backward left
    else if (state == 'H') {
    	analogWrite(motorA1, 0);   analogWrite(motorA2, vSpeed); 
        analogWrite(motorB1, 200); analogWrite(motorB2, 0); 
        
    }
  /**********************Backward Right************************/
  //If state is equal with letter 'J', car will go backward right
    else if (state == 'J') {
    	analogWrite(motorA1, 0);   analogWrite(motorA2, vSpeed); 
        analogWrite(motorB1, 0);   analogWrite(motorB2, 200); 
        
    }
  /***************************Left*****************************/
  //If state is equal with letter 'L', wheels will turn left
    else if (state == 'L') {
    	analogWrite(motorA1, 0);   analogWrite(motorA2, 0); 
        analogWrite(motorB1, 200); analogWrite(motorB2, 0); 
       
    }
  /***************************Right*****************************/
  //If state is equal with letter 'R', wheels will turn right
    else if (state == 'R') {
    	analogWrite(motorA1, 0);   analogWrite(motorA2, 0); 
        analogWrite(motorB1, 0);   analogWrite(motorB2, 200); 
        	
    }
  /************************Lights*****************************/
  //If state is equal with letter 'W', turn leds on or of off
    else if (state == 'W') {
      if (i==0){  
         digitalWrite(lights, HIGH); 
         i=1;
      }
      else if (i==1){
         digitalWrite(lights, LOW); 
         i=0;
      }
      state='n';
    }
  /**********************Horn sound***************************/
  //If state is equal with letter 'V', play (or stop) horn sound
    else if (state == 'V'){
      if (j==0){  
         tone(buzzer, 1000);//Speaker on 
         j=1;
      }
      else if (j==1){
         noTone(buzzer);    //Speaker off 
         j=0;
      }
      state='n';  
    }
  /************************Stop*****************************/
  //If state is equal with letter 'S', stop the car
    else if (state == 'S'){
        analogWrite(motorA1, 0);  analogWrite(motorA2, 0); 
        analogWrite(motorB1, 0);  analogWrite(motorB2, 0);
    }
  /***********************Battery*****************************/
  //Read battery voltage every 10sec.
    currentMillis = millis();
    if(currentMillis - (previousMillis) > (interval)) {
       previousMillis = currentMillis; 
       //Read voltage from analog pin A0 and make calibration:
       voltage = (analogRead(A0)*5.015 / 1024.0)*11.132;
       //Calculate percentage...
       perVolt = (voltage*100)/ maxBattery;
       if      (perVolt<=75)               { level=0; }
       else if (perVolt>75 && perVolt<=80) { level=1; }    //        Battery level
       else if (perVolt>80 && perVolt<=85) { level=2; }    //Min ------------------------   Max
       else if (perVolt>85 && perVolt<=90) { level=3; }    //    | 0 | 1 | 2 | 3 | 4 | 5 | >
       else if (perVolt>90 && perVolt<=95) { level=4; }    //    ------------------------
       else if (perVolt>95)                { level=5; }   
      // Serial.println(level);    
    }
    
}

Merci
Bonne journée

Bonjour,

ta variable state est de type int. Du coup, Serial.print t'affiche les 2 octets qui compose l'int sous forme décimale.

La question est pourquoi ton state, qui est en fait un caractère (1 octet) est mémorisé dans un int ?

A la lecture du code je ne vois pas pourquoi donc essaye peut-être simplement en remplaçant

int state;

par

char state;

Du coup ton Serial.print(state) t'affichera le caractère (puisqu'il reçoit maintenant un caractère en argument).

Autre solution, en gardant int state; c'est de forcer le changement de type juste pour l'appel de la fonction :

Serial.print((char)state);

70 c'est le code ASCII du caractère F

@fdufnews, oui mais comment tu expliques 7070 ? :wink:

EDIT : je pense qu'en fait 7070 est le résultat de 2 print consécutifs de state... 1 seul print doit afficher 70 seulement.

Merci pour vos réponses
j'ai remarqué qu'en branchant le pin state du module à la carte (pin 2) les données arrivant dans le serial moniteur sont plus nombreuse
Quel est l'intérêt de cette broche "state" ?

D'après les infos du net cette broche reflète l'état connecté du module. C'est cohérent avec le code : le programme se sert de cette broche pour arrêter les moteurs et passer dans l'état 'S' pour stop si état "non connecté" (normal, que le robot ne continue pas a avancer en cas de déconnexion). Par contre, à part le Serial.Serial.print(state); du cas 'F' je ne vois pas ce qui peut s'afficher de plus en mode connecté ?. Soit plus clair, qu'est ce qui s'affiche en plus quand tu connectes state ?

Bonjour,
En réalité en cliquant de la même manière et durant un même temps sur le bouton de l'application au lieu d'avoir 7070 par exemple j'ai 70707070707070 en reliant le pin 'state' a l'arduino
Bonne journée

Rebonjour,

une petite question,
J'aimerai récupérer les chiffres (qui ne sont pas fixes car ils dépendent de mon curseur) contenus dans un message provenant de l'application et encadrés par deux lettres que je peut choisir (fixes) par exemple :
A105F ou A12F

je me suis dit que je pourrai trouver à quel place se trouve le chiffre juste avant la lettre F pour ensuite découper grâce à la fonction stringOne.substring (,) mais je n'arrive pas à faire ce petit compteur
Voici mon code :

char state;
char p;
int t = 1;

void setup() {
  Serial.begin(9600);
}

void loop() {
  state = Serial.read();
  if (state == 'A') {

    while (p != 'F') {
      p = Serial.read();
      t++;
      Serial.print(t);
    }
   delay(1000);
  }
}

Est-ce une bonne idée ?
Auriez vous une autre idée pour récupérer ces chiffres de façon plus simple?
merci à vous

Voir par ici