CCCPaste
/*
 * Dimas Zabala
 * 
*/
/*
 * 
 * NOMBRE:
 * 
 * Entrgar con nombre archivo: usr_p1.ino
 * 
 * 24/06/21 - Requerimientos
 * 1) Implementar un LED TEST que tenga un destello de 50ms cada 1000ms (50ms ENCENDIDO / 950ms APAGADO)
 * 2) Implementar un Lector de Pulsador, que permita diferenciar entre
 *  a) Botón presiondo durante más de 500ms segundo --> APAGA EL MODULO DE EFECTOS
 *  b) 1 Toque corto de botón (menos de 500ms) habilita efecto a / invierte el sentido
 *  c) 2 Toques cortos de botón (un tiempo inferior a 500ms entre toques) HABILITA EFECTO B / Invierte el sentido
 * 3) Módulo de Leds con múltiples efectos
 *  Efecto a: Un punto que se va corriendo
 *  b: Una barra de leds que se va completando
 *  
 *  PORTD --> 8 LEDs
 *  PORTB.0 --> Pulsador
 *  PORTB.5 --> LED_TEST
/ */
#define PUERTO_LEDS PORTD
#define CONFIGURAR_LEDS 0xFF //define como output pines 1-7
 
#define CONFIGURAR_BOTON  pinMode(8, INPUT)  //DDRB&=~1
#define BOT_PRESIONADO    digitalRead(8)

#define CONFIGURAR_LED_TEST pinMode(13, OUTPUT)
#define ENCENDER_LED_TEST   digitalWrite(13,HIGH)
#define APAGAR_LED_TEST     digitalWrite(13,LOW)

#define TPO_LED_TEST_ON   50
#define TPO_LED_TEST_OFF  950

void setup() {
  Serial.begin(9600);
  CONFIGURAR_LED_TEST;
  CONFIGURAR_BOTON;
  PUERTO_LEDS;
  CONFIGURAR_LEDS;
  }

bool moduloEfectos=true, efectoA=false, efectoB=false;

void loop() {
  LedTest();
  SupervisaPulsador();
  Efectos();
  }

void SupervisaPulsador(void)
  {
  /* Eventos
   *  Se presionó el botón
   *  Se superaron los 500ms con el botón presionado
   *  Se liberó el botón antes de los 500ms
   *  Se liberó el botón después de los 500ms
   *  Pasaron más de 500ms desde que se liberó el botón
   */
   static bool bot_presionado_ant=0;
   static unsigned long millis_ant=0,milli=0,millis_pas=0;
   static int pulsos=0;
   
  if(BOT_PRESIONADO==bot_presionado_ant) return;
  bot_presionado_ant=BOT_PRESIONADO;

  if(!BOT_PRESIONADO) return;
  
  milli=millis();
  
  while(BOT_PRESIONADO) { 
    millis_ant=millis();
    }

  millis_pas = millis_ant - milli;

  pulsos++;

  if(millis_ant>500 )moduloEfectos=false; 
  if(millis_ant<500 && pulsos<2){efectoA=true;pulsos=0;}
  if(millis_ant<500 && pulsos>=2){efectoB=true;pulsos=0;}
  }
  
void LedTest(void)
  {
  static bool led_encendido=false;
  static unsigned long millis_ant=0;

  if(led_encendido==false){
    if(millis()-millis_ant<950) return;
    millis_ant=millis();
    led_encendido=!led_encendido;
    }
  else{
    if(millis()-millis_ant<50) return;
    millis_ant=millis();
    led_encendido=!led_encendido;
    }

  if(led_encendido) ENCENDER_LED_TEST; 
  else              APAGAR_LED_TEST;
  }

void Efectos(void)
  {
    if(moduloEfectos)return;
    
    if(efectoA)efectoPunto();
    
    if(efectoB)efectoBarra();
  }

void efectoPunto(){
  int i=0;
  static int irIzquierda=0;
  static unsigned int t_inicio1=0;
  
  if(millis() - t_inicio1 < 500)return;
  t_inicio1 = millis();

  if(PUERTO_LEDS & (1<<7))irIzquierda=1;

  if(irIzquierda==0){
    PUERTO_LEDS << 1;
    PUERTO_LEDS=PUERTO_LEDS & 1<> 1;
    PUERTO_LEDS=PUERTO_LEDS & 1<>=1;
    PUERTO_LEDS=PUERTO_LEDS | 1;
    }
  }