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
Febbraio 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
Condividi

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

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

Michele Pisani

Grazie Paolo,
spero possa tornarti utile per i tuoi scopi.

Paolo

salve,mi interessa il progetto sensore gas ,per applicazioni in agricoltura.Vedremo gli …

Michele Pisani

Ciao Rossana,
strano problema, una domanda: continui a visualizzare entrambe le pagine o una …

Rossana

Ciao Michele, il mio problema è che Facebook non mi risponde. Mi è successo tre volte: faccio …