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.
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
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
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.
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.
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
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.
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
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);
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.
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
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.
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
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.
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.
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.
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.
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.
E. S. schrieb: > Gerne reiche hier die Schaltung nach Hast du wirklich immer noch keine Vorwiderstände an den LEDs?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.