Ampel­an­la­ge

# 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;

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);
}

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();
}

Letzte Aktualisierung: 24. Jul 2023 @ 8:07