In questo piccolo progetto ho voluto provare a simulare l'intermittenza di una luce posteriore per biciclette, di quelle che si vedono spesso in giro e che, con un bottoncino, è possibile gestirne il lampeggio dei led.
Il materiale necessario, oltre ovviamente ad Arduino UNO, è composto da 3 led rossi, 3 resistori da 220 Ohm, un pulsante di tipo NO (normally open) ed un resistore da 10K Ohm.
Il risultato sarà evidenziato da alcuni giochi di luce con i 3 led che cambiano il modo di lampeggiare ed alternarsi in base al clic sul bottone, nel caso specifico dopo ogni clic la modalità di lampeggio dei led passerà da luce fissa, lampeggio ogni mezzo secondo, lampeggio ogni quarto di secondo, lampeggio alternato led esterni e led interno, lampeggio alternato led in sequenza in una direzione, lampeggio alternato led in sequenza in due direzioni, luce spenta.
Di seguito lo schema elettrico del progetto:
Fig. 1 - Schema per Arduino - Simulare Luce Posteriore di una Bicicletta con i LED
Ed ecco lo sketch:
const int INDICE_PIN = 3;
int pin_output_led[INDICE_PIN] = {13,12,11};
const int INDICE_LED_STATE = 3;
int ledState[INDICE_LED_STATE] = {0, 0, 0};
const int pin_input_bottone = 2;
const int debounceDelay = 200;
const int intervallo_base = 250;
int pin_input_bottone_valore = 0;
int bottone_stato_pressione = 0;
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
int counter = 0;
bool led_direction = 0;
void setup() {
pinMode(pin_input_bottone, INPUT);
for(int i = 0; i < INDICE_PIN; i++) {
pinMode(pin_output_led[i], OUTPUT);
}
}
void loop() {
currentMillis = millis();
pin_input_bottone_valore = digitalRead(pin_input_bottone);
if (pin_input_bottone_valore == HIGH) {
switch (bottone_stato_pressione) {
case 0:
bottone_stato_pressione = 1;
break;
case 1:
bottone_stato_pressione = 2;
break;
case 2:
bottone_stato_pressione = 3;
break;
case 3:
bottone_stato_pressione = 4;
break;
case 4:
bottone_stato_pressione = 5;
break;
case 5:
bottone_stato_pressione = 6;
break;
case 6:
bottone_stato_pressione = 0;
break;
//default:
// non fare niente
}
delay(debounceDelay);
}
if (bottone_stato_pressione == 0) {
for(int j = 0; j < INDICE_LED_STATE; j++) {
ledState[j] = LOW;
}
} else if (bottone_stato_pressione == 1) {
for(int j = 0; j < INDICE_LED_STATE; j++) {
ledState[j] = HIGH;
}
} else if (bottone_stato_pressione == 2) {
if ((currentMillis - previousMillis) >= (intervallo_base * 2)) {
for(int j = 0; j < INDICE_LED_STATE; j++) {
ledState[j] = switch_ledState(ledState[j]);
}
updateMillis();
}
} else if (bottone_stato_pressione == 3) {
if ((currentMillis - previousMillis) >= (intervallo_base)) {
ledState[0] = switch_ledState(ledState[0]);
ledState[1] = ledState[0];
ledState[2] = ledState[0];
updateMillis();
}
} else if (bottone_stato_pressione == 4) {
if ((currentMillis - previousMillis) >= (intervallo_base * 2)) {
ledState[0] = switch_ledState(ledState[0]);
ledState[1] = switch_ledState(ledState[0]);
ledState[2] = ledState[0];
updateMillis();
}
} else if (bottone_stato_pressione == 5) {
if ((currentMillis - previousMillis) >= (intervallo_base * 2)) {
for(int j = 0; j < INDICE_LED_STATE; j++) {
ledState[j] = HIGH;
if (counter != j) ledState[j] = LOW;
}
counter = counter + 1;
if (counter > 2) counter = 0;
updateMillis();
}
} else if (bottone_stato_pressione == 6) {
if ((currentMillis - previousMillis) >= (intervallo_base * 2)) {
if (led_direction == 0) {
for(int j = 0; j < INDICE_LED_STATE; j++) {
ledState[j] = HIGH;
if (counter != j) ledState[j] = LOW;
}
counter = counter + 1;
if (counter > INDICE_LED_STATE - 1) {
counter = INDICE_LED_STATE - 2;
led_direction = 1;
}
} else { // led_direction == 1
for(int h = INDICE_LED_STATE - 1; h > 0; h--) {
ledState[h] = HIGH;
if (counter != h) ledState[h] = LOW;
}
counter = counter - 1;
if (counter < 1) {
counter = 0;
led_direction = 0;
}
}
updateMillis();
}
}
for(int i = 0; i < INDICE_PIN; i++) {
digitalWrite(pin_output_led[i], ledState[i]);
}
}
bool switch_ledState(bool ledState) {
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
return ledState;
}
void updateMillis() {
previousMillis = currentMillis;
}
Nel video una breve dimostrazione del funzionamento del piccolo sistema realizzato:
Da notare l'utilizzo della funzione millis() per la gestione dei tempi di attesa anziché del semplice delay() onde evitare di bloccare temporaneamente Arduino con conseguente problema di reattività al click sul bottone.
Per consigli, suggerimenti o chiarimenti sentitevi liberi di lasciare un commento!
Nessuno ha ancora commentato questo articolo, fallo tu per primo!
Scrivi un Commento