Ampel­an­la­ge an einem Fußgängerüberweg

Lese­zeit: 4 Minu­ten

Lösung
Seite als PDF

An einem Fuß­gän­ger­über­weg sol­len je zwei Fahr­bahn­am­peln und zwei Fuß­gän­ger­am­peln par­al­lel geschal­tet wer­den. Auf einem OLED wird die War­te­zeit für die Fuß­gän­ger bis zur nächs­ten Grün­pha­se angezeigt. 

So sieht es aus:

Benö­tig­te Bauteile:

  • Fahr­bahn­am­peln: LEDs (2 rote, 2 gel­be, 2 grü­ne) oder 2 Ampelmasten
  • Fuß­gän­ger­am­peln: 2 rote und 2 grü­ne LEDs
  • Wider­stän­de 220 Ω
  • Lei­tungs­dräh­te
  • OLED
  • zusätz­lich Lautsprecher

Beach­te die ➨Vor­wi­der­stän­de ver­schie­de­ner LEDs

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Benö­tig­te Bibliothek:

Bin­de die benö­tig­te Biblio­thek ein und defi­nie­re die Variablen:

# include "U8g2lib.h"

// 0,96 Zoll SSD1306
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// Bildschirmgröße
int BildschirmBreite = oled.getDisplayWidth();
int BildschirmHoehe = oled.getDisplayHeight();

//  Pins für die Ampeln
enum Ampel 
{
  // Startwert Pin 3
  FAHRBAHN_ROT_LINKS = 3,
  FAHRBAHN_GELB_LINKS,       // 4
  FAHRBAHN_GRUEN_LINKS,      // 5
  FUSSGAENGER_ROT_LINKS,     // 6
  FUSSGAENGER_GRUEN_LINKS,   // 7
  FAHRBAHN_ROT_RECHTS,       // 8
  FAHRBAHN_GELB_RECHTS,      // 9
  FAHRBAHN_GRUEN_RECHTS,     // 10
  FUSSGAENGER_ROT_RECHTS,    // 11
  FUSSGAENGER_GRUEN_RECHTS,  // 12
};

int LAUTSPRECHER = 13;

// angezeigte Zahl Fahrbahnampel
int NummerFahrbahnampel = 9;

// angezeigte Zahl Fußgängerampel
int NummerFussgaengerampel = 4;

// Sekunden der Grün-Phase Fahrbahnampel
int SekundenGruenFahrbahn = 6;
int SekundenGruenFussgaenger = 4;

Der set­up-Teil. Beach­te die Kommentare.

void setup() 
{
  // pinModes der LEDs
  for (int i = FAHRBAHN_ROT_LINKS; i <= FUSSGAENGER_GRUEN_RECHTS; i++) 
  {
    pinMode(i, OUTPUT);
  }
  // Display starten
  oled.begin();

  // Kontrast maximal 255
  oled.setContrast(200);

  // Schriftart setzen
  oled.setFont(u8g2_font_logisoso62_tn);
}

Der loop-Teil. Beach­te die Kommentare.

void loop() 
{
  // Fahrbahnampeln rot
  // links
  digitalWrite(FAHRBAHN_ROT_LINKS, HIGH);
  digitalWrite(FAHRBAHN_ROT_RECHTS, HIGH);

  digitalWrite(FUSSGAENGER_ROT_LINKS, LOW);
  digitalWrite(FUSSGAENGER_ROT_RECHTS, LOW);
  digitalWrite(FUSSGAENGER_GRUEN_LINKS, HIGH);
  digitalWrite(FUSSGAENGER_GRUEN_RECHTS, HIGH);

  oled.firstPage();
  do 
  {
    oled.setCursor(50, BildschirmHoehe);
    oled.print(NummerFussgaengerampel);
  } 
  while (oled.nextPage());

  // Grünphase Fußgängerampel
  for (int i = 0; i < SekundenGruenFussgaenger; i++) 
  {
    // Variable herunterzählen
    NummerFussgaengerampel--;
    delay(1000);

    oled.firstPage();
    do 
    {
      oled.setCursor(50, BildschirmHoehe);
      oled.print(NummerFussgaengerampel);
    } 
    while (oled.nextPage());
  }

  // OLED löschen
  oled.clearDisplay();

  // Fußgängerampeln von grün auf rot geschaltet
  digitalWrite(FUSSGAENGER_GRUEN_LINKS, LOW);
  digitalWrite(FUSSGAENGER_ROT_LINKS, HIGH);

  digitalWrite(FUSSGAENGER_GRUEN_RECHTS, LOW);
  digitalWrite(FUSSGAENGER_ROT_RECHTS, HIGH);

  tone(LAUTSPRECHER, 1000, 10);
  delay(1000);
  tone(LAUTSPRECHER, 1000, 10);

  // Anzeige der Sekunden Fahrbahnampel
  oled.firstPage();
  do 
  {
    oled.setCursor(50, BildschirmHoehe);
    oled.print(NummerFahrbahnampel);
  } 
  while (oled.nextPage());

  // Fahrbahnampeln auf rot-gelb und dann auf grün schalten
  digitalWrite(FAHRBAHN_GELB_LINKS, HIGH);
  digitalWrite(FAHRBAHN_GELB_RECHTS, HIGH);

  // Variable herunterzählen
  NummerFahrbahnampel--;
  delay(1000);

  oled.firstPage();
  do 
  {
    oled.setCursor(50, BildschirmHoehe);
    oled.print(NummerFahrbahnampel);
  } 
  while (oled.nextPage());

  digitalWrite(FAHRBAHN_ROT_LINKS, LOW);
  digitalWrite(FAHRBAHN_GELB_LINKS, LOW);
  digitalWrite(FAHRBAHN_GRUEN_LINKS, HIGH);

  digitalWrite(FAHRBAHN_ROT_RECHTS, LOW);
  digitalWrite(FAHRBAHN_GELB_RECHTS, LOW);
  digitalWrite(FAHRBAHN_GRUEN_RECHTS, HIGH);

  // Grünphase der Fahrbahnampeln
  for (int i = 0; i < SekundenGruenFahrbahn; i++) 
  {
    NummerFahrbahnampel--;
    delay(1000);
    oled.firstPage();
    do 
    {
      oled.setCursor(50, BildschirmHoehe);
      oled.print(NummerFahrbahnampel);
    } 
    while (oled.nextPage());
  }

  // Fahrbahnampeln auf gelb schalten
  digitalWrite(FAHRBAHN_GRUEN_LINKS, LOW);
  digitalWrite(FAHRBAHN_GELB_LINKS, HIGH);

  digitalWrite(FAHRBAHN_GRUEN_RECHTS, LOW);
  digitalWrite(FAHRBAHN_GELB_RECHTS, HIGH);

  delay(1000);
  NummerFahrbahnampel--;

  oled.firstPage();
  do 
  {
    oled.setFontDirection(0);
    oled.setCursor(50, BildschirmHoehe);
    oled.print(NummerFahrbahnampel);
  } 
  while (oled.nextPage());

  // Fahrbahnampeln gelb aus
  digitalWrite(FAHRBAHN_GELB_LINKS, LOW);
  digitalWrite(FAHRBAHN_GELB_RECHTS, LOW);

  digitalWrite(FUSSGAENGER_ROT_RECHTS, HIGH);
  digitalWrite(FUSSGAENGER_ROT_LINKS, HIGH);

  digitalWrite(FAHRBAHN_ROT_RECHTS, HIGH);
  digitalWrite(FAHRBAHN_ROT_LINKS, HIGH);
  oled.firstPage();
  do 
  {
    oled.setFontDirection(0);
    oled.setCursor(50, BildschirmHoehe);
    oled.print(NummerFahrbahnampel);
  } 
  while (oled.nextPage());
  delay(1000);
  // Wert für die Anzeige der Sekunden zurücksetzen
  NummerFahrbahnampel = 9;
  NummerFussgaengerampel = 4;

  // OLED löschen
  oled.clearDisplay();
}

Startseite
Aufgaben A-Z
Downloads
Suchen
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 24. Nov 2023 @ 9:00