Problemas con if/else (Solucionado)

Tengo un problema, y haber si me lo podeis solucionar, estoy con un proyecto simple, en el que me base, en este ejercicio que me baje:

/*
--------------------------------------
Escritura serial
--------------------------------------
Consiste en escribir por la pantalla del computador (consola serial)
una letra predeterminada, la primera vez que se escriba está
un LED se enciende, si se vuelve a escribir por segunda vez
el LED se apaga.
Cosas de Mecatrónica y Tienda de Robótica
*/
//--------------------------------------------------
//Declara puertos de entradas y salidas y variables
//--------------------------------------------------
int led = 13; //Pin donde se encuentra el LED, salida
char leer; //Variable donde se almacena la letra
boolean prendido=false; //Estado LED la primera vez, apagado
//------------------------------------
//Funcion principal
//------------------------------------
void setup() // Se ejecuta cada vez que el Arduino se inicia
{
Serial.begin(9600); //Inicia comunicación serial
pinMode(led, OUTPUT); //Configurar el LED como una salida
}
//------------------------------------
//Funcion ciclicla
//------------------------------------
void loop() // Esta funcion se mantiene ejecutando
{ // cuando este energizado el Arduino
//Guardar en una variable el valor de la consola serial
leer=Serial.read();
// Si es la letra 'a' y además el LED está apagado
if ( (leer=='a') && (prendido==false) )
{
digitalWrite(led,HIGH); // Enciende el LED
prendido=true; // Actualiza el estado del LED
}
// Si es la letra 'a' y además el LED está encendido
else if ( (leer=='a') && (prendido==true) )
{
digitalWrite(led,LOW); // Apaga el LED
prendido=false; // Actualiza el estado del LED
}
}
//Fin programa

quise hacer lo mismo, solo que con 5 leds de colores diferentes

y el sketch es este:

int ledrojo = 2;
int ledamarillo = 3;
int ledverde = 4;
int ledazul = 5;
int ledblanco = 6;
char leerojo;
char leeramarillo;
char leerverde;
char leerazul;
char leerblanco;
boolean rojo=false;
boolean amarillo=false;
boolean verde=false;
boolean azul=false;
boolean blanco=false;

void setup() {
Serial.begin(9600);
pinMode(ledrojo, OUTPUT);
pinMode(ledamarillo, OUTPUT);
pinMode(ledverde, OUTPUT);
pinMode(ledazul, OUTPUT);
pinMode(ledblanco, OUTPUT);

}

 void loop(){
leerojo=Serial.read();
// Si es la letra 'a' y además el LED está apagado
if ( (leerojo=='r') && (rojo==false) )

digitalWrite(ledrojo,HIGH); // Enciende el LED
rojo=true; // Actualiza el estado del LED

// Si es la letra 'a' y además el LED está encendido
else if ( (leerojo=='r') && (rojo==true) )

digitalWrite(ledrojo,LOW); // Apaga el LED
rojo=false;

leeramarillo=Serial.read();
// Si es la letra 'a' y además el LED está apagado
if ( (leeramarillo=='a') && (amarillo==false) )

digitalWrite(ledamarillo,HIGH); // Enciende el LED
amarillo=true; // Actualiza el estado del LED

// Si es la letra 'a' y además el LED está encendido
else if ( (leeramarillo=='a') && (amarillo==true) )

digitalWrite(ledamarillo,LOW); // Apaga el LED
amarillo=false;

leerverde=Serial.read();
// Si es la letra 'a' y además el LED está apagado
if ( (leerverde=='v') && (verde==false) )

digitalWrite(ledverde,HIGH); // Enciende el LED
verde=true; // Actualiza el estado del LED

// Si es la letra 'a' y además el LED está encendido
else if ( (leerverde=='v') && (verde==true) )

digitalWrite(ledverde,LOW); // Apaga el LED
verde=false;

leerazul=Serial.read();
// Si es la letra 'a' y además el LED está apagado
if ( (leerazul=='z') && (azul==false) )

digitalWrite(ledazul,HIGH); // Enciende el LED
azul=true; // Actualiza el estado del LED

// Si es la letra 'a' y además el LED está encendido
else if ( (leerazul=='v') && (azul==true) )

digitalWrite(ledazul,LOW); // Apaga el LED
azul=false;

leerblanco=Serial.read();
// Si es la letra 'a' y además el LED está apagado
if ( (leerblanco=='v') && (blanco==false) )

digitalWrite(ledblanco,HIGH); // Enciende el LED
blanco=true; // Actualiza el estado del LED

// Si es la letra 'a' y además el LED está encendido
else if ( (leerblanco=='v') && (blanco==true) )

digitalWrite(ledblanco,LOW); // Apaga el LED
blanco=false;


}

me sale un error en los if y en los else que dice asi:

Arduino: 1.5.6-r2 (Windows 8), Placa:"Arduino Uno"

sketch_sep20.ino: In function 'void loop()':
sketch_sep20.ino:36: error: 'else' without a previous 'if'
sketch_sep20.ino:49: error: 'else' without a previous 'if'
sketch_sep20.ino:62: error: 'else' without a previous 'if'
sketch_sep20.ino:75: error: 'else' without a previous 'if'
sketch_sep20.ino:88: error: 'else' without a previous 'if'

Gracias por vuestro Tiempo

Saludos
Para este tipo de casos es mejor usar switch case

max_saeta:
Saludos
Para este tipo de casos es mejor usar switch case

como tendría que usarlo?

Se puede hacer con if else, pero hay varios errores en el código. Faltan corchetes de los if, sobran tantos parentesis en los if (no es un error, pero no son necesarios) y hay errores en las letras a usar por cada color. También hay un error, al leer el serial antes de cada if. El Serial debe leerse una sola vez en todo el ciclo, y solamente, si hay algo que leer. Una vez acabado el ciclo, hay que borrar la variable "leer" para que no se repita el ciclo sin poner ninguna letra por la consola serie.

Prueba este código corregido. Te recomiendo leerlo y compararlo detenidamente con el tuyo, para que entiendas el por qué de los cambios:

int ledrojo = 2;
int ledamarillo = 3;
int ledverde = 4;
int ledazul = 5;
int ledblanco = 6;
char leer;
boolean rojo = false;
boolean amarillo = false;
boolean verde = false;
boolean azul = false;
boolean blanco = false;

void setup() {
  Serial.begin(9600);
  pinMode(ledrojo, OUTPUT);
  pinMode(ledamarillo, OUTPUT);
  pinMode(ledverde, OUTPUT);
  pinMode(ledazul, OUTPUT);
  pinMode(ledblanco, OUTPUT);
}
void loop() {
  //Leemos el serial una sola vez para todo el ciclo y solo
  //si hay algo que leer
  if (Serial.available())
  leer = Serial.read();
  // Si es la letra 'r' y además el LED está apagado
  if (leer == 'r' && rojo == false) {
    digitalWrite(ledrojo, HIGH); // Enciende el LED
    rojo = true; // Actualiza el estado del LED
  }
  // Si es la letra 'r' y además el LED está encendido
  else if (leer == 'r' && rojo == true) {
    digitalWrite(ledrojo, LOW); // Apaga el LED
    rojo = false;
  }
  // Si es la letra 'a' y además el LED está apagado
  if (leer == 'a' && amarillo == false) {
    digitalWrite(ledamarillo, HIGH); // Enciende el LED
    amarillo = true; // Actualiza el estado del LED
  }
  // Si es la letra 'a' y además el LED está encendido
  else if (leer == 'a' && amarillo == true) {
    digitalWrite(ledamarillo, LOW); // Apaga el LED
    amarillo = false;
  }
  // Si es la letra 'v' y además el LED está apagado
  if (leer == 'v' && verde == false) {
    digitalWrite (ledverde, HIGH); // Enciende el LED
    verde = true; // Actualiza el estado del LED
  }
  // Si es la letra 'v' y además el LED está encendido
  else if (leer == 'v' && verde == true) {
    digitalWrite(ledverde, LOW); // Apaga el LED
    verde = false;
  }
  // Si es la letra 'z' y además el LED está apagado
  if (leer == 'z' && azul == false) {
    digitalWrite(ledazul, HIGH); // Enciende el LED
    azul = true; // Actualiza el estado del LED
  }
  // Si es la letra 'z' y además el LED está encendido
  else if (leer == 'z' && azul == true) {
    digitalWrite(ledazul, LOW); // Apaga el LED
    azul = false;
  }
  // Si es la letra 'b' y además el LED está apagado
  if (leer == 'b' && blanco == false) {
    digitalWrite(ledblanco, HIGH); // Enciende el LED
    blanco = true; // Actualiza el estado del LED
  }
  // Si es la letra 'b' y además el LED está encendido
  else if (leer == 'b' && blanco == true) {
    digitalWrite(ledblanco, LOW); // Apaga el LED
    blanco = false;
  }
  //borramos la variable leer
  leer=' ';
}

Saludos
De forma mas facil y sin tanto codigo

int ledrojo = 2;
int ledamarillo = 3;
int ledverde = 4;
int ledazul = 5;
int ledblanco = 6;

void setup() {
  Serial.begin(9600);
  pinMode(ledrojo, OUTPUT);
  pinMode(ledamarillo, OUTPUT);
  pinMode(ledverde, OUTPUT);
  pinMode(ledazul, OUTPUT);
  pinMode(ledblanco, OUTPUT);

}

void loop(){
  
  char comando = (char)Serial.read();
  
  switch (comando){
    case 'r':
      digitalWrite(ledrojo,!digitalRead(ledrojo));
    break;
    case 'a':
      digitalWrite(ledamarillo,!digitalRead(ledamarillo));
    break; 
    case 'v':
      digitalWrite(ledverde,!digitalRead(ledverde));
    break;        
    case 'z':
      digitalWrite(ledazul,!digitalRead(ledazul));
    break;     
    case 'b':
      digitalWrite(ledblanco,!digitalRead(ledblanco));
    break;         
  }
  
}

max_saeta, funciona perfecto tu código, aunque no entiendo la sintáxis de ciertas partes.

char comando = (char)Serial.read();;

no entiendo por qué está el (char) y el doble ; al final. Yo he probado con:

char comando = Serial.read();

y también funciona.

Tampoco entiendo la sintáxis de:

digitalWrite(ledrojo,!digitalRead(ledrojo));

¿Se explica en algún sitio en la parte de "Reference de la web de arduino?

Saludos

char comando = (char)Serial.read(); <--- El doble char es redundante, claro funciona sin el segundo, lo coloco para asegurarme la conversión a una letra dentro de ASCII.

digitalWrite(ledrojo,!digitalRead(ledrojo)); <--- Este tipo de codigo no lo he visto por allí, eso fue un día tratando de hacer un toggle como lo hacia con los PIC anteriormente que se me ocurrió hacerlo y funciona correctamente en Arduino.

max_saeta:
Saludos

char comando = (char)Serial.read(); <--- El doble char es redundante, claro funciona sin el segundo, lo coloco para asegurarme la conversión a una letra dentro de ASCII.

digitalWrite(ledrojo,!digitalRead(ledrojo)); <--- Este tipo de codigo no lo he visto por allí, eso fue un día tratando de hacer un toggle como lo hacia con los PIC anteriormente que se me ocurrió hacerlo y funciona correctamente en Arduino.

Muchas gracias. Realmente curioso lo del toggle...

Gracias, ya funciona!!!

aun así, me gustaría entender el código, porque pusiste esto?

digitalWrite(ledrojo,!digitalRead(ledrojo));

como tendría que poner para que me apareciese en el monitor serie led rojo encendido, led rojo apagado....

Saludos
Para eso tienes dos maneras, una añadiendo al codigo que te di esto:

  case 'E':   //Esto en el Switch que revisa los comandos seriales
    estado();
  break;


void estado(){  //y Esto como una funcion
  if(digitalRead(ledrojo)==HIGH){
    Serial.println("Led Rojo Apagado");
  }
  else{
    Serial.println("Led Rojo Encendido");
  }
  if(digitalRead(ledamarillo)==HIGH){
    Serial.println("Led Amarillo Apagado");
  }
  else{
    Serial.println("Led Amarillo Encendido");
  }  
  if(digitalRead(ledverde)==HIGH){
    Serial.println("Led Verde Apagado");
  }
  else{
    Serial.println("Led Verde Encendido");
  }  
  if(digitalRead(ledazul)==HIGH){
    Serial.println("Led Azul Apagado");
  }
  else{
    Serial.println("Led Azul Encendido");
  }  
  if(digitalRead(ledblanco)==HIGH){
    Serial.println("Led Blanco Apagado");
  }
  else{
    Serial.println("Led Blanco Encendido");
  }  
}

O puedes cambiar

      digitalWrite(ledrojo,!digitalRead(ledrojo));

Por

      if(digitalRead(ledrojo)==HIGH){
        digitalWrite(ledrojo,LOW);
        Serial.print("Led Rojo Apagado");
      }
     else{
        digitalWrite(ledrojo,HIGH);
        Serial.print("Led Rojo Encendido");
     }

gracias, el segundo me funciono

edit: Carmeloco, no te leí hasta ahora, lo siento creo que ya entendí el funcionamiento(creo :blush: ), gracias, el otro, no lo entendí muy bien :cold_sweat:

Muy buenas gente:

Soy muy novato así que disculpen la pregunta quizás tonta.
Empece a hacer los tutoriales y a aprender despacito este mundo de posibilidades que brinda Arduino y en un tutorial en el que enseñan el uso del "if" y del "else" daban un ejercicio bastante facil pero a mi por alguna razon me da error les copio el codigo:

int numero = 3;

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

if (numero == 2);
{
Serial.println("La variable numero es igual a 2");
} else {
Serial.println("La variable numero NO es igual a 2!!!");
}

}

void loop() {
// put your main code here, to run repeatedly:

}

al compilar me da un error que dice:

if_else:10: error: 'else' without a previous 'if'

} else {

^

exit status 1
'else' without a previous 'if'

no entiendo porque me pone que no esta el if si arriba esta.

Muchas Gracias desde ya por vuestra ayuda.

A tu if le sobra el punto y coma. Abre llaves inmediatamente, pues el punto y coma es una instrucción, aunque sea vacía.