Go Down

Topic: 4 Led's + 1 Led ohne delay, ich bekomme es nicht hin (Read 5761 times) previous topic - next topic

example

Hallo zusammen :)

Ich bin neu in sachen Arduino und eigentlich nicht beratungresistent.
Dennoch verstehe ich es nicht :(

Ich bekomme ein Led lauflicht (rundum licht) hin (1 bis 4 und wieder von vorne) und dann Blitzt am ende eine Led.

Das Problem ist das ich ledeglich den Basic sketch "blink" kopiert habe so das die 4 Led's nach einander an und aus gehen und am ende die 5. led "blitzt".

Allerdings sollen die 4 Leds unabhängig von der 5. als flasher eingesetzten led laufen.
Die 5. soll nach gefühl 2 mal auf blitzen.
Ich habe mir den sketch für led ohne delay angeschaut und ich kapiere es leider nicht :(



Wäre echt super wenn sich da jemand erbarmt und mir das leicht verständlich einprügelt.
Natürlich möchte ich nicht nur den sketch kopieren sondern es auch verstehen um in der AVR/arduino welt weiter zu kommen.

Vielen dank im vorraus :)

Eisebaer

hi, und willkommen im forum,

setup
  ledstatus = 5


loop
  wenn ledstatus == 5 dann
    ledstatus =1
    startmillis = millis()
  ende wenn

  wenn (ledstatus == 1) und ((millis() - startmillis) > 1000) dann
    ledstatus = 2
    led4 aus
    led1 an
  ende wenn

  wenn (ledstatus == 2) und ((millis() - startmillis) > 2000) dann
    ledstatus = 3
    led1 aus
    led2 an
  ende wenn

  wenn (ledstatus == 3) und ((millis() - startmillis) > 3000) dann
    ledstatus = 4
    led2 aus
    led3 an
  ende wenn

  wenn (ledstatus == 4) und ((millis() - startmillis) > 4000) dann
    ledstatus = 5
    led3 aus
    led4 an
  ende wenn

  wenn ((millis() - startmillis) > 2300) und ((millis() - startmillis) < 2350) dann
    blitzled an
  ende wenn

  wenn ((millis() - startmillis) > 2400) dann
    blitzled aus
  ende wenn

sehr unelegant, aber zum verständnis i.o.
wenn Du das prinzip verstanden hast, dann elegantere lösungen suchen. am besten unter "finite state machine".

gruß stefan

agmue

Möglicherweise findest Du hier nützliche Anregungen: Anleitung Endlicher Automat mit millis()
Das Blaulicht entspricht Deinem Blitzer, die Ampel dem Rundumlicht.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

example

@ Eisbär
das verstehe ich so halb aber dann blitzt die 5. led doch imemr synchron zu den anderen 4 oder ?

@agmue
habe eben mal folgendes versucht:

void setup() {
  // Definiert die Pins als Aus- oder Eingang
  pinMode(8, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13,OUTPUT);
}

void loop() {
  // Ampelschaltung
  digitalWrite(10, HIGH);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  millis(3000);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  millis(3000);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, HIGH);
  digitalWrite(13, LOW);
  millis(3000);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH);
  millis(3000);
}

Funktioniert nicht und ich habe keine ahnung warum
Arduino: 1.6.5 (Windows 7), Platine: "Arduino/Genuino Uno"

Der Sketch-Name musste geändert werden. Sketch-Namen können nur aus
ASCII-Zeichen und Zahlen bestehen (aber nicht mit einer Zahl beginnen).
Sie sollten auch weniger als 64 Zeichen lang sein.

Build-Optionen wurden verändert, alles wird neu gebaut

sketch_4_wo_delay.ino: In function 'void loop()':
sketch_4_wo_delay:16: error: too many arguments to function 'long unsigned int millis()'
In file included from sketch_4_wo_delay.ino:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:132:15: note: declared here
 unsigned long millis(void);
               ^
sketch_4_wo_delay:21: error: too many arguments to function 'long unsigned int millis()'
In file included from sketch_4_wo_delay.ino:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:132:15: note: declared here
 unsigned long millis(void);
               ^
sketch_4_wo_delay:26: error: too many arguments to function 'long unsigned int millis()'
In file included from sketch_4_wo_delay.ino:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:132:15: note: declared here
 unsigned long millis(void);
               ^
sketch_4_wo_delay:31: error: too many arguments to function 'long unsigned int millis()'
In file included from sketch_4_wo_delay.ino:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:132:15: note: declared here
 unsigned long millis(void);
               ^
too many arguments to function 'long unsigned int millis()'

  Dieser Report hätte mehr Informationen mit
  "Ausführliche Ausgabe während der Kompilierung"
  aktiviert in Datei > Einstellungen

michael_x

Quote
millis(3000);
Du liest hier zwar öfters, man sollte delay durch millis ersetzen, aber das ist Unsinn.

Die meinen, du sollst deinen Sketch komplett umschreiben, so dass du auf delay() verzichten kannst und trotzdem Wartezeiten im Griff hast.

Du schreibst den sketch so, dass loop() immer sofort fertig ist und wieder neu starten kann.
Dazu musst du dir merken, wann die letzte Änderung war und in welchem Zustand das ganze ist.

Das kannst du natürlich für Blitz und Ampel unabhängig machen und schon blitzt es unabhängig vom Ampel-Rhythmus, wenn du das willst. 

Eisebaer

hi,

oje, ein knoten im hirn. ist uns allen schon passiert.

Du gehst davon aus, daß millis() etwas ähnliches ist wie delay. aber abgesehen, daß beide funktionen etwas mit zeit zu tun haben, trifft das überhaupt nicht zu.

delay(xx) macht eine pause von xx millisekunden.

millis() gibt Dir die millisekunden, die seit dem start des arduinos vergangen sind. zeit mußt Du da selbst messen.

laß mal den teil mit dem blitzlicht weg und schau Dir mein obiges beispiel an. vergiß, daß Du mit millis() eine pause angibst, nein, millis liefert Dir nur einen ZEITPUNKT. deswegen erwartet es auch keine angabe der dauer. Du mußt selbst die zeit zwischen zwei millis() mit der von Dir gewünschten pause vergleichen.

gruß stefan

example

Du schreibst den sketch so, dass loop() immer sofort fertig ist und wieder neu starten kann.
Dazu musst du dir merken, wann die letzte Änderung war und in welchem Zustand das ganze ist.
Das problem ist das ich erstmal verstehen muss wie ich das grundsätzlich zu schreiben habe um das umzusetzten.
Ich weis ja nicht mal woran ich festmachen kann das ein Loop zuende ist.
Weis nur das Loop immer wieder in dauerschleife läuft aber was genau, weis ich nicht.


Quote
Das kannst du natürlich für Blitz und Ampel unabhängig machen und schon blitzt es unabhängig vom Ampel-Rhythmus, wenn du das willst.
So mein vorhaben.


@ Eisbär
naja, weniger der knoten, eher dass ich es leider noch nicht verstehe.
Noch...

Im grunde wie mein fehlerhafter versuch nur... und da hapert es.
Ich kann mir aus dem beispiel nichts funktionierendes ableiten.
Ich glaube digitalWrite... irgendwann ms und ja.

Der uno liegt neben mir und ich habe keine ahnung

Klaus_ww

Hast Du Dir das mitgelieferte Beispiel "BlinkWithoutDelay" mal in Ruhe angeschaut und auch verstanden was da passiert?
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

example

Eben erst entdeckt.
Was soll ich nun, wo ich schon die grundlagen nicht wirklich verstehe, mit constant "const" und unsigned long anfangen können ?

Auch wenn ich mich wiederhole, ich verstehe es NICHT. Will es aber verstehen.
Habe ich bereits am anfang erwähnt.

Auch mit rum editieren funktioniert nichts außer dem standard beispiel.
Entweder läuft das oder es läuft nichts.

Klaus_ww

Wissen kommt nicht über Nacht, was erwartest Du?
Arbeite die Beispiele durch, erst 1 LED, dann 2 und dann fällt schon der Groschen.
Und schau in die Referenz, da wird viel erklärt.
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

ardubu

ich habe dir mal das Blinkprogramm ein wenig dokumentiert
Code: [Select]

const int ledPin=13;
void setup() {
  pinMode(ledPin, OUTPUT);

}

void loop() {

  static unsigned long previousMillis_led;// Zeit merken       
  static boolean ledState; // Status der Led
  // millis() ist die aktuelle Zeit
  const int interval = 300;// Zeit zwischen an und aus     const bedeutet das es sich um eine Konstante handelt     
 
   if(millis() - previousMillis_led > interval)
     {
       previousMillis_led = millis();   
       if (!ledState) ledState = HIGH;
       else{
            ledState = LOW;
           
            }
       digitalWrite(ledPin, ledState);
     }
   }// Ende Loop


ardubu

für die Variablen und Konstanten (int  long, unsigned, static) schaue mal in der IDE unter Hilfe Referenz

example

#12
Oct 19, 2015, 10:04 pm Last Edit: Oct 19, 2015, 10:10 pm by example
Ich versteh nur das die Led irgendwann an geht, nach xy ms wieder aus.
Wann die an geht weis ich nicht, wie ich eine 2. einbinden soll versteh ich auch nicht.
Warum welche Zeit merken und boolean ceck ich auch nicht wenn doch noch steht ledstate high/low nach xy ms ???

Im beispiel blinkwithout delay zb steht:
"int ledState = LOW;             // ledState used to set the LED"
Da steht nichts von Led 1, 2, 3 oder welche nummer sie auch immer hat.
Leuchtet mir ein bei einer LED.
Aber wie soll ich der 2. LED zukommen lassen das die mal im gewünschten abstand aufleuchtet ?
Kann auch mit den Variablen nichts anfangen da mir die grundlagenkentnisse fehlen.
Zudem lädt die Referenz Seite nun bereits seit 2 minuten. Finde ich absolut nicht dramatisch da ich damit NICHTS anfangen könnte.


/edit

ja die erklärung zu unsigned long wird mir sicher helfen....
speichert keine negaitven nummern,32bit und 4 bytes und dann von 0 - 4,294,967,259 (2^32-1)

Stimmt, das habe ich gesucht.
Das erklärt natürlich warum die 8. LED von links nicht blinken wollte aber der Akku leer ist.


Nein, es hilft mir absolut nicht, sorry

Klaus_ww

Dann lass es bleiben, willst offenbar nur jammern aber nicht lernen  :smiley-confuse:
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

combie

Code: [Select]
Kann auch mit den Variablen nichts anfangen da mir die grundlagenkentnisse fehlen.
Das können wir nicht ändern.
Vielleicht helfen....
Allerdings: Der Weg des lernens ist deiner.

c/C++ Referenzen und Tutorials gibt es wie Sand am Meer.
Da findest du genug Grundlagen......



Quote
Dann lass es bleiben, willst offenbar nur jammern aber nicht lernen
Glaube ich nicht...
Das nur eine kleine Blockade.... überwindbar...
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Go Up