Go Down

Topic: Wieviel LEDs sind für ein Lauflicht möglich ? (Read 2581 times) previous topic - next topic

Aceli

schade..... danke.... dann muss ich warten bis ich zuhause bin.

Aceli

#61
Apr 18, 2019, 07:31 pm Last Edit: Apr 18, 2019, 08:09 pm by Aceli
ich habe das ganze jetzt noch mit einem dritten Effekt, Strobo versucht . aber irgendwie hackt es zwischen den Programmen nun... und ja ich schaue mir das mit Millis() nachher nochmal an.

strobo geht nur wenn ich den Knopf gedrückt halte....

Code: [Select]

#include <Adafruit_NeoPixel.h>
 
#define N_LEDS 15
#define PIN     6

const int tasterPin = 7;
int lichtmodus = 0;
int tasterStatus = LOW;
const byte potPin = A0;
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);
//Adafruit_NeoPixel pixels = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);
//int delayval = 500;
int n=0;
 
void setup() {
  strip.begin();
  //pixels.begin();
  pinMode (tasterPin, INPUT_PULLUP);
  Serial.begin(9600);
 
}
 
int pos = 0, dir = 1; // Position, direction of "eye"
 
void loop() {
  tasterStatus = digitalRead(tasterPin);

  if (tasterStatus == LOW)
{
  lichtmodus++;
  delay(30);
}
if (lichtmodus == 0)
{
uint16_t analogWert=analogRead(potPin);
Serial.print("Analog-Wert:");  //gibt Text/Variablen auf der Seriellen aus
Serial.println(analogWert);
  int j;
 
  // Draw 5 pixels centered on pos.  setPixelColor() will clip any
  // pixels off the ends of the strip, we don't need to watch for that.
  strip.setPixelColor(pos - 1, 0x696969); // Medium red
  strip.setPixelColor(pos    , 0xFFFFFF); // Center pixel is brightest
  strip.setPixelColor(pos + 1, 0x696969); // Medium red
 
 
  strip.show();
  delay(analogWert);
 
  // Rather than being sneaky and erasing just the tail pixel,
  // it's easier to erase it all and draw a new one next time.
  for(j=-2; j<= 2; j++) strip.setPixelColor(pos+j, 0);
 
  // Bounce off ends of strip
  pos += dir;
  if(pos < 0) {
    pos = 1;
    dir = -dir;
  } else if(pos >= strip.numPixels()) {
    pos = strip.numPixels() - 2;
    dir = -dir;
  }
}
else if (lichtmodus == 1)
{
  for(n=0;n<=15;n++)
{
  strip.setPixelColor(n, 138,43,226);
}
strip.show();
}
else if (lichtmodus == 2)
{
  for(n=0;n<15;n++)
  {
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    strip.setPixelColor(n, strip.Color(0,150,0)); // Moderately bright green color.
  }
  {
    strip.show(); // This sends the updated pixel color to the hardware.
   
  }
  }

 else
  {
    lichtmodus = 0;
  }
}

_______
EDIT;

so es funktioniert super, auch mit Millis und Storno

Code: [Select]

#include <Adafruit_NeoPixel.h>

#define N_LEDS 15
#define PIN     6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);

const byte MAX_ANZAHL_LICHTMODI = 3;
const byte tasterPin = 7;
int lichtmodus = 0;
bool aktTasterStatus, altTasterStatus;
const byte potPin = A0;
uint32_t jetzt, vorhin, intervall, entprellMillis;
int pos = 0, dir = 1; // Position, direction of "eye"
#define INTER_FLASH_DELAY 30
#define INTER_FLASH_COUNT 10
void setup() {
  strip.begin();
  pinMode (tasterPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println(F("Anfang"));
  intervall = analogRead(potPin);
  Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
  Serial.println(intervall);
}

void loop() {
  jetzt = millis();
  altTasterStatus = aktTasterStatus;
  aktTasterStatus = digitalRead(tasterPin);

  if ((aktTasterStatus != altTasterStatus) && (jetzt - entprellMillis >= 30))
  {
    entprellMillis = jetzt;
    if (!aktTasterStatus)
    {
      lichtmodus = (lichtmodus + 1) % MAX_ANZAHL_LICHTMODI;
      Serial.print(F("Neuer Lichtmodus: "));
      Serial.println(lichtmodus);
    }
  }

  switch (lichtmodus) {
    case 0:
      if (jetzt - vorhin >= intervall)
      {
        vorhin = jetzt;
        intervall = analogRead(potPin);
        Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
        Serial.println(intervall);

        // Rather than being sneaky and erasing just the tail pixel,
        // it's easier to erase it all and draw a new one next time.
        for (uint16_t j = 0; j < N_LEDS; j++) strip.setPixelColor(j, 0);

        // Draw 5 pixels centered on pos.  setPixelColor() will clip any
        // pixels off the ends of the strip, we don't need to watch for that.
        strip.setPixelColor(pos - 1, 0x696969);
        strip.setPixelColor(pos    , 0xFFFFFF); // Center pixel is brightest
        strip.setPixelColor(pos + 1, 0x696969);
        strip.show();

        // Bounce off ends of strip
        pos += dir;
        if (pos < 0) {
          pos = 1;
          dir = -dir;
        } else if (pos >= N_LEDS) {
          pos = N_LEDS - 2;
          dir = -dir;
        }
      }
      break;
    case 1:
      for (uint16_t n = 0; n < N_LEDS; n++)
      {
        strip.setPixelColor(n, 138, 43, 226);
      }
      strip.show();
      break;
     case 2:
     for (uint16_t n = 0; n < N_LEDS; n++) {
       strip.setPixelColor(0, strip.Color(0, 0, 255));
    strip.setPixelColor(1, strip.Color(0, 0, 255));
    strip.setPixelColor(2, strip.Color(0, 0, 255));
    strip.setPixelColor(3, strip.Color(0, 0, 255));
    strip.setPixelColor(4, strip.Color(0, 0, 255));
    strip.setPixelColor(5, strip.Color(0, 0, 255));
    strip.setPixelColor(6, strip.Color(0, 0, 255));
    strip.setPixelColor(7, strip.Color(0, 0, 255));
    strip.setPixelColor(8, strip.Color(0, 0, 255));
    strip.setPixelColor(9, strip.Color(0, 0, 255));
    strip.setPixelColor(10, strip.Color(0, 0, 255));
    strip.setPixelColor(11, strip.Color(0, 0, 255));
    strip.setPixelColor(12, strip.Color(0, 0, 255));
    strip.setPixelColor(13, strip.Color(0, 0, 255));
    strip.setPixelColor(14, strip.Color(0, 0, 255));
   
    strip.show();
    delay(INTER_FLASH_DELAY);
    strip.setPixelColor(0, strip.Color(0, 0, 0));
    strip.setPixelColor(1, strip.Color(0, 0, 0));
    strip.setPixelColor(2, strip.Color(0, 0, 0));
    strip.setPixelColor(3, strip.Color(0, 0, 0));
    strip.setPixelColor(4, strip.Color(0, 0, 0));
    strip.setPixelColor(5, strip.Color(0, 0, 0));
    strip.setPixelColor(6, strip.Color(0, 0, 0));
    strip.setPixelColor(7, strip.Color(0, 0, 0));
    strip.setPixelColor(8, strip.Color(0, 0, 0));
    strip.setPixelColor(9, strip.Color(0, 0, 0));
    strip.setPixelColor(10, strip.Color(0, 0, 0));
    strip.setPixelColor(11, strip.Color(0, 0, 0));
    strip.setPixelColor(12, strip.Color(0, 0, 0));
    strip.setPixelColor(13, strip.Color(0, 0, 0));
    strip.setPixelColor(14, strip.Color(0, 0, 0));
 
    strip.show();
    delay(INTER_FLASH_DELAY);
     }
      break;
    default:
      lichtmodus = 0;
  }
}

Aceli

Jez noch ein
Fade in fade out

Was ich sehr schwer empfinde

Und dann sollte das eigentlich reichen ....

Doc_Arduino

#63
Apr 18, 2019, 09:18 pm Last Edit: Apr 18, 2019, 09:21 pm by Doc_Arduino
Hallo,

was soll dein case 2 machen? Das wechselt aktuell 15x die Farbe auf allen LEDs?
N_LEDS in deiner case 2 for Schleife hat dann aber nichts mit der LED Anzahl zu tun.

Man könnte die Code Vielfachen abkürzen wie folgt.
Code: [Select]

const byte N_LEDS = 15;


Code: [Select]
case 2:
      for (byte n = 0; n < N_LEDS; n++) {
        setFarbe(N_LEDS, 0, 0, 255);     // alle blau
        strip.show();
        delay(INTER_FLASH_DELAY);
        setFarbe(N_LEDS, 0, 0, 0);       // alle aus
        strip.show();
        delay(INTER_FLASH_DELAY);
      }
      break;


Code: [Select]
void setFarbe (const byte n, byte r, byte g, byte b)
{
  for (byte i=0; i<n; i++)
  {
    strip.setPixelColor(i, strip.Color(r, g, b));
  }  
}

Dann erhält man wieder mehr Überblick und der Umbau auf millis() fällt leichter.
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

Aceli

Aber ich hab doch im Sketch oben mit define n_leds 15 die bereits festgelegt oder ?

agmue

#define N_LEDS 15          // Textersetzung
const byte N_LEDS = 15;  // Konstante mit Typprüfung

Dieser kleine Unterschied ist aber nicht der springende Punkt! Es geht um die Verwendung einer Funktion zum Zusammenfassen und Aufräumen.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Aceli

Gut, verstehe, denk ich.

Ja ich war erstmal froh das es so funktioniert hat.
Aufräumen ist gut.

leider weiß ich noch nicht wie ich
Code: [Select]
void setFarbe (const byte n, byte r, byte g, byte b)
{
  for (byte i=0; i<n; i++)
  {
    strip.setPixelColor(i, strip.Color(r, g, b));
  } 
}



in mein Sketch einbau.

auch mit diesem Fade in/out

hab ich probleme beim verständnis und einfügen  :smiley-confuse:

agmue

leider weiß ich noch nicht wie ich ...
in mein Sketch einbau.
Code: [Select]
void setup() {
...
}
 
void loop() {
...
}

void setFarbe (const byte n, byte r, byte g, byte b)
{
  for (byte i=0; i<n; i++)
  {
    strip.setPixelColor(i, strip.Color(r, g, b));
  }
}

void FadeInOut(byte red, byte green, byte blue){
  float r, g, b;

  for(int k = 0; k < 256; k=k+1) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    strip.show();
  }

  for(int k = 255; k >= 0; k=k-2) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    strip.show();
  }
}



Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Aceli

Danke

aber ich meint vorrangig das aus Beitrag #63

oder übersehe ich grad was ...

Aceli

so funktioniert es...

wärt ihr damit zufrieden?

Code: [Select]

#include <Adafruit_NeoPixel.h>
const byte N_LEDS = 15;
#define N_LEDS 15
#define PIN     6

Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);


const byte MAX_ANZAHL_LICHTMODI = 3;
const byte tasterPin = 7;
int lichtmodus = 0;
bool aktTasterStatus, altTasterStatus;
const byte potPin = A0;
uint32_t jetzt, vorhin, intervall, entprellMillis;
int pos = 0, dir = 1; // Position, direction of "eye"

#define INTER_FLASH_DELAY 30
#define INTER_FLASH_COUNT 10


void setup() {
  strip.begin();
  pinMode (tasterPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println(F("Anfang"));
  intervall = analogRead(potPin);
  Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
  Serial.println(intervall);
}

void setFarbe (const byte n, byte r, byte g, byte b)
{
  for (byte i=0; i<n; i++)
  {
    strip.setPixelColor(i, strip.Color(r, g, b));
  } 
}

void loop()
{
  jetzt = millis();
  altTasterStatus = aktTasterStatus;
  aktTasterStatus = digitalRead(tasterPin);

  if ((aktTasterStatus != altTasterStatus) && (jetzt - entprellMillis >= 30))
  {
    entprellMillis = jetzt;
    if (!aktTasterStatus)
    {
      lichtmodus = (lichtmodus + 1) % MAX_ANZAHL_LICHTMODI;
      Serial.print(F("Neuer Lichtmodus: "));
      Serial.println(lichtmodus);
    }
  }

 
  switch (lichtmodus)
  {
    case 0:
      if (jetzt - vorhin >= intervall)
      {
        vorhin = jetzt;
        intervall = analogRead(potPin);
        Serial.print(F("Intervall: "));  //gibt Text/Variablen auf der Seriellen aus
        Serial.println(intervall);

        // Rather than being sneaky and erasing just the tail pixel,
        // it's easier to erase it all and draw a new one next time.
        for (uint16_t j = 0; j < N_LEDS; j++) strip.setPixelColor(j, 0);

        // Draw 5 pixels centered on pos.  setPixelColor() will clip any
        // pixels off the ends of the strip, we don't need to watch for that.
        strip.setPixelColor(pos - 1, 0x696969);
        strip.setPixelColor(pos    , 0xFFFFFF); // Center pixel is brightest
        strip.setPixelColor(pos + 1, 0x696969);
        strip.show();

        // Bounce off ends of strip
        pos += dir;
        if (pos < 0) {
          pos = 1;
          dir = -dir;
        } else if (pos >= N_LEDS) {
          pos = N_LEDS - 2;
          dir = -dir;
        }
      }
      break;
   case 1:
      for (uint16_t n = 0; n < N_LEDS; n++)
        {
          strip.setPixelColor(n, 138, 43, 226);
        }
      strip.show();
      break;
   case 2:
     for (byte n = 0; n < N_LEDS; n++)
        {
          setFarbe(N_LEDS, 0, 0, 255);     // alle blau
          strip.show();
          delay(INTER_FLASH_DELAY);
          setFarbe(N_LEDS, 0, 0, 0);       // alle aus
          strip.show();
          delay(INTER_FLASH_DELAY);
        }
      break;
    default:
      lichtmodus = 0;
  }
}



so nun zum Fade

Doc_Arduino

Zufrieden? Ist Ansichtssache. Du drückst dich vor millis() ohne Ende. Derweile baust du den Sketch immer weiter aus. Hast du noch nicht mitbekommen das der Sketch träge reagiert wenn du den Lichtmodus ändern möchtest?
Dein case 2: blockiert für satte 900ms (15 * 2 * 30 ms) die loop.

In case 0 nimmst du schon millis. Scheinbar nicht konsequent oder unbewußt.

Ich sehe 2 Möglichkeiten
a) dich stört das nicht, dann kannste so weitermachen
b) dich stört es, dann lerne den Umgang mit millis und bau alles komplett neu auf. Mit einheitlichen Datentypsyntax und ohne define. Das ist sonst schwer lesbar. Genauso wie die case Nummern in 3 Monaten schwer lesbar werden. Welche Nummer welche Lichtfunktion darstellt. Nimm enum mit switch-case. Notfalls bauste dir noch einen Dolmetscher dazwischen, der zwischen die Lichtmodusnummern in enums übersetzt. Alles in extra Funktionen, dann ist das alles kein Problem und leichter wartbar.

Immer daran denken, deine loop und eben das ewig aufgerufende switch-case müssen immer ohne Pause durchlaufen können. Als Pause ohne Blockierung nimmste ein case was mittels if wartet bis die Zeit vorbei ist. Danach springt das case wieder dorthin wo es etwas machen soll. Nichts blockiert, alles im Fluß. Erfordert umdenken und Übung. Aber ganz ehrlich. Ohne dem kommst du nicht wirklich weiter.

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

Aceli

na ich muss das schon noch ordentlich lernen.

nicht konsequent und unbewusst....
bisher freute ich mich immer wenn es doch funktioniert.

aber in der tat ist mir beim durchschalten aufgefallen das es von Case 2 auf 0 wieder lange dauert bis er das nimmt....


vielen dank für dein Kommentar....

noch sehr viel zu lernen ich hab

Aceli

...
Dein case 2: blockiert für satte 900ms (15 * 2 * 30 ms) die loop.
....

Gebe zu.... ich finds nicht. ich weiß nicht wie ich das ändere....

postmaster-ino

Hi

Indem Du in 'case 2' eine neue Status-Variable erzeugst und mit Dieser einen neuen Endlichen Automat realisierst.
So kommst Du jedes Mal in Deinen 'case 2', und dort, je nach Status, machst Du was, oder eben nicht.
Beim letzten Status änderst Du den Status, Der Dich zu 'case 2' gebracht hat - schätze, wird dann wohl '3' werden - kA.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Aceli

Dann habe ich den Sketch, wie aus Beitrag #55, falsch weiter geführt mit Case 2?!

Dann versteh ich es wirklich noch nicht... verstehe nicht warum das so schwer ist zu verstehen für mich

Go Up