Umsetzung mit WS2812 Strips möglich

Hallo Freunde

Ich möchte gerne meine LED Uhr verbessern und habe folgendes vor, die Uhr Zeiger werden aus 2 Ringe weißer Led angezeigt. Also es läuft alle 5 Min. der Minutenzeiger weiter, je Std. springt der Stundenzeiger um einen Schrit weiter. Da mir das nicht genug war habe ich noch einen Sekundenzeiger dazu programmiert. Jedoch da jeder Zeiger aus 2 LED in weiß dargestellt wird , wird das ganze ein wenig unübersichtlich, da alle Zeiger die gleiche Länge haben und somit schlecht auseinander zu halten sin. Ich bekomme die Tage die bestellten WS2812 Strips und habe mir gedacht die 2 Led Ringe um einen Ring mit den WS2812 zu erweitern und hätte dazu eine Frage. Ich möchte dann jeweils für den Sekundenzeiger die LEDs in Rot mit laufen lassen und für den Minutenzeiger in Blau mit laufen lassen und sobald sich die Zeiger überschneiden bei der Minute und der Stunde sich die farbe an der Led in RGB mischen lassen. Meine Frage ..... ist das möglich die Leds so an zu steuern , das diese wie beschrieben reagieren.
Zur besseren Übersicht habe ich einmal ein Bild der UHR angehängt. Bis jetzt läuft der Min. Zeiger und die Stunde und bei jeder Vollen,Halben oder viertelstunde geht eine Rainbow LED mit an. Aber Ihr seht das man die Zeiger unterwegs zu schnell verwechseln kann.

DSCF0106.jpg

Hat eventuell einer einen Plan ob das was ich beschrieben habe möglich ist? Ich kenne mich mit den Strips nicht aus aber eventuell hat ja schon jemand Erfahrung damit.

l.G.Jürgen

Ja, das ist so möglich. Du kannst die einzelnen RGB LEDs der WS2812 Strips einzeln oder gemischt ansteuern.

Danke sven222

Ich habe mit den Strips noch nie gearbeitet, vielmehr ich habe sie noch garnicht. Ich denke einmal das sie diese oder nächste Woche ankommen, dann werde ich wohl mal weitersehen und mal ein wenig experimentieren.

l.G.Jürgen

Habe hier noch einen Sketch von meiner Uhr. Hab daran nicht weitergearbeitet, da ich noch auf die Alibaba Lieferung warte. Ansich ist der Sketch funktionsfähig auch wenn nicht optimiert :wink:

An dem Beispiel siehste, wie du mit der FastSPI Lib einzelne Farben ansteuern kannst.
Mit leds gibt die i-te RGB Led an, mit “.b” die Farbe und mit x den Wert der Farbe. b steht in diesem Bespiel für blau :wink: r = rot, g = grün
```

  • leds[i].b = x;*
    * *
    *// RTC
    #include <DS3232RTC.h>
    #include <Wire.h>
    #include <Time.h>

// F-Makro
#include <Streaming.h>

// LED Strip
#include <FastSPI_LED2.h>
#define NUM_LEDS 60
#define DATA_PIN 4
CRGB leds[NUM_LEDS];

// Ausgabe Debug Serial Monitor
byte debug = 3;
unsigned long lZeit = 0;

void setup() {
  // Serielle Schnittstelle öffnen
  Serial.begin(115200);

// RTC Uhrzeit holen
  setSyncProvider(RTC.get);
  setSyncInterval(3600);
  if(timeStatus() != timeSet) Serial << F(“Sync nicht erfolgreich”) << endl;
  else Serial << F(“Sync erfolgreich!”) << endl;

// LED Strip
  FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
}

void loop() {
  // Erfassung der loopZeit
  unsigned long aZeit = millis();

// Aktivieren des Debuggers über den Serial Monitor
  if(Serial.available()) debug = Serial.parseInt();

// Alle LEDs löschen
  for(int x = 0; x < 60; x++) leds = CRGB(0,0,0);

rtcStunden();
  rtcMinuten();
  rtcSekunden();

FastLED.show();

// Erfassung der loopZeit
  lZeit = millis() - aZeit;
  if(debug == 0) {
    //Serial << F("lZeit : ") << dig2(lZeit) << endl;
  }
}

void rtcSekunden() {
  byte s = second();

byte ledArray = {
    59, 0,1,2,3,4,5,6,7,8,9,10,
    11,12,13,14,15,16,17,18,19,20,
    21,22,23,24,25,26,27,28,29,30,
    31,32,33,34,35,36,37,38,39,40,
    41,42,43,44,45,46,47,48,49,50,
    51,52,53,54,55,56,57,58,59, 0
  };

byte pwmFadeX = {
    217,186,158,135,115,98,84,71,
    61,52,44,38,32,27,23,20
  };

byte pwmFadeZ = {
    20,23,27,32,38,44,52,61,
    71,84,98,115,135,158,186,217
  };

// Vergangene Zeit seit der letzen Sekundenänderung
  static byte sAlt;
  unsigned long aZeit = millis();
  static unsigned long vZeit;
  static unsigned long dZeit;
  if(s != sAlt) {
    vZeit = aZeit;
    sAlt = s;
  }
  dZeit = aZeit - vZeit;

// Berechnung des Fadings
  byte i = dZeit/62;
  if(i >= 16 ) i = 15;

// 10 Schritte/Sekunde
  byte x = pwmFadeX[i];
  byte y = 255;
  byte z = pwmFadeZ[i];

// Zuweisung
  leds[ledArray[s]].b = x;
  leds[ledArray[s+1]].b = y;
  leds[ledArray[s+2]].b = z;
}

void rtcMinuten() {
    byte m = minute();
  byte s = second();

byte pwmFade = {
    20,24,28,33,39,47,55,66,
    78,92,109,129,153,182,215,255
  };

byte mStartTemp = m/5;
  byte mStart = mStartTemp*5;
  byte mMod = m%5;

// Berechnung des Fadings
  byte i = s*16/60;
  if(i >= 16 ) i = 15;
  byte x = pwmFade[i];

// Zuweisung
  for(int j = 0; j <= mMod; j++) leds[mStart+j].g = 255;
  leds[m+1].g = x;
}

void rtcStunden() {
  byte h = hourFormat12();
  byte m = minute();

byte pwmFade = {
    20,24,28,33,39,47,55,66,
    78,92,109,129,153,182,215,255
  };

// Berechnung des Fadings
  byte i = m/12;
  byte x = pwmFade[m-(i*12)];

// Zuweisung
  for(int k = 0; k < i; k++) leds[h5+i-k].r = 255;
  leds[h
5+i+1].r = x;
  leds[h*5].r = 255;
}

// 2 stellige Ausgabe von Zahlen
byte dig2(byte i) {
  if(i < 10) Serial << " ";
  return i;
}

// 3 stellige Ausgabe von Zahlen
byte dig3(byte i) {
  if(i < 10) Serial << " ";
  if(i < 100) Serial << " ";
  return i;
}*
```

Danke für den Sketch, das ist schön zum experimentieren, da ich mir garnicht vorstellen kann wie das funktioniert. Ich warte sehnsüchtih auf die Strip`s von Alibaba , die müssten eigentlich die Woche kommen.

l.G.Jürgen

hi,

hier meiner für die ws2812. rtc anschließen und sollte laufen, ich hoffe, es ist der richtige, funktionierende sketch.

#include <FastSPI_LED2.h>
#include <Wire.h> 

#define NUM_LEDS 60
struct CRGB { byte g; byte r; byte b; };
struct CRGB leds[NUM_LEDS];
WS2811Controller800Mhz<12> LED;

uint8_t h;
uint8_t m;
uint8_t s = 15;

byte sdim = 0;
byte mill_akt;
byte mill_alt = 39;

boolean neu = true;

byte loga[] = {0,0,0,0,0,1,1,1,2,2,3,4,5,6,7,8,9,10,11,13,14,16,18,19,21,23,26,28,30,
               32,35,38,40,43,46,49,52,55,59,62,66,70,73,77,81,85,90,94,98,103,108,112,
               117,122,127,133,138,144,149,155,161,167,173,179,185,192,198,205,212,219,
               226,233,240,247,255};
               
byte ledrf[] = {58,59,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
                26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,
                50,51,52,53,54,55,56,57,58,59,0,1,2};

byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

boolean sek_sig() {
  if (digitalRead(8) == HIGH) {
    if (neu == true) {
      neu = false;
      return true;
    }
  } else {
    neu = true;
  }
  return false;
}

void holeZeit() {
  Wire.beginTransmission(0x68);
  Wire.write(byte(0));
  Wire.endTransmission(); 
  Wire.requestFrom(0x68, 7);
  s = bcdToDec(Wire.read() & 0x7f);
  m = bcdToDec(Wire.read());
  h = bcdToDec(Wire.read() & 0x3f);
  h = (h % 12)*5+int((m+5)/12);
}

void setLED(byte led_, byte r_, byte g_, byte b_) {
  leds[led_].r = r_;
  leds[led_].g = g_;
  leds[led_].b = b_;
}

void setLEDs() {
  memset(leds, 0, 180);
  setLED(ledrf[s+5], 0, loga[sdim], 0);
  setLED(ledrf[s+4], 0, loga[sdim+25], 0);
  setLED(ledrf[s+3], 0, loga[sdim+50], 0);
  setLED(ledrf[s+2], 0, loga[74-sdim], 0);
  setLED(ledrf[s+1], 0, loga[49-sdim], 0);
  setLED(ledrf[s  ], 0, loga[24-sdim], 0);
  setLED(ledrf[m+1], 30, 0, 0);
  setLED(ledrf[m+2], 255, 0, 0);
  setLED(ledrf[m+3], 30, 0, 0);
  setLED(ledrf[h+2], 0, 0, 255);
  LED.showRGB((byte*)leds, NUM_LEDS);
}

void setup() {
  pinMode(8, INPUT);
  Wire.begin();
  LED.init();
  memset(leds, 0, 180);
  LED.showRGB((byte*)leds, NUM_LEDS);
  Wire.beginTransmission(0x68);
  Wire.write(0x07);
  Wire.write(0x10);
  Wire.endTransmission();
  holeZeit();
  s--;
//  Serial.begin(9600);
}

void loop() {
  mill_akt = millis() % 40;
  if (mill_akt < mill_alt) {
    setLEDs();
    sdim++;
    if (sdim > 24) {
      sdim = 0;
    }
  }
  mill_alt = mill_akt;
  if (sek_sig() == true) {
    s++;
    sdim = 0;
    if (s>59) {
      holeZeit();
    }
  }
}

gruß stefan

So jetzt könnten die Strips kommen von Alibaba :slight_smile: den Sek.Zeiger habe ich realisiert jetzt nur noch mit Farbe belegen damit man die einzelnen Zeiger unterscheiden kann.

http://swf.vidup.de/v/62RVt/
l.G.Jürgen