Hola:
Antes de nada quiero aclarar que soy totalmente nuevo en esto de arduino, de programacion nada de nada.
Todo lo que estoy aprendiendo es por tutoriales.
Mi intencion es hacer con un solo pulsador que haga lo siguiente:
-1 pulsacion corta + 1 pulsacion corta + 1 pulsacion larga (de X segundos) = Salida
-al cabo de X segundos desde la primera pulsacion resetea y deja todo como al principio.
Lo de las pulsaciones cortas mas o menos creo que lo tengo, pero despues ya no se como seguir. Por lo que lei lo mio seria usar pulseln ¿algun empujoncito?
Pongo el codigo:
int led = 13;
int boton = 2;
int contador = 0;
int estadoanterior = 0;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(boton, INPUT);
}
void loop()
{
int lectura = digitalRead(boton); // Verificar el valor del boton
if (lectura¡=estadoAnterior) // Si la lectura es diferente del estado anterior
{
if (lectura==HIGH) // Si la lectura es igual a encendido
{
}
contador++ // Se incrementa el contador
Serial.println(contador)
}
}
estadoAnterior==lectura; //el estado anterior toma el nuevo valor de la lectura
if (contador==2)
{
Y aqui a final entraria en escena el puseln, creo...
¿Voy bien?
Muchas gracias por responder, ya corregi el texto, lo siento.
La pulsacion corta no lleva tiempo, seria solo el flanco de subida o bajada del pulsador.
Mirare con millis a ver que tal.
¿viste algun defecto grave en el codigo que pegue?
Como defecto grave no veo a donde conduce ni como detectas pulsaciones cortas o largas.
Te pregunté como defines una pulsación corta y cómo una larga.
Yo definiría una pulsación corta como de algo entre 100 y 250 mseg y una larga digamos 1 a 2 seg
Asi que lo que debes hacer es
observar una pulsación
tomar el tiempo de su duración y clasificarla
Para ello se usa millis() que te da el tiempo en milisegundos como un cronómetro que se activa al energizar el Arduino.
tomas un valor parcial en un momento (cuando se presiona el pulsador) y tomas el momento final cuando se libera el pulsador.
Si esta entre 100 y 250 sera corto, si esta entre 1000 y 2000 será largo.
Llamaré
Ahora tienes los intervalos.
De tu código voy a extraer gran parte de lo que hiciste bien con algunas correcciones que verás al compararlas.
#define TcortoMin 100
#define TcortoMax 250
#define TlargoMin 1000
#define TlargoMax 2000
const byte led = 13;
const byte boton = 2;
int contador = 0;
bool lectura = false;
bool estadoanterior = false;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(boton, INPUT);
}
void loop() {
lectura = digitalRead(boton); // Verificar el valor del boton
if (lectura ¡=estadoAnterior) { // Si la lectura es diferente del estado anterior
if (lectura && !estadoAnterior) { // Si la lectura es igual a encendido
start = millis(); // arranco con flanco 0 a 1
}
if (!lectura && estadoAnterior) { // detengo la cuenta flanco 1 a 0
duracion = millis()-start;
if (duracion > TcortoMin && duracion < TcortoMax)
Serial.println("Pulsacion CORTA");
if (duracion > TlargoMin && duracion < TlargoMax)
Serial.println("Pulsacion LARGA");
}
}
estadoAnterior = lectura; //el estado anterior toma el nuevo valor de la lectura
}
surbyte:
Como defecto grave no veo a donde conduce ni como detectas pulsaciones cortas o largas.
Muchas gracias,
Las pulsaciones cortas no las detecto por tiempo, si no cuando detecta poscion HIGH.
Solo quiero tener en cuenta el tiempo de pulsacion el la tercera y ultima pulsacion.
Me quedo con el codigo que me pasaste e intento romperme un poquito la cabeza.
Muchas gracias, usare millis a ver que tal
un saludo
Hola.
Estuve dándole duro a esto.
Creo que jugando con los tiempos, tanto en las pulsaciones cortas como largas se podría hacer mucho más fácil, pero básicamente soy muy novato en esto y poco controlo.
Os recuerdo que lo que yo quería hacer era a través de un código de pulsaciones encender un led. Dos pulsaciones + una pulsación más larga = led encendido (todo esto dentro de un tiempo/si no se cumple en ese tiempo =reset)
Aquí os pego lo que hice
#define TlargoMin 1000
#define TlargoMax 3000
int led = 13;
int boton = 2;
int contador = 0;
int estadoAnterior = 0;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(boton, INPUT);
}
void loop()
{
int lectura = digitalRead(boton); // Verificar el valor del boton
if (lectura ¡=estadoAnterior) { // Si la lectura es diferente del estado anterior
if (lectura==HIGH) { // Si la lectura es igual a encendido
contador++ // Se incrementa el contador
Serial.println(contador)
}
}
estadoAnterior==lectura; //el estado anterior toma el nuevo valor de la lectura
if (contador==2) { //si el contador llega a 2 pulsaciones
if lectura i=estadoAnterior { //si la lectura es diferente del estado anterior
start = millis () //enciendo contador tiempo
if (!lectura && estadoAnterior) { //detengo contador en el
duracion = millis()-start; //paso de flanco de 1 a 0
if (duracion > TlargoMin && duracion < TlargoMax) //si la duración esta entre los valores establecidos
Serial.println("Pulsacion LARGA");
digitalWrite (led, HIGH); //encender led
delay (3000); //retardo de 3 segundos
digitalWrite (led, LOW); //apagamos el led
contador=0 //se resetea el contador
}
}
}
}
Fijisimo que algo está mal. Os pido un poco de compasión jiji.
Lo que que me queda por hacer, y no se, es que una vez pasado un tiempo desde que hacemos la primera pulsación ponga todo a cero (contador y millis)
Hola:
Al final lo consegui, pero con el pulsein
Dejo aqui el codigo por si alguien le vale.
Muchas gracias surbyte por tu ayuda, te lo agradezco.
unsigned long timeout1 = 3000;
unsigned long timeout2 = 3000;
unsigned long timeout3 = 5000;
unsigned long duracion = 0;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(boton, INPUT);
}
void loop() {
duracion = pulseIn(boton, HIGH, timeout1*1000 )/1000;
if (duracion){
Serial.print("Se ha pulsado durante ");
Serial.print(duracion );
Serial.println(" ms");
if (duracion > TcortoMin && duracion < TcortoMax) {
Serial.println("La duracion entra en margen 1");
delay (Tdelay);
duracion = pulseIn(boton, HIGH, timeout2*1000)/1000;
if (duracion){
Serial.print("Se ha pulsado por segunda vez durante ");
Serial.print(duracion );
Serial.println(" ms");
if (duracion > TcortoMin && duracion < TcortoMax) {
Serial.println("La duracion entra en margen 2");
delay (Tdelay);
duracion = pulseIn(boton, HIGH, timeout3*1000) /1000;
if (duracion){
Serial.print("Se ha pulsado por tercera vez durante ");
Serial.print(duracion );
Serial.println(" ms");
if (duracion > TlargoMin && duracion < TlargoMax){ //si la duración esta entre los valores establecidos
Serial.println("Pulsacion LARGA. Encendemos LED");
digitalWrite (led, HIGH); //encender led
delay (3000); //retardo de 3 segundos
digitalWrite (led, LOW); //apagamos el led
} else Serial.println("Duracion no valida. Salimos!");
}else Serial.println(" No se ha pulsado. Salimos!");
}else Serial.println("Duracion no valida. Salimos!");
}else Serial.println("Salimos");
}else Serial.println("Duracion no valida. Salimos!");
}//else Serial.println(" No se ha pulsado. Salimos!");
}