sowas in der art habe ich für mich gesucht bzw. für meine mopete.
zwar brauch ich nur 2 tasten (die originalen li und re schalter), aber das kann man ja ändern.
den sketch von jurs freudestrahlend gleich in die IDE kopiert und mal gleich verifizieren gedrückt.
(ohne hardware aufbau)
Blinker_Luxus.ino: In function 'void blinkTask()':
Blinker_Luxus:148: error: invalid initialization of reference of type 'byte& {aka unsigned char&}' from expression of type 'boolean {aka bool}'
Blinker_Luxus:54: error: in passing argument 4 of 'void handleStateChange(byte, byte&, long unsigned int&, byte&)'
Blinker_Luxus:149: error: invalid initialization of reference of type 'byte& {aka unsigned char&}' from expression of type 'boolean {aka bool}'
Blinker_Luxus:95: error: in passing argument 4 of 'void handleBlinkState(byte, byte&, long unsigned int, byte&)'
invalid initialization of reference of type 'byte& {aka unsigned char&}' from expression of type 'boolean {aka bool}'
kann es sein, das die IDE 1.6.5 nicht kompatibel mit dem sketch ist. bzw umgekehrt oder haben sich befehle geändert?
beide varianten hab ich jeweils geändert, und beide funktionieren.
zumindest kommt beim verify kein fehler.
ich muss das noch hardware maßig nachbauen.
was mich natürlich interessiert, was löst das eine, bzw. das andere aus.
warum kann ich diese eine fehlermeldung auf 2 versch. arten lösen?
Arduino ist C++, also ist die bool Variante die richtige, wenn man binäre/logische Zustände meint.
In C Zeiten hat man da char oder unsigned char verwendet. Hier wäre auch unit8_t möglich. (was dann das byte meint, wie wir es hier kennen)
Hat wie gesagt historische Gründe. C hatte bis C99 keinen richtigen boolschen Datentyp. Also hat man unsigned char genommen. Das bringt aber bei manchen Konstrukten gewisse Probleme mit sich, da die Variable dann andere Werte als nur 0 und 1 annehmen kann.
In C++ (und später dann C99) wurde dann bool eingeführt damit das konsistent ist. bool ist immer nur 0 oder 1 und wenn man etwas größeres zuweist wird der Wert automatisch auf 1 gekürzt.
In der Arduino Software hat man dann aus irgendeinem unerfindlichen Grund die C Konvention übernommen einfach einen unsigned char für einen boolschen Datentyp zu nehmen. Obwohl gcc auch bool hat. Und dann hat man es auch auch noch boolean genannt. Eventuell damit es gleich wie in Processing ist, was auch Java basiert.
In 1.6.0rc2 hat man dass dann endlich mal geändert und boolean ist jetzt bool statt unsigned char. War an sich keine große Sache und byte/bool sind zu einem gewissem Grad miteinander kompatibel, aber bei ein paar Sachen wie hier Referenzen nicht.
kann es sein, das die IDE 1.6.5 nicht kompatibel mit dem sketch ist. bzw umgekehrt oder haben sich befehle geändert?
Ja, das kann bei Arduino Sketchen leider sein. Man findet viel, aber älteres macht gerne mal Probleme. Besonders, wenn die Dinger noch in .pde Dateien sind, ist das ein Zeichen, dass es mal für Version 0.x geschrieben wurde, als es noch keine arduino.h gab. ( Wenn du mal #include "WProgram.h" siehst )
Inzwischen wird auch ein neuerer avr-gcc Compiler verwendet, der viele Vorteile bietet, aber ...
Da bei openSource ja alles offen ist, lernt man eine Menge bis alles wieder geht
Schonmal .write(0); probiert oder gesehen ?
Beliebt sind auch fehlende const bei Daten im Flash-Speicher. War früher nicht nötig, und wurde daher selten gemacht, auch wenn es schon immer richtiger gewesen wäre.
Dass es ausgerechnet einen "Luxus Blinker von Jurs" trifft, ist schon hart.
bin auch auf den Luxus Blinker aufmerksam geworden und wollte diesen einfach mal auf einen UNO laden,
babei kommt diese Fehlermeldung:
Arduino: 1.8.3 (Windows 10), Board: "Arduino/Genuino Uno"
C:\..\Luxus_4_Tasten_Blinker\Luxus_4_Tasten_Blinker.ino: In function 'void blinkTask()':
Luxus_4_Tasten_Blinker:146: error: invalid initialization of reference of type 'byte& {aka unsigned char&}' from expression of type 'long unsigned int'
C:\..\Luxus_4_Tasten_Blinker\Luxus_4_Tasten_Blinker.ino:52:6: note: in passing argument 4 of 'void handleStateChange(byte, byte&, long unsigned int&, byte&)'
Luxus_4_Tasten_Blinker:147: error: invalid initialization of reference of type 'byte& {aka unsigned char&}' from expression of type 'long unsigned int'
C:\..\Luxus_4_Tasten_Blinker\Luxus_4_Tasten_Blinker.ino:93:6: note: in passing argument 4 of 'void handleBlinkState(byte, byte&, long unsigned int, byte&)'
exit status 1
invalid initialization of reference of type 'byte& {aka unsigned char&}' from expression of type 'long unsigned int'
Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.
Tommy56:
Es wäre sinnvoll gewesen, den Thread auch zu lesen, nicht nur zu kapern. Er beantwortet bereits genau Deine Frage.
Gruß Tommy
Hallo Tommy, danke für deinen Hinweis, gelesen hab ich das alles schon nur hab ich mich schwer getan es umzusetzten da ich leider noch ein absoluter Frischling im Programmieren bin.
mittlerweile konnte ich mich aber soweit in den Code einarbeiten damit ich beide Lösungsansätze umsetzten konnte und diese Funktionieren nun auch.
skorpi080:
@Joe-muc
Nimm die ClickButton Library, die ist das richtige für euer Projekt.
Es gibt auch noch die OneButton.
Hallo skorpi80,
damit hast du schon recht habe selbst schon damit rumgespielt, aber die intension warum ich mir diesen Code näher betrachten will ist eine ganz andere.
Wie schon gesagt bin ich erst seit ein paar Tagen am programmieren und habe mich schon bei den ersten Schaltungen des Starter Kit´s an den Delay Befehlen gestört, da ich mit diesen ja alle weiter Befehle im Loop verzögere und während der Delay-Zeit auch nichts weiter verarbeitet werden kann.
Deswegen ich, nach für mich interessanten Programmen gesucht habe und Lösungen von euch wie man sowas eleganter umsetzt.
Aufgefallen ist mir hierbei des öffteren jurs und auch sein EVA Prinzip, was ich auch von programmieren von SPS´n her kenne. Den Luxus Blinker von ihm fand ich recht gelungen und wollte ihn testen um anschließen den Code durcharbeiten zu könnem um diesen zu verstehen und lernen zu können.
Ich denke seine Art zu Programmieren ist sehr gut durchdacht und effektiv.....!?
Darf ich anbei fragen ob es expliziet zum Programmieren lernen gute Fachliteratur gibt die ihr mir empfehlen könnt?
combie:
Das stimmt so, absolut formuliert, nicht!
Aus mindestens 2 Gründen.
Warum? Ein Delay hält doch eine Loopschleife für eine bestimmte Zeit an und in dieser können keine weiteren Abfragen oder Handlungen erfolgen, oder? Erst wenn diese Zeit um ist können wieder andere Signale erfass und verarbeitet werden....!?
Warum? Ein Delay hält doch eine Loopschleife für eine bestimmte Zeit an und in dieser können keine weiteren Abfragen oder Handlungen erfolgen, oder? Erst wenn diese Zeit um ist können wieder andere Signale erfass und verarbeitet werden....!?
Einen der Gründe hat Serenifly schon genannt.
Hier ist der Zweite:
Erst raten, wie die Ausgabe aussehen wird, dann ausprobieren.
Um das zu verstehen muss man aber in wiring.c schauen was delay() genau macht und in hooks.c schauen wie yield() deklariert ist (und dann nachschlagen was das "weak" Attribut macht)
@Joe-muc:
Hoffentlich hast du die Experten-Tips halbwegs kapiert. Oder dich wenigstens nicht hast irre machen lassen.
Interrupt-Routinen weil loop im delay hängt, ist kein ernstgemeinter Tip, sondern generell Unsinn.
Die Experten haben natürlich auf ihrem Level auch Recht, aber dein Argument gegen delay() ist vollkommen richtig. Meist wird hier mühsam versucht, Leuten das delay() abzugewöhnen und klarzumachen, dass ein loop-Durchlauf nicht den kompletten Programm-Ablauf lang dauern sollte. Das hast du perfekt selbst erkannt.
Es hat schon seinen Grund, dass yield() nicht in der Arduino-Referenz erwähnt wird. Man kommt natürlich auch ohne aus, wenn man delay nicht (oder nur sparsam und bewusst) verwendet.
Wie Thread-Kapern richtig geht, haben Serenifly und combie dir hoffentlich gezeigt 8)