• Die Forumsregeln und Nutzungsbedingungen findet ihr in der Navbar unter Impressum !
    Bitte unbedingt beachten!
    Wie überall im Leben gibt es Spielregeln, so auch hier!
    Die Datenschutzerklärung zum DSGVO findet ihr ebenfalls in der Navbar unter Datenschutzerklärung !
    Hinweis nach DSGVO :
    Es ist hier keinerlei Angabe erforderlich. Alle Angaben in diesem Bereich sind öffentlich sichtbar und werden freiwillig gemacht. Mit einem Eintrag in diesem Bereich erkenne ich dieses an, und bestätige die Datenschutzerklärung zur DSGVO für das Forum gelesen zu haben.

    Danke
  • Hallo Gast, beschränke dich hier bitte auf den Bereich der Elektronik. Die Fahrzeuge oder Gebäude, wo diese Elektronik eingebaut wird bitte in dem passenden Fachbereiich behandeln. Auch wenn Teile des Projektes dadurch im Forum doppelt vorhanden sind! Danke.

Arduino Ampelschaltung

daube1

Member
VIP Unterstützt modelltruck.net 2024
Registriert
30.10.2012
Beiträge
41
Hallo,
Ich habe mir ein ARDUINO UNO gekauft und ein Ampel Programm geschrieben.
Habe nur folgendes Problem ich möchte das Haupt Programm und das Not/Nacht Programm mit einen schalter steuern.
Würde mich freuen wenn mir geholfen wird

Haupt Programm


int ledpinRot1=13;
int ledpinRot2=12;
int ledpinGelb1=11;
int ledpinGelb2=10;
int ledpinGruen1=9;
int ledpinGruen2=8;

void setup()
{
pinMode(ledpinRot1, OUTPUT);
pinMode(ledpinRot2, OUTPUT);
pinMode(ledpinGelb1, OUTPUT);
pinMode(ledpinGelb2, OUTPUT);
pinMode(ledpinGruen1, OUTPUT);
pinMode(ledpinGruen2, OUTPUT);
}

void loop()
{

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, HIGH);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, LOW);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, HIGH);
digitalWrite(ledpinGruen2, LOW);
delay(50000);

digitalWrite(ledpinRot1, LOW);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, HIGH);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, HIGH);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, LOW);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, HIGH);
delay(50000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, LOW);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, HIGH);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);


}




Not/Nacht Programm

int ledpinRot1=13;
int ledpinRot2=12;
int ledpinGelb1=11;
int ledpinGelb2=10;
int ledpinGruen1=9;
int ledpinGruen2=8;

void setup()
{
pinMode(ledpinRot1, OUTPUT);
pinMode(ledpinRot2, OUTPUT);
pinMode(ledpinGelb1, OUTPUT);
pinMode(ledpinGelb2, OUTPUT);
pinMode(ledpinGruen1, OUTPUT);
pinMode(ledpinGruen2, OUTPUT);
}

void loop()
{
digitalWrite(ledpinGelb1, HIGH);
digitalWrite(ledpinGelb2, HIGH);
delay(2000);

digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
delay(2000);
}
 
int ledpinRot1=13;
int ledpinRot2=12;
int ledpinGelb1=11;
int ledpinGelb2=10;
int ledpinGruen1=9;
int ledpinGruen2=8;
int setNotpin=7;
int schalter=HIGH;

void setup()
{
pinMode(ledpinRot1, OUTPUT);
pinMode(ledpinRot2, OUTPUT);
pinMode(ledpinGelb1, OUTPUT);
pinMode(ledpinGelb2, OUTPUT);
pinMode(ledpinGruen1, OUTPUT);
pinMode(ledpinGruen2, OUTPUT);
pinMode(setNotpin, INPUT);
}

void loop()
{
schalter = digitalRead(setNotpin);
if (schalter == LOW)
{
Not_Nacht_Programm;

}

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, HIGH);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, LOW);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, HIGH);
digitalWrite(ledpinGruen2, LOW);
delay(50000);

digitalWrite(ledpinRot1, LOW);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, HIGH);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, HIGH);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, HIGH);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, LOW);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, HIGH);
delay(50000);

digitalWrite(ledpinRot1, HIGH);
digitalWrite(ledpinRot2, LOW);
digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, HIGH);
digitalWrite(ledpinGruen1, LOW);
digitalWrite(ledpinGruen2, LOW);
delay(5000);
}


void Not_Nacht_Programm()
{
digitalWrite(ledpinGelb1, HIGH);
digitalWrite(ledpinGelb2, HIGH);
delay(2000);

digitalWrite(ledpinGelb1, LOW);
digitalWrite(ledpinGelb2, LOW);
delay(2000);
}


Änderungen in Gelb

Pin 7 mit dem Arbeitskontakt eines Schalterverbinden. Der andere Pol des Schalters an Minus.
Pin 7 gleichzeitig über 10 K-Ohm an Plus 5 Volt.
 
Moin, moin...

Ich möchte noch eine Alternative zur Programmierung anbieten.

Aktuell hat das Programm den Nachteil, dass ein Wechsel zwischen den Programmen u. U. sehr lange dauert, da die Programme mit delays realisiert wurden. diese haben das Problem dass sie die Ausführung des Programms blockieren.

Ich empfehle eine zeitlich gesteuerte Realisierung. So kann man die einzelnen Phasen auch unterbrechen und die Programme wechseln.

So könnte dies von der Struktur her aussehen:

int Programmstatus = 0;
int Programmwahl = 0;// 0 = Normal, 1 = Notschaltung
long NaechsteAktion = millis(); // initialisieren mit der aktuellen Zeit.

loop()
{
// pruefen ob ein Wechsel des Programms vorliegt
int nWahl = ( digitalRead(NotPin) == HIGH ? 1 : 0);
if ( nWahl != Programmwahl )
{
ProgrammStatus = 0; // Programmstatus zurueck setzen
Programmwahl = nWahl;
NaechsteAktion = millis() - 10; //dafuer sorgen dass sosfort ein wechsel stattfindet
}

if ( millis() > NaechsteAktion )
{
// es gibt etwas zu tun
switch ( Programmwahl)
{
case 0:
if ( Programmwahl == 0)
{
erster status Normalprogramm
ProgrammStatus++; // naechsten Programmststus...
NaechsteAktion = millis() + 5000; // ... in 5 Sekunden ausführen
}
else
{
erster Status Notprogramm
}
break;

case 1:
// 2. Teil des Programms schalten
usw...
case 2:
// 3. Teil schalten..
usw...
case 3:
usw...
}

// Am ende der ()
delay(20); // ansonsten läuft der Prozessor dauerhaft auf 100%

}

Im letzten Status des jeweiligen Programms musst Du den Status auf 0 setzen statt ihn zu erhöhen.

Diese Methode hat 2 Vorteile:
1. Das Programm reagiert sofort auf Programmwechsel
2. Du kannst nebenher noch weitere Funktionen realisieren indem Du einfach weitere Stati und Variablen für Zeitstempel einbaust.
 
Richtig Peter, er könnte auch ganz einfach mit einem Interupt arbeiten,
aber ich war davon ausgegangen das er (Name????) eine Lösung wie diese noch nicht versteht, denn sonst hätte er nach meinem Gefühl auch gewusst, dass und wie man ein Unterprogramm anwendet.
Ich denke da musst du ihm schon das ganze Programm aufführen, und nicht nur den Lösungsansatz.
Wenn es nicht so ist kann mich ????? ja gerne korregieren.
 
Moin Winni,

ich hatte nur kurz skizziert, aber ich kann auch gerne das volle Programm liefern.

allerdings ist ein selbst erarbeitet Programm um einiges besser :)

Ich stelle mich Herrn/Frau ????? gerne bei Rückfragen zur Programmierung zur Verfügung.

Noch ein Hinweis zu Interrupts: Man sollte die Ausführungszeit der Interrupts möglichst kurz halten und sich auf logische Operationen beschränken, da der Interrupt die komplette Programmausführung anhält.

Je nach verwendeter Library können Calls in Interrupts auch zu Blocking calls werden wenn diese Funktionen wiederum auf eine Interruptsteuerung zurückgreifen.

Das Schalten von ein paar digitalen Ausgängen sollte im Interrupt sicherlich kein Problem sein, aber die Callback Routine sollte nicht ausarten und zu umfangreich werden.

Meine Vorgehensweise ist in der Regel aufgeteilt.

In der Interrupt Routine berechnet die Stati. Nach dem Setzen der Stati setze ich eine Variable "StatiSetzen". Die loop() Funktion prueft diese Variable und schaltet alles entsprechend der Stati.
 
... Aber das ist das Schöne an der Arduino Platine...

Man kann mit einfachen Befehlen sehr schnell sehr viel erreichen und sich nach und nach steigern...

Es stellt eine wunderbare Brücke zwischen der reinen Programmierung und der Elektrotechnik dar.
 
So ist es, Peter.
Warten wir mal ab was ??? dazu meint.
 
Danke euch beiden für die Hilfe,
Bei der Idee von Peter ist gut aber ich habe das ein oder andere nicht genau verstanden z.B wie wird der Schalter angeschlossen. Wenn möglich kann man es mir noch genauer erklären?

Gruß Kai
 
Moin Kai,

direkt vorab erst einmal zwei Buchtipps:

Für den Einstieg : Erik Bartmann - Die elektronische Welt mit Arduino entdecken -ISBN : 978-3-89721-319-7
Dieses Buch führt nicht nur in die Arduino Programmierung ein, es liefert auch sehr detailliert Grundlagen zu den benötigten elektrischen Bauteilen.

Für Fortgeschrittene : Michael Margolis - Arduino Kochbuch -ISBN : 978-3-86899-353-0
Das Buch liefert sehr viele Ideen zur Anwendung, z. B. zur drahtlosen Datenübertragung

Den Schalter schließt Du wie folgt an:

5V Pin -> Schalter -> Pin7
GND -> 10K Widerstand -> Pin7

Der Widerstand sorgt für ein stabiles LOW Signal wenn der Schalter nicht geschaltet ist. Andernfalls misst die Platine zufällige Werte am Pin7 , die durch Zufall auch mal ein HIGH sein können.

Meine Idee ist im Grunde eigentlich ganz einfach. Anstatt Pins zu schalten, zu warten, wieder zu schalten, zu warten, ... etc.... geht meine Idee einen anderen Weg.

Es gibt eine Funktion millis() welche die Anzahl Millisekunden seit dem Start der Platine liefert. Diese kann man für Zeitmessungen prima verwenden.

Anstatt die Aktionen in einer sog. seriellen Verarbeitung nacheinander durchzuführen, merke ich mir einfach die Zeit wann die nächste Aktion durchgeführt werden soll. Ist die Zeit noch nicht erreicht tut die loop() Funktion nichts anderes als "leer" zu laufen. Dabei prüft sie immer wieder ob die Zeit nun endlich reif ist. Wenn die Zeit reif ist, wird eine Aktion durchgeführt, die neue Zeit für die nächste Aktion gesetzt und die Kennung für die nächste Aktion definiert. Aufgrund der Kennung weiß das Programm was zur gegebenen Zeit zu tun ist und welche neue Wartezeit zu setzen ist.

Wie schon geschrieben hat diese Methode den Vorteil dass man beliebig viele parallele Aktionen gleichzeitig bearbeiten und steuern kann.

Ich empfinde es in der Entwicklung als sehr wichtig dass der Entwickler seinen Code entweder selbst schreibt und entwickelt (mal abgesehen von eingebundenen Libraries). Daher möchte ich hier keinen komplett fertigen Quelltext einstellen, sondern möchte Dich gerne bei der Entwicklung Deines Projekts mit Tipps, Ratschlägen und Informationen unterstützen um Dich in die Lage zu versetzen Deinen Code in Eigenregie zu entwickeln und wachsen zu lassen.
 
Hallo Peter
Noch eine kleine frage: Kann ich mein altes Programm dann in der Idee von dir noch nutzen?
Wenn Ja wo muss ich es dann einsetzen?
Gruß Kai
 
Moin Kai,

Du müsstest Deine Schaltbefehle in die einzelnen "case" Anweisungen der Switch Anweisung einsetzen und mit dem Setzen des neuen ProgrammStatus und der neuen Zeit ergänzen.

Meine Idee würde Deinen Code in der loop() Funktion ersetzen.
 

Servonaut
Zurück
Oben Unten