ich bin neu hier. Bin sonst in der industrieller Automatisierung und Elektrotechnik tätig. Da ist es halt aber mit der SPS-Programmierung etwas anders...
Meine Arduino-Kenntnisse sind so dass ich ein Code nachvollziehen kann und die absoluten Grundlagen verstehe.
Jetzt versuche ich selbst was zu programmieren und erstelle erstmal einzelne "Bausteine", die ich teste.
Ich versuche eine Längenmessung zu erstellen, die mittels eines Encoders Länge eines Werkstückes an Säge misst und ausgibt, so eine Art "digitales Zollstock". Messung läuft soweit, OLED-Display auch.
Für die richtige Angabe muss aber die Breite des Sägeblattes berücksichtigt werden. Diese kann variieren und ich will nicht die jedes Mal über Programm speichern.
Da ich ohnehin ein OLED habe will ich 2. Encoder ansetzen. Mit Hilfe der OneButton-Lib und der Benutzung des Tasters am Encoder habe ich vor dass mit einem Click das Menü geöffnet wird wo ich die breite einstelle. Mit Loslassen nach langem Click soll eingestellter Wert gespeichert werden und das Menu geschlossen werden (wieder zurück in loop()). Mit einem Doppelklick soll das Menü einfach geschlossen werden (zurück ins loop() ohne speichern).
Nun funktionieren die einzelnen Aufrufe für sich genommen. Das Problem habe ich wenn ich per Click ins menuClick() reinkomme: wie kann ich es wieder über menuBack() oder menuBack() verlassen? Ich komme nicht auf die Idee wie ich die while-Schleife damit unterbrechen kann.
Habt ihr ein Rat?
Um es nicht unnötig zu verunstalten habe ich alles entfernt was nicht unbedingt der Übersicht dient.
Das Problem ist deine Endlos-while-Schleife. Da kommst so ohne weiteres nicht mehr raus.
Damit die OneButton Lib korrekt arbeitet, muss das button.tick() im loop immer wieder aufgerufen werden. Das verhinderst Du aber mit deiner while-Schleife, und deshalb wird darin kein weiterer Tastendruck erkannt.
Du musst lernen 'blockadefrei' zu programmieren. Da loop bereits eien Schleife ist, brauchst Du keine weitere.
Du kannst z.B. im menuClick ein Flag setzen, und wenn das Flag gesetzt ist, wird die Blattbreitenfunktion im loop aufgerufen ( nur mit einer if-Abfrage, ohne das while drumrum, loop 'schleift' ja sowieso ). Dann funktioniert auch die OneButton wieder, und Du kannst z.B. in menuBack das Flag wieder zurücksetzen, damit die Blattbreitenbestimmung im loop nicht mehr durchlaufen wird.
P.S. letztendlich funktioniert der Arduino auch nicht viel anders wie eine SPS. Da läuft das Programm auch immer im Kreis herum ( Stichwort 'Zykluszeit' ) und wird nie angehalten. In jedem Baustein wird geprüft, ob was zu tun ist, und wenn nciht geht's gleich zum nächsten.
MicroBahner:
a loop bereits eien Schleife ist, brauchst Du keine weitere.
Du kannst z.B. im menuClick ein Flag setzen, und wenn das Flag gesetzt ist, wird die Blattbreitenfunktion im loop aufgerufen ( nur mit einer if-Abfrage, ohne das while drumrum, loop 'schleift' ja sowieso ). Dann funktioniert auch die OneButton wieder, und Du kannst z.B. in menuBack das Flag wieder zurücksetzen, damit die Blattbreitenbestimmung im loop nicht mehr durchlaufen wird
Vielen dank für den Denkanstoss! Ich werde es mal umbaue dass Alle im Loop läuft und dann tatsächlich nur Flags über OneButton-Funktoionen gesetzt werden.
Vielen dank für die Anregungen und Tips!
Gruß,
Nico
benutzt werden, bei diversen Anleitungen sieht man aber true.
Und delay() hat sehr wohl seine Bereichtigung, weil Komponenten sonst nicht rechtzeitig bereit sind.
Warum nicht eine einfache Antwort auf eine Frage kommt, kann ich nicht so recht verstehen.
Ich bin zwar erst neu bei Arduino, habe aber sehr viele Anleitungen gelesen, ebenso Fragen und Antworten die es 'Anfängern' nur viel schwerer machen.
Klar kann man auch anders Programmieren, aber darum geht es hier doch nicht, sonst muste man jedem sagen er solle sich die Sprach-Referenz durch lesen.
yettiz:
Warum so kompliziert? Es geht so einfach:
......
Warum nicht eine einfache Antwort auf eine Frage kommt, kann ich nicht so recht verstehen.
Nein, es geht nunmal nicht so einfach. Das 'break;' hilft hier gar nichts. Das Problem liegt darin, dass durch die while-Schleife nicht mehr erkannt wird, wenn ein Taster gedrückt wird, und damit auch nicht fetgestellt werden kann, wann es Zeit für ein 'break;' ist.
sonst muste man jedem sagen er solle sich die Sprach-Referenz durch lesen.
Ob man das jedem sagen muss, ist eine Frage.
Aber ob man ohne lesen der Sprachreferenz klar kommt, ist keine Frage.
Darum machen es die meisten, ohne Hinweis, ganz automatisch.
Die gloable "run" Variable kann von jedem Programmteil geändert werden, der die Schleife starten oder stoppen soll.
Abgesehen davon sind Schleifen innerhalb von loop() meist Verständnis- oder Programmierfehler, sofern sie nicht unbedingt notwendig sind um das Timing schneller Abläufe (LED strips...) zu gewährleisten.