Código no funciona, servo 3 botones SOLUCIONADO

Hola a todo el grupo, soy novato con en el manejo de arduino y copie el código de la web para hacer funcionar un servo con dos botones de izquierda a derecha que funciona perfecto, inicialmente comienza en 90°, pero al incorporarle otro botón para que desde la posición donde se encuentre vuelva a la posición inicial y no vuelve. Ya probé de todas las formas lógicas con el código y no eh tenido suerte. Le agradezco si alguien puede darme una mano con esto. Les dejo el código y el esquemático.

#include <Servo.h> 

Servo myservo;

//Definición de variables
int pos=90;
int adelante=0;
int atras=0;
int medio=0;

void setup() {

  Serial.begin(9600);
  myservo.attach(9);

  // Inicializa pin
  pinMode(3, INPUT);
  pinMode(5, INPUT);
  pinMode(4, INPUT);
}

void loop() {
  // Lee entrada de pulsación de los botones
  adelante = digitalRead(5);
  atras = digitalRead(3);
  medio = digitalRead(4);
  
  if (adelante == 1){
     pos = pos+1;
     if (pos>=180){
         pos=180;
    }  
  }

  if (atras == 1){
    pos=pos-1;
    if (pos<=0){
       pos=0;
    }   
  }
  
  if (medio == 1) 
    
    if ((pos > 0) || (pos < 89) || (pos > 91) || (pos < 180));
  {
    myservo.write(90);
       
  }
  myservo.write(pos);
    delay(15);
}

Hola. Si pones “myservo.write(90);” para el botón central sin usar la variable “pos” entonces el código sería así

if (medio == 1) { pos = 90; }

Lo que al pulsar el botón lleva al servo a 90° sin importar en que grado anterior esté.

En cambio, si lo que quieres hacer es ir paso a paso por los distintos grados entonces el código sería así:

#include <Servo.h>
Servo myservo;

//Definición de variables
int pos=90;
int adelante=0;
int atras=0;
int medio=0;

void setup() {

  Serial.begin(9600);
  myservo.attach(9);

  // Inicializa pin
  pinMode(3, INPUT);
  pinMode(5, INPUT);
  pinMode(4, INPUT);
}

void loop() {
  // Lee entrada de pulsación de los botones
  adelante = digitalRead(5);
  atras = digitalRead(3);
  medio = digitalRead(4);
 
  if (adelante == 1){
     pos++;
     if (pos>=180){pos=180;} 
  }

  if (atras == 1){
    pos--;
    if (pos<=0){pos=0;}   
  }

  if (medio == 1) {  //   Si el botón esta pulsado
    if (pos <90)  { // Si "pos" es menor a 90 
      pos++;
    }
    if (pos > 90)  {  // si "pos" es mayor a 90
     pos--;
    }
 }
 

  myservo.write(pos);
  delay(15);
}

Tu me dirás si el código funciona bien, pues yo no he probado, lo hice en este mismo editor del foro.
Saludos

Probé con los dos diferentes códigos por separados y directamente se queda en 90°, así se presione cualquiera de los botones. En varias de las pruebas que hice me sucedió lo mismo.

CrisZandorin:
Probé con los dos diferentes códigos por separados y directamente se queda en 90°, así se presione cualquiera de los botones. En varias de las pruebas que hice me sucedió lo mismo.

Claramente tienes los botones alimentados con +5 v y se ponen a masa o sea 0v LOW cuando los oprimes.

Tienes que cambiar las tres condiciones "if (xxx == 1)" por "if (xxx == LOW){".

Gracias Daniel por el aporte, los botones están bien, actuan como corresponden cuando presionas adelante o atrás, pero cuando le ordeno al botón centrar hacer algo se descompagina todo, jaja, lo que quisiera escribir para el botón medio que al presionarlo, es si la variable "pos" está entre 0 o 180° se vuelva el servo a 90°, pero ya probé con varias sentencias o me queda en 90 o se mueve y al presionar el botón medio acusa un leve movimiento y se vuelve a los grados en el que estaba. También nombre otro entero con el nombre medio y nada. Sigo probando, prueba y error. jaja desde ya te agradezco

Acabo de probarlo y hace lo que tu querías
Como no tengo resistecias a mano para poner en el protoboard puse las
entradas a PULLUP y uso cable entre mas y los pines 3 4 y 5.

Entiendo que el botón funciones pero si lo lees sin oprimir el resultado es 1 o HIGH.
Si tienes tres condiciones es == 1, entonces se cumplen las tres condiciones.

Al iniciar pos esta en 90, luego con la primer condición pos pasa a 91.
Con la segunda condición que también se cumplía sin oprimir el botón pos pasa otra vez a 90.
En la tercera condición y a pesar que se cumple el 1 con el botón sin oprimir, pos esta en 90, ni es mayo ni es menor, por lo cual retorna al comienzo.

Lo que debes hacer en lugar de copiar y pegar es tratar de entender que hace cada cosa.

En youtube hay varios canales que dan clases de una forma ordenada y bien explicado.

#include <Servo.h>
Servo myservo;

//Definición de variables
int pos=90;
int adelante=0;
int atras=0;
int medio=0;

void setup() {

 Serial.begin(9600);
 myservo.attach(9);

 // Inicializa pin
 pinMode(3, INPUT_PULLUP);
 pinMode(5, INPUT_PULLUP);
 pinMode(4, INPUT_PULLUP);
}

void loop() {
 // Lee entrada de pulsación de los botones
 adelante = digitalRead(5);
 atras = digitalRead(3);
 medio = digitalRead(4);

 if (adelante == LOW){
    pos++;
    if (pos>=180){pos=180;}
 }

 if (atras == LOW){
   pos--;
   if (pos<=0){pos=0;}  
 }

 if (medio == LOW) {  //   Si el botón esta pulsado
   if (pos <90)  { // Si "pos" es menor a 90
     pos++;
   }
   if (pos > 90)  {  // si "pos" es mayor a 90
    pos--;
   }
}
 myservo.write(pos);
 delay(5);
}

Muchísimas gracias Daniel por tu tiempo y explicación, lo probé y funciona perfecto. Gracias. Me recomendarías algún canal o web para ver. Saludos.

CrisZandorin:
Me recomendarías algún canal o web para ver. Saludos.

Este canal es muy bueno, explica bien y pausado y te da los ejercicios.

Daniel_Arg:
Este canal es muy bueno, explica bien y pausado y te da los ejercicios.

Gracias!!!