Belebtes Haus mit ws2812 - Lichtfarbe ändern

Hallo zusammen,

kurz vorangestellt: Ich bin sowohl was Elektronik als auch Programmierung angeht lediglich mit angelesenen Einsteigerfähigkeiten ausgestattet, also seht es mir bitte nach, wenn ich blöde Fragen oder blöde Nachfragen stelle. Zu meinem Probelm: Ich möchte ein Modellhaus mittels Arduino (später Aty45) mit WS2812 (5 LEDs) beleuchten, und zwar über den unten angefügten Sketch, den ich von https://analog-h0.de/ habe. Angepasst habe ich bereits die Helligkeit, weil mir die Voreinstellungen erheblich zu hell waren. Jetzt möchte ich aber auch die Lichtfarbe ändern, weil mir das voreingestellte Weiß zu kalt ist. Nun finde ich absolut nicht die Stelle(n), wo ich das anpassen kann. Könntet ihr mir einen Tipp geben, wo und ggfls. wie ich das machen kann?

Hier der vorhandene Code:

/**
*** Beleuchtung eines Mehrparteinen-Wohnhauses mit TV Flimmern
*** Räume werden zufällig beleuchtet, es gibt eine Treppenhausbeleuchtung mit dem typischen Leuchtstoffröhren-Einschaltflackern, oder eine Simulation, die dem TV-Flackern ähnelt
***
*** Ansteuerung eines LED-Strang  mit WS2812B mit Attiny85 oder Attiny45
*** CPU Clock mindestens auf 8Mhz stellen!
**/

#include <Adafruit_NeoPixel.h>


// diese Definitionen nach Geschmack anpassen
#define PIN 4               //Ausgabepin des Attiny
#define ANZAHL_RAEUME 5    //Anzahl der Räume im Haus
#define TREPPENHAUS 1       //Der Raum im Haus, der das Treppenhaus darstellt
#define PAUSE 50            //Pause zwischen den Schritten des Zeitzählers
#define TIMER_MAX 250       //Zeit für die nächste Raumauslosung (TIMER_MAX * PAUSE msec)
#define MSEKUNDEN 200       //Zeitvorgabe fuer die minimale Beleuchtungsdauer
#define RAND_TEIL 125        //Zufallszugabe für die Beleuchtungsdauer
#define ROOM_BRIGHTNESS 8  //Helligkeitseinstellung der LED's bei Raumbeleuchtung
#define TV_BRIGHTNESS 4     // Helligkeit des TV-Flimmerns
#define LS_ROEHRE 125       //msec für Leuchtstoffröhren-Flackern


// die folgenden Definitionen nicht anfassen!
#define LICHT_AUS 0
#define LICHT_AN 1
#define TV_AN 2

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(ANZAHL_RAEUME, PIN, NEO_GRB + NEO_KHZ800);

byte Room[ANZAHL_RAEUME];
byte Zeit = 0;
byte Counter = TIMER_MAX;

void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // Initialisierung des Zufallsgenerators
 #define SERIAL Serial
 
  randomSeed(analogRead(0));

  // Initialisierung der LED-Kette
  pixels.begin();
  // Alle LEDs abschalten
  for (byte i = 0; i < ANZAHL_RAEUME; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 0, 0));
    Room[i] = LICHT_AUS;
  }
  // LEDs ansteuern
  pixels.show();
}

void loop() {
  // LEDs ansteuern
  pixels.show();
  // Fernsehsimulation aufrufen und Treppenhausbeleuchtung prüfen
  tvFlimmern();
  // Prüfen, ob der Zeitintervall um ist
  if (Counter == TIMER_MAX) {
    Counter = 0;
    // Raum auslosen
    byte r = random(ANZAHL_RAEUME);
    // Wenn das Treppenhaus ermittelt wurde, die LLeuchtstoffröhren-Simulation für den Raum aufrufen und den Timer starten
    if (r == TREPPENHAUS) {
      TreppenhausBeleuchtung();
    }
    else {
      // prüfen, ob das Licht im Raum aus ist
      if (Room[r] == LICHT_AUS) {
        // falls ja, einmal würfeln
        byte w = random(6);
        // bei 0-3 geht nur das Licht an
        if (w <= 3) {
          pixels.setPixelColor(r, pixels.Color(ROOM_BRIGHTNESS, ROOM_BRIGHTNESS, ROOM_BRIGHTNESS));   //Leuchstärke der lED Farben festlegen
          Room[r] = LICHT_AN;
        }
        // bei 4-5 geht der Fernseher an
        else {
          Room[r] = TV_AN;
        }
      }
      // ist in dem Raum bereits eine Beleuchtung an, dann diese ausschalten
      else{
        pixels.setPixelColor(r, pixels.Color( 0, 0, 0));
        Room[r] = LICHT_AUS;
      }
    }
  }
  // warten
  delay(PAUSE);
  // Zeitzähler hochzählen
  Counter++;
}

void tvFlimmern() {
  for (byte r = 0; r < ANZAHL_RAEUME; r++) {
    // Dort, wo ein Fernseher laufen soll, für Flimmern sorgen
    if (Room[r] == TV_AN) {
      pixels.setPixelColor(r, pixels.Color(random(TV_BRIGHTNESS), random(TV_BRIGHTNESS), random(TV_BRIGHTNESS)));
    }
    // Timer im Treppenhaus prüfen und ggfs runterzählen
    // wenn die Zeit abgelaufen ist, Licht ausschalten
    if(r == TREPPENHAUS ){
      // wenn die Zeit angelaufen ist, Licht abschalten
     if((Zeit==0)&&(Room[r]==LICHT_AN)){
      pixels.setPixelColor(r, pixels.Color( 0, 0, 0));
      Room[r]=LICHT_AUS;
      }
    // Sonst Timer runterzählen
      else{
        Zeit--;
      }
    }
  }
  // LEDs ansteuern
  pixels.show();    
}

void TreppenhausBeleuchtung() {
  // Einschaltflackern nur, wenn im Treppenhaus kein Licht brennt
  if (Room[TREPPENHAUS] == LICHT_AUS) {
    // dreimal blinken
    for (byte i = 0; i < 3; i++) {
      pixels.setPixelColor(TREPPENHAUS, pixels.Color(ROOM_BRIGHTNESS, ROOM_BRIGHTNESS, ROOM_BRIGHTNESS));
      pixels.show();
      delay(LS_ROEHRE);
      pixels.setPixelColor(TREPPENHAUS, pixels.Color(0, 0, 0));
      pixels.show();
      delay(LS_ROEHRE);
    }
    // Licht einschalten und Timer starten
    pixels.setPixelColor(TREPPENHAUS, pixels.Color(ROOM_BRIGHTNESS, ROOM_BRIGHTNESS, ROOM_BRIGHTNESS));
    Room[TREPPENHAUS] = LICHT_AN;
    Zeit = MSEKUNDEN+random(RAND_TEIL);
  }
  // LEDs ansteuern
  pixels.show();
}
      pixels.setPixelColor(r, pixels.Color(ROOM_BRIGHTNESS, ROOM_BRIGHTNESS, ROOM_BRIGHTNESS));   //Leuchstärke der lED Farben festlegen

das ist die Stelle.

pixels.Color(255, 255, 255) hellste Farbe weiss

ROOM_BRIGHTNESS

ist doch mit 8 vorbelegt, wie kommt da 255 hin?

Da ist schon im obigen Sketch von dir etwas falsch eingetragen worden.
Das ist die Stelle für die Farbe und nicht für die Helligkeit.
Die Helligkeit bekommt einen eigenen Eintrag.

Ich habe nur diese beiden Zeilen verändert:

#define ROOM_BRIGHTNESS 8  //Helligkeitseinstellung der LED's bei Raumbeleuchtung
#define TV_BRIGHTNESS 4     // Helligkeit des TV-Flimmerns

und zwar von 16 auf 8 in der ersten Zeile und von 8 auf 4 in der zweiten Zeile. Was war daran falsch? Ich habe die Änderungen vorgenommen, weil mir das Licht zu hell war, und tatsächlich haben die Änderungen dazu geführt, dass das Licht deutlich dunkler wurde. An der Lichtfarbe hat das nichts geändert.

An der Stelle, wo die von dir geänderten Werte eingesetzt werden, änderst du aber die Farbe. Deshalb heißt die Anweisung auch ...color...
Die Helligkeit wird gesondert eingestellt.
Schau dir einfach mal die nützlichen Beispiele zur Library an.

mach dir eine Konstante für warmweiß. Reduziere einfach ein wenig den Blauanteil.
Ich schreibe die Farbe meist in HEX, dann hast immer zwei Stellen für jede Farbe ( RRGGBB).

constexpr uint32_t warmweiss {0xFFFFAA};

und dann verwendest
warmweiss
statt
pixels.Color(ROOM_BRIGHTNESS, ROOM_BRIGHTNESS, ROOM_BRIGHTNESS)

weniger zum tippen ist es auch :wink:

Ich komme nicht weiter. Wenn ich den von dir vorgeschlagenen Weg gehe, also die Konstante festlege und warmweiss statt pixels.Color(ROOM_BRIGHTNESS, ROOM_BRIGHTNESS, ROOM_BRIGHTNESS) einsetze, leuchten die LEDs wieder mit voller Kraft und weiterhin in kaltweiß. Da scheint irgendwo anders ein Fehler im Programm zu sein.

naja wenn du ursprünglich mit 8,8,8 gearbeitet hast dann probier halt mal

constexpr uint32_t warmweiss {0x080804};

grundsätzlich wäre es halt so dass ich die Helligkeit nicht über die Farbe ändern würde, sondern über die brightness...

strip.setBrightness(42); // 0..255

Inzwischen habe ich mich wohl der Lösung angenähert. Ich habe an der Stelle

 // prüfen, ob das Licht im Raum aus ist
      if (Room[r] == LICHT_AUS) {
        // falls ja, einmal würfeln
        byte w = random(6);
        // bei 0-3 geht nur das Licht an
        if (w <= 3) {
          pixels.setPixelColor(r, pixels.Color(9, 5, 3));   //Leuchstärke der lED Farben festlegen
          Room[r] = LICHT_AN;
        }

die niedrigen Werte anstelle der fraglichen ROOM_BRIGHTNESS eingetragen und es klappt, wie es soll, soll heißen Lichtstärke reduziert und Lichtfarbe in wärmerem weiß. Entsprechend klappt es auch mit der Konstanten, wenn ich den Wert reduziere, also 0x090503.

Warum siehst du dir die Beispiele nicht an.
Da kannst du auch schon viel daraus erkennen.

Das werde ich auch machen. Ich fang ja grad erst an...

Ok......das ist wie mit einer Bedienungsanleitung.
Die wird auch erst gelesen, wenn das Gerät kaputt ist. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.