Forum: Mikrocontroller und Digitale Elektronik Ampelschaltung - Arduino


von E. S. (e_s)


Angehängte Dateien:

Lesenswert?

Ein schönen guten Tag an Alle. Ich bitte um Eure Hilfe.
Mit der beigefügten Ampel-Schaltung möchte ich durch die Betätigung des 
Schalters von Rot auf Grün schalten. Ich habe gelesen dass Pin 3 nicht 
floaten darf und daher habe ich es mit allen drei Methoden versucht 
(INPUT_PULLUP, INPUT mit externem 10K-PULLUP und INPUT mit externem 
10K-PULLDOWN) versucht. Ich nehme an es ist ein Fehler im Sketch denn 
ich bekomme Dauer-Rot bei Default-LOW  und Blinkendes-Grün bei 
Betätigung der Taste (HIGH) und das entspricht aber nicht der Intention 
im Sketch. Rot sollte blinken und Grün sollte nicht blinken zumindest 
solange die Taste gedrückt wird.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

E. S. schrieb:
> Ich habe gelesen dass Pin 3 nicht floaten darf
Und jetzt solltest du drüber nachedenken: warum? Und wie ist der Pin 3 
denn jetzt tatsächlich beschaltet?

> daher habe ich es mit allen drei Methoden versucht
Man "versucht" nicht blind irgendwas und hofft, dass es dann irgendwie 
schon tun wird, sondern man analysiert das Problem und macht es 1 
einziges Mal. Und dann gleich richtig.

Nur zur Sicherheit: sind eigentlich auf der LED-Platine Vorwiderstände 
für die LEDs drauf?

> bei Betätigung der Taste (HIGH)
Und: ist der Port auch tatsächlich "high", wenn du die Taste betätigst? 
Was zeigt das Multimeter in diesem Fall an?

> Ampel-Sketch.jpg
Ja, klar. Sourcecode als Screenshot. Und zudem nur Fragmente vom 
Programm! Das tu ich mir nicht an. Kopier den Code hier rein und schreib 
[c] Tags drumrum.

: Bearbeitet durch Moderator
von Martin V. (oldmax)


Lesenswert?

Hi
Ok, Grundlagen Ampelsteuerung
1. Taster entprellen, damit nicht unkontrollierte Impulse gelesen 
werden.
2. Signalflanken erfassen, also das Ereignis Taster gedrückt oder 
losgelassen
3. Schrittsteuerung nach Wunsch, also bei jedem Tasterdruck eins 
weiterschalten, z,B. Ampelstatus = Zähler
Status 0 = Rot
Status 1 = Rot + Gelb
Status 2 = Grün
Status 3 = Gelb
Status 4 = Status 0
Wär mal so mein Vorschlag. Wenn dann noch was blinken soll, dann eben 
einen weiteren Schrit einfügen und bearbeiten.
Eine Kreuzung hat entsprechend mehr Schritte, je nachdem was da alles 
gesteuert werden soll.
Einfach:
                              Richtung 1      Richtung 2
Schritt 0:                      Rot an           Rot an
Schritt 1:                      Rot+Gelb an      Rot an
Schritt 2:                      Grün an          Rot an
Schritt 3:                      Gelb an          Rot an
Schritt 4:                      Rot  an          Rot an
Schritt 5:                      Rot an           Rot + Gelb an
Schritt 6:                      Rot an           Grün an
Schritt 7:                      Rot an           Gelb an
Schritt 8 = Schritt 0:          Rot an           Rot an
 Falls noch Fußgänger oder Abbiegespuren einfließen sollen, kannst du 
dir so eine Schritttabelle erstellen und danach dein Programm aufbauen.

Sorry, das ich dir mit C nicht helfen kann, aber das ist nicht meine 
Welt.

Gruß oldmax

von ❀❀❀❀❀❀❀❀ (Gast)


Lesenswert?

"{" "}"

Die beiden fehlen im Code.

von ❀❀❀❀❀❀❀❀ (Gast)


Lesenswert?

Und Du macht Grün nicht aus, wenn der Taster nicht mehr gedrückt ist.

von ❀❀❀❀❀❀❀❀ (Gast)


Lesenswert?

E. S. schrieb:
> Ich nehme an es ist ein Fehler im Sketch denn
> ich bekomme Dauer-Rot bei Default-LOW  und Blinkendes-Grün bei
> Betätigung der Taste (HIGH) und das entspricht aber nicht der Intention
> im Sketch.

Wenn Du mit Pullup arbeitest und einen Schließer gegen GND verwendest, 
bedeutet die grdrückte Taste LOW.

Wenn die falsche LED blinkt, hast DU die LEDs vertauscht oder die 
Pinbezeichnungen im Code.

von Dirk B. (dirkb2)


Lesenswert?

Wenn ich das richtig sehe, schaltet der Taster zwischen 5V (High) und 
GND(Low) um.

Einfacher:
Mit dem Pullup ziehst du die Leitung auf High Potenzial.
Der Schalter macht dann nur einen Kurzschluss vom Pin nach GND.
Du brauchst nur einen einfachen Schalter, keinen Umschalter.

von Martin V. (oldmax)


Lesenswert?

Hi
Lothar M. schrieb:
> Man "versucht" nicht blind irgendwas und hofft, dass es dann irgendwie
> schon tun wird, sondern man analysiert das Problem und macht es 1
> einziges Mal. Und dann gleich richtig.
Nun ja, Anfänger machen trotz "Analyse" Fehler und setzen oftmals neu 
auf. Nicht jeder hat ein Studium und ist entsprechend geschult, um 
strukturiert vorzugehen. Aber es ist schon richtig, anhand der Bilder 
ist von der Beschaltung nicht wirklich was zu erkennen. Daher gebe ich 
auch immer den T´rat, das eine Skizze hilfreich ist, nicht nur, um sie 
hier zu veröffentlichen, sondern auch für einen selbst. Mit einer Skizze 
lassen sich dann auch Fehler vermeiden, die mit einer drauflos 
gesteckten Schaltung halt passieren.
Oberflächlich gehts mit Papier und Bleistift, etwas schöner, aber auch 
schnell, mit Paint, wenn keine Zeichenprogramme verfügbar sind.

Gruß oldmax

von Falk B. (falk)


Lesenswert?

E. S. schrieb:
> Ein schönen guten Tag an Alle. Ich bitte um Eure Hilfe.

Siehe Netiquette.
Quelltext immer im Original und vollständig als Anhang.
Außerdem siehe Entprellung und Statemachine.
Weiterhin fehlt ein Schaltplan deines Aufbaus.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin V. schrieb:
> Nun ja, Anfänger machen trotz "Analyse" Fehler und setzen oftmals neu
> auf.
Ja, man darf ja Fehler machen. Aber man muss auch daraus lernen. Oder es 
wenigstens versuchen.
Wenn man an einer Schraube "dreht" und verschiedene Eingangsmodi 
"ausprobiert", dann sollte man sich überlegen, ob die Ergebnisse 
plausibel sind und was dieses "schraubendrehen" denn nun bewirkt hat. 
Und warum es nichts bewirkt hat, obwohl man eine Wirkung erwartet hätte.

Und man sollte Probleme aufteilen.
Hier heißt das: erst mal 1.) definiert eine LED ein- und auszuschalten 
(ganz ohne "Blinkenlights" usw...). Und dann 2.) einen Taster 
einzulesen, dessen Zustand mit der zuvor zur Funktion gebrachten LED 
angezeigt wird. Und dann 3.) mal die Sache mit dem Blinken angehen. Und 
dann 4.) nur blinken, wenn der Taster gedrückt ist.

Mit dem bis dahin erworbenen Wissen kann man die Ampel dann per 
delay_ms() leicht selbst zum Laufen bekommen.
Und dann kann man die Ampel verbessern und sich die Sache mit der 
Zeitberechnung per millis(), den Zustandsmerkern und den Automaten 
antun.

: Bearbeitet durch Moderator
von E. S. (e_s)


Lesenswert?

Ich möchte mich bei Allen bedanken die mir mit Tips helfen wollten, auch 
wenn manche Kritik nicht konstruktiv war. Ich habe eine Lösung gefunden 
und möchte diese Erfahrung mitteilen. Die Schaltung egal ob interner 
pullup, externer pullup or pulldown sind alle geeignet sofern technisch 
korrekt durchgeführt, auch der Programcode war an sich nicht fehlerhaft.
Zum einen habe ich entdeckt, dass das Blinken mit dem eingebauten LED 
synchron war und dass diese auf den Schalter reagierte obwohl diese in 
gar keiner Weise angesprochen wurde. Zum anderen habe ich noch 
herausgefunden, dass bei jedem Durchlauf des Loops, die im vorherigen 
Durchlauf im "If-Teil" auf HIGH gestellte Led OHNE den entsprechenden 
Code "digitalWrite(led, LOW)" kurioserweise dennoch automatisch auf LOW 
gestellt wird und dann bei der erneuten Ausführung des "If-Teils wieder 
auf HIGH gestellt wird und so das Blinken Zustande kommt.
Das Problem habe ich gelöst in dem ich die IF-ELSE Struktur mit einer DO 
WHILE Schleife ersetzt habe. Diese wird erst beim Tastendruck verlassen 
und die LED blinkt innerhalb dieser Schleife nicht. Der Code sieht so 
aus:
// z.B. Ampel auf rot gestellt dauerhaft ohne blinken
do { digitalWrite(led_g, LOW);digitalWrite(led_r, HIGH); }
while ((digitalRead(taster)==1));
// nach Tastendruck auf grün gestellt für 500 ms
digitalWrite(led_g, HIGH);
digitalWrite(led_r, LOW);
delay(500);

von Rainer S. (enevile) Benutzerseite


Lesenswert?

E. S. schrieb:
> Zum einen habe ich entdeckt, dass das Blinken mit dem eingebauten LED
> synchron war und dass diese auf den Schalter reagierte obwohl diese in
> gar keiner Weise angesprochen wurde.

Hört sich nach einen schönen Kurzschluss an und die Spannung bricht weg.


E. S. schrieb:
1
 // z.B. Ampel auf rot gestellt dauerhaft ohne blinken
2
 do { digitalWrite(led_g, LOW);digitalWrite(led_r, HIGH); }
3
 while ((digitalRead(taster)==1));
4
 // nach Tastendruck auf grün gestellt für 500 ms
5
 digitalWrite(led_g, HIGH);
6
 digitalWrite(led_r, LOW);
7
 delay(500);
Lothar M. schrieb:
> Kopier den Code hier rein und schreib
> [c] Tags drumrum.

Ich kann mich nur den Vorredner anschließen. Was auch gut ist um es zu 
verstehen ist einen Schaltplan zu zeichnen! Nur dann kann man 
nachvollziehen was geschieht.

Auf Fragen gehst du nicht ein? Die bringen vorallem bei **dir** Licht 
ins Dunkle.

von Adam P. (adamap)


Lesenswert?

E. S. schrieb:
1
// z.B. Ampel auf rot gestellt dauerhaft ohne blinken
2
do { digitalWrite(led_g, LOW);digitalWrite(led_r, HIGH); }
3
while ((digitalRead(taster)==1));

Wer so ein Code schreibt, der frisst auch kleine Kinder...

Falk B. schrieb:
> Außerdem siehe Entprellung und Statemachine.

Dies wurde dir nicht umsonst nahe gelegt.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

E. S. schrieb:
> kurioserweise dennoch automatisch auf LOW
> gestellt wird

Kurios heißt also, Du hast in keinster Weise verstanden, was Du da 
verzapft hat.

E. S. schrieb:
> Das Problem habe ich gelöst

Was man nicht verstanden hat, kann man erst recht nicht lösen.
Du hast also nur irgenwas ausprobiert, was den Fehler nicht mehr zu 
zeigen scheint.

Wenn Du Code zeigen willst, dann als Dateianhang compilierbar und nicht 
als Schipselchen aus dem Zusammenhang herausgerissen.

von Martin V. (oldmax)


Angehängte Dateien:

Lesenswert?

Hi
E. S. schrieb:
> Ich habe eine Lösung gefunden
> und möchte diese Erfahrung mitteilen.
So, so, eine Lösung hast du gefunden junger Freund.
Also, ich sehe keine Lösung, denn du hast nichts verstanden. Nach wie 
vor sitzt du auf deinem alten Gaul. Du hast es nicht geschafft, eine 
kleine Skizze anzufertigen, deine Tastereingabe zu entprellen und eine 
Flankenauswertung zu erstellen. So wird das nix, da kannst du noch lange 
knobeln.
Ich mach dir mal einen Vorschlag mit einer Skizze in Paint. So ungefähr 
könnte ein Arbeitsblatt aussehen. Bei der Verwendung der internen 
Pull-Up Widerstände macht es Sinn, die Tastersignale beim Einlesen zu 
drehen. So ist dann auch ein gedrückter Tster "1" und nicht "0".
Das Entprellen ist hier schon so oft behandelt worden und auch die 
Flankenbildung, das ich das jetzt nicht nochmal wiederholen möchte. Mach 
dir bitte selbst die Mühe und geh auf die Suche.
Und ja, noch was, du solltest hier schon zeigen, das dir die Hilfen 
wertvoll sind und du diese beachtest. Wenn du weiterhin den ein oder 
anderen Rat ignorierst, werden die Töne dann schon mal etwas rauher.
Gruß oldmax

von E. S. (e_s)


Angehängte Dateien:

Lesenswert?

Gerne reiche hier die Schaltung nach (pin 10 und 11 als output, pin 6 
als INPUT_PULLUP konfiguriert. Zur Entprellung, JA danke, da habe ich 
etwas nützliches von dir gelernt, habe mich auch darum beim testen 
meines Schaltkreises entsprechend mit einem delay (20) und einer 
nochmaligen Abfrage gekümmert. Hat aber gegen das Blinken nicht 
geholfen.

von E. S. (e_s)


Lesenswert?

Du hast es genau erfasst, ich gebe es gern zu ich habe es nicht ganz 
verstanden. Ich habe zumindest erkannt wie programtechnisch das Blinken 
entsteht und eine andere Lösung gefunden. Das schöne am Programmieren 
ist ja, das man mehrere Lösungen hat.

von E. S. (e_s)


Lesenswert?

tut mir leid, als Anfänger war ich etwas von den Kommentaren überfordert 
und daher auch nicht auf die Fragen antworten können. Ihr müsst ja 
bedenken, dass  die erste Antwort mich zurecht gewiesen hat:
Man "versucht" nicht blind irgendwas und hofft, dass es dann irgendwie
schon tun wird, sondern man analysiert das Problem und macht es 1
einziges Mal. Und dann gleich richtig.
Nach Experten-Meinung waren alle drei Schaltungen gleichwertig und in 
der Antwort fand ich nicht die 4. gleich Richtige. Also habe ich mich 
erstmals 24 Stunden, der Analyse by Probieren gewidmet.

von Cyblord -. (cyblord)


Lesenswert?

E. S. schrieb:
> Das schöne am Programmieren
> ist ja, das man mehrere Lösungen hat.

Wohl wahr! Es gibt immer ein paar Richtige und eine die Arduino-Nutzer 
implementieren.

von E. S. (e_s)


Lesenswert?

Klar du hast ja Recht. Am Anfang wusste ich nicht ob es an dem Code oder 
an der Schaltung oder es an beiden lag. Am Ende allerdings ging mir 
nicht mehr um die Schaltung, sondern wollte nur die programmtechnische 
Lösung zeigen. Meine Elektronik-Kenntnisse sind noch minimal. Das Bild 
mit der Schaltung habe ich gepostet um Diskrepanz zwischen dem was ich 
gemacht habe und einem wohl eher besser geplanten Schaltplan zu 
vermeiden.  Auf jeden Fall Danke für das Kommentar.

von Stefan F. (Gast)


Lesenswert?

E. S. schrieb:
> Gerne reiche hier die Schaltung nach

Hast du wirklich immer noch keine Vorwiderstände an den LEDs?

von E. S. (e_s)


Lesenswert?

Die Ampelmodule haben eingebaute Vorwiderstände, sorry mein Fehler ich 
habe nicht daran gedacht es extra zu erwähnen. Ich glaube im 
Originalpost im Photo sieht man dass es sich um einen kommerziellen 
Modul handelt.

von Joachim B. (jar)


Lesenswert?

E. S. schrieb:
> Ich glaube im
> Originalpost im Photo sieht man dass es sich um einen kommerziellen
> Modul handelt.

bedenke nicht jeder kennt ALLE Module dieser Welt und nicht JEDES Modul 
hat IMMER Widerstände auf dem PCB.

Ich nehme an das du auch Antworten möchtest von Menschen die das Problem 
verstehen, antworten könnten ohne das Modul zu kennen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.