Uno de los ejemplos más comunes al aprender a programar con Arduino es la administración de un botón pulsador. De hecho, una de las funciones más útiles para desarrollar es poder interactuar con la placa Arduino. La interfaz más minimalista es la entrada de un botón y la salida del monitor en serie. Además, la funcionalidad que se puede desarrollar en un botón se puede aplicar a muchos sensores (interruptor, sensor magnético, RFID, etc.). Veremos aquí algunas de estas características.
Hardware
- Computadora
- Arduino UNO
- Cable USB para conectar el Arduino a la computadora
- Pulsador
Diagrama de conexión
Hay diferentes formas de conectar un botón a la placa Arduino. La forma más fácil es conectarlo entre tierra y una entrada analógica en el Arduino. Para que el botón se detecte correctamente, agregaremos una resistencia pullup disponible por el código. Por lo tanto, el estado será alto (1024) cuando se suelte el botón (0) y bajo cuando se presione el botón.
Codigo basico
En este ejemplo, detectaremos si el botón está presionado o no.
//Parameters const int btnPin = A0; //Variables int btnVal = 0; void setup(){ //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init btn pinMode(btnPin,INPUT_PULLUP); } void loop() { ////Read pushbutton btnVal=analogRead(btnPin); Serial.print(btnVal); Serial.print(F("-->")); if(btnVal<200){ Serial.println(F("Button is pressed")); }else{ Serial.println(F("Button is released")); } delay(100); }
El código leerá constantemente la entrada analógica y escribirá «botón presionado» o «liberado» que no es muy limpio o fácil de depurar.
Código de detección del estado del botón
Una forma de mejorar este código es agregar una variable que registre el estado del botón. Esto permite que el resultado se muestre solo una vez cuando el botón ha cambiado de estado.
//Parameters const int btnPin = A0; //Variables int btnVal = 0; bool btnState = false; bool oldbtnState = false; void setup(){ //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init btn pinMode(btnPin,INPUT_PULLUP); } void loop(){ testPushBtn(); } void testPushBtn( ){/* function testPushBtn */ ////Read pushbutton btnVal=analogRead(btnPin); if(btnVal<200){ btnState=true; if(oldbtnState!=btnState) Serial.print(btnVal);Serial.print(F("-->"));Serial.println(F("Button was pressed")); }else{ btnState=false; if(oldbtnState!=btnState) Serial.print(btnVal);Serial.print(F("-->"));Serial.println(F("Button was released")); } oldbtnState=btnState; }
Código para transformar un botón en un interruptor
Una vez que el estado del botón está en la memoria, es fácil transformar el botón en un interruptor. En este ejemplo, el LED se ilumina cuando se presiona el botón y se apaga cuando se presiona nuevamente el botón.
//Parameters const int btnPin = A0; const int ledPin = 13; //Variables int btnVal = 0; bool btnState = false; bool oldbtnState = false; bool ledState = LOW; void setup() { //Init Serial USB Serial.begin(9600); Serial.println(F("Initialize System")); //Init btn pinMode(btnPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { testPushBtn(); } void testPushBtn( ) { /* function testPushBtn */ ////Read pushbutton btnVal = analogRead(btnPin); if (btnVal < 200) { btnState = true; } else { btnState = false; } if (oldbtnState != btnState) { if(btnState==true){ Serial.print(F("Button was pressed")); Serial.print(F("-->")); Serial.print(F("LED ")); ledState = !ledState; Serial.println(ledState); digitalWrite(ledPin, ledState); } } oldbtnState = btnState; }
Mezcle y modifique estos ejemplos para obtener la funcionalidad que desea. También es necesario en algunos casos agregar funciones de promedio deslizante o antirrebote.
Para una gestión más avanzada del pulsador, puede utilizar una interrupción para detectar su estado.
Aplicación
- Crea una interfaz minimalista para tu proyecto