Problème avec Switch Case

Bonjour,

Problème sûrement tout bête mais je ne m'en sors pas.
Avec une AA (MIT Inventor) j'envoi des octets (1, 2, 3, ....) via le bluetooth.
Sur le moniteur série, je vois bien arriver les chiffres (ordre). A mon avis, c'est bien des INT car j'ai pu faire des additions avec ces chiffres,.
Par contre, ils ne semblent pas reconnu dans le "SWITCH CASE.
Et là, je ne vois pas?
Attention c'est un programme en cours, pas fini, et les nombreux Serial.print ne sont là que pour le développement.
Qui peut m'aider?
Jean-Michel

#include <SoftwareSerial.h>
SoftwareSerial hc06(2,3);

#define ENA        10       
#define IN1        9      
#define IN2        8       
#define IN3        7       
#define IN4        6        
#define ENB        5
int ordre = 0;       
int SP1 = 0;
int SP2 = 0;
void setup(){
 	Serial.begin(9600);
 	hc06.begin(9600);
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENB, OUTPUT);   
}
void loop(){
 	while(hc06.available()>0){
 			ordre = hc06.read();
 	}
 	if(ordre!=""){
 			Serial.println(ordre);            
      ordre = "";
 	    delay(100);
 	}
  switch(ordre){
    case 0:
    SP1 = 0;
    Serial.println(SP1);
    motor(SP1,SP2);
    break;
    case 1:
    SP1 = SP1 + 10;
    Serial.println(SP1);
    motor(SP1,SP2);
    break;
    case 2:
    SP1 = SP1 - 10;
    motor(SP1,SP2);
    break;

  } 
}

void motor(int speed1, int speed2){
  if (speed1>0){
    digitalWrite(IN1, HIGH);                 
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);                 
    digitalWrite(IN4, LOW);  }
  else {
    digitalWrite(IN1, LOW);                 
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);                 
    digitalWrite(IN4, HIGH);   
  }
  if (abs(speed1) > 240){
    speed1 = 240;
  }
analogWrite(ENA, speed1);

Serial.print("Vitesse =");
Serial.print(speed1);
Serial.print("   IN1 =");
Serial.print(IN1);
Serial.print("   IN2 =");
Serial.println(IN2);

}

Désolé pour le dérangement mais c'est simplement mon ordre = "" qui était mal placé.
Le switch case ne voyait donc rien.

if(ordre!=""){
 			Serial.println(ordre);            
      ordre = "";

ordre est un int.
Donc le comparer à une chaîne de caractère (ou lui affecter une chaîne) n'a aucun sens.

Bonjour loco28

Oui, hc06.read() donne des int.
MAI t'envoie bien des chiffres, mais sous forme de code ASCII, 0 = 48, 1 = 49...
Si tu veux tester un 1 reçu de MAI, dans un case ou un if ou ... il faut écrire:

case 49:
ou
case '1':

Ta loop():

void loop()
{
	while(hc06.available()>0)
	{
		ordre = hc06.read();
	}
	if(ordre!=0)
	{
		Serial.println("Code SASCII = " + String(ordre));
		delay(100);

		switch(ordre){
			case '0':
				Serial.println("C'est un 0");
				break;
			case '1':
				Serial.println("C'est un 1");
				break;
			case '2':
				Serial.println("C'est un 2");
				break;
		}
		ordre = 0;
	}
}

Cordialement
jpbbricole

Merci, je n'avais pas pensé à cet aspect "code ASCII".
Je vais pouvoir avancer

Jean-Michel

Supprimer la valeur de la varaible avant de la comparer fera toujours que switch case (en tout cas ici) ne réagira pas correctement !

Sinon j'ai un peu refait ton code :

#include <SoftwareSerial.h>
SoftwareSerial hc06(2, 3);

#define ENA 10
#define IN1 9
#define IN2 8
#define IN3 7
#define IN4 6
#define ENB 5

char ordre ;
int SP1 = 0;
int SP2 = 0;

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

  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENB, OUTPUT);
}

void loop() {
  while (hc06.available() > 0) {
    ordre = hc06.read();
  }

  if (ordre != "") Serial.println(ordre);

  switch (ordre) {
    case '0':
      SP1 = 0;
      Serial.println(SP1);
      motor(SP1, SP2);
      break;
    case '1':
      SP1 = SP1 + 10;
      Serial.println(SP1);
      motor(SP1, SP2);
      break;
    case '2':
      SP1 = SP1 - 10;
      motor(SP1, SP2);
      break;
  }
}

void motor(int speed1, int speed2) {
  if (speed1 > 0) {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
  } else {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
  }
  if (abs(speed1) > 240) {
    speed1 = 240;
  }
  analogWrite(ENA, speed1);

  Serial.print("Vitesse : "); Serial.print(speed1);
  Serial.print("\tIN1 : ");   Serial.print(IN1);
  Serial.print("\tIN2 :");    Serial.println(IN2);

  /*Pour afficher sur plusieurs lignes
  Serial.print("Vitesse : "); Serial.println(speed1);
  Serial.print("IN1 : ");     Serial.println(IN1);
  Serial.print("IN2 : ");     Serial.println(IN2);
  */
}

Bonjour,

Merci pour ta réponse, cela m'a permis d'avancer.
Maintenant c'est ces moteurs "low cost" (jaune) qui me posent problème (ils ne démarrent qu'avec un rapport cyclique > 150) mais là , c'est un autre problème

Jean-Michel

Bonsoir loco28

Qu'as-tu comme interface de puissance et comme alimentation pour ton moteur?

Cordialement
jpbbricole

Désolé pour ma réponse tardive.
C'est des ensembles moteur + réducteur de couleur jaune que l'on trouve pour quelques euros (d'où sûrement le résultat).
Je voulais faire une variation continu de la vitesse, mais j'ai laissé tombé.
Je mais le PWM à 200 en marche tout droit et je réduit l'un des moteurs à 120 pour tourner à droite ou à gauche.
Ce n'est pas parfait mais je suis plutôt sur un démonstrateur pour tester des fonctions (la prochaine c'est de coupler avec le générateur d'ultrasons)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.