Cambio de estado del pulsador para un Led

Hola:

En este ejemplo no me sale una caosa.

vdiv8.gif


El código de abajo está programado para Pull-Down. ¿Cómo lo programo a la imagen de la izauierda? Quiero que me funcione bien el código.

Código:
http://picmania.garcia-cuervo.net/images/vdiv8.gif

Funciona como. So lo pulsas, enciende LEd y ventilador. Si lo vuelves a pulsar, Apaga ventilador y el LEd parpadea cada segundo. Estando apagado o encendido, da igual su estado, si dejo pulsado el botón durante 3 segundos. Se detiene todo.

Código:
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. 
  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, ON);} else {digitalWrite(Led, OF);}
  if (Ven_Encendido) {digitalWrite(Ventilador, ON);} else {digitalWrite(Ventilador, OF);}   
}
 
Hola:

Ya lo sonseguí. Comportamiento:


  1. Led y ventilador apagados.
  2. Si pulsa el botón, se enciende Led y ventilador.
  3. Si vuelves a pulsar el botón, se apaga ventilador y Led parpadea cada segundo.
  4. Si dejas pulsado el botón durante 3 seg. esté el ventilador activo o no, se apaga todo.
Código:
Código:
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. 
  delay(20);                                // Antirebotes.
  
  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);}   
}


Quiero hacer otra cosa que no me sale, apague o no Arduino de la alimentación principal, se guarden el estado del Led y ventilador.



¿Cómo se hace?


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.




Seguiré investigando...
...cualquier ayudita en vienbenida.
 
Atrás
Arriba