#define PUERTO_LEDS PORTD #define CONFIGURAR_LEDS DDRD = 0xFF #define CONFIGURAR_BOTON DDRB = DDRB | (1<<0) #define BOT_PRESIONADO digitalRead(8) #define CONFIGURAR_LED_TEST DDRB = DDRB | (1<<5) #define ENCENDER_LED_TEST PORTB = PORTB | (1<<5) #define APAGAR_LED_TEST PORTB = PORTB & ~(1<<5) #define TPO_LED_TEST_ON 950 #define TPO_LED_TEST_OFF 50 //Estado anterior del boton static bool presionado_ant = 0; //referencia milis led test static unsigned long milis_ant_test = 0; // static bool led_ant_test = 0; static int efecto = 0; static unsigned long milis_ant_efecto = 0; static int contador = 0; int start_presion = 0; int end_presion = 0; int idle_presion = 0; int hold_presion = 0; bool sentido_efecto1 = 0; void setup() { CONFIGURAR_LED_TEST; CONFIGURAR_BOTON; CONFIGURAR_LEDS; } void loop() { LedTest(); SupervisaPulsador(); Efectos(); } void SupervisaPulsador(void) { bool presionado = BOT_PRESIONADO; if (presionado == presionado_ant) return; presionado_ant = presionado; if (BOT_PRESIONADO) { start_presion = millis(); idle_presion = start_presion - end_presion; /*efecto++; PUERTO_LEDS = B00000000; if(efecto == 3){ efecto = 0; }*/ } else { end_presion = millis(); hold_presion = end_presion - start_presion; if (hold_presion >= 500) { efecto = 2; } if (hold_presion < 500) efecto = 0; if (idle_presion < 500) { efecto = 1; sentido_efecto1 = !sentido_efecto1; } } } /* 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 */ void LedTest() { unsigned long tiempoActual = millis(); if (tiempoActual - milis_ant_test >= 950 && led_ant_test == 0) { milis_ant_test = tiempoActual; ENCENDER_LED_TEST; led_ant_test = 1; } else if (tiempoActual - milis_ant_test >= 50 && led_ant_test == 1) { milis_ant_test = tiempoActual; APAGAR_LED_TEST; led_ant_test = 0; } } void Efectos(void) { unsigned long tiempoActualEfecto = millis(); if (tiempoActualEfecto - milis_ant_efecto >= 500) { milis_ant_efecto = tiempoActualEfecto; switch (efecto) { case 0: PUERTO_LEDS <<= 1; PUERTO_LEDS = PUERTO_LEDS | 1; if (PUERTO_LEDS == B11111111) { PUERTO_LEDS = B00000000; } break; case 1: if (sentido_efecto1) { switch (contador) { case 0: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 0); break; case 1: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 1); break; case 2: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 2); break; case 3: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 3); break; case 4: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 4); break; case 5: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 5); break; case 6: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 6); break; case 7: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 7); break; } contador++; if (contador > 7) contador = 0; } else { switch (contador) { case 0: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 7); break; case 1: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 6); break; case 2: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 5); break; case 3: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 4); break; case 4: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 3); break; case 5: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 2); break; case 6: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 1); break; case 7: PUERTO_LEDS = B00000000; PUERTO_LEDS = PUERTO_LEDS | (1 << 0); break; } contador++; if (contador > 7) contador = 0; } break; case 2: PUERTO_LEDS = B00000000; default: break; } } }