Nota
¡Hola, bienvenido a la Comunidad de Aficionados a Raspberry Pi, Arduino y ESP32 de SunFounder en Facebook! Profundiza en Raspberry Pi, Arduino y ESP32 con otros entusiastas.
¿Por qué unirse?
Soporte de expertos: Resuelve problemas posventa y desafíos técnicos con ayuda de nuestra comunidad y equipo.
Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.
Vistas previas exclusivas: Obtén acceso anticipado a anuncios de nuevos productos y avances.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
Promociones festivas y sorteos: Participa en sorteos y promociones de fiestas.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [aquí] y únete hoy!
5.3 Detección de Cambio de Estado¶
Cuando el botón controla otros dispositivos, no solo puede funcionar cuando se presiona, sino que también puede detenerse cuando se suelta. También es posible cambiar el estado de trabajo cada vez que se presiona el botón.
Para lograr este efecto, necesitas saber cómo alternar el estado de trabajo entre apagado y encendido cuando se presiona el botón, Es decir, «detección de cambio de estado».
En este proyecto, usaremos el botón para controlar el motor.
Componentes Necesarios
En este proyecto, necesitamos los siguientes componentes.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ELEMENTOS EN ESTE KIT |
ENLACE |
|---|---|---|
3 in 1 Starter Kit |
380+ |
También puedes comprarlos por separado en los enlaces a continuación.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
- |
|
- |
Esquemático
Cableado
Código
Nota
Abre el archivo
5.3.state_change_detection.inoen la ruta3in1-kit\basic_project\5.3.state_change_detection.O copia este código en Arduino IDE.
O carga el código a través del Editor Web de Arduino.
Después de cargar el código con éxito, presionas el botón y el motor girará; hasta que presiones el botón de nuevo, el motor se detendrá.
¿Cómo funciona?
Crea variables y define pines para el motor y el botón.
... int detectionState = 0; int buttonState = 0; int lastButtonState = 0;
detectionStatees una bandera cuyo valor cambia cada vez que se presiona el botón, por ejemplo, 0 esta vez, 1 la próxima, y así sucesivamente de forma alternativa.buttonStateylastButtonStatese utilizan para registrar el estado del botón en esta ocasión y la última vez, para comparar si el botón fue presionado o soltado.
Inicializa cada pin y establece la tasa de baudios del monitor serial.
void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); pinMode(B_1A, OUTPUT); pinMode(B_1B, OUTPUT); }
Primero lee el estado del botón, y si el botón está presionado, la variable
detectionStatecambiará su valor de 0 a 1 o de 1 a 0. CuandodetectionStatees 1, el motor se activará. Tiene el efecto de que esta vez se presiona el botón, el motor gira, la próxima vez que se presiona el botón, el motor se detiene, y así sucesivamente de forma alternativa.void loop() { // Toggle the detectionState each time the button is pressed buttonState = digitalRead(buttonPin); if (buttonState != lastButtonState) { if (buttonState == HIGH) { detectionState=(detectionState+1)%2; Serial.print("The detection state is: "); Serial.println(detectionState); } delay(50); } lastButtonState = buttonState; // According to the detectionState, start the motor if(detectionState==1){ digitalWrite(B_1A,HIGH); digitalWrite(B_1B,LOW); }else{ digitalWrite(B_1A,LOW); digitalWrite(B_1B,LOW); } }
El flujo de trabajo completo es el siguiente.
Lee el valor del botón.
buttonState = digitalRead(buttonPin);
Si
buttonStateylastButtonStateno son iguales, significa que el estado del botón ha cambiado, continúa con el siguiente juicio y almacena el estado del botón en este momento en la variablelastButtonState.delay(50)se utiliza para eliminar el jitter.
if (buttonState != lastButtonState) { ... delay(50); } lastButtonState = buttonState;
Cuando se presiona el botón, su valor es HIGH. Aquí, cuando se presiona el botón, se cambia el valor de la variable
detectionState, por ejemplo, de 0 a 1 después de una operación.
if (buttonState == HIGH) { detectionState=(detectionState+1)%2; Serial.print("The detection state is: "); Serial.println(detectionState); }
Cuando la variable
detectionStatees 1, deja que el motor gire, de lo contrario, detente.
if(detectionState==1){ digitalWrite(B_1A,HIGH); digitalWrite(B_1B,LOW); }else{ digitalWrite(B_1A,LOW); digitalWrite(B_1B,LOW); }