Luxus Blinker von Jurs

beim stöbern im WWW bin ich über diesen thread gestoßen.

http://forum.arduino.cc/index.php?topic=191069.0

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)

leider fehlermeldung:

Arduino: 1.6.5 (Windows XP), Platine: "Arduino Nano, ATmega328"

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?

lt. tread sollte der sketch doch laufen.

Boolean war früher ein typedef für unsigned char/byte. Jetzt ist korrekter (für C++) ein typedef auf bool.

Ändere die Parameter der angemeckerten Funktionen von byte& auf bool& oder boolean&. Dann sollte es passen

EDIT:
Nicht alle Parameter, sondern nur den vierten! Das erste byte& soll wohl tatsächlich ein Byte sein. Aber der letzte Parameter sollte bool& sein

Serenifly:
Ändere die Parameter der angemeckerten Funktionen von byte& auf bool& oder boolean&. Dann sollte es passen

Oder die Variablendeklaration ändern auf:

  static byte shortButtonPress=false;

danke an euch beiden.

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)

oha, ich muss noch viel lernen.

nun ja, bin ja auch noch nicht so lange dabei....

gut, dann werde ich das auf die bool variante ändern, wenn es die logische lösung ist.

vielen dank erst mal dafür.

was ich nur sehr schade finde, das nach fragestellungen nur sehr selten die ergebnisse gezeigt werden.

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 :wink:

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.

Hallo Community,

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.

Es wäre sinnvoll gewesen, den Thread auch zu lesen, nicht nur zu kapern. Er beantwortet bereits genau Deine Frage.

Gruß Tommy

Joe-muc:
Hallo Community,

bin auch auf den Luxus Blinker aufmerksam geworden und wollte diesen einfach mal auf einen UNO laden,
babei kommt diese Fehlermeldung:

Dieser Bericht wäre detaillierter, wenn die Option

"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

hast du denn das gemacht, was in der Fehlermeldung steht ?

@Joe-muc
Nimm die ClickButton Library, die ist das richtige für euer Projekt.
Es gibt auch noch die OneButton.

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?

Gruß Joe

und während der Delay-Zeit auch nichts weiter verarbeitet werden kann.

Das stimmt so, absolut formuliert, nicht!
Aus mindestens 2 Gründen.

Die verwendete Sprache ist C++.
Da gibts Berge an Literatur.
Ein gutes Buch, ist eins, welches man versteht.

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....!?

Interrupts gehen in der Zeit

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.

void setup()
{
   Serial.begin(9600);
}


void loop()
{
  delay(1000);
  Serial.println("Loop Durchlauf");
}


void yield()
{
   Serial.println(millis());
}

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)

Ja!
Das ist doch mal eine gute Übung.

@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)