Pulsador Teensy ++ 2.0

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:

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. :wink:
Aún así sigo analizando el código a ver si encuentro ideas...

Gracias por tu tiempo, mi muy distinguido amigo. :slight_smile:

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

:slight_smile:

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. :wink:

Un saludo.

voy a montar el circuito para ver q pasa

]:slight_smile:

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.

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. :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. :wink:

Gracias de nuevo.

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

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í. :wink:

He cambiado lo que dices pero no me sale.

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.

En este mundo señor es cualquiera :stuck_out_tongue:

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

He montado el circuito por segunda vez, jeje

Este es el código que tengo cargado:

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

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)

Se comporta igual.

Lo ideal sería montarlo con el pulsador Push-Up.

ok, lo estudio

Cambia:
...
void loop()
{
Estado_Pulsador = digitalRead(Pulsador); // Lee el estado del botón.
...

por :

...
void loop()
{
Estado_Pulsador = !digitalRead(Pulsador); // Lee el estado del botón.
...

:slight_smile:

¡¡¡Holaaaaaaaaaa!!!

Por fin me funciona, jajajajajjjaa. Pensaba que eran cosas de las variables cambiarla de false a true y era un ! (NOT).

Si que cuesta hacer varias funciones en el mismo botón.

Por cierto, esta parte del código.

unsigned long Parpadeo=1000;

¿El unsigned para que es?

Muchas gracias honorable amigo.

unsigned es una variable "sin signo", solo positivos.

El problema no estaba ni en el programa ni en el esquema, estaba en la incompatibilidad entre ellos, jajajaaj.

Tu tenias un pulsador con resistencia pull up, eso envia y mantiene un high hasta que pulses, yo buscaba flancos ascendentes, asi que namas encender, si no pulsabas antes de 3 segundos se apaga,

Gracias por la explicación.

Precisamente pasaba lo último que indicas.

Gracias de nuevo. Estás hecho un profesional.

Hola:

Me faltó una cosa más. Cuando apago Arduino, el estado del Led y ventilador, no se queda guardado en la EEPROM interna. Quiero que guarde el estado en la EEPROM después de pulsar el botón. Así cuando se apague el Arduino, al encenderlo, esté el estado que esté ventilador y Led, aunque sea Led parpadeando, recupera su estado actual tal como perdió la alimentación a la hora de recuperarla.

¿Es muy complejo hacerlo?

Un saludo.

No creo que sea muy complejo, pero es un terreno que no controlo, a ver si nos ilumina algún compañero, si no habrá que estudiarlo.

Buenas:

Aquí hay libreerías y ejemplos, voy a investigar y probar a ver que pasa.

1) Borrado de EEPROM.
2) Lectura de EEPROM.
3) Escritura de EEPROM.

Los ejemplos e arriba son como que se recorren toda el mapa de memoria, en mi caso quiero usar solo una zona de memoria en concreto. Esa es la cuestión.

Preguntanto por aquí en Inglés y usando http://translate.google.es para escapar.
EEPROM of use Teensy ++ 2.0. - Programming Questions - Arduino Forum

Seguiré investigando...

:roll_eyes:

#include <EEPROM.h>
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;
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
byte Secuencia=0;             // Para manejar la secuencia de salidas
byte Asecuencia = 0;          // Para guardar la secuencia en eeprom
void setup()
{
  pinMode(Pulsador, INPUT);       
  pinMode(Led, OUTPUT);         
  pinMode(Ventilador, OUTPUT);
  //for( int i=0;i<255;i++) {EEPROM.write(i, 0);} // ejecutarlo solo la primera vez para borrar la eeprom
  Asecuencia= EEPROM.read(0);
  Secuencia=Asecuencia;
  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);}  
  if (Asecuencia != Secuencia)
  {
    Asecuencia = Secuencia;
    EEPROM.write(0, Asecuencia);
  }  
}