Varios if seguidos pero no anidados.

Hola: Antes de nada, es mi primer post ya que llevo poco tiempo iniciandome en el apasionante mundo de Arduino (no sé si tengo que presentarme en algún sitio, he estado mirando y no me ha parecido verlo, disculpas). Tened piedad de mi ignorancia! jaja.

Quiero controlar varios motores con varios pulsadores (un pulsador para cada motor) y quiero que se enciendan o apaguen independientemente de lo que estén haciendo los demás, pero de forma secuencial, no estoy hablando de hacer nada multitarea. En un principio pensé en usar varios if seguidos (no anidados) pero lee la primera condición y si se cumple vuelve a empezar el loop, con lo que todo lo que está por debajo no lo lee nunca.

...

void loop () {

if (boton1 ==HIGH){
digitalWrite(motor1, HIGH);
}

if (boton2 ==HIGH){
digitalWrite(motor2, HIGH);
}

...

¿Por qué no lee el primer if, si es verdadero, ejecuta la instrucción y continúa leyendo el segundo if, etc.? Cuando se encuentra con un bucle, si es verdadero, tras ejecutarlo ¿siempre vuelve al inicio del void loop?

He encontrado un post en el que abordaban este asunto con varios relés, y está el codigo de la solución pero casi no tiene comentarios y no consigo comprenderlo en profundidad. Además me parece bastante "largo" ¿no hay formas mas sencillas de solucionar estas situaciones?

http://forum.arduino.cc/index.php?topic=186648.0

No sé si algún alma caritativa me podría echar una mano con este código o con otro código con el mismo fin, o sugerirme bibliografia concreta (a poder ser en castellano por favor). No he incluido esta pregunta en el post que indico, porque me salta un mensaje de que es muy antiguo y que comience uno nuevo (eso he creido entender).

Muchísimas gracias y un saludo!

en el codigo del link usan if (si a es igual a 1, hacer esto) else (sino estado = 0) me explico, el if va con el else.

HeronDA, te recomiendo vayas a Documentación y leas los dos primeros hilos. Te serán de mucha utilidad para mejorar tus habilidades para programar.

Cuando tengas un problema como el que explicas, debes poner todo el código porque en tu caso, refieres a que los if no hacen lo que tu pretendes, pero no sabemos que dice el resto del código, si lees bien o no cada pulsador, etc. De paso, lee las normas del foro para aprender como se postean códigos, imágenes y enlaces.

Hola:

Gracias por los consejos y comentarios, los tendré en cuenta.

Pongo el código completo, pero vamos, que es un ejemplo. Lo que me importa es comprender como lee Arduino el programa y como actúa con los bucles if, while, etc. La cuestión es que yo quiero tener varios motores (o relés, o led...) cada uno que se active solo si se presiona un pulsador destinado para encender ese motor en concreto (o un sensor).

int pulsador1 = 2; // pulsador para activar el motor1
int pulsador2 = 3; //pulsador para activar el motor 2
int motor1 = 11;  // señal de salida de motor 1 encendido (HIGH) o apagado (LOW)
int motor2 = 13;  // señal de salida de motor 2 encendido (HIGH) o apagado (LOW)

void setup() {
  
  Serial.begin(9600);
  
  pinMode(motor1, OUTPUT); 
  pinMode(motor2, OUTPUT);
  pinMode(pulsador1, INPUT);
  pinMode(pulsador2, INPUT);

void loop(){

if (pulsador1 == HIGH){           //  si está presionado el pulsador1, se enciende el motor 1
digitalWrite(motor1, HIGH);      
}
if (pulsador1 == LOW){             // si no está presionado el pulsador 1, el motor 1 está apagado
digitalWrite(motor1, LOW);
}
if (pulsador2 ==HIGH){             // igual pero con el pulsador 2
digitalWrite(motor2, HIGH);
}
if (pulsador2 == LOW){
digitalWrite(motor2, LOW);
}
}

La cuestión es que si yo tengo pulsado el pulsador 1, al llegar a la primera condición (el primer if), el programa activa el motor 1, y no sigue leyendo las condiciones de debajo, vuelve a empezar el void loop. ¿correcto? ¿sabéis como se resuelven este tipo de situaciones?

Muchas gracias a todos y saludos!

Primero tu loop esta mal, le falta lo mas importante que es leer el pin donde esta el pulsador. Lo corregí como para que puedas avanzar a partir de esta solución para dos pulsadores.

No olvides prestar atención a los detalles. el setup no tiene la llave que indica que esta terminado. Mira en lo que copias y pegaste entre

pinMode(pinBoton2, INPUT);

void loop(){

Esto para que prestes atención porque te daría errores al compilar.

Este es el código que sugiero para que sigas.

const byte pinBoton1  = 2; // pulsador para activar el motor1
const byte pinBoton2  = 3; //pulsador para activar el motor 2
const byte motor1     = 11;  // señal de salida de motor 1 encendido (HIGH) o apagado (LOW)
const byte motor2     = 13;  // señal de salida de motor 2 encendido (HIGH) o apagado (LOW)
bool estado1, estado2;

void setup() {
  
  Serial.begin(9600);
  
  pinMode(motor1, OUTPUT); 
  pinMode(motor2, OUTPUT);
  pinMode(pinBoton1, INPUT);
  pinMode(pinBoton2, INPUT);
}

void loop(){
  estado1 = digitalRead(pin1);

  if (estado1 == HIGH){           //  si está presionado el pinBoton1, se enciende el motor 1
     digitalWrite(motor1, HIGH);      
  }
  else {             // si no está presionado el pulsador 1, el motor 1 está apagado
      digitalWrite(motor1, LOW);
  }
  
  estado2 = digitalRead(pin2);
  if (estado2 == HIGH){             // igual pero con el pulsador 2
      digitalWrite(motor2, HIGH);
  }
  else {
      digitalWrite(motor2, LOW);
  }
}

Este es un código simple. Puede que los botones reboten y requerirá de mas trabajo.

Y una pequeña sugerencia de optimización del código:

Si no necesitas de la comunicación serial (por ejemplo, para ver el valor de las variables en tiempo de ejecución), elimina o comenta esta línea:

Serial.begin(9600);

Puedes simplemente comentar esta línea; ya que posiblemente, a futuro y por alguna razón, querrás depurar tu código utilizando esta función del Arduino.

Muchisimas gracias por las respuestas y disculpad los errores, no tenía el código en el ordenador y lo escribí de memoria...

Entiendo que la variable que se usa para definir el estado de cada pulsador (estado1 y estado2) podrían ser de otro tipo distinto de bool, verdad? o tiene algún tipo de ventaja aquí que sea así?

Y por qué no usar directamente las variables de la propia entrada de los pines de los pulsadores (pinBoton1 y pinBoton2) en el bucle if, sin usar estado1 y estado2?

HeronDA: Entiendo que la variable que se usa para definir el estado de cada pulsador (estado1 y estado2) podrían ser de otro tipo distinto de bool, verdad? o tiene algún tipo de ventaja aquí que sea así?

A estos los llamo yo "variables lógicas". Lo ideal es que ocupen solo un bit, porque solo almacena dos estados (true o false, HIGH o LOW, 1 o 0, etc.); pero para efectos de código y hacerlo más fácil de manipular, se utilizan variables que solo ocupen un byte (byte, char, boolean). Se puede usar int, aunque no sería lo más eficiente para almacenar solo dos valores posibles.

Y por qué no usar directamente las variables de la propia entrada de los pines de los pulsadores (pinBoton1 y pinBoton2) en el bucle if, sin usar estado1 y estado2?

Es posible y es más eficiente, pero para un verdadero principiante de la programación, puede que sea difícil de entender en un principio. Lo que dices se vería así:

if (digitalRead(pinBoton1) == HIGH)

ok Lucario448, genial. Gracias también a surbyte por supuesto, y el resto de gente que ha contestado.

Ahora estoy de viaje de vacaciones asiq no puedo probar el código :o , pero por suerte en pocos días se me acaban, jaja.

Saludos!