if-Schleife in die void setup

Hallo,

kann ich in die VOidschleife diese if-Schleife bauen? Hatte das probiert und klappte nicht, krieg immer nen fehler imCompiler.
Daher will ich erst mal generell fragen ob das geht.
hintergrund: Wenn der controller mal abstürzt oder ich mal dran ruzmspiele und dann das programm starte, möchte ich dass die leds je nach uhrzeit entweder auf LOW oder HIGH stellen.

if (hour<8 && hour>=18) {
   digitalWrite(stripePin[0], LOW);
   digitalWrite(stripePin[1], LOW);
   digitalWrite(stripePin[2], LOW);
   digitalWrite(stripePin[3], LOW);
  }
  else if {hour>=8 && hour<18
   digitalWrite(stripePin[0], HIGH);
   digitalWrite(stripePin[1], HIGH);
   digitalWrite(stripePin[2], HIGH);
   digitalWrite(stripePin[3], HIGH);
  }

Gruß

Beim zweiten if fehlen die schließende Klammer und die öffnende geschweifte Klammer.
Zudem wird die Bedingung des ersten if nie zutreffen, mach aus dem UND (&&) ein ODER (||).

Hallo,
die klammern waren mir schon aufgefallen.
das die erste nicht eintreten kann habe ich nich gemerkt, vielen Dank.

Trotzdem hätte doch eigentlich die 2te else if eintreten müssen oder?
Jedenfalls waren die Lampen LOW als ich das eingestellt hatte. Werd das noch mal testen. Also deiner Meinung nach sollte das funktionieren wenn ich alles korrekt programmiert habe?
Gruß

Kriege immer noch ne Fehlermedlung, finde aber den Fehler nicht:

 pinMode(stripePin[0], OUTPUT);
   pinMode(stripePin[1], OUTPUT);
   pinMode(stripePin[2], OUTPUT);
   pinMode(stripePin[3], OUTPUT);
   pinMode(stripePin[4], OUTPUT);
  if (hour<8 || hour>=18) {
   digitalWrite(stripePin[0], LOW);
   digitalWrite(stripePin[1], LOW);
   digitalWrite(stripePin[2], LOW);
   digitalWrite(stripePin[3], LOW);
   digitalWrite(stripePin[4], HIGH);
   prozent[] = {0, 0, 0, 0, 100};
   k=1;
  }
  else if {hour>=8 && hour<18) {
   digitalWrite(stripePin[0], HIGH);
   digitalWrite(stripePin[1], HIGH);
   digitalWrite(stripePin[2], HIGH);
   digitalWrite(stripePin[3], HIGH);
   digitalWrite(stripePin[4], LOW);
   prozent[] = {100, 100, 100, 100, 0}; 
   k=0;
  }

Fehlermeldugn: expected primary-expression before ']' token

Wenn ich den codeabschnitt aus /* */, wirdfehlerfrei compiliert,also muss hier noch nen fehler drin sein.
Finde leider nix

Die Zuweisung des Arrays geht so nicht, entweder die Werte einzeln oder in einer Schleife.

Wenn der controller mal abstürzt

Dann ist er abgestürzt und es wird kein weiterer Code ausgeführt.
Grüße Uwe

uwefed:

Wenn der controller mal abstürzt

Dann ist er abgestürzt und es wird kein weiterer Code ausgeführt.
Grüße Uwe

logisch, soll halt so laufen dass wenn ich dann den arduino neu starte automatisch das licht auf high oder low gesetzt wird, ohne dass ich den code anpassen muss. Zudem will ich nen watchdog einbauen.
Gruß

du hast:

else if {hour>=8 && hour<18)

mach mal

else if (hour>=8 && hour<18) {....

:wink:

currymuetze:
logisch, soll halt so laufen dass wenn ich dann den arduino neu starte automatisch das licht auf high oder low gesetzt wird, ohne dass ich den code anpassen muss. Zudem will ich nen watchdog einbauen.

Der Arduino hat intern einen Watchdog aber da sind einige Dinge zu beachten; lies Dich zuerst gut ein um den Controller nicht zu blockieren.
Du mußt die Zustände ins EEprom oder besser falls Du ein RTC verwendest, ins gepufferte Ram schreiben und nach dem Einschalten den Wert von dort holen.
Grüße Uwe

Ich muß hier mal n bißchen klugscheißern, sorry.
Zu allererst mußt du die Logik, dann die Syntax richtig haben sonst kriegst du nie das raus, was du willst.
Erklärung zu "void setup": void bedeutet, daß dieser Programmteil keinen Typ hat, also kein int oder char oder irgendetwas anderes zurückgibt. Mir scheint, das ist dir noch nicht in der Form klar. Der Name des Programmteils ist einfach nur setup und dient dazu, Dinge zu tun, die am Anfang und nur einmal wichtig sind.
Und "if" ist numal keine Schleife, sondern eine Verzweigung! Der Programmteil "loop" hingegen ist eine Schleife, obwohl man ihm das gar nicht ansieht. Denn er wird "von außen her" immer wieder ausgeführt.
Die beiden Programmteile setup und loop sind deswegen beim Arduino eingeführt, weil das für Programmieranfänger den Einstieg vereinfacht.
Variablen (also auch Arrays) im Code zu deklarieren und dann auch noch zu initialisieren, macht maximal bei Schleifen (for, while) die Lesbarkeit und Eindeutigkeit des Codes besser. Ansonsten solltest du Variablen und Konstanten IMMER am Anfang deklarieren und initialisieren. Andernfalls lauer auch hier Compilerfehler.
Denke immer daran, daß nicht nur der controller, sondern auch der Compiler nach der Methode "dumm, aber fleißig" arbeiten. Wo sollen Logik oder gar "Intelligenz" herkommen, wenn nicht von dir?
Tut mir leid, aber aus deinen Beiträgen sprach etwas Unkenntnis und ich möchte dir gern helfen, gut programmieren zu lernen. Sicher geht das auch so "straight forward", aber gerade bei C/C++ wirst du so nicht glücklich werden.

Hi Uli,

vielen Dank für dein Feedback, erleuchtet in der Tat noch so einige Dinge.
Zu meiner if-Verzweigung in der void Setup:
Genau das wollte ich erreichen. Einmalig bei Neustart des Arduinos festlegen, ob die Lampe an oder aus sein soll. Dafür die If Verzweigung denn die Lampe soll tagsüber ein- und nachts ausgeschaltet sein. Hintergrund: Wenn mir der Arduino mal abschmiert und ich ihn neustarte, möchte ich nicht erst mein Programm anpassen (soll jetzt ein oder aus geschaltet werden) sondern das einfach in Abhängigkeit von der Uhrzeit machen.
Ab dann soll es in die Loop gehen und alles automatisiert gesteuert werden.

Die Frage war daher aus meiner (Anfänger-)Sicht hoffentlich trotzdem berechtigt, ob ICH in der Setup Void einen Zustand festlegen muss (sprich HIGH oder LOW) oder ob ich das auch in der Setup über eine if Verzweigung entscheiden lassen kann.
Ich habe das jetzt so umgesetzt und scheint auch zu funktionieren. Leider ist mir das Board noch nicht so oft abgeschmiert, daher müsste ich noch etwas mehr testen.

Gruß
Thorsten

Hallo Ulli

Es ist richtig die Dinge klarzustellen um etwaige Fehler die andere durch die aufgezeigten Lösungen mit den Ungenauigkeiten machen könnten zu verhindern.
In diesem Fall muß man aber selbst genauer als der zu korrigierende Beitrag sein.
In Deiner Antwort ist es nicht der Fall:
"void" bedeutet, daß eine Funktione keine Wert zurückgibt. Das hat nichts mit dem Daten-Typ einer Variablen zu tun.
Es ist besser sich an die technisce Standartsprache beim programmieren zu halten: "loop()" ist kein Programmteil sondern eine Funktion.

In der Arduinoprogrammierumgebung wird setup() einmal am Anfang der Abarbeitung des Sketches aufgerufen und loop() immer wieder sobald die Funktion fertig abgearbeitet worden ist.

In die setup-Funktion kommen alle Funktionen und Programmteile hinein, die einmal am Anfang ausgeführt werden sollen. Also zB Initialisation von externer HW, Einschaltbild auf Display, Wert zuweisen von Variablen, falls sie noch nicht vorher mit einem Wert geladen wurden. Es kann jede x-beliebige Funktion aufgerufen werden und jede Bedingung enthalten sein.
In die loop-Funktion kommt alles rein was immer wieder ausgeführt werden soll; also das meiste unseres Sketches.

Der Vorschlag Variablen immer vor und auserhalb der setup-Funktion ist nicht immer Zielführend. Das gilt für Kostanten ( jene die mit "#define" deklariert werden). Der Compiler ersetzt die Konstant-Variable vor dem kompilieren mit dem Wert. ZB ich definire "#define Ausgang 3" dann ersetzt der Kompiler "Ausgang" mit "3". Das hat den Vorteil Ramspeicher für die Variablen zu sparen. Achtung: er ersetzt "AusgangLED" auch und es kommt "3LED" dabei raus; Das kann manchmal Probleme geben wenn Du "3LED" als Variable bereits verwendest. Zweites Achtung: #define wird ohne "=" und Strichpunkt am Ende geschrieben!!!
In C und C++ gibt es globale und locale Variablen.
Locale Variablen werden innerhalb von Funktionen definiert
zB:

funktionXY()
{
int Z = 1;
...
}

Diese Variable , in unserem Fall "Z", existiert nur innerhalb dieser Funktion "funktionXY()". Außerhalb oder innerhalb einer anderen Funktion gibt es sie nicht oder wenn es dort noch eine Variable "Z" gibt, ist es nicht die gleiche Variable wie die in der Funktion "funktionXY()".
Das kann zu scheinbar unerklärbaren Programmfehler führen, wenn man das nicht weiß.

Globale Variablen sind jene Variablen, die außerhalb jeder Funktion vor "setup()" definiert wurden. Diese gibt es in allen Funktionen und in allen Funktionen kann man auf sie zugreifen.

Nun zur Frage von currymuetze

Du kannst in der Funktion setup() die LED abhängig von der Zeit an oder ausschalten:

... 
setup()
{
...
Lampe = 0;   // Lampe ist aus
if (Stunde >21 || Stunde < 7)  // wenn es später als 21h59 oder früher als 7h00 ist, also Nacht, dann leuchtet die Lampe
  {
  Lampe =1; 
  }
...
}

Grüße Uwe

Da es sich ja hier um die Programiersprache "C" handelt, kann ich hier an dieser Stelle das buch
"C++ Programmierung lernen: Anfangen, Anwenden, Verstehen" von André Willms (ISBN 978-3-8273-2674-4)
an Herz legen. Es hat mir sehr weiter geholfen insbesonder um das Verständniss von der Arbeistweise von C bzw. C++.

Hallo,
habs jetzt so gelöst:
Am Anfang der Loop:

if (millis()<1000) {
    neustart();
  }

Funktion:

void neustart() {
  if (hour<8 || hour>=18) {
   digitalWrite(stripePin[0], LOW);
   digitalWrite(stripePin[1], LOW);
   digitalWrite(stripePin[2], LOW);
   digitalWrite(stripePin[3], LOW);
   digitalWrite(stripePin[4], HIGH);
   prozent[0]=0;
   prozent[1]=0;
   prozent[2]=0;
   prozent[3]=0;
   prozent[4]=100;
   k=1;
  }
  else if (hour>=8 && hour<18) {
   digitalWrite(stripePin[0], HIGH);
   digitalWrite(stripePin[1], HIGH);
   digitalWrite(stripePin[2], HIGH);
   digitalWrite(stripePin[3], HIGH);
   digitalWrite(stripePin[4], LOW);
   prozent[0]=100;
   prozent[1]=100;
   prozent[2]=100;
   prozent[3]=100;
   prozent[4]=0;
   k=0;
  }
}

Problem: Um Punkt 18h ging jetzt alles auf LOW => was ist falsch? die 1000 millis sind doch längst drüber
Gruß
Thorsten

Äh, Du hast "hour>=18)" dort stehen....

das = bedeutet gleich...

Lieber Gruß
Chris

Hallo Chris,
das ist richtig.
Mein Problem ist aber, warum die Funktion überhaupt aufgerufen wurde?
Bedingung war doch, dass millis()<1000 sein muss, also wirklich nur direkt wenn der arduino neugestartet wird, also stecker raus und rein.
Resettet sich millis() irgendwann wieder??
Gruß

millis() hat eine Überlauf (fängt wieder mit 0 an) nach 49 Tagen und einigen Stunden.
Grüße Uwe

Kann also nicht der Auslöser sein, da 49 Tage nach der Entwicklung längst nicht rum sind...

Stromausfall, Schwankungen?

Mhh, Breadboard, oder "echter" Arduino?
Spannungsversorgung stabilisiert?

mmh, also ich sehe eigentlich keinen Fehler (was nicht viel heißt), aber ich würde an Deiner Stelle trotzdem einen "Triggerbegrenzer" einbauen....
<1000 heißt ja alle Millis die kleiner als 1000 sind... das heißt es wird 999 mal ausgelöst.... sofern er das denn schafft innerhalb der cyclen... was bestimmt nicht so ist, und daher so oder so zu einem "Überlauf" > an Aufgaben führt... was allerdings garnicht Dein Problem ist....

mmh, da bin ich jetzt auch gespannt....

Lieber Gruß
ChrisS

Ich weiß zwar auch nicht warum der Code ausgeführt wird obwohl millies größer hätte sein sollen aber was mir auch noch aufgefallen ist:
Bei 18 Uhr und 8 Uhr sind beide Bedingungen für eine Stunde wahr!

millies geht echt über 49 Tage?
Das ist aber ein ziemlich große Zahl dann >4.000.000.000 wenn ich mich nicht verrechnet habe.

Thorsten

Hallo,
Ich werds wohl besser über einen boolean definieren:
Initial wird boolean auf true gesetzt, neustart wird nur ausgeführt, wenn boolean==true und in der neustart void wird der boolean auf false gesetzt.
Somit dürfte sich sowohl der millis-Reset nach 50 Tagen sowie die 999-fache Ausführung der void erledigen.

@Thorsten:
Kannst du mir genau sagen, wo du den Fehler siehst? (Oder hast du dir den Code aus Beitrag#1 angeschaut?)

if (hour<8 || hour>=18) {
....
}
==> hier wird von 00 Uhr bis 7 Uhr und dann wieder von 18 Uhr bis 23 Uhr ausgeführt

else if (hour>=8 && hour<18) {
....
}
==> hier wird von 8 Uhr bis 17 Uhr auseführt

Gruß
Thorsten