Help with line follower code (switch case).

Hello, I have some problems to make the code, I wanted to implement a “switch case” but I do not know how to do it, I previously did the code with “if” and “else if” but it was very ugly. If someone can help me I would appreciate it very much.

(I feel my lack of level at the time of writing code).

/*PRUEBA UNO PARA EL PROYECTO DE CLASE
ROBOT SEGUIDOR DE LINEA SIN VELOCIDAD
VARIABLE, SALIDA PWM*/

//--------------declarar motores.--------------

const int MupIz = //pin;
const int MupDer = //pin;

const int MdownIz = //pin;
const int MdownDer = //pin;

//salida PWM del controlador H, A es izquierda y B es derecha.
const int pinENA = //pin;
const int pinENB = //pin;

//--------------declarar sensores.--------------
//         IR5  IR4  IR3(0) IR2  IR1  (sensor mirandote)

const int IR5 = //pin;
const int IR4 = //pin;
const int Sensor0 = //pin;
const int IR2 = //pin;
const int IR1 = //pin;

int umbral = 520;
int vel1 = 90; //velocidad del motor inicial??
const int VelNula = 0; //velocidad 0
int VelR = 40; //provicional para la marcha atras.

//------------defino los estados de los sensores---------
int  IR5State;
int  IR4State;
int  Sensor0State;
int  IR2State;
int  IR1State;
//-------------------------------------------------
void setup(){
 
  pinMode (MupIz, OUTPUT);
  pinMode (MupDer, OUTPUT);
 
  pinMode (MdownIz, OUTPUT);
  pinMode (MupDer, OUTPUT);
 
  pinMode (pinENA, OUTPUT);
  pinMode (pinENB, OUTPUT);
 
  Serial.begin (9600);
 
  pinMode(IR5, INPUT);
  pinMode(IR4, INPUT);
  pinMode(Sensor0, INPUT);
  pinMode(IR2, INPUT);
  pinMode(IR1, INPUT);
 
 
}

  
    void hacia_delante(){
  
 MupIz(Vel1);
    MupDer(Vel1);
    
    MdownIz (VelNula);
    MdownDer (VelNula);
 
 analogWrite(pinENA, 255);
 analogWrite(pinENB, 255);
  }
 
 void giro_derecha(){
 
 MupIz(Vel1);
    MupDer(VelNula);
    
    MdownIz (VelR);
    MdownDer (VelNula);
 
 //prueba 2! freno motor izquiero y solo activo el derecho. 
 
 /*MupIz(VelNula);
    MupDer(Vel1;
    
    MdownIz (VelNula);
    MdownDer (VelNula);*/
 }
 
 void giro_izquierda(){
 
 MupIz(VelNula);
    MupDer(Vel1);
    
    MdownIz (VelR);
    MdownDer (VelNula);
 
 //prueba 2! freno motor izquiero y solo activo el derecho. 
 
 /*MupIz(Vel1);
    MupDer(VelNula);
    
    MdownIz (VelNula);
    MdownDer (VelNula);*/
 }
 
 void loop(){
 
  //--------------------------------Prueba funcionamiento de los sensores.--------------------------------
  //Leo el estado de los sensores.
 
  IR5State = digitalRead(IR5);
  IR4State = digitalRead(IR4);
  Sensor0State = digitalRead(Sensor0);
  IR2State = digitalRead(IR2);
  IR1State = digitalRead(IR1);
 
  //muestro si detectan la linea negra o no.
 
  if(IR5State==HIGH){Serial.print("||black = IR5||"); Serial.print("");}
  else{Serial.print("||white = IR5||"); Serial.print("");}

  if(IR4State==HIGH){Serial.print("||black = IR4||"); Serial.print("");}
  else{Serial.print("||white = IR4||"); Serial.print("");}

  if(Sensor0State==HIGH){Serial.print("||black = IR3(0)||"); Serial.print("");}
  else{Serial.print("||white = IR3(0)||"); Serial.print("");}
 
  if(IR2State==HIGH){Serial.print("||black = IR2||"); Serial.print("");}
  else{Serial.print("||white = IR2||"); Serial.print("");}
 
  if(IR1State==HIGH){Serial.print("||black = IR1||"); Serial.print("");}
  else{Serial.print("||white = IR1||"); Serial.print("");}
 
  Serial.println("*********************************");
  delay(500);
  //---------------------------------------------------------------------------------------------------------
 
  //--------------------------------Funcionamiento del coche--------------------------------
  //         IR5  IR4  IR3(0) IR2  IR1  (sensor mirandote)
  //motor va en linea reca cuando los tres sensores del medio pasan por la linea negra.
  
  /*  if(IR5State<umbral && IR4State<umbral && Sensor0State>umbral && IR2State<umbral && IR1State<umbral){ //va recto.
    // 0   0 1 0 0
 hacia_delante();
    }
 
 
 
 
 }*/

There you go: switch...case - Arduino Reference :slight_smile:

Aka, what's the real problem? What did you try? What happened? etc

Sorry to explain myself wrong.

What I do not know exactly is how to make the “switch case”, for example, turn the robot to the left. Before with the “if” I did this:

else if(IR5State<umbral && IR4State>umbral && Sensor0State>umbral && IR2State<umbral && IR1State<umbral  || IR5State>umbral && IR4State>umbral && Sensor0State>umbral && IR2State<umbral && IR1State<umbral){ //gira a la izquierda*/

	//prueba! giro up motor izquierdo down derecho en plan giro horario pero con ditinta velocidad. 
	MupIz(VelNula);
    MupDer(Vel1);
    
    MdownIz (VelR);
    MdownDer (VelNula);
	
	//prueba 2! freno motor izquiero y solo activo el derecho. 
	
	/*MupIz(Vel1);
    MupDer(VelNula);
    
    MdownIz (VelNula);
    MdownDer (VelNula);*/

In doing this it worked, but it is not very good.

I wanted to implement a "switch case" but I do not know how to do it

switch/case works by testing the value of a single integer variable to determine which code block to execute.

Which variable do you want to use in the switch/case ? You seem to be testing 5 variables and you cannot do this with a single switch/case. You could do it with 5 switch/cases but what would be the advantage ?

If you bit-pack the individual readings, you will end up with a single value.
How you interpret that single value is the key to your problem

Okay, I tried something new, I think it should work, in default I'll put some kind of function for the robot to try to find a line.

Changes at line: 34-38, 129, 155-183.

const int MupIz = //pin;
const int MupDer = //pin;

const int MdownIz = //pin;
const int MdownDer = //pin;

//salida PWM del controlador H, A es izquierda y B es derecha.
const int pinENA = //pin;
const int pinENB = //pin;

//--------------declarar sensores.--------------
//         IR5  IR4  IR3(0) IR2  IR1  (sensor mirandote)

const int IR5 = //pin;
const int IR4 = //pin;
const int Sensor0 = //pin;
const int IR2 = //pin;
const int IR1 = //pin;

//----------------Otras variables------------------
int ValSensores; 
//int umbral = 520; pruebo otra cosa, esto es privcional 
int vel1 = 90; //velocidad del motor inicial??
const int VelNula = 0; //velocidad 0
int VelR = 40; //provicional para la marcha atras.

//------------defino los estados de los sensores---------
int  IR5State = 0;
int  IR4State = 0;
int  Sensor0State = 0;
int  IR2State = 0;
int  IR1State = 0;
//-------------------------------------------------
void setup(){
 
  pinMode (MupIz, OUTPUT);
  pinMode (MupDer, OUTPUT);
 
  pinMode (MdownIz, OUTPUT);
  pinMode (MupDer, OUTPUT);
 
  pinMode (pinENA, OUTPUT);
  pinMode (pinENB, OUTPUT);
 
  Serial.begin (9600);
 
  pinMode(IR5, INPUT);
  pinMode(IR4, INPUT);
  pinMode(Sensor0, INPUT);
  pinMode(IR2, INPUT);
  pinMode(IR1, INPUT);
 
 
}

  
    void hacia_delante(){
	  
	MupIz(Vel1);
    MupDer(Vel1);
    
    MdownIz (VelNula);
    MdownDer (VelNula);
	
	analogWrite(pinENA, 255);
	analogWrite(pinENB, 255);
  }
 
 void giro_derecha(){
	 
 	MupIz(Vel1);
    MupDer(VelNula);
    
    MdownIz (VelR);
    MdownDer (VelNula);
	
	//prueba 2! freno motor izquiero y solo activo el derecho. 
	
	/*MupIz(VelNula);
    MupDer(Vel1;
    
    MdownIz (VelNula);
    MdownDer (VelNula);*/
 }
 
 void giro_izquierda(){
	 
	MupIz(VelNula);
    MupDer(Vel1);
    
    MdownIz (VelR);
    MdownDer (VelNula);
	
	//prueba 2! freno motor izquiero y solo activo el derecho. 
	
	/*MupIz(Vel1);
    MupDer(VelNula);
    
    MdownIz (VelNula);
    MdownDer (VelNula);*/
 }
 
 void loop(){
	 
	 
  //Pongo en marcha los moteres:
  digitalWrite (MupDer, HIGH);
  digitalWrite (MupIz, HIGH);
  
  digitalWrite (MdownDer, LOW);
  digitalWrite (MdownIz, LOW);
	 
  //--------------------------------Prueba funcionamiento de los sensores.--------------------------------
  //Leo el estado de los sensores.
 
  IR5State = digitalRead(IR5);
  IR4State = digitalRead(IR4);
  Sensor0State = digitalRead(Sensor0);
  IR2State = digitalRead(IR2);
  IR1State = digitalRead(IR1);
  
  //Combinacion de los valores totales de los sensores para la comprobacion 
  ValSensores = (IR5State * 10000) + (IR4State * 1000) + (Sensor0State * 100) + (IR2State * 10) + (IR1State);
 
  //muestro si detectan la linea negra o no.
 
  if(IR5State==HIGH){Serial.print("||black = IR5||"); Serial.print("");}
  else{Serial.print("||white = IR5||"); Serial.print("");}

  if(IR4State==HIGH){Serial.print("||black = IR4||"); Serial.print("");}
  else{Serial.print("||white = IR4||"); Serial.print("");}

  if(Sensor0State==HIGH){Serial.print("||black = IR3(0)||"); Serial.print("");}
  else{Serial.print("||white = IR3(0)||"); Serial.print("");}
 
  if(IR2State==HIGH){Serial.print("||black = IR2||"); Serial.print("");}
  else{Serial.print("||white = IR2||"); Serial.print("");}
 
  if(IR1State==HIGH){Serial.print("||black = IR1||"); Serial.print("");}
  else{Serial.print("||white = IR1||"); Serial.print("");}
 
  Serial.println("*********************************");
  delay(500);
  //---------------------------------------------------------------------------------------------------------
	 
  //--------------------------------Funcionamiento del coche--------------------------------
  //         IR5  IR4  IR3(0) IR2  IR1  (sensor mirandote)
  
  switch (ValSensores){
	  
	  case 100:
	  hacia_delante;
	  break;
	  
	  case 1110:
	  hacia_delante;
	  break;
	  
	  case 110:  //giro izquierda
	  giro_izquierda; 
	  break;
	  
	  case 111: //giro más cerrado izquierda
	  giro_izquierda;
	  break;
	  
	  case 1100://giro derecha
	  giro_derecha;
	  break;
	  
	  case 11100://giro más cerrado izquierda
	  giro_derecha;
	  break;
	  
	  default:
	  
  }

 }
    hacia_delante;

Is this intended to call the hacia_delante;() function ?

Yes, Is not it correct?

No, you need these ()

This is very strange too:

  MupIz(Vel1);

The compiler should be telling you about that one though - I get numerous errors when I try it.

Yesterday I saw the problems I had, thanks to everyone for help.