Boton

Buenas noches, Por que no me funciona el botón con este código? Cuando inicio el programa, me da la posición inicial de los servos, pero presiono el botón y no me dan los movimientos. Como lo puedo programar de otra manera? Muchas gracias.

#include <Servo.h>               
 
Servo servo1;  
Servo servo2;
Servo servo3;

const int buttonPin = 2;
int buttonState = 0;

int pos1 = 0;
int pos2 = 180;
int pos3 = 90;

void setup() 
{ 
  servo1.attach(9);   
  servo2.attach(8);
  servo3.attach(7);
  
  
  
  pinMode(buttonPin, INPUT);  
  
  servo1.write(pos1);
  servo2.write(pos2);
  servo3.write(pos3);
  delay(10);

}
  
void loop() 
{
  int buttonState = digitalRead(buttonPin);
  
  if(buttonState == true) {
    servo1.write(180);
    servo2.write(0);
    servo3.write(0);
    delay(2000);
  }
  
}

a ver asi:

#include <Servo.h>               
 
Servo servo1;  
Servo servo2;
Servo servo3;

const byte buttonPin = 2;
bool buttonState = false;

byte pos1 = 0;
byte pos2 = 180;
byte pos3 = 90;

void setup() 
{ 
  servo1.attach(9);   
  servo2.attach(8);
  servo3.attach(7);
  
  
  
  pinMode(buttonPin, INPUT);  
  
  servo1.write(pos1);
  servo2.write(pos2);
  servo3.write(pos3);
  delay(10);

}
  
void loop() 
{
  buttonState = digitalRead(buttonPin);
  
  if(buttonState == true) {
    servo1.write(180);
    servo2.write(0);
    servo3.write(0);
    delay(2000);
  }
  
}

Nada, No me da así tampoco. Solamente me da el movimiento de la posición inicial.

Prueba con esto:

void loop() 
{
  buttonState = digitalRead(buttonPin);
  bool valorPin;

  if(buttonState == true) {
     valorPin = true;
}
    
  if(valorPin == true) {
    servo1.write(180);
    servo2.write(0);
    servo3.write(0);
    valorPin = false;
    delay(2000);
  }
  
}

Como esta cableado el pin 2 al botón?

el boton lo tengo conectado un pin al GND, Otro al 5v con una resistencia, Y otro al pin A2 del ANALOG IN

Entonces ahí estan los problemas: 1.- tienes conectado en pull-up y el codigo esta hecho para pull-down,
2.- conectaste en una entrada análoga y declaraste el pin 2 en lugar de A2.

Quita la resistencia y solo conecta una punta del botón a GND y la otra a la entrada del arduino y si puedes de preferencia usa otra que sea digital (puedes usar el pin 2 porque así lo tienes en el código)

En el pinMode cambia buttonPin(INPUT) por buttonPin(INPUT_PULLUP)

Jajaj y me quitas el remate @RIG.

Hago la pregunta precisa y se llevan el premio.. jaja

:slight_smile: Jajaja, nada de eso surbyte el credito es tuyo, ademas me falto decir que debe invertir los estados del boton

Muchachos muchas gracias, Ya resolví el problema. :smiley:

Que bueno! para eso es el foro.

Todos los creditos @Surbyte 2018
come frutas y verduras
(algo de humor :slight_smile: )

asi me quedo el codigo:

#include <Servo.h>               
 
Servo servo1;  
Servo servo2;
Servo servo3;

const int buttonPin = 2;
int buttonState = 0;

int pos1 = 0;
int pos2 = 180;
int pos3 = 90;

void setup() 
{ 
  servo1.attach(9);   
  servo2.attach(8);
  servo3.attach(7);
  
  
  
  pinMode(buttonPin, INPUT);  
  
  servo1.write(pos1);
  servo2.write(pos2);
  servo3.write(pos3);
  delay(10);

}
  
void loop() 
{
  int buttonState = digitalRead(buttonPin);
  
  if(buttonState == true) {
    
    servo1.write(180);
    delay(2000);
    servo2.write(0);
    delay(10);
    servo3.write(0);
    delay(10); 
     servo1.write(0);
     delay(2000);
     servo2.write(180);
     delay(2000);
     servo3.write(90);
     delay(2000);
   servo3.write(180);
     delay(10);
  }   
 
}

Otra cosa. Como puedo hacer para que vuelva a presionar el boton y haga otros movimientos? el servo 1 a 180 grados, el servo2 a 0 grados y el servo3 a 0 grados.

Y porque no lo dijiste en le primer post?
Te lo dejo a @RIG para que ahora se lleve el crédito.

Basicamente cuando presionas el boton, accionas un contador que irá hasta la cuenta máxima de funciones a realizar.
Cada presion un avance. Cuando sale deriva con el número que corresponda.

Ahora esta asi

void loop() 
{
  int buttonState = digitalRead(buttonPin);
  
  if(buttonState == true) {

Esto ultimo es una redundancia ya que if (buttonState) describe lo mismo.

Otro error típico de los profesores es este

  int buttonState;// MAL USO de memoria

El boton solo toma dos estados 1 o 0, true o false asi que una variable bool sobra, o sea un bit.

  bool buttonState;// BUEN USO de memoria

Para lo que pides defino dos variables o una mas. Una que llamaré buttonLastState o sea el estado anterior

// Antes de setup defino estas dos variables
bool buttonState, buttonLastState = false;
byte cont = 0;

void loop() 
{
   buttonState = digitalRead(buttonPin);
  
   if (buttonState && !buttonLastState) {
       cont++;
       if (cont > 4) 
            cont = 0;
   }
   buttonLastState = buttonState;
   switch(cont) {
        case 1: funcion0();
                   break;
        case 2: funcion1();
                   break;
        case 3: funcion2();
                   break;
        case 4: funcion3();
                   break;
   
   }
 
}  
  
void funcion0() {
    servo1.write(180);
    delay(2000);
    servo2.write(0);
    delay(10);
    servo3.write(0);
    delay(10); 
     servo1.write(0);
     delay(2000);
     servo2.write(180);
     delay(2000);
     servo3.write(90);
     delay(2000);
     servo3.write(180);
     delay(10);
}

// repite las demas funciones

Lo puse asi, y me da error.

11:1: error: expected initializer before 'buttonLastState'
In function 'void loop()':
37:4: error: 'buttonState' was not declared in this scope
39:24: error: 'buttonLastState' was not declared in this scope
44:4: error: 'buttonLastState' was not declared in this scope

La verdad no lo entiendo. Me ayudas porfa

Te dije donde ubicar las cosas, si corres eso que te di OBVIO que te dará error.
Lee bien por favor!!