Feu de circulation Funduino (CMS)
FunduinoDernière mise à jour le
34 WS2812-LEDs, acht Taster und zehn Fotowiderstände auf einer Platine
Die Ampelkreuzung im Überblick
Die Spannungsversorgung
1 / 2
Die WS2812-LEDs
Beispiel: eine einzelne Ampel programmieren
Beispiel: eine einzelne Ampel
#include <Adafruit_NeoPixel.h>
// Pin und Anzahl der WS2812 LEDs
#define DATA_PIN 3
#define NUMPIXELS 3 // 3 LEDs für die Ampel
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, DATA_PIN, NEO_GRB + NEO_KHZ800);
// Funktion zum Setzen der Ampelfarbe
void setAmpel(int pixel, int r, int g, int b) {
strip.setPixelColor(pixel, strip.Color(r, g, b));
strip.show();
}
void setup() {
strip.begin(); // Initialisiere WS2812 LEDs
strip.show(); // Alle LEDs ausschalten
}
void loop() {
// Phase Rot
setAmpel(0, 255, 0, 0); // Rot an
setAmpel(1, 0, 0, 0); // Gelb aus
setAmpel(2, 0, 0, 0); // Grün aus
delay(5000); // 5 Sekunden Rot
// Phase Rot-Gelb
setAmpel(0, 255, 0, 0); // Rot an
setAmpel(1, 255, 255, 0); // Gelb an
setAmpel(2, 0, 0, 0); // Grün aus
delay(2000); // 2 Sekunden Rot-Gelb
// Phase Grün
setAmpel(0, 0, 0, 0); // Rot aus
setAmpel(1, 0, 0, 0); // Gelb aus
setAmpel(2, 0, 255, 0); // Grün an
delay(5000); // 5 Sekunden Grün
// Phase Gelb
setAmpel(0, 0, 0, 0); // Rot aus
setAmpel(1, 255, 255, 0); // Gelb an
setAmpel(2, 0, 0, 0); // Grün aus
delay(2000); // 2 Sekunden Gelb
}Die Taster für Fußgänger
Fotowiderstände und Multiplexer CD74HC4067
Multiplexer ansteuern – Beispiel für Fotowiderstand 3
digitalWrite(S0, LOW); digitalWrite(S1, HIGH); digitalWrite(S2, LOW); digitalWrite(S3, LOW); SensorWert = analogRead(Analogpin);
Die gesamte Kreuzung programmieren
Die gesamte Kreuzung in acht Phasen
#include <Adafruit_NeoPixel.h>
// Pin und Anzahl der WS2812 LEDs
#define DATA_PIN 3
#define NUMPIXELS 34 // Gesamtzahl der LEDs
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, DATA_PIN, NEO_GRB + NEO_KHZ800);
// Funktion zum Setzen der Ampelfarbe für eine Richtung
void setAmpel(int pixel1, int pixel2, int r, int g, int b) {
strip.setPixelColor(pixel1, strip.Color(r, g, b));
strip.setPixelColor(pixel2, strip.Color(r, g, b));
strip.show();
}
// Funktion zum Setzen der Fußgängerampel mit mehreren LEDs
void setFussgaengerAmpel(int gruen1, int gruen2, int gruen3, int gruen4, int rot1, int rot2, int rot3, int rot4,
bool gruenAn) {
if (gruenAn) {
// Grün an, Rot aus
strip.setPixelColor(gruen1, strip.Color(0, 255, 0));
strip.setPixelColor(gruen2, strip.Color(0, 255, 0));
strip.setPixelColor(gruen3, strip.Color(0, 255, 0));
strip.setPixelColor(gruen4, strip.Color(0, 255, 0));
strip.setPixelColor(rot1, strip.Color(0, 0, 0));
strip.setPixelColor(rot2, strip.Color(0, 0, 0));
strip.setPixelColor(rot3, strip.Color(0, 0, 0));
strip.setPixelColor(rot4, strip.Color(0, 0, 0));
} else {
// Rot an, Grün aus
strip.setPixelColor(gruen1, strip.Color(0, 0, 0));
strip.setPixelColor(gruen2, strip.Color(0, 0, 0));
strip.setPixelColor(gruen3, strip.Color(0, 0, 0));
strip.setPixelColor(gruen4, strip.Color(0, 0, 0));
strip.setPixelColor(rot1, strip.Color(255, 0, 0));
strip.setPixelColor(rot2, strip.Color(255, 0, 0));
strip.setPixelColor(rot3, strip.Color(255, 0, 0));
strip.setPixelColor(rot4, strip.Color(255, 0, 0));
}
strip.show();
}
void setup() {
strip.begin(); // Initialisiere WS2812 LEDs
strip.show(); // Alle LEDs ausschalten
}
void loop() {
// Phase 1: Richtung 1 Rot, Richtung 2 Grün, Fußgänger 1 Grün, Fußgänger 2 Rot
setAmpel(15, 6, 255, 0, 0); // Richtung 1 Rot an
setAmpel(16, 7, 0, 0, 0); // Richtung 1 Gelb aus
setAmpel(17, 8, 0, 0, 0); // Richtung 1 Grün aus
delay(2000); // 2 Sekunden warten, bevor Fußgänger 1 Grün wird
setFussgaengerAmpel(18, 32, 24, 26, 19, 33, 25, 27, true); // Fußgänger 1 Grün
setAmpel(0, 9, 0, 0, 0); // Richtung 2 Rot aus
setAmpel(1, 10, 0, 0, 0); // Richtung 2 Gelb aus
setAmpel(2, 11, 0, 255, 0); // Richtung 2 Grün an
setFussgaengerAmpel(20, 22, 30, 28, 21, 23, 31, 29, false); // Fußgänger 2 Rot
delay(5000); // 5 Sekunden Grünphase für Richtung 2
// Phase 2: Richtung 1 bleibt Rot, Richtung 2 schaltet auf Gelb, Fußgänger 2 auf Rot
setAmpel(15, 6, 255, 0, 0); // Richtung 1 Rot an
setAmpel(16, 7, 0, 0, 0); // Richtung 1 Gelb aus
setAmpel(17, 8, 0, 0, 0); // Richtung 1 Grün aus
setFussgaengerAmpel(18, 32, 24, 26, 19, 33, 25, 27, true); // Fußgänger 1 Grün
setAmpel(0, 9, 0, 0, 0); // Richtung 2 Rot aus
setAmpel(1, 10, 255, 255, 0); // Richtung 2 Gelb an
setAmpel(2, 11, 0, 0, 0); // Richtung 2 Grün aus
setFussgaengerAmpel(20, 22, 30, 28, 21, 23, 31, 29, false); // Fußgänger 2 Rot
delay(2000); // 2 Sekunden Gelbphase für Richtung 2
// Phase 3: Beide Richtungen zeigen Rot, Fußgänger 1 Grün, Fußgänger 2 Rot
setAmpel(15, 6, 255, 0, 0); // Richtung 1 Rot an
setAmpel(16, 7, 0, 0, 0); // Richtung 1 Gelb aus
setAmpel(17, 8, 0, 0, 0); // Richtung 1 Grün aus
setFussgaengerAmpel(18, 32, 24, 26, 19, 33, 25, 27, true); // Fußgänger 1 Grün
setAmpel(0, 9, 255, 0, 0); // Richtung 2 Rot an
setAmpel(1, 10, 0, 0, 0); // Richtung 2 Gelb aus
setAmpel(2, 11, 0, 0, 0); // Richtung 2 Grün aus
delay(2000); // 2 Sekunden warten, bevor Fußgänger 2 Grün wird
setFussgaengerAmpel(20, 22, 30, 28, 21, 23, 31, 29, true); // Fußgänger 2 Grün
delay(1000); // 1 Sekunde beide Richtungen Rot
// Phase 4: Richtung 1 schaltet auf Gelb, Richtung 2 bleibt Rot, Fußgänger 1 auf Rot
setAmpel(15, 6, 255, 0, 0); // Richtung 1 Rot an
setAmpel(16, 7, 255, 255, 0); // Richtung 1 Gelb an
setAmpel(17, 8, 0, 0, 0); // Richtung 1 Grün aus
setFussgaengerAmpel(18, 32, 24, 26, 19, 33, 25, 27, false); // Fußgänger 1 Rot
setAmpel(0, 9, 255, 0, 0); // Richtung 2 Rot an
setAmpel(1, 10, 0, 0, 0); // Richtung 2 Gelb aus
setAmpel(2, 11, 0, 0, 0); // Richtung 2 Grün aus
delay(2000); // 2 Sekunden Gelbphase für Richtung 1 vor Grün
// Phase 5: Richtung 1 Grün, Richtung 2 bleibt Rot, Fußgänger 2 Grün
setAmpel(15, 6, 0, 0, 0); // Richtung 1 Rot aus
setAmpel(16, 7, 0, 0, 0); // Richtung 1 Gelb aus
setAmpel(17, 8, 0, 255, 0); // Richtung 1 Grün an
setFussgaengerAmpel(18, 32, 24, 26, 19, 33, 25, 27, false); // Fußgänger 1 Rot
setAmpel(0, 9, 255, 0, 0); // Richtung 2 Rot an
setAmpel(1, 10, 0, 0, 0); // Richtung 2 Gelb aus
setAmpel(2, 11, 0, 0, 0); // Richtung 2 Grün aus
setFussgaengerAmpel(20, 22, 30, 28, 21, 23, 31, 29, true); // Fußgänger 2 Grün
delay(5000); // 5 Sekunden Grünphase für Richtung 1
// Phase 6: Richtung 1 schaltet auf Gelb vor Rot, Richtung 2 bleibt Rot, Fußgänger 2 auf Rot
setAmpel(15, 6, 0, 0, 0); // Richtung 1 Rot aus
setAmpel(16, 7, 255, 255, 0); // Richtung 1 Gelb an
setAmpel(17, 8, 0, 0, 0); // Richtung 1 Grün aus
setFussgaengerAmpel(20, 22, 30, 28, 21, 23, 31, 29, false); // Fußgänger 2 Rot
delay(2000); // 2 Sekunden Gelbphase für Richtung 1 vor Rot
// Phase 7: Beide Richtungen zeigen Rot, Fußgänger 1 auf Grün, Fußgänger 2 bleibt Rot
setAmpel(15, 6, 255, 0, 0); // Richtung 1 Rot an
setAmpel(16, 7, 0, 0, 0); // Richtung 1 Gelb aus
setAmpel(17, 8, 0, 0, 0); // Richtung 1 Grün aus
delay(2000); // 2 Sekunden warten, bevor Fußgänger 1 Grün wird
setFussgaengerAmpel(18, 32, 24, 26, 19, 33, 25, 27, true); // Fußgänger 1 Grün
setAmpel(0, 9, 255, 0, 0); // Richtung 2 Rot an
setAmpel(1, 10, 0, 0, 0); // Richtung 2 Gelb aus
setAmpel(2, 11, 0, 0, 0); // Richtung 2 Grün aus
setFussgaengerAmpel(20, 22, 30, 28, 21, 23, 31, 29, false); // Fußgänger 2 Rot
delay(1000); // 1 Sekunde beide Richtungen Rot
// Phase 8: Richtung 1 bleibt Rot, Richtung 2 schaltet auf Gelb, Fußgänger 1 Grün, Fußgänger 2 auf Rot
setAmpel(15, 6, 255, 0, 0); // Richtung 1 Rot an
setAmpel(16, 7, 0, 0, 0); // Richtung 1 Gelb aus
setAmpel(17, 8, 0, 0, 0); // Richtung 1 Grün aus
setFussgaengerAmpel(18, 32, 24, 26, 19, 33, 25, 27, true); // Fußgänger 1 Grün
setAmpel(0, 9, 255, 0, 0); // Richtung 2 Rot an
setAmpel(1, 10, 255, 255, 0); // Richtung 2 Gelb an
setAmpel(2, 11, 0, 0, 0); // Richtung 2 Grün aus
setFussgaengerAmpel(20, 22, 30, 28, 21, 23, 31, 29, false); // Fußgänger 2 Rot
delay(2000); // 2 Sekunden Gelbphase für Richtung 2
}Taster und Fotowiderstände auslesen
Taster und Fotowiderstände auslesen
int Fotowiderstand = A0;
int LED = 12;
int SchwelleDunkelheit = 400;
int S0 = 4;
int S1 = 5;
int S2 = 6;
int S3 = 7;
int p = 5;
int SensorWert = 0;
int Taster1 = 8;
int Taster2 = 9;
int Taster3 = 10;
int Taster4 = 11;
int TasterStatus = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(Taster1, INPUT);
pinMode(Taster2, INPUT);
pinMode(Taster3, INPUT);
pinMode(Taster4, INPUT);
// Seriellen Monitor starten
Serial.begin(9600);
}
void loop() {
// 1
digitalWrite(S0, LOW);
digitalWrite(S1, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 2
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 3
digitalWrite(S0, LOW);
digitalWrite(S1, HIGH);
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 4
digitalWrite(S0, HIGH);
digitalWrite(S1, HIGH);
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 5
digitalWrite(S0, LOW);
digitalWrite(S1, LOW);
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 6
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 7
digitalWrite(S0, LOW);
digitalWrite(S1, HIGH);
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 8
digitalWrite(S0, HIGH);
digitalWrite(S1, HIGH);
digitalWrite(S2, HIGH);
digitalWrite(S3, LOW);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 9
digitalWrite(S0, LOW);
digitalWrite(S1, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// 10
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
delay(p);
SensorWert = analogRead(Fotowiderstand);
Serial.print(SensorWert);
Serial.print(" ");
// Tasater abfragen
TasterStatus = digitalRead(Taster1);
if (TasterStatus == HIGH) {
Serial.print("Taster1 aktiv");
}
TasterStatus = digitalRead(Taster2);
if (TasterStatus == HIGH) {
Serial.print("Taster2 aktiv");
}
TasterStatus = digitalRead(Taster3);
if (TasterStatus == HIGH) {
Serial.print("Taster3 aktiv");
}
TasterStatus = digitalRead(Taster4);
if (TasterStatus == HIGH) {
Serial.println("Taster4 aktiv");
} else if (TasterStatus == LOW) {
Serial.println(" ");
}
}Évaluer le guide