MICHELEPISANI.IT
 

Pulsante, LED e Giochi di Luce

Gestire l'Intermittenza della Luce Posteriore a LED di una Bicicletta

arduino - simulare la luce posteriore di una bicicletta con i led
February 17
07:172017

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:

arduino - luce posteriore di una bicicletta con i led
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!

Tags

Autore

Michele Pisani

Michele Pisani

Ho uno spiccato orientamento al problem-solving, se è troppo facile non mi diverto :)
Credo nella volontà e nel cambiamento perchè hanno fatto della mia passione il mio pane quotidiano.
Se devo descrivermi con una sola parola direi... "Concretezza", la mia stretta di mano è una garanzia.

0 Commenti

Non ci sono commenti

Nessuno ha ancora commentato questo articolo, fallo tu per primo!

Scrivi un Commento

Scrivi un Commento

Il tuo indirizzo email non sarà pubblicato.
I campi contrassegnati da un * sono obbligatori

Articoli e Argomenti correlati

Il Canale YouTube in ITALIANO

1 VIDEO GRATIS ogni 2 settimane! ISCRIVITI!

Entra a far parte della community su Facebook

Categorie popolari

Iscriviti alla mia newsletter

La tua e-mail con me sarà al sicuro.
Non fornirò mai le tue informazioni a nessuno!

Ultimi commenti

MASSIMO BERNARDI

ho cercato ma non ho trovato niente se non dei sensori di passaggio tipo passaggio sotto entrata di …

Michele Pisani

Ciao Massimo, sia i sensori che un sistema già pronto (in base alle tue esigenze) li puoi …

MASSIMO BERNARDI

CIAO A ME SERVIREBBERO QUATTRO SENSORI COSì PER FARE DEI TEST FISICI DOVE POSSO TROVARE UN …

Michele Pisani

Ciao Domenico, in questi casi controllerei la posta, di solito arrivano degli avvisi via email in …