Pages: [1] 2   Go Down
Author Topic: Pulsador Teensy ++ 2.0  (Read 1807 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 2
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola:

Hice un mini código siguiendo los ejemplos encontrado por aquí. Si pulso el botónenciende un Led, si lo dejo de pulsar el Led se apaga.

Code:
int val = 0;     // variable para leer estado del pulsador

void setup()
{
  pinMode(PIN_D0, OUTPUT);  // configuramos el LED como SALIDA
  pinMode(PIN_B0, INPUT);    // configuramos el pulsador como ENTRADA
}

void loop()
{
  val = digitalRead(PIN_B0);  // leemos el estado del pulsador
  if (val == HIGH)
  {         // verificamos si el valor es alto (HIGH)                         
    digitalWrite(PIN_D0, LOW);  // Apagamos el LED
  }
  else
  {
    digitalWrite(PIN_D0, HIGH); // Encendemos el LED
  }
}

Lo que quiero hacer es otra cosa, por ejemplo, quiero un pulsador, que al pulsarlo y luego soltar el pulsador, el Led quede encendido. Si vuelvo a pulsar y luego lo dejo de pulsar, el Led se apague.

¿Dónde modifico el código para conseguir este objetivo?

Un saludo.
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 328
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lo que debes hacer es incorporar el tiempo, es decir si pulso por un determinado tiempo, degamos un segundo
este se pone en on,  y si luego preciono de nuevo por el mismo tiempo este se apaga


Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola:

He sacado el código de lo que quiero.
Code:
int Pulsador = PIN_B0; // Pulsador conectado a GND o masa.
int Led = PIN_D0;      // Led.
int Estado = 0;        // Estado de la variable.
int Estado_Led = 0;    // Estado del led.
int Estado_Anterior = 1; // Inicia Teensy con valor 0, el Led encendido, 1, empieza Led apagado.

void setup()
{
  pinMode(Led, OUTPUT); // Salida para el Led pin 0 del Teensy ++ 2.0.
  pinMode(Pulsador, INPUT); // Entrada del pulsador.
}

void loop()
{
  Estado = digitalRead(Pulsador); // Lee el estado del botón.
 
  if ((Estado == HIGH) && (Estado_Anterior == LOW))
  {
    Estado_Led = 1 - Estado_Led;
    delay(20);
  }
 
  Estado_Anterior = Estado;
 
  if (Estado_Led == 1)
  {
   digitalWrite(Led, HIGH);
  }
  else
  {
  digitalWrite(Led, LOW);
  }
}

No me gusta mucho tanto lío de códigos, seguro que se puede simplificar mejor. Voy a investigar como hacerlo. Cuanto menos código mejor que mejor. También quiero simplificarlo ya que usaré la EEPROM para que se guarde los valores de los estados de los Leds y los recupere al encender Teensy ++ 2.0.
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mirate algo asi:

Code:
int Pulsador = PIN_B0; // Pulsador conectado a GND o masa.
int Led = PIN_D0;      // Led.
boolean Estado;        // Estado de la variable.
boolean Estado_Led = false;    // Estado del led.
boolean Estado_Anterior = false; //

void setup()
{
  pinMode(Led, OUTPUT); // Salida para el Led pin 0 del Teensy ++ 2.0.
  pinMode(Pulsador, INPUT); // Entrada del pulsador.
}

void loop()
{
  Estado = digitalRead(Pulsador); // Lee el estado del botón.
  if (Estado && !Estado_Anterior) // Pulsas por primera vez (paso de low a high)
  {
    Estado_Anterior=true;         // No enta en el if hasta q sueltes el pulsador
    Estado_Led=!Estado_Led;       // De encendido a apagado y viceversa
    digitalWrite(Led, Estado_Led);
  }
  if (!Estado && Estado_Anterior) // Pulsador soltado (paso de high a low)
  {Estado_Anterior=false;}        // Ya permitimos volver a encender o apagar
}

Por cierto, podrías explicarme las 2 primeras lineas que no entiendo que hacen.
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola:

Me funciona tu código y me parece más optimo. Gracias por tu tiempo. smiley-wink

Si te refieres a esta línea:
Code:
  if ((Estado == HIGH) && (Estado_Anterior == LOW))
  {
    Estado_Led = 1 - Estado_Led;
    delay(20);
  }

Es para que la variable vuelva a 0. el código fucniona como el tuyo, lo que no me gusta es como lo tenía sin optimizar.

Modifiqué algo el tuyo, que empezaba con el Led encendido y ahora empieza apagado como quiero, a parte de ponerle un antirrebotes.

Code:
int Pulsador = PIN_B0;            // Pulsador conectado a GND o masa.
int Led = PIN_D0;                 // Led.
boolean Estado;                   // Estado de la variable.
boolean Estado_Led = true;        // Estado del led. Par que inicie el LEd apagado.
boolean Estado_Anterior = false;  //

void setup()
{
  pinMode(Led, OUTPUT);           // Salida para el Led pin 0 del Teensy ++ 2.0.
  pinMode(Pulsador, INPUT);       // Entrada del pulsador.
}

void loop()
{
  Estado = digitalRead(Pulsador); // Lee el estado del botón.
  delay(20);                      // Antirebotes.
  if (Estado && !Estado_Anterior) // Pulsas por primera vez (paso de low a high).
  {
    Estado_Anterior=true;         // No enta en el if hasta q sueltes el pulsador
    Estado_Led=!Estado_Led;       // De encendido a apagado y viceversa
    digitalWrite(Led, Estado_Led);
  }
  if (!Estado && Estado_Anterior) // Pulsador soltado (paso de high a low)
  {Estado_Anterior=false;}        // Ya permitimos volver a encender o apagar
}

Otro mini reto.
No se si arduino será capaz de programarlo, me da la impresión que si.

Por ejemplo a pasos:
Tengo un Led a su salida en PIN_D0 y un ventilador cooler en su otra salida PIN_D1 y un botón como entrada PIN_B0. Lo que tiene que hacer es lo siguiente. Cuando pulse el botón PIN_B0, se activa el Led PIN_D0 y el ventilador PIN_D1. Eso es lo primero, ahora mira después del vídeo los pasos necesarios para poder hacer una cosa.
El ejemplo que puse en el vídeo no hace lo que quiero porque solo tenía la finalizadad en ese momento en ser capaz de encender y apagar un led y ventilador  cada uno con su pulsador.

Ver vídeo. (Este vídeo no tiene nada que ver con lo que haremos ahora, es solo para dar ideas).
Quote
1) El Led empieza apagado cuando encienes Arduino.
2) Pulso el botón PIN_B0 y se enciende el Led PIN_D0 y ventilador PIN_D1.
3) Si vuelvo a pulsar el botón PIN_B0, el Led PIN_D0 parapadea cada segundo y el ventilador PIN_D1 se detiene. (1 seg. en on y otro seg. en off),
4) Vuelvo a pulsar el botón PIN_B0, el Led PIN_D0 deja de parpadear y queda encendido en ventilador PIN_D1 fijamente.
5) Cada vez que pulso el botón PIN_B0, ocurre siempre lo indicado arriba exceptuando cuando lo dejas pulsado durante 3 seg.
6) Esté en el estado que esté el Led y ventilador encendido o apagado, si dejas pulsado el botón PIN_B0 durante 3 seg. Se apaga el Led y se detiene el ventilador. (Es como cancelar un programa).

¿Se entiende lo que quiero decir?
Puedes hacer preguntas.

El programa parece que es muy complejo y laaaarrrrrrrrrgo. smiley-wink
« Last Edit: November 28, 2013, 12:03:51 pm by Metaconta » Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Esta sin comprobar, pero te puede dar una idea

Code:
byte Pulsador  =PIN_B0; // Pulsador conectado a GND o masa.
byte Led       =PIN_D0; // Led.
byte Ventilador=PIN_D1; //

boolean Estado_Pulsador;
boolean Estado_Anterior = false;

boolean Led_Encendido=false;

byte Secuencia = 0;    // Para manejar la secuencia de salidas

unsigned long Parpadeo=1000;  // Tiempo de parpadeo de led
unsigned long T_Anterior=0;   // Auxiliar para controlar tiempo de parpadeo

unsigned long T_Apagar=3000;  // Tiempo a pulsar para apagar
unsigned long T_Pulsado=0;    // Auxiliar para controlar tiempo de boton pulsado

void setup()
{
  pinMode(Pulsador, INPUT);       
  pinMode(Led, OUTPUT);         
  pinMode(Ventilador, OUTPUT);
  digitalWrite(Led, LOW);
  digitalWrite(Ventilador, LOW);
}

void loop()
{
  Estado_Pulsador = digitalRead(Pulsador); // Lee el estado del botón.
  if (Estado_Pulsador && !Estado_Anterior) // paso de low a high
  {
    T_Pulsado=millis()+T_Apagar;           // Tiempo para apagar
    Estado_Anterior=true;                  // No enta en el if hasta q sueltes el pulsador
    Secuencia++;                           // Pasamos a siguiente secuencia
    if (Secuencia>3){Secuencia=1;}
  }
  if (!Estado_Pulsador && Estado_Anterior) // paso de high a low
  {
    Estado_Anterior=false;
    T_Pulsado=0;                           // al soltar pulsador ya no controlamos el tiempo
  }
  if (T_Pulsado>0 && Estado_Pulsador && millis()>T_Pulsado)  // Fin secuencia
  {
    digitalWrite(Led, LOW);
    digitalWrite(Ventilador, LOW);
    T_Pulsado=0;
    Secuencia=0;
    Led_Encendido=false;
    delay(2000);
  }
  switch (Secuencia)
  {
    case 1:  // Pulsamos por 1ª vez, encender todo
      digitalWrite(Led, HIGH);
      digitalWrite(Ventilador, HIGH);
      Led_Encendido=true;      // Para poder iniciar maniobra de parpadeo
      break;
    case 2:  // Pulsamos por 2ª vez, led parpadea y ventilador se detiene
      if (Led_Encendido && millis()>T_Anterior)    // Led encendido y finalizo tiempo de encendido
      {
        T_Anterior=millis() + Parpadeo;           // Tiempo a esperar para encender de nuevo
        Led_Encendido=false;
        digitalWrite(Led, LOW);
      }
      if (!Led_Encendido && millis()>T_Anterior)  // Led apagado y finalizo tiempo espera
      {
        T_Anterior=millis() + Parpadeo;           // Tiempo a esperar para apagar de nuevo
        Led_Encendido=true;
        digitalWrite(Led, HIGH);
      }
      digitalWrite(Ventilador, LOW);
      break;
    case 3:  // Pulsamos por 3ª vez, led deja parpadear (encendido o apagado?) y ventilador enciende
      //digitalWrite(Led, HIGH o LOW);
      digitalWrite(Ventilador, HIGH);
      break;
  }
}
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas:

Hace efectos no deseados. En resumen.
El programa se comporta:
1- Nada más activar Teensy ++ 2.0 se enciende por un seg. Led y ventilador.
2- Cuando pase ese segundo se apaga todo.
3- Al pulsar el botón, se enciende Led y ventilador durante 3 seg.
4- y más efectos no deseados.

El ideal sería así:
1) El pulsador lo pulsas una vez y al soltarlo (no dejar pulsador pulsado) como un botón normal, enciende el Led fijo y el ventilador.
2) Si vuelvo a pulsar el botón, se apaga el ventilador pero el Led hace un parpadeo siempre a 1 seg o 1000 ms.
3) Si vuelves a pulsar el botón, ocurre el paso 1).
4) Si vuelves a pulsar, sigue ahora el paso 2).
5) Así siempre.

Hasta aquí el código es este para que se entienda lo dicho arriba:
Code:
int Pulsador = PIN_B0;            // Pulsador conectado a GND o masa.
int Led = PIN_D0;                 // Led.
boolean Estado;                   // Estado de la variable.
boolean Estado_Led = true;        // Estado del led. Par que inicie el LEd apagado.
boolean Estado_Anterior = false;  //

void setup()
{
  pinMode(Led, OUTPUT);           // Salida para el Led pin 0 del Teensy ++ 2.0.
  pinMode(Pulsador, INPUT);       // Entrada del pulsador.
}

void loop()
{
  Estado = digitalRead(Pulsador); // Lee el estado del botón.
  delay(20);                      // Antirebotes.
  if (Estado && !Estado_Anterior) // Pulsas por primera vez (paso de low a high).
  {
    Estado_Anterior=true;         // No enta en el if hasta q sueltes el pulsador
    Estado_Led =! Estado_Led;     // De encendido a apagado y viceversa
    digitalWrite(Led, Estado_Led);
  }
  if (!Estado && Estado_Anterior) // Pulsador soltado (paso de high a low)
  {Estado_Anterior = false;}      // Ya permitimos volver a encender o apagar
}

La función nueva es:
Da igual el estado del Led y el ventilador si está apagado o encendido en este momento. En este momento se deja pulsado el botón durante 3 segundos y ahí es cuando todo se detiene, tanto el Led como el ventilador. Lo que se le conoce como cancelar el programa.

Espero haberme explicado bien. smiley-wink
Aún así sigo analizando el código a ver si encuentro ideas...

Gracias por tu tiempo, mi muy distinguido amigo. smiley
« Last Edit: November 28, 2013, 06:59:37 pm by Metaconta » Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
byte Pulsador  =PIN_B0; // Pines usados
byte Led       =PIN_D0;
byte Ventilador=PIN_D1; 

#define ON HIGH       
#define OF LOW

boolean Estado_Pulsador;
boolean Estado_Anterior = false;

boolean Led_Encendido=false;
boolean Ven_Encendido=false;

byte Secuencia = 0;            // Para manejar la secuencia de salidas

unsigned long Parpadeo=1000;  // Tiempo de parpadeo de led
unsigned long T_Anterior=0;   // Auxiliar para controlar tiempo de parpadeo

unsigned long T_Apagar=3000;  // Tiempo a pulsar para apagar
unsigned long T_Pulsado=0;    // Auxiliar para controlar tiempo de boton pulsado

void setup()
{
  pinMode(Pulsador, INPUT);       
  pinMode(Led, OUTPUT);         
  pinMode(Ventilador, OUTPUT);
  digitalWrite(Led, OF);
  digitalWrite(Ventilador, OF);
}

void loop()
{
  Estado_Pulsador = digitalRead(Pulsador); // Lee el estado del botón.
 
  if (Estado_Pulsador && !Estado_Anterior) // Pulsador pasa de low a high
  {
    T_Pulsado=millis()+T_Apagar;           // Para controlar el timpo que pasa pulsado
    Estado_Anterior=true;                  // No enta en el if hasta q pulsador pase de high a low
    Secuencia++;                           // Pasamos a siguiente secuencia
  }
 
  if (!Estado_Pulsador && Estado_Anterior) // Pulsador pasa de high a low
  {
    Estado_Anterior=false;                 // No enta en el if hasta q pulsador pase de low a high
    T_Pulsado=0;                           // Al soltar pulsador ya no controlamos el tiempo
  }
 
  if (T_Pulsado>0 && Estado_Pulsador && millis()>T_Pulsado) 
  {                                        // Hay tiempo cargado para controlar el fin y pulsador en high y ha transcurrido el tiempo del pulsador activo
    T_Pulsado=0;                           // Ya no controlamos timepo de pulsado
    Secuencia=0;                           // Secuencia 0, todo apagado
  } 
 
  if (Secuencia==0)                        // Todo apagado
  {
    Led_Encendido=false;
    Ven_Encendido=false;
    T_Anterior=0;                          // Para que pueda funcionar el parpadeo de nuevo
  }
  else if (Secuencia==1)                   // Pulsamos por 1ª vez, todo encendido
    {
      Led_Encendido=true;
      Ven_Encendido=true;
    }
    else if (Secuencia==2)                 // Pulsamos por 2ª vez, Apaga ventilador y led parpadea
      {
        Ven_Encendido=false;       
        if (millis()>T_Anterior)           // Tiempo parpadeo finalizado
        {
          T_Anterior=millis() + Parpadeo;// Tiempo a esperar para siguiente parpadeo
          Led_Encendido=!Led_Encendido;  // de encendido a apagado y viceversa
        }           
      }
      else {Secuencia=1; }   

  if (Led_Encendido) {digitalWrite(Led, ON);} else {digitalWrite(Led, OF);}
  if (Ven_Encendido) {digitalWrite(Ventilador, ON);} else {digitalWrite(Ventilador, OF);}   
}

 smiley
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas:

No funciona. Desde que pulse el botón, se queda el Led y ventilador encendido durante 3 seg. y después se apaga todo. Si lo pulso otra vez, ocurre lo mismo así siempre.

Tratar un botón así tiene su mundo. smiley-wink

Un saludo.
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

voy a montar el circuito para ver q pasa
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-evil

Lo he probado, y a mi me va perfectamente.

una cuestión, enciendes con low o con high?
Si enciendes con low cambia

#define ON HIGH       
#define OF LOW

por

#define OF HIGH       
#define ON LOW

y me dices.
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pues no, no funciona.

Ese ON se pone verde, si pongo OF que se ve negro a OFF, se ve verde como el ON. Tampoco tiene nada que ver. Ahora puse ON en ONN para que esté negro por si acaso.

Edito:
Me he dado cuenta el motivo. Digamos que pulso el botón al contrario como debería hacer, lo que hago es, Dejar el botón pulsado antes de encender Teensy, y lo dejo de pulsar para luego dejar pulsado, funciona de maravilla. Tampoco voy a estar con el dedo pegado todo el día. smiley-wink

Para hacer el efecto contrario hice lo que dijiste arriba el ON por el OF haber que pasa. Tiene comportamiento no deseado.

¿Cómo tienes conectado físicamente el botones de entrada?



El que tengo es la imagen de la izquierda, parece ser el que usas es el de la derecha. Lo del cambiar el ON a OF y al revés no funciona como quiero.

Poco a poco se ven los motivos. smiley-wink

Gracias de nuevo.
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yo el circuito lo monte  con pull down

El programa busca cambios de low a high, asi que actua al pulsar, no al soltar. Y no necesita mantener pulsado.

ON y OF son variable, no se van aponer verdes, las uso para activar los reles. Dependiendo del circuito de los reles, tienes que dejar sus valores asi o intercambiarlos, podrias indicarme como tienes el circuito que enciende el led y el ventilador?

Si encienden con high, estan bien, si encienden con low estan al reves.

Un saludo
Logged

Offline Offline
Full Member
***
Karma: 2
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Señor:

Me he pegado este tiempo averiguandopra no molestarte mucho, y muy agradecido que estoy porque estoy entendiendo arduino gracias a ti a y a muchos de aquí. smiley-wink

He cambiado lo que dices pero no me sale.

Code:
byte Pulsador  =PIN_B0; // Pines usados
byte Led       =PIN_D0;
byte Ventilador=PIN_D1; 

//#define ON HIGH       
//#define OF LOW

boolean Estado_Pulsador;
boolean Estado_Anterior = false;

boolean Led_Encendido=false;
boolean Ven_Encendido=false;

byte Secuencia = 0;            // Para manejar la secuencia de salidas

unsigned long Parpadeo=1000;  // Tiempo de parpadeo de led
unsigned long T_Anterior=0;   // Auxiliar para controlar tiempo de parpadeo

unsigned long T_Apagar=3000;  // Tiempo a pulsar para apagar
unsigned long T_Pulsado=0;    // Auxiliar para controlar tiempo de boton pulsado

void setup()
{
  pinMode(Pulsador, INPUT);       
  pinMode(Led, OUTPUT);         
  pinMode(Ventilador, OUTPUT);
  digitalWrite(Led, LOW);
  digitalWrite(Ventilador, LOW);
}

void loop()
{
  Estado_Pulsador = digitalRead(Pulsador); // Lee el estado del botón.
  delay(20);
  if (Estado_Pulsador && !Estado_Anterior) // Pulsador pasa de low a high
  {
    T_Pulsado=millis()+T_Apagar;           // Para controlar el timpo que pasa pulsado
    Estado_Anterior=true;                  // No enta en el if hasta q pulsador pase de high a low
    Secuencia++;                           // Pasamos a siguiente secuencia
  }
 
  if (!Estado_Pulsador && Estado_Anterior) // Pulsador pasa de high a low
  {
    Estado_Anterior=false;                 // No enta en el if hasta q pulsador pase de low a high
    T_Pulsado=0;                           // Al soltar pulsador ya no controlamos el tiempo
  }
 
  if (T_Pulsado>0 && Estado_Pulsador && millis()>T_Pulsado) 
  {                                        // Hay tiempo cargado para controlar el fin y pulsador en high y ha transcurrido el tiempo del pulsador activo
    T_Pulsado=0;                           // Ya no controlamos timepo de pulsado
    Secuencia=0;                           // Secuencia 0, todo apagado
  } 
 
  if (Secuencia==0)                        // Todo apagado
  {
    Led_Encendido=false;
    Ven_Encendido=false;
    T_Anterior=0;                          // Para que pueda funcionar el parpadeo de nuevo
  }
  else if (Secuencia==1)                   // Pulsamos por 1ª vez, todo encendido
    {
      Led_Encendido=true;
      Ven_Encendido=true;
    }
    else if (Secuencia==2)                 // Pulsamos por 2ª vez, Apaga ventilador y led parpadea
      {
        Ven_Encendido=false;       
        if (millis()>T_Anterior)           // Tiempo parpadeo finalizado
        {
          T_Anterior=millis() + Parpadeo;// Tiempo a esperar para siguiente parpadeo
          Led_Encendido=!Led_Encendido;  // de encendido a apagado y viceversa
        }           
      }
      else
    {
      Secuencia=1;
    }   

  if (Led_Encendido)
{
  digitalWrite(Led, HIGH);
}
  else
{
  digitalWrite(Led, LOW);
}
  if (Ven_Encendido)
  {
    digitalWrite(Ventilador, HIGH);
  }
    else
  {
    digitalWrite(Ventilador, LOW);
  }   
}

Algo pasa.
Logged

Vilalba, Lugo, Spain
Offline Offline
Sr. Member
****
Karma: 23
Posts: 336
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En este mundo señor es cualquiera  smiley-razz

No molestas en absoluto, si así fuera te lo haría saver  smiley

He montado el circuito por segunda vez, jeje

Este es el código que tengo cargado:
Code:
byte Pulsador  =23; // Pines usados
byte Led       =25;
byte Ventilador=27; 

#define ON HIGH       
#define OF LOW

boolean Estado_Pulsador;
boolean Estado_Anterior = false;

boolean Led_Encendido=false;
boolean Ven_Encendido=false;

byte Secuencia = 0;            // Para manejar la secuencia de salidas

unsigned long Parpadeo=1000;  // Tiempo de parpadeo de led
unsigned long T_Anterior=0;   // Auxiliar para controlar tiempo de parpadeo

unsigned long T_Apagar=3000;  // Tiempo a pulsar para apagar
unsigned long T_Pulsado=0;    // Auxiliar para controlar tiempo de boton pulsado

void setup()
{
  pinMode(Pulsador, INPUT);       
  pinMode(Led, OUTPUT);         
  pinMode(Ventilador, OUTPUT);
  digitalWrite(Led, OF);
  digitalWrite(Ventilador, OF);
}

void loop()
{
  Estado_Pulsador = digitalRead(Pulsador); // Lee el estado del botón.
 
  if (Estado_Pulsador && !Estado_Anterior) // Pulsador pasa de low a high
  {
    T_Pulsado=millis()+T_Apagar;           // Para controlar el timpo que pasa pulsado
    Estado_Anterior=true;                  // No enta en el if hasta q pulsador pase de high a low
    Secuencia++;                           // Pasamos a siguiente secuencia
  }
 
  if (!Estado_Pulsador && Estado_Anterior) // Pulsador pasa de high a low
  {
    Estado_Anterior=false;                 // No enta en el if hasta q pulsador pase de low a high
    T_Pulsado=0;                           // Al soltar pulsador ya no controlamos el tiempo
  }
 
  if (T_Pulsado>0 && Estado_Pulsador && millis()>T_Pulsado) 
  {                                        // Hay tiempo cargado para controlar el fin y pulsador en high y ha transcurrido el tiempo del pulsador activo
    T_Pulsado=0;                           // Ya no controlamos timepo de pulsado
    Secuencia=0;                           // Secuencia 0, todo apagado
  } 
 
  if (Secuencia==0)                        // Todo apagado
  {
    Led_Encendido=false;
    Ven_Encendido=false;
    T_Anterior=0;                          // Para que pueda funcionar el parpadeo de nuevo
  }
  else if (Secuencia==1)                   // Pulsamos por 1ª vez, todo encendido
    {
      Led_Encendido=true;
      Ven_Encendido=true;
    }
    else if (Secuencia==2)                 // Pulsamos por 2ª vez, Apaga ventilador y led parpadea
      {
        Ven_Encendido=false;       
        if (millis()>T_Anterior)           // Tiempo parpadeo finalizado
        {
          T_Anterior=millis() + Parpadeo;// Tiempo a esperar para siguiente parpadeo
          Led_Encendido=!Led_Encendido;  // de encendido a apagado y viceversa
        }           
      }
      else {Secuencia=1; }   

  if (Led_Encendido) {digitalWrite(Led, ON);} else {digitalWrite(Led, OF);}
  if (Ven_Encendido) {digitalWrite(Ventilador, ON);} else {digitalWrite(Ventilador, OF);}   
}

como podrás ver, solo cambian los identificadores de los pines, tengo el circuito conectado a un mega

https://www.dropbox.com/s/azg3luh3e6lsr3v/2013-12-03%2011.27.23.jpg

led rojo para el led y el amarillo para el ventilador, mira el circuito a ver si descubres algo. (no protestes por los colores de las conexiones, son los que hay jejeje)
Logged

Pages: [1] 2   Go Up
Jump to: