Menu
CoddyTech

Segnale pedonale e cicalino

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

Chi va a piedi ha i propri semafori: rosso sul pin 7 (attendi) e verde sul pin 6 (cammina). Mentre le auto hanno il rosso, le persone vedono il verde; per il resto del tempo vedono il rosso.

Il segnale per attraversare cambia solo in due momenti: quando le auto passano al rosso e quando lo lasciano. Scrivi una funzione per i semafori pedonali e chiamala in quei due punti:

void showWalk(bool walk) {
  if (walk) {
    digitalWrite(walkRedPin, LOW);
    digitalWrite(walkGreenPin, HIGH);
  } else {
    digitalWrite(walkGreenPin, LOW);
    digitalWrite(walkRedPin, HIGH);
  }
}

Gli attraversamenti emettono anche un segnale acustico mentre è sicuro attraversare, per le persone che non possono vedere i semafori. tone() può accettare un terzo numero, che indica per quanto tempo riprodurre il suono: tone(buzzerPin, 1000, 100) riproduce un suono a 1000 Hz per 100 ms e si ferma da solo. Lo sketch non attende che finisca.

Per emettere un segnale acustico ogni 500 ms solo durante il rosso, inserisci un terzo timer millis() dentro case RED:.

challenge icon

Sfida

Medio

Aggiungi il segnale pedonale e il suo cicalino:

  • rosso pedonale sul pin 7 e verde pedonale sul pin 6, entrambi impostati come uscite
  • mentre il semaforo delle auto è rosso: verde pedonale acceso, rosso pedonale spento e un segnale acustico di 100 ms a 1000 Hz sul pin 8 ogni 500 ms
  • per il resto del tempo: rosso pedonale acceso, verde pedonale spento, nessun suono

Premi Run, 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;
// Il pulsante per l'attraversamento
const int buttonPin = 2;

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;

// Accende una luce e spegne 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);
  pinMode(buttonPin, INPUT_PULLUP);
  showLight(greenPin);
}

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

  switch (light) {
    case GREEN:
      // Premendo il pulsante per l'attraversamento, la luce verde termina in anticipo.
      if (now - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
        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