/*
* 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;
}
}