Go Down

Topic: [Projekt] INTERVAL (Read 7138 times) previous topic - next topic

ElEspanol

Also besser das INTERVAL_FIRST nehmen um auf der sicheren Seite zu sein?

combie

Ich neige ganz klar zur Variante aus Posting #24.
Also zu INTERVAL.h in der ursprünglichen Fassung.


Falls du Spaß an Macros hast, irgendwo habe ich noch einen Macro getriebenen "endlichen Automaten".
Ich kann ihn ja mal raus suchen und auf Arduino anpassen...
 :smiley-evil: obwohl, mich schüttelt schon, wenn ich da nur dran denke :smiley-evil:
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

michael_x

 
Quote from: ElEspanol
Somit ist Schluss mit negativen previous-Werten, damit die Funktion direkt am Anfang ausgeführt wird.
Was aber nach meinem Geschmack die einfachste (und damit Kandidat für die beste) Lösung wäre.

INTERVAL(dauer) { /* läuft sofort und dann nach 'dauer' wieder. basta. */ }

Code: [Select]
#define INTERVAL(interval)                     \
{                                              \
  static unsigned long lastHit = -1L*(interval);    \
...     

ElEspanol

Leider funktioniert das nicht:
Code: [Select]

#include <INTERVAL.h>

const byte LED = 13;
unsigned long dauer=500;
void setup()
{
  Serial.begin(115200);
  pinMode(LED,OUTPUT);
}

void loop()
{
   INTERVAL(dauer) 
   {
    static unsigned long lastHit = -1L*dauer;
     digitalWrite(LED,!digitalRead(LED));
     Serial.println(millis());
   }
}

Oder war das mehr als Idee gedacht?

ElEspanol

#34
Jul 26, 2016, 09:20 pm Last Edit: Jul 26, 2016, 09:28 pm by ElEspanol
Bin gerade etwas am rumspielen

Das geht und macht auf allen 8 LED die Flackereffekte wie gewünscht:
https://www.youtube.com/watch?v=mFSE9NERTJg
Code: [Select]

#include <INTERVAL.h>

byte LED[] = {2, 3, 4, 5, 6, 7, 8, 9};

unsigned long dauer[8] = {300, 0, 0, 0, 0, 0, 0, 0};

unsigned long zufall[] = {300, 250, 100, 200, 1500, 300, 400, 1500};
void setup()
{
  Serial.begin(115200);
  for (byte x = 0; x < 8; x++)
    pinMode(LED[x], OUTPUT);
  Serial.println("started");
}

void loop()
{
  byte x = 0;

  INTERVAL(dauer[x])
  {
    dauer[x] = random(zufall[x]) % 43 * 9;
    digitalWrite(LED[x], !digitalRead(LED[x]));
    Serial.println(dauer[x]);
  }

  x++;
  INTERVAL(dauer[x])
  {
    dauer[x] = random(zufall[x]) % 43 * 9;
    digitalWrite(LED[x], !digitalRead(LED[x]));
    Serial.println(dauer[x]);
  }

  x++;
  INTERVAL(dauer[x])
  {
    dauer[x] = random(zufall[x]) % 43 * 9;
    digitalWrite(LED[x], !digitalRead(LED[x]));
    Serial.println(dauer[x]);
  }

  x++;
  INTERVAL(dauer[x])
  {
    dauer[x] = random(zufall[x]) % 43 * 9;
    digitalWrite(LED[x], !digitalRead(LED[x]));
    Serial.println(dauer[x]);
  }

  x++;
  INTERVAL(dauer[x])
  {
    dauer[x] = random(zufall[x]) % 43 * 9;
    digitalWrite(LED[x], !digitalRead(LED[x]));
    Serial.println(dauer[x]);
  }

  x++;
  INTERVAL(dauer[x])
  {
    dauer[x] = random(zufall[x]) % 43 * 9;
    digitalWrite(LED[x], !digitalRead(LED[x]));
    Serial.println(dauer[x]);
  }

  x++;
  INTERVAL(dauer[x])
  {
    dauer[x] = random(zufall[x]) % 43 * 9;
    digitalWrite(LED[x], !digitalRead(LED[x]));
    Serial.println(dauer[x]);
  }

  x++;
  INTERVAL(dauer[x])
  {
    dauer[x] = random(zufall[x]) % 43 * 9;
    digitalWrite(LED[x], !digitalRead(LED[x]));
    Serial.println(dauer[x]);
  }


}


Und das hier, wo ich dachte, das macht das gleiche, läuft viel langsamer, ist nix mit flackern.
https://www.youtube.com/watch?v=K3k3ZEDHano
Code: [Select]

#include <INTERVAL.h>

byte LED[] = {2, 3, 4, 5, 6, 7, 8, 9};

unsigned long dauer[8] = {300, 0, 0, 0, 0, 0, 0, 0};

unsigned long zufall[] = {300, 250, 100, 200, 1500, 300, 400, 1500};
void setup()
{
  Serial.begin(115200);
  for (byte x = 0; x < 8; x++)
    pinMode(LED[x], OUTPUT);
  Serial.println("started");
}

void loop()
{
  for (byte x = 0; x < 8; x++)
  {
    INTERVAL(dauer[x])
    {
      dauer[x] = random(zufall[x]) % 43 * 9;
      digitalWrite(LED[x], !digitalRead(LED[x]));
      Serial.println(dauer[x]);
    }
  }
}


An was kann das liegen?

michael_x

#35
Jul 26, 2016, 10:53 pm Last Edit: Jul 26, 2016, 10:59 pm by michael_x
Quote
Oder war das mehr als Idee gedacht?
   static unsigned long lastHit = -1L*(dauer); 
war als Ersatz für die Zeile
   static unsigned long lastHit = 0;
in der Makro definition  in INTERVAL.h gedacht, sorry.

INTERVAL(dauer) { ... } kann dann nach Belieben, mit dem leicht veränderten Verhalten verwendet werden



Die Klammer um (dauer) in der Makro-Definitionszeile oben hat übrigens ihren Grund. Dann geht nämlich sogar eine Verwendung wie

#define minimum 500
....
INTERVAL(minimum+random(1000)) {...}

ElEspanol

nur, wenn ich die negative previous in die h reinschreibe, gilt das ja für alle INTERVAL Routinen in ALLEN  Sketchen. Da ist die Übergabe als 2. Parameter doch universeller.

michael_x

Ich finde, man sollte sich schon entscheiden, was man will, wenn man schon so ein tolles einfaches Makro verwendet.
( Und intuitiver ist eigentlich die Funktion "mach es gleich, und dann erst nach dauer wieder", finde ich nachdem ich es mir überlegt habe ;) )

Ansonsten gibt es komplexe Blink-Systeme wie Sand ( äh, Leuchtfeuer-Landkarten ... ) am Meer.


ElEspanol

"mach es gleich, und dann erst nach dauer wieder"

genau. und gleich muss ja nicht sofort sein, deswegen die Startverzögerung. Um zunächst mal zB. Temperaturen einlesen, etc, und dann erst die erste Ausführung.

combie

"mach es gleich, und dann erst nach dauer wieder"

genau. und gleich muss ja nicht sofort sein, deswegen die Startverzögerung. Um zunächst mal zB. Temperaturen einlesen, etc, und dann erst die erste Ausführung.
Ich glaube, da ist man dann schon im Bereich eines "endlichen Automaten".
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

ElEspanol

Schon, aber eben nur einfacher. Eine Routine, u.U. sogar nur in einer einzigen Zeile, und haben fertig. Einfach genial. Und taugt sogar zum Funkelfeuer beim Leuchtturm.

ElCaron

#41
Nov 05, 2019, 08:08 pm Last Edit: Nov 05, 2019, 08:08 pm by ElCaron
Ich nutze diese Library oft und gerne. Vielen Dank! Ist die irgendwo auf Github und Co zu finden? Damit wäre es einfacher, sie z.B. als dependency von PlatformIO-Projekten einzubinden. Eine Lizenz ist ja leider auch nicht dabei ...

combie

Nein, bisher nicht nicht.

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Doc_Arduino

Hallo,

ist es nicht eher so das alles was im Forum auftaucht sowieso frei ist von jeder Lizenzpolitik? Also jeder damit tun und lassen kann was er möchte. Wenn es unter GPL3 Lizenz steht, dann heißt das ja "nichts weiter", dass du deinen Code ebenfalls unter GPL3 stellen musst wenn du Teile verwendest die "unter GPL3" stehen. Bei privater Verwendung interessiert das niemanden aber spätestens wenn du damit Geld verdienen möchtest.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

ElCaron

ist es nicht eher so das alles was im Forum auftaucht sowieso frei ist von jeder Lizenzpolitik?
Keine Ahnung. Steht das in den Forenbedingungen? Wenn ja, hält es einer AGB-Prüfung stand?
Normalerweis eist es so, dass Sachen, die keine Lizenz dabei haben, überhaupt nicht weitergegeben werden dürfen.

Quote
Wenn es unter GPL3 Lizenz steht, dann heißt das ja "nichts weiter", dass du deinen Code ebenfalls unter GPL3 stellen musst wenn du Teile verwendest die "unter GPL3" stehen. Bei privater Verwendung interessiert das niemanden aber spätestens wenn du damit Geld verdienen möchtest.
Ne, aber ich stelle meine Sachen gerne open source auf github (üblicherweise unter Apache Lizenz). Da will ich ungerne unlizensierten Code einfach einfügen.
Am Besten wäre halt ein Git-Repository als Dependency, PlatformIO läd das dann ja sogar automatisch.

Go Up