joerg1972:
Hm, ich hab gestern noch ein bißchen probiert und versucht mit der Analyse aus anderen Bsp.: herauszufinden wie ich einen blickkanal und einen fadekanal schreiben kann. Dabei hab ich mir das Blinkexampel und das Fadexample rausgesucht.
Das sind zwei Beispiele, wie sie für die zur Arduino-Software mitgelieferten Programmbeispiele typisch sind: Sie zeigen, wie irgendwas geht, sind aber vom Prinzip her total unbrauchbar für irgendwelche praktischen Zwecke. Die Beispiel sind voll der Griff ins Klo.
Die Unbrauchbarkeit dieser Beispiele kommt von der verwendeten "delay()" Funktion. Delay-Aufrufe blockieren die gesamte Programmausführung für eine bestimmte Zeit. Das mag für einige wenige nicht-interaktive Programme tatsächlich praktikabel sein, aber für Programme, die entweder
- interaktiv bedienbar sein sollen oder
- verschiedene Hardware nahezu "gleichzeitig" ansteuern sollen
ist "delay" eine Funktion, die nicht verwendet werden darf. Interaktive Programme, und Programme die Dinge gleichzeitig tun sollen, dürfen in der Programmausführung nicht blockiert werden, sondern müssen im "kooperativen Multitasking" laufen.
joerg1972:
muß ich die leds als int angeben oder als const int???
Hardware-Pins im Programm, die sich zur Programmlaufzeit nicht ändern, definiere ich immer per #define Makro, z.B.:
#define LEDPIN 13
Im Gegensatz zu einer Variablendeklaration mit "int" oder "const int" belegt das Makro keinen RAM-Speicherplatz. Ein define-Makro funktioniert so, dass vor der eigentlichen Kompilierung ein "Präprozessor" unsichtbar im Hintergrund ein Suchen und Ersetzen über den Quelltext laufen läßt. Dabei würde dann überall wo "LEDPIN" steht, tatsächlich "13" im Quelltext eingesetzt werden und das Programm erst danach kompiliert. Der bearbeitete Quelltext ändert sich dabei nicht.
Als Merkhilfe, dass ein Ausdruck ein Makro und keine Variable ist, bietet es sich an, Makros immer groß zu schreiben. Denn wenn man sich irgendwo vertippt, etwa beim Makro, können sonst im merkwürdige und kaum erklärbare Fehler beim Kompilieren auftreten, wenn man nicht weiß, dass es sich um ein Makro handelt, das man dann überprüfen müßte.
joerg1972:
Und im setup als output deklarieren denke ich mal.
Ausgänge, die per "digitalWrite" geschaltet werden sollen, müssen vorher auf OUTPUT gesetzt werden.
Bei Ausgängen, die per "analogWrite" auf eine PWM-Ausgabe geschaltet werden sollen, ist das aber nicht erforderlich.
joerg1972:
Nur hab ich es nicht hinbekommen wo der fadekanal hingehört; setup oder loop.
muß ich dem selber einen Namen geben und dann den Inhalt in Klammern setzen, so dass er dann immer wieder abgerufen werden kann???)
Arduino-Sketche sind C++ Programme. Du müßtest Dir mal dringend ein paar Grundkenntnisse der Programmierung aneignen.
Programme bestehen aus Funktionen, die aufgerufen werden. Es gibt im Sprachumfang sowohl "eingebaute" Funktionen, die schon vorhanden sind und die Du direkt verwenden kannst, so wie "pinMode" oder "digitalWrite". Aber Du kannst auch Funktionen selber schreiben, dazu wird eine Funktion nach diesem Schema "deklariert":
rückgabewert Funktionsname(parameterliste)
{
}
Wenn eine Funktion keinen Rückgabewert zurückliefern braucht, heißt der Rückgabewert "void", das steht für "nichts". Die Parameterliste ist eine Liste von Variablendeklarationen, die an die Funktion übergeben werden sollen. Und im Anweisungsblock zwischen den geschweiften Klammern stehen die auszuführenden Befehle.
Es gibt zwei Funktionen, die jeder Arduino Sketch haben muß (setup und loop) und beliebig viele eigene Funktionen kannst Du selber schreiben und aufrufen.
Funktionen dienen zur Strukturierung eines Programms.
Du kannst natürlich auch 500 Zeilen Progrmamcode nur in die "loop" schreiben. Sinnvoller ist es aber, ein Programm in kleinere Funktionsblöcke aufzuteilen, die jede für sich eine ganz kleine Einzelaufgabe übernehmen, z.B. in 25 Funktionen zu je 20 Zeilen.
Für Deinen Anwendungsfall hatte ich Dir eine Struktur mit den beiden selbst zu schreibenden Funktionen blinkKanal und fadeKanal vorgeschlagen. Die müssen natürlich geschrieben werden und sie dürfen kein "delay" enthalten. Sonst wird das Programm ja wieder zeitweise blockiert, und kann in der Zeit nichts anderes tun. Ganz oben hatte ich Dir einen Link gepostet auf ein von mir gepostetes Beispielprogramm, das gleichzeitig ein Blinken (an einer LED) und ein Pulsieren (Hin- und Herbewegen eines Servos) realisiert. Das hilft Dir nicht bei der Realisierung Deiner beiden Funktionen zum Blinken und Pulsieren?