Go Down

Topic: Encendido y apagado con pulsador y medicion de tiempo (Read 131 times) previous topic - next topic

davidcr85

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.

Code: [Select]

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);
   
      }     

robertoxyz20

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"

Code: [Select]
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.


davidcr85

#2
Dec 09, 2019, 07:48 am Last Edit: Dec 09, 2019, 12:02 pm by surbyte Reason: No repitas lo que se lee arriba.
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

davidcr85

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.

Code: [Select]


/*
 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 *************
 // *********************************************************
    }

Go Up