Cruce de semáforos Funduino – montaje y ejercicios prácticos
FunduinoÚltima actualización el
Ampelphasen und Fußgängeranforderung mit dem Arduino MEGA programmieren
Aufbau und Ausstattung der Kreuzung
Vorbereitung
1 / 2
Die LDR-Sensoren in der Fahrbahn
Beschriftung der Ampelsockel
Eine einzelne LED programmieren
Rote LED blinken lassen
void setup() //Hier beginnt das Setup.
{ //Hier beginnt ein Programmabschnitt.
pinMode(36, OUTPUT); //Pin 36 soll ein Ausgang sein.
} //Hier ist ein Programmabschnitt beendet.
void loop() //Hier beginnt das Hauptprogramm.
{ //Hier beginnt ein Programmabschnitt.
digitalWrite(36, HIGH);//Schalte die Spannung an Pin36 ein (LED an).
delay(1000); //Warte 1000 Millisekunden (eine Sekunde).
digitalWrite(36, LOW);//Schalte die Spannung an Pin36 aus (LED aus).
delay(1000); //Warte 1000 Millisekunden (eine Sekunde).
} //Programmabschnitt beendet.Variante: die LED schneller blinken lassen
Variante: schneller blinken (200 Millisekunden)
void setup() //Hier beginnt das Setup
{ //Hier beginnt ein Programmabschnitt.
pinMode(36, OUTPUT); //Pin 13 soll ein Ausgang sein.
} //Hier ist ein Programmabschnitt beendet.
void loop() //Hier beginnt das Hauptprogramm
{ //Programmabschnitt beginnt.
digitalWrite(36, HIGH); //Schalte die Spannung an Pin36 ein (LED an).
delay(200); //Warte 200 Millisekunden
digitalWrite(36, LOW); //Schalte die Spannung an Pin36 aus (LED aus).
delay(200); //Warte 200 Millisekunden
} //Programmabschnitt beendet.Aufgabe 2 – Der Wechselblinker
Der Wechselblinker
void setup()
{ //Wir starten mit dem Setup
pinMode(36, OUTPUT); //Pin 36 ist ein Ausgang.
pinMode(34, OUTPUT); //Pin 34 ist ein Ausgang.
}
void loop()
{ //Das Hauptprogramm beginnt.
digitalWrite(36, HIGH); //Schalte die LED an Pin36 an.
delay(1000); //Warte 1000 Millisekunden.
digitalWrite(36, LOW); //Schalte die LED an Pin36 aus.
digitalWrite(34, HIGH); //Schalte die LED an Pin34 ein.
delay(1000); //Warte 1000 Millisekunden.
digitalWrite(34, LOW); //Schalte die LED an Pin34 aus.
} //Hier am Ende springt das Programm an den Start des Loop-Teils. Also: schalte die LED an Pin36 an… usw…Spannung am Fotowiderstand auslesen
Der Serielle Monitor
Den Fotowiderstand programmieren
Fotowiderstand auslesen und LED schalten
int eingang=A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
int LED=36; //Das Wort „LED“ steht jetzt für den Wert 36. Hier wird also die Rote LED an der Ampel angesteuert, die sich genau neben dem Mikrocontroller befindet.
int sensorwert=0; //Variable für den Sensorwert mit 0 als Startwert
void setup() //Hier beginnt das Setup.
{
Serial.begin(9600); //Die Kommunikation mit dem Seriellen Port wird gestartet, um den Wert des Sensors im Seriellen Monitor darzustellen.
pinMode (LED,OUTPUT);//Der Pin mit der LED (Pin 36) ist jetzt ein Ausgang
}
void loop()
{ //Mit dieser Klammer wird der Loop-Teil geöffnet.
sensorwert=analogRead(eingang); //Die Spannung an dem Fotowiderstand auslesen und unter der Variable „sensorWert“ abspeichern.
Serial.println("Sensorwert="); //Der Befehl „Seriel.print“ erzeugt eine Ausgabe am Seriellen Monitor.: Das Wort „Sensorwert:”
Serial.println(sensorwert); // Ausgabe am Seriellen Monitor. Mit dem Befehl „Serial.println“ wird der Sensorwert des Fotowiderstandes in Form einer Zahl zwischen 0 und 1023 an den Seriellen Monitor gesendet. Durch die Erweiterung um die beiden Buchstaben „LN“ wird aus dem Befehl „Seriel.println“. Dadurch wird bei der Ausgabe am Seriellen Monitor ein Seitenumbruch erzeugt und die Messwerte sind leichter ablesbar
if(sensorwert < 512) //Wenn der Sensorwert unter dem Wert 512 liegt….
{
digitalWrite(LED,HIGH); //…soll die LED leuchten…
}
else //…andernfalls
{
digitalWrite(LED,LOW); //…soll sie nicht leuchten
}
delay(50);//Eine kurze Pause, in der die LED an oder aus ist
} //Mit dieser letzten Klammer wird der Loop-Teil geschlossen.
//Wenn nun der Sensorwert bei normaler Helligkeit bspw. nur den Wert 100 hat (der Wert ist abhängig von den verwendeten Widerständen, von der Helligkeit und von der Stromrichtung), dann nimmt man anstelle des Wertes 512 einen wesentlich kleineren Wert, bei dem die LED zu leuchten beginnen soll. Bspw. nimmt man dann den Wert 90. Den aktuellen Sensorwert kann man sich nun mithilfe des Seriellen Monitor anzeigen lassen. Dazu klickt man oben auf „Werkzeuge“ und anschließend auf „Serieller Monitor“Schema: Entscheidung anhand des Sensorwertes
if(sensorwert < 512) //Wenn der Sensorwert unter dem Wert 512 liegt….
{
Passiert Option1 (Zum Beispiel die Ampel für die Fahrzeuge bleibt auf Grün)
}
else //…andernfalls
{
passiert Option2 (Zum Beispiel die Ampel für die Fahrzeuge wechselt zu Rot)
}Eine Ampel programmieren
Schritt 3.1: Die Pins definieren
#define AMPEL_1_GRUEN 4 #define AMPEL_1_GELB 5 #define AMPEL_1_ROT 6 #define AMPEL_1_KNOPF 7 #define AMPEL_1_FUSSGAENGER_ROT 8 #define AMPEL_1_FUSSGAENGER_GRUEN 9 //Damit haben wir die Pins der ersten Ampel definiert.
Schritt 3.2: Das Setup
void setup()
{
// LEDS
pinMode(AMPEL_1_GRUEN, OUTPUT);
pinMode(AMPEL_1_GELB, OUTPUT);
pinMode(AMPEL_1_ROT, OUTPUT);
pinMode(AMPEL_1_FUSSGAENGER_ROT, OUTPUT);
pinMode(AMPEL_1_FUSSGAENGER_GRUEN, OUTPUT);
// KNOPF
pinMode(AMPEL_1_KNOPF, INPUT_PULLUP);
}Der Ampel-Loop: die Phasen schalten
Der Loop einer einzelnen Ampel
void loop()
{
// Stelle jede LED auf aus, auser AMPEL_1_FUSSGAENGER_ROT
// und AMPEL_1_GRUEN. Diese sollen an sein.
digitalWrite(AMPEL_1_GRUEN , HIGH);
digitalWrite(AMPEL_1_FUSSGAENGER_ROT, HIGH);
digitalWrite(AMPEL_1_GELB, LOW);
digitalWrite(AMPEL_1_ROT, LOW);
digitalWrite(AMPEL_1_FUSSGAENGER_GRUEN, LOW);
// warten
delay(5000);
// Gehe von Gruen auf Gelb.
digitalWrite(AMPEL_1_GRUEN , LOW);
digitalWrite(AMPEL_1_GELB, HIGH);
// warten
delay(5000);
// Gehe von Gelb auf Rot und setze die Rote Fußgänger
// LED auf die Grüne Fußgänger-LED.
digitalWrite(AMPEL_1_GELB, LOW);
digitalWrite(AMPEL_1_ROT, HIGH);
digitalWrite(AMPEL_1_FUSSGAENGER_ROT, LOW);
digitalWrite(AMPEL_1_FUSSGAENGER_GRUEN, HIGH);
// warten
delay(5000);
// Rot aktivieren und von Fußgänger grün wieder auf Rot wechseln.
digitalWrite(AMPEL_1_GELB, HIGH);
digitalWrite(AMPEL_1_FUSSGAENGER_ROT, HIGH);
digitalWrite(AMPEL_1_FUSSGAENGER_GRUEN, LOW);
delay(5000);
}Mehrere Ampeln gleichzeitig steuern
Schritt 1: Definition der Struktur "Ampel"
// Schritt 1: Definition der Struktur "Ampel"
struct Ampel
{
int Rot; // Pin für Auto-Rot
int Gelb; // Pin für Auto-Gelb
int Gruen; // Pin für Auto-Grün
int pedestrain_Rot; // Pin für Fußgänger-Rot
int pedestrain_Gruen; // Pin für Fußgänger-Grün
int pedestrain_Knopf; // Pin für Fußgänger-Button
};Schritt 2: Ampeln für die vier Richtungen anlegen
// Schritt 2: Initialisierung von Ampeln für verschiedene Richtungen
Ampel Seite_1_geradeaus = {6, 5, 4, 8, 9, 7};
Ampel Seite_4_geradeaus = {36, 35, 34, 38, 39, 37};
Ampel Seite_2_geradeaus = {18, 17, 16, 20, 21, 19};
Ampel Seite_3_geradeaus = {24, 23, 22, 26, 27, 25};Der vollständige Sketch für vier Ampeln
#include <Arduino.h>
// Schritt 1: Definition der Struktur "Ampel"
struct Ampel
{
int Rot; // Pin für Auto-Rot
int Gelb; // Pin für Auto-Gelb
int Gruen; // Pin für Auto-Grün
int pedestrain_Rot; // Pin für Fußgänger-Rot
int pedestrain_Gruen; // Pin für Fußgänger-Grün
int pedestrain_Knopf; // Pin für Fußgänger-Button
};
// Schritt 2: Initialisierung von Verkehrslichtern für verschiedene Richtungen
Ampel AMPEL_1 = {6, 5, 4, 8, 9, 7};
Ampel AMPEL_2 = {18, 17, 16, 20, 21, 19};
Ampel AMPEL_3 = {24, 23, 22, 26, 27, 25};
Ampel AMPEL_4 = {36, 35, 34, 38, 39, 37};
// Schritt 3: Initialisierung der Pins im Setup
void setup()
{
Serial.begin(9600);
// Ampel 1
pinMode(AMPEL_1.Rot, OUTPUT);
pinMode(AMPEL_1.Gelb, OUTPUT);
pinMode(AMPEL_1.Gruen, OUTPUT);
pinMode(AMPEL_1.pedestrain_Rot, OUTPUT);
pinMode(AMPEL_1.pedestrain_Gruen, OUTPUT);
pinMode(AMPEL_1.pedestrain_Knopf, INPUT_PULLUP);
// Ampel 2
pinMode(AMPEL_2.Rot, OUTPUT);
pinMode(AMPEL_2.Gelb, OUTPUT);
pinMode(AMPEL_2.Gruen, OUTPUT);
pinMode(AMPEL_2.pedestrain_Rot, OUTPUT);
pinMode(AMPEL_2.pedestrain_Gruen, OUTPUT);
pinMode(AMPEL_2.pedestrain_Knopf, INPUT_PULLUP);
// Ampel 2
pinMode(AMPEL_3.Rot, OUTPUT);
pinMode(AMPEL_3.Gelb, OUTPUT);
pinMode(AMPEL_3.Gruen, OUTPUT);
pinMode(AMPEL_3.pedestrain_Rot, OUTPUT);
pinMode(AMPEL_3.pedestrain_Gruen, OUTPUT);
pinMode(AMPEL_3.pedestrain_Knopf, INPUT_PULLUP);
// Ampel 2
pinMode(AMPEL_4.Rot, OUTPUT);
pinMode(AMPEL_4.Gelb, OUTPUT);
pinMode(AMPEL_4.Gruen, OUTPUT);
pinMode(AMPEL_4.pedestrain_Rot, OUTPUT);
pinMode(AMPEL_4.pedestrain_Gruen, OUTPUT);
pinMode(AMPEL_4.pedestrain_Knopf, INPUT_PULLUP);
}
// Schritt 5: Hauptverkehrslichtsteuerung und Fußgängerübergangserkennung
void loop()
{
// Geradeaus-Ampeln auf Grün setzen
digitalWrite(AMPEL_1.Gruen, HIGH);
digitalWrite(AMPEL_3.Gruen, HIGH);
// Andere Geradeaus-Ampeln auf Rot setzen
digitalWrite(AMPEL_1.Rot, LOW);
digitalWrite(AMPEL_3.Rot, LOW);
digitalWrite(AMPEL_1.Gelb, LOW);
digitalWrite(AMPEL_3.Gelb, LOW);
// Fußgänger-Ampeln auf Rot setzen
digitalWrite(AMPEL_4.pedestrain_Rot, HIGH);
digitalWrite(AMPEL_1.pedestrain_Rot, HIGH);
digitalWrite(AMPEL_2.pedestrain_Rot, HIGH);
digitalWrite(AMPEL_3.pedestrain_Rot, HIGH);
digitalWrite(AMPEL_4.pedestrain_Gruen, LOW);
digitalWrite(AMPEL_1.pedestrain_Gruen, LOW);
digitalWrite(AMPEL_2.pedestrain_Gruen, LOW);
digitalWrite(AMPEL_3.pedestrain_Gruen, LOW);
// Überprüfen, ob Fußgänger-Button gedrückt wurde
if (digitalRead(AMPEL_4.pedestrain_Knopf) == LOW ||
digitalRead(AMPEL_1.pedestrain_Knopf) == LOW ||
digitalRead(AMPEL_2.pedestrain_Knopf) == LOW ||
digitalRead(AMPEL_3.pedestrain_Knopf) == LOW)
{
// Warte 2 Sekunden
delay(2000);
// Geradeaus-Ampeln auf Gelb schalten und dann auf Rot
digitalWrite(AMPEL_1.Gruen, LOW);
digitalWrite(AMPEL_3.Gruen, LOW);
digitalWrite(AMPEL_1.Gelb, HIGH);
digitalWrite(AMPEL_3.Gelb, HIGH);
// Warte 1 Sekunden
delay(1000);
digitalWrite(AMPEL_1.Gelb, LOW);
digitalWrite(AMPEL_3.Gelb, LOW);
digitalWrite(AMPEL_1.Rot, HIGH);
digitalWrite(AMPEL_3.Rot, HIGH);
// Warte 2 Sekunden
delay(2000);
// Fußgänger-Ampeln auf Grün setzen
digitalWrite(AMPEL_4.pedestrain_Gruen, HIGH);
digitalWrite(AMPEL_1.pedestrain_Gruen, HIGH);
digitalWrite(AMPEL_2.pedestrain_Gruen, HIGH);
digitalWrite(AMPEL_3.pedestrain_Gruen, HIGH);
digitalWrite(AMPEL_4.pedestrain_Rot, LOW);
digitalWrite(AMPEL_1.pedestrain_Rot, LOW);
digitalWrite(AMPEL_2.pedestrain_Rot, LOW);
digitalWrite(AMPEL_3.pedestrain_Rot, LOW);
// Warte 5 Sekunden
delay(5000);
// Fußgänger-Ampeln auf Rot setzen
digitalWrite(AMPEL_4.pedestrain_Gruen, LOW);
digitalWrite(AMPEL_1.pedestrain_Gruen, LOW);
digitalWrite(AMPEL_2.pedestrain_Gruen, LOW);
digitalWrite(AMPEL_3.pedestrain_Gruen, LOW);
digitalWrite(AMPEL_4.pedestrain_Rot, HIGH);
digitalWrite(AMPEL_1.pedestrain_Rot, HIGH);
digitalWrite(AMPEL_2.pedestrain_Rot, HIGH);
digitalWrite(AMPEL_3.pedestrain_Rot, HIGH);
// Warte 2 Sekunden
delay(2000);
// Geradeaus-Ampeln auf Gelb schalten
digitalWrite(AMPEL_1.Gelb, HIGH);
digitalWrite(AMPEL_3.Gelb, HIGH);
// Rote Ampeln ausschalten
digitalWrite(AMPEL_1.Rot, HIGH);
digitalWrite(AMPEL_3.Rot, HIGH);
delay(1000);
}
}Calificar la guía