Klar, das Ampel Beispiel ist ok.
Ich würde aber alternativ
#define LEDPIN_ROT 1
#define LEDPIN_ORANGE 2
#define LEDPIN_GRUEN 3
(Großbuchstaben) empfehlen, weil es sich hier um Konstanten handelt. Kein Muss, aber guter Stil.
Druckbare Version
Klar, das Ampel Beispiel ist ok.
Ich würde aber alternativ
#define LEDPIN_ROT 1
#define LEDPIN_ORANGE 2
#define LEDPIN_GRUEN 3
(Großbuchstaben) empfehlen, weil es sich hier um Konstanten handelt. Kein Muss, aber guter Stil.
Okay, Konstanten das Wort hat mir gefehlt ....
also LED oder Button Pins sind Konstanten! und Das andere Variablen - Global oder Lokal.
Ich wollte e schon Fragen, was zwischen den beiden Unterschiedlichen Schreibweisen der unterschied ist!??
int LEDPIN_ROT = 1; und #define LEDPIN_ROT 1
ich hab schon bemerkt immer wenn eine Library im Spiel ist also, NEW PING.h oder Servo.h wird das gerne gemacht!
Hat das einen bestimmten Grund oder einen bestimmten Vorteil?
Wobei es ja auch: int LEDPIN_ROT und const int LEDPIN_ROT gibt also wenn die Konstante nicht geändert werden soll.
Wie macht man das dann mit dem #define wenn man sie nicht ändern darf oder ist das schon von Anfang an gegeben?
'Nerdmütze aufsetzen'
#define ist eine Präprozessor-Direktive (wie alle Befehle, die mit '#' beginnen). Bevor der Kompiler den Quelltext in Maschinencode übersetzt, ist der Präprozessor am Start. Der 'klebt' zuerst alle Quelltextteile zusammen, sofern mit #include andere Teile integriert werden sollen. Also bastelt erstmal einen Gesamtquelltext. Gleichzeitig werden auch alle '#define-Begriffe', die im Quelltext vorkommen ersetzt. Also z.B. wo LEDPIN_ROT steht, wird dies mit einer 1 ersetzt.
'const int' arbeitet anders, weil noch eine Typenprüfung stattfindet. Also z.B. würde 'const int zahl = 17.44;' eine Fehlermeldung provozieren, weil hier eine Gleitkommazahl als Ganzzahl definiert werden soll. Normalerweise sollte z.B. 'const int zahl = 8;' vom Optimierer des Kompilers ebenso direkt in Maschinencode geschrieben werden, so dass effektiv außer der Typprüfung kein Unterschied zwischen beiden Schreibweisen vorhanden ist.
'Nerdmütze wieder absetzen'
Kurz: Beide Definitionen sind sich sehr ähnlich.
grins okay - danke für die Erklärung
Also wie man es praktisch schreiben möchte, manchmal braucht man aber ja const int.
Habs grade am mega Getestet mit dem AmpelCode, funktioniert mit den Tabs einwandfrei^^
@ Sisor eine Frage, du hast doch mit bekommen, das ich meine 5 Sensoren mit der oder Abfrage, abfrage.
Wenn das alles verodert ist fragt er dann auch einen nach dem anderen ab? Nicht das ich mir mit den Echos in die Quere komme ???Code:void loop()
{
if(tempVORNE_MITTE < triggerDistanz || tempVORNE_RECHTS < triggerDistanz || tempRECHTS < triggerDistanz)
{
zurueck_LINKS();
}
else
{
vor();
}
if(tempVORNE_LINKS < triggerDistanz || tempLINKS < triggerDistanz)
{
zurueck_RECHTS();
}
else
{
vor();
}
}
Also ned das der eine Sensor das Echo vom anderen Sensor abfragt!
Ich sehe in deinem Quelltext überhaupt keine Abfrage der Ultraschall-Sensoren.
ja grins ....
weil die in den Unterprogrammen stecken^^
Code:void scan_VORNE_RECHTS()
{
int tempVORNE_RECHTS = VORNE_RECHTS.ping();
int VORNE_RECHTS = tempVORNE_RECHTS / US_ROUNDTRIP_CM;
if(VORNE_RECHTS == 0)
{
VORNE_RECHTS = MAX_DISTANCE;
}
delay(100);
}
- Deine Funktion ist vom Typ void, liefert also keinen Wert zurück.
- Dein Hauptprogramm ruft diese Funktion nie auf.
em stimmt, so klappt das wahrscheinlich nicht
ja aber welche Funktion sollte es sonst sein? muss dann eine sein wo auch zurück gibt, hab aber auch gedacht das
void zurück gib .... :-(
währe das dann z.b. " char" ??
-void bedeutet Leere, Nichts.
-wozu das delay?
-warum nicht einfach
Damit kannst du dir die Funktionen sparen.Code:void loop()
{
int vm = VORNE_MITTE.ping_cm();
int vr = VORNE_RECHTS.ping_cm();
if(vm && vm < triggerDistanz || vr && vr < triggerDistanz ...
}
Um deine ursprüngliche Frage zu beantworten: Die US_Sensoren werden nacheinander abgefragt, und kommen sich nicht ins Gehege.
Übrigens: Bei 70cm maximaler Distanz dauert ein ping-Funktionsaufruf etwa 2*0,7/340 s = 4 ms lang.
okay also so kann ich das auch machen, mit der separaten Funktion hab ich es halt etwas besser verstanden !
Das heist ein US Sensor brauch 4ms für eine Messung?
Ich glaub dir schon das dass so ist hab ich ja auch grad gelesen....
Nur hab ich schon Beispiel Programme gesehen, wo die das auch mit "void" gemacht haben - komisch
Ich hab zum Beispiel global Deklariert die Distanz und die Maximale Distanz:
Brauch ich das halt dann noch trotzdem ?Code:int triggerDistanz = 70;
int MAX_DISTANCE = 100;
Weil ich würd gern vorerst das so mit den Unterprogrammen machen! Weil das es für mich verständlich bleibt!
Du Sisor, hast ja weit aus mehr die Erfahrung und Kompetenz, wenn du mein Code schreiben würdest währe er wahrscheinlich nur 1/4 so groß wie
jetzt. Das is das was ich gemeint hab, das ich es momentan noch so schreibe das ich es auch verstehe, aber es funktioniert immer besser!
Also wenn ich das so lassen möchte und die Funktion " void scan_VORNE_RECHTS " bleiben soll - muss ich das void ersetzten nur durch welches?
es gibt float() char() Byte() word() nur welches von denen gibt auch Aussagen zurück?