Controlar un servomotor con un pulsador (editado)

Hola Arduinos, no se casi nada de programación y estoy tratando de aprovechar las bondades del arduino para combinarlo con el mundo del ferromodelismo. Mi idea es controlar los desvíos con un servomotor. La idea es que al presionar un pulsador el motor vaya de A hacia B y al presionarlo nuevamente, vaya de B hacia A y así sucesivamente.

El código que he escrito, luego de muchas horas en foros y videos, es el siguiente:

#include <Servo.h>

Servo myservo;

int pos = 30;
int pinBoton = 2;
int anterior = 0;
int estado = 0;
int encender = 0;

void setup()
{
  myservo.attach(12);

  pinMode(pinBoton, INPUT);
}

void loop()
{
estado = digitalRead(pinBoton);


if(estado && anterior == 0)
{
  encender = 1 - encender;
  delay(50);
}
anterior = estado;

  if(encender)
  {
    for(pos = 30; pos <= 60; pos++)   
                                      
    myservo.write(pos);               
    delay(100);    
  }
    else
   {
    for(pos = 60; pos>=30; pos--)     
                                   
    myservo.write(pos);               
    delay(100);                       
}
}

El problema que tengo es que queda el motor "bailando", es decir, hay rebote y a pesar de buscar y buscar, no logro evitar esto. Las repito que no se casi nada de programación, así es que si me dan una mano les estaré eternamente agradecido.

Por favor AYUDA!!!!

Gracias desde ya.

Saludos

si comparas por HIGH es porque tienes una resistencia pull down. Es así. Tienes el pulsador conectado con una R de 10k a gnd y del otro lado esta conectado a +5V
En el punto en que se unen pulsador y R lo conectas a tu Pin 2.

Es correcto?
Si eso está bien, sigamos con tu programa.
Evidentemente tienes rebote, pero tu código

implementa este código que usa debounce

La diferencia esta en que arranca con un cambio 0 a 1 como en tu caso pero luego espera a confirmar el 1 50 mseg despues.
O sea sin rebotes.

Hola, gracias por la respuesta, como decía en el post, no se casi nada de programación y esperaba una respuesta mas concreta (se que es un abuso pero en el pedir no hay engaño). He revisado el código que me sugeriste y estoy haciendo el intento para que me funcione. Mas tarde comento como me ha ido.

Saludos y gracias nuevamente

bien, voy a ser mas concreto entonces.

  1. baja esta librería Bounce2 (github)

Esto hace la librería

Intervalo Estable

Por defecto la librería usa un intervalo estable para procesar los rebotes. Es simple de entender y puede cancelar el ruido no deseado.

  1. Usando esta librería asi queda tu programa.
#include <Bounce2.h>
#include <Servo.h>

Servo myservo;
// Inicializo el objeto Bounce
Bounce debouncer = Bounce(); 

const byte pinBoton = 2;

int pos;
int estado;
bool encender  = false;

void setup()
{
  myservo.attach(12);

  pinMode(pinBoton, INPUT);
  debouncer.attach(pinBoton);
  debouncer.interval(5); // interval in ms Si ves que no sirven 5 incrementa hasta 20 mseg
}

void loop() {

    // actualiza la instancia Bounce
  debouncer.update();

  // obtiene el valor actualizado
  int estado = debouncer.read();

  if(estado)   {
    encender = !encender;
  }


  if(encender) {

    for (pos = 30; pos <= 60; pos++)                         
        myservo.write(pos);               
        delay(100);    
    }
    else {
        for (pos = 60; pos>=30; pos--)     
            myservo.write(pos);               
        delay(100);                       
    }
  }
}