Me lio con el pulseln (SOLUCIONADO)

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 a todos

MIra el privado que te he enviado para que edites tu post inicial que no cumple con las normas del foro.

La duración corta y la duración larga tiene un tiempo previsto?
Puedes usar millis() para ir detectando una u otra

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?

Un saludo

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

  1. observar una pulsación
  2. 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é
#define TcortoMin 100
#define TcortoMax 250
#define TlargoMin 1000
#define TlargoMax 2000

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
}

bueno ahi tienes un empujoncito!!

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

tienes TcortoMin y TcortoMax para manejar cualquier tiempo.
Ajusta esos valores a 10 y 50 mseg y computas esa posibilidad.

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!");

}

Si terminaste con tu problema EDITA el título y agrega [SOLUCIONADO]