Buenos días a todos. Necesito su ayuda o al menos una orientacion sobre como terminar este proyecto.
Estoy creando: Un control de escobillas para vehículo.
Funcionamiento: Con un pulsador (palanca) al presionarse (1) una vez la funcion intermitente se pone en marcha esto es un ciclo que corre de esta forma: Cada 4 segundos el LED 13 enciende por un periodo de 1.5 segundos. Al presionar nuevamente el pulsador la función intermitente se detiene. (ESTA PARTE YA FUNCIONA)
Necesito ayuda para: Se requiere que desde el momento en que el pulsador es accionado el LED13 se encienda, si el pulsador se mantiene apretado por un periodo indefinido (mayor a 4 segundos) al desconectarse el LED13 se apaga, acaba su función. Si el pulsador es accionado y liberado en un tiempo menor a 4 segundos corre la función arriba descrita (con (1)vez el intermitente se activa a la (2)da vez el intermitente se apaga.
Espero que se entienda lo que quiero hacer y alguien me pueda hechar un cable sobre como lograrlo. Dejo mi codigo como lo tengo.
int pbuttonPin = 2;// connect output to push button
int relayPin = 13;// Connected to relay (LED)
int val = 0; // push value from pin 2
int lightON = 0;//light status
int pushed = 0;//push status
int start =0;
const long interval = 4000;
unsigned long previousMillis = 0; // will store last time LED was updated
void setup() {
// Robojax.com code and video tutorial for push button ON and OFF
// Serial.begin(9600);
pinMode(pbuttonPin, INPUT_PULLUP);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, LOW);// keep the load OFF at the begining. If you wanted to be ON, change the HIGH to LOW
}
void wipers() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
digitalWrite(relayPin, HIGH);
if (currentMillis - previousMillis >= 5500) {
digitalWrite(relayPin, LOW);
previousMillis = currentMillis;
}
}
}
void loop() {
// Robojax.com code and video tutorial for push button ON and OFF
val = digitalRead(pbuttonPin);// read the push button value
if(val == HIGH && lightON == LOW){
previousMillis = millis() - interval; // Permite que el LED encienda y se haga el conteo desde el momento en que el PULSADOR es accionado.
pushed = 1-pushed;
delay(100);
}
lightON = val;
if(pushed == HIGH){
// Serial.println("Light OFF");
digitalWrite(relayPin, LOW);
}else{
wipers();
}
delay(80);
}
Hola, davidcr85.
Te recomiendo usar alguna librería para debouncing (anti rebote), yo traté de hacer algo como lo que planteas por mi cuenta y perdí mucho tiempo.
La librería DebounceEvent.h de Xose Pérez te da número de "re clics", tiempo de pulsado de un solo clic y otras cosas más.
Mira esta parte del ejemplo "debounceevent_basic"
Serial.print("Count : "); Serial.print(button->getEventCount());
Serial.print(" Length: "); Serial.print(button->getEventLength());
Con un solo botón se pueden hacer varias cosas a la vez.
Excelente ! Muchas gracias por la recomendación de la libreria ya la instale y estoy probando los ejemplos realmente es un aporte genial muy útil ya que usando solo millis() se vuelve un tanto complejo el manejo de los tiempos y los estados.
Moderador:
No repitas lo que se lee arriba
Para darle continuidad a mi propio hilo diré que usar librerias para el uso de pulsadores, tiempos de espera, doble pulsacion rapida etc supone una ventaja enorme. Gracias a la libreria EasyButton de Evert Arias solo me tomó unas 2 horas comprender todo el funcionamiento y completar mi proyecto. Dejo mi codigo por si alguien lo encuentra útil.
/*
Name: escobillas.ino
Created: 9/12/2019 02:43:52 AM
Author: David Barquero C | davidbomberoscr@gmail.com
Description: Control mejorado de escobillas para Chevrolet Nova 88 | Agrega funcion intermitentes usando el mando de existente.
Library: EasyButton https://github.com/evert-arias/EasyButton
*/
#include <EasyButton.h>
// Arduino pin where the button is connected to.
#define BUTTON_PIN 2
const int relayPin = 13;// the number of the LED pin
const long interval = 4000;
unsigned long previousMillis = 0;
bool low_wipers = 0;
boolean intermitente = false;
// Instance of the button.
EasyButton button(BUTTON_PIN);
// Callback function to be called when the button is pressed.
void onPressedForDuration() {
// FUNCION ACCIONAMIENTO DE PALANCA VELOCIDAD BAJA CONTINUA
Serial.println("Button has been pressed for 1.5 seconds");
low_wipers=1;
}
void onPressed() {
Serial.println("Button has been pressed!");
// ***** FUNCION INTERMITENTES *************
previousMillis = millis() - interval; // Permite que el LED encienda y se haga el conteo desde el momento en que el SWITCH es presionado.
intermitente = !intermitente;
// *****************************************
}
void setup() {
// Initialize Serial for debuging purposes.
Serial.begin(9600);
pinMode(relayPin, OUTPUT);
// Initialize the button.
button.begin();
// Add the callback function to be called when the button is pressed for at least the given time.
button.onPressedFor(1500, onPressedForDuration);
button.onPressed(onPressed);
}
void loop() {
// Continuously read the status of the button.
button.read();
//*********************************************************
// FUNCION ACCIONAMIENTO DE PALANCA VELOCIDAD BAJA CONTINUA
// ********************************************************
if(low_wipers==1) {
intermitente=false;
bool released = button.isReleased();
if(released==0) {
digitalWrite(relayPin, HIGH);
delay(100);
}else {
digitalWrite(relayPin, LOW);
low_wipers=0;
}
}
// ************************************************************
// ***** FIN ACCIONAMIENTO VELOCIDAD BAJA CONTINUA ***********
// ************************************************************
// ************************************************************
// ********* FUNCION INTERMITENTES *************************
if(intermitente==true) {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
digitalWrite(relayPin, HIGH);
if (currentMillis - previousMillis >= 5500) {
digitalWrite(relayPin, LOW);
previousMillis = currentMillis;
}
}
} else {
digitalWrite(relayPin, LOW);
}
// *********************************************************
// ****** FIN DE LA FUNCION CICLO INTERMITENTE *************
// *********************************************************
}