Menu
CoddyTech

Pulsante di attraversamento

Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 3 di 24.

Le persone a piedi hanno bisogno di un modo per chiedere di attraversare la strada. Il pulsante blu sul pin 2 è il pulsante di attraversamento: se viene premuto durante il verde, il verde termina subito, così le auto passano al giallo e poi al rosso.

Poiché le luci funzionano con millis(), loop() passa per lo stato verde migliaia di volte al secondo e può leggere il pulsante ogni volta, oltre all'orologio. Il verde termina quando una delle due condizioni è vera, come indica || (oppure):

case GREEN:
  if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
    // passa al giallo
  }
  break;

Il pulsante collega il pin 2 a massa, quindi imposta il pin su INPUT_PULLUP: legge HIGH finché il pulsante non lo porta a LOW.

Solo lo stato verde legge il pulsante. Durante il giallo e il rosso, le auto si stanno già fermando, e il giallo dura per tutto il suo secondo, così i conducenti hanno il tempo di fermarsi.

challenge icon

Sfida

Medio

Aggiungi il pulsante di attraversamento sul pin 2:

  • imposta il pin 2 su INPUT_PULLUP
  • mentre la luce è verde, una pressione termina subito il verde (la luce diventa gialla)
  • il giallo e il rosso mantengono i propri tempi, che il pulsante sia premuto o meno

Premi Run, attendi che arrivi il verde, premi il pulsante blu, poi Check.

Provalo tu

// Le luci per le auto
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Il LED integrato nella scheda: la spia di stato del controller
const int statusPin = 13;

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;  // quando si è accesa la luce attuale

bool statusOn = false;
unsigned long lastBlink = 0;

// Accendi una luce e spegni le altre due.
void showLight(int pin) {
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(pin, HIGH);
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(statusPin, OUTPUT);
  showLight(greenPin);
}

void loop() {
  unsigned long now = millis();

  switch (light) {
    case GREEN:
      if (now - lightStart >= 3000) {
        light = YELLOW;
        lightStart = now;
        showLight(yellowPin);
      }
      break;
    case YELLOW:
      if (now - lightStart >= 1000) {
        light = RED;
        lightStart = now;
        showLight(redPin);
      }
      break;
    case RED:
      if (now - lightStart >= 3000) {
        light = GREEN;
        lightStart = now;
        showLight(greenPin);
      }
      break;
  }

  // La spia di stato lampeggia ogni 500 ms, indipendentemente dalle luci per le auto.
  if (now - lastBlink >= 500) {
    lastBlink = now;
    if (statusOn) {
      statusOn = false;
      digitalWrite(statusPin, LOW);
    } else {
      statusOn = true;
      digitalWrite(statusPin, HIGH);
    }
  }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Progetti

Esercitati da solo: Playground Arduino