Hei Ich bin Anfängerin und wollte mal einen einfachen Sketch mit der if-schleife machen: ... void loop() { //sas = 1 if ( sas == true ){ fal = millis();} if (fal>3000){ fal =0;} Serial.println( fal ); delay(1000); } Meine Problem ist aber, dass im Seriellen-Monitor nach der zurücksetzung auf 0 in der zweiten if-Schleife die Var. sas auf 0 bleibt und später sie einen negativen Wert bekomment. Ich hatte erwartet das dieser Sketch die Var. von 0-3 Sek. laufen lässt und dass sich immer wiederholt?! Scheinbar ist das nicht so einfach wie ich gedacht habe aber wo liegt denn das Problem? LG heike
heike schrieb: > Scheinbar ist das nicht so einfach wie ich gedacht habe aber wo liegt > denn das Problem? Hier ist eine Erläuterung dazu: http://if-schleife.de/
http://blog.ebene7.com/2010/01/15/und-es-gibt-sie-doch-if-schleifen-so-wird-es-nicht-gemacht/ Hehe...nein nur Spaß. Ok gut, aber trotz dessen sollte sie doch funktionieren?! heike
heike schrieb: > Ich hatte erwartet das dieser Sketch die Var. von 0-3 Sek. laufen lässt > und dass sich immer wiederholt?! Wie soll das funktionieren? Du änderst doch gar nichts an der Variablen sas. Du fragst sie nur ab. Dadurch kann sie sich nie ändern.
heike schrieb: > Ok gut, aber trotz dessen sollte sie doch funktionieren?! Tut sie ja auch. Offensichtlich macht sie nur nicht das, was du erwartest. Zeig das ganze Programm und rück den Code vernünftig ein.
heike schrieb: > in der zweiten if-Schleife die Var. sas auf 0 bleibt entschuldige hier meinte ich natür. die Var. fal. in der zweiten if-Abfrage setze ich ja fal auf 0 so fällt sie doch aus der Abfrage in die erste if-Abfrage und bekommt wieder millis() zugeteilt?! heike
Bist du dir sicher, was wann gesetzt wird? Tip: Serial.println öfter verwenden, an den Stellen, an denen du genauer hingucken möchtest. Um die verschiedneen Stellen im Serial-Monitor unterscheiden zu können: Serial.print("Stelle A: "); Serial.println(fal); Serial.print("Stelle B: "); Serial.println(fal);
:
Bearbeitet durch User
heike schrieb: > Meine Problem ist aber, dass im Seriellen-Monitor nach der zurücksetzung > auf 0 in der zweiten if-Schleife die Var. sas auf 0 bleibt Das hätte ich auch erwartet, denn so hast du es in deinem Code hingeschrieben. > und später sie einen negativen Wert bekomment. Von welchem Typ ist die Variable denn? Ich wette, es ist int, und nach ca. 32 Sekunden wird sie negativ. > Ich hatte erwartet das dieser Sketch die Var. von 0-3 Sek. laufen lässt > und dass sich immer wiederholt?! Warum sollte es? Du hast doch gesagt, dass, wann immer millis() mehr als 3000 zurückgibt, die Variable auf 0 gesetzt werden soll. heike schrieb: > http://blog.ebene7.com/2010/01/15/und-es-gibt-sie-doch-if-schleifen-so-wird-es-nicht-gemacht/ > > Hehe...nein nur Spaß. > Ok gut, aber trotz dessen sollte sie doch funktionieren?! PHP version not supported The requested PHP version is not supported on this server. ------------------------------------------------------------------------ Die gewählte PHP Version ist auf dem Server nicht verfügbar.
Hallo, sieht nach Arduino aus... millis() liefert die Anzahl Millisek nach Programmstart zurück, ist also 3s nach Start größer als 3000 und erhöht sich mit jeder ms um 1. Was soll es also bezwecken? Gruß aus Berlin Michael
Hi Bitte jetzt nicht schlagen, aber wie funktioniert dieses Programm? Wenn setup() und loop() Funktionen sind, passiert da doch akut ... Nichts. Wenn diese 'Blöcke' (warum auch immer) abgearbeitet werden, spätestens nach dem Ende von loop() ebenfalls Nichts mehr. Und Das sollte binnen 3 Sekunden zu schaffen sein. Eigentlich müsste ich doch bei Programmstart die setup() aufrufen und dann in einer Endlos-Schleife die loop()-Funktion. Glaub, ich bleibe bei Assembler ... da kann ich mir sicher sein, daß der Fehler auch weiterhin vor dem Bildschirm sitzt. MfG
heike schrieb: > Ich hatte erwartet das dieser Sketch die Var. von 0-3 Sek. laufen lässt > und dass sich immer wiederholt?! millis() zählt nicht nur von 0-3000. Du musst relative Zeitmessungen also einen Startzeitpunkt nehmen (t_start), und dann diesen Startzeitpunkt von der aktuellen Zeit (t_now) abziehen. Wenn du bei 3 Sekunden angelangt bis, schiebst du den Startzeitpunkt um 3 Sekunden nach vorne, und bist dadurch wieder auf 0. Dein delay(1000) ist nicht besonders günstig, denn durch die Ausführungszeit der restlichen Instruktionen vor dem delay() wird insgesamt immer etwas mehr als 1000 ms vergehen, deine Ausgabe ist also etwas langsamer als 1x pro Sekunde. Deswegen ist folgende Vorgehensweise besser: Du bastelst dir eine Zeitmessung für genau 1 Sekunde, und zählst dann einen weiteren Zähler von 0..2 hoch.
1 | unsigned long t_now; |
2 | unsigned long t_start; |
3 | unsigned long t_delta; |
4 | int seconds = 0; |
5 | |
6 | void setup() |
7 | {
|
8 | t_start = millis(); |
9 | }
|
10 | |
11 | void loop() |
12 | {
|
13 | t_now = millis(); |
14 | t_delta = t_now - t_start; |
15 | |
16 | if (t_delta >= 1000) // 1 second has passed |
17 | {
|
18 | t_start += 1000; |
19 | |
20 | seconds += 1; // could also be 1000 for counting in milliseconds |
21 | if (seconds >= 3) // could also be 3000 for counting in milliseconds |
22 | seconds = 0; |
23 | |
24 | Serial.println(seconds); |
25 | }
|
26 | }
|
Patrick J. schrieb: > Bitte jetzt nicht schlagen, aber wie funktioniert dieses Programm? > Wenn setup() und loop() Funktionen sind, passiert da doch akut ... > Nichts. Das ist eine Besonderheit der Arduino "Sketches". Es fehlt im Prinzip dieser Code hier:
1 | main() |
2 | {
|
3 | setup(); |
4 | while(1) |
5 | {
|
6 | loop(); |
7 | }
|
8 | }
|
wobei die Variablen in loop glaube ich alle static werden. Frag mich nicht, mit welcher Schweinerei das erreicht wurde. Ich hatte so einen Arduino noch nie in der Hand, aber hier kommen inzwischen so viele Fragen dazu, dass man das einfach mal so akzeptiert ;-) Ach ne, die Variablen in loop() sind nicht static. main() kann man sich hier angucken: https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/main.cpp
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.