Pages: [1] 2   Go Down
Author Topic: if-Schleife in die void setup  (Read 1338 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 6
Posts: 717
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Code:
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ß
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 (||).
Logged

_______
Manfred

Offline Offline
God Member
*****
Karma: 6
Posts: 717
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ß
Logged

Offline Offline
God Member
*****
Karma: 6
Posts: 717
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kriege immer noch ne Fehlermedlung, finde aber den Fehler nicht:
Code:
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
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

_______
Manfred

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21665
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Wenn der controller mal abstürzt
Dann ist er abgestürzt und es wird kein weiterer Code ausgeführt.
Grüße Uwe
Logged

Offline Offline
God Member
*****
Karma: 6
Posts: 717
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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ß
Logged

Heidelberg
Offline Offline
Full Member
***
Karma: 1
Posts: 207
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

du hast:

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

mach mal

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

smiley-wink
Logged

 

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21665
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Erfurt, Germany
Offline Offline
Newbie
*
Karma: 1
Posts: 42
IPC Certified Interconnect Designer (C.I.D.), hustling around in electronics since 1971
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

2b || !2b
Shakespeare, Hamlet

Offline Offline
God Member
*****
Karma: 6
Posts: 717
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21665
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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:
Code:
...
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
« Last Edit: March 22, 2011, 02:17:14 pm by uwefed » Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1128
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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++.
 
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Offline Offline
God Member
*****
Karma: 6
Posts: 717
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
habs jetzt so gelöst:
Am Anfang der Loop:
Code:
if (millis()<1000) {
    neustart();
  }

Funktion:
Code:
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
Logged

Dresden / Germany
Offline Offline
Sr. Member
****
Karma: 4
Posts: 451
Entwicklungsklaus
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

das = bedeutet gleich...

Lieber Gruß
Chris
Logged

Sturmfabrik - mediale Dienstleistungen
www.sturmfabrik.de

Pages: [1] 2   Go Up
Jump to: