Arduino uno Neopixel Uhr

hallo leute ich bin auf der suche nach hilfe, und zwar will ich eine neopixel uhr bauen habe aber probleme das mein code nicht funktioniert ich nutze als RTC die DS3231 mit einem 60led ring

der code:

#include <Adafruit_NeoPixel.h>
#include <DS3231.h>
 
 
#define PIN            6
#define NUMPIXELS      60
 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
 
int delayval = 500;
RTCDateTime dt;
DS3231 clock;
uint32_t color;
boolean reset = false;
int oldSec;
 
 
void setup() {
  Serial.begin(9600);
  pixels.begin();
  clock.begin();
  //clock.setDateTime(__DATE__, __TIME__);
  pixels.setBrightness(16);
}
 
void loop() {
    dt = clock.getDateTime();
    String hour = clock.dateFormat("g", dt);
    String minute = clock.dateFormat("i", dt);
    String second = clock.dateFormat("s", dt);
    int hLED = hour.toInt();
    int mLED = minute.toInt();
    int sLED = second.toInt();
 
    //battery hack - needs less power
    /*for (int i=0; i<NUMPIXELS;i++) {
        pixels.setPixelColor(i, 0,0,0);  
      }
    */
    if (sLED == 0) {
      theaterChase (pixels.Color(255,0,128),25);
      for (int i=0; i<NUMPIXELS;i++) {
        pixels.setPixelColor(i, 0,0,0);  
      }
      pixels.show();
    }
 
    
    if (sLED <= 10) {
      pixels.setPixelColor(sLED, 255,sLED*25,0);
    } else if (sLED > 10 && sLED <= 20) {
      pixels.setPixelColor(sLED, 255 - (sLED-10)*25,255,0);
    } else if (sLED > 20 && sLED <= 30) {
      pixels.setPixelColor(sLED, 0,255, (sLED-20)*25);
    } else if (sLED > 30 && sLED <= 40) {
      pixels.setPixelColor(sLED, 0,255-(sLED-30)*25, 255);
    } else if (sLED > 40 && sLED <= 50) {
      pixels.setPixelColor(sLED, (sLED-40)*25,0, 255);
    } else if (sLED > 50) {
      pixels.setPixelColor(sLED, 255,0, 255-(sLED-50)*25);
    }
    
    
    
    pixels.setPixelColor(hLED*5, 255,0,0,255);
    if (hLED*5 == mLED) {
      pixels.setPixelColor(mLED, 255,128,0);  
    } else pixels.setPixelColor(mLED, 0,255,0);
    pixels.show();
    delay(delayval);
}
 
 
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < NUMPIXELS; i=i+3) {
        pixels.setPixelColor(i+q, c);    //turn every third pixel on
      }
      pixels.show();
 
      delay(wait);
 
      for (uint16_t i=0; i < pixels.numPixels(); i=i+3) {
        pixels.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
 
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

die Fehler:

Arduino: 1.8.2 (Windows 7), Board: "Arduino/Genuino Uno"

WARNUNG: Kategorie 'Real-time clock' in der Bibliothek DS3231 ist ungültig und wird auf 'Uncategorized' festgelegt
neopixeluhrV1:11: error: 'RTCDateTime' does not name a type

 RTCDateTime dt;

 ^

C:\Users\Helma\Documents\Arduino\neopixeluhrV1\neopixeluhrV1.ino: In function 'void setup()':

neopixeluhrV1:21: error: 'class DS3231' has no member named 'begin'

   clock.begin();

         ^

C:\Users\Helma\Documents\Arduino\neopixeluhrV1\neopixeluhrV1.ino: In function 'void loop()':

neopixeluhrV1:27: error: 'dt' was not declared in this scope

     dt = clock.getDateTime();

     ^

neopixeluhrV1:27: error: 'class DS3231' has no member named 'getDateTime'

     dt = clock.getDateTime();

                ^

neopixeluhrV1:28: error: 'class DS3231' has no member named 'dateFormat'

     String hour = clock.dateFormat("g", dt);

                         ^

neopixeluhrV1:29: error: 'class DS3231' has no member named 'dateFormat'

     String minute = clock.dateFormat("i", dt);

                           ^

neopixeluhrV1:30: error: 'class DS3231' has no member named 'dateFormat'

     String second = clock.dateFormat("s", dt);

                           ^

exit status 1
'RTCDateTime' does not name a type

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

ich hoffe ihr könnt mir helfen.

könnt ihr mir auch einen arduino empfehlen wenn ich die uhr verbauen möchte welches so klein als möglich ist

mfg Phillert

'class DS3231' has no member named 'getDateTime'
'RTCDateTime' does not name a type
'class DS3231' has no member named 'begin'

Da passt dein Sketch nicht zu der Library, die du verwendest.
Kriegst die Beispiele zu deiner DS3231.h ans Laufen?
DS3231.h ist evtl. nicht eindeutig auf deinem PC.


Der kleinste "Uno" ist ein nackter atmega328p chip.
Ein Nano wird dir evtl. auch gefallen.
Da du im Betrieb ja keine USB schnittstelle brauchst *), wäre ein Pro Mini auch interessant. (= Nano ohne USB )


*) wie stellst du deine Uhr überhaupt?

also die beispiele laufen alle nur im sketch habe ich die probleme und das verstehe ich nicht ganz die libary wenn ich ein “.h” anhänge bringt mir einen fatal error

WARNUNG: Kategorie 'Real-time clock' in der Bibliothek DS3231 ist ungültig und wird auf 'Uncategorized' festgelegt
C:\Users\Helma\Documents\Arduino\neopixeluhrV1\neopixeluhrV1.ino:2:20: fatal error: DS3231.h: No such file or directory

 #include <DS3231.h>

                    ^

compilation terminated.

exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.

ich weiß nicht woran das liegt habe die lib auch schon 2 mal gelöscht und neu draufgepackt sowohl über den lib verwalter als auch manuell …

kann das noch andere hintergründe haben

Hast du wirklich eine "DS3231.h"-Library ?

Oder evtl. eine "DS3232RTC.h"-Library ? Diese ist sehr verbreitet und wird mehrfach eingesetzt.

Schau mal in deinen Library-Ordner.

ich habe diese lib

https://github.com/NorthernWidget/DS3231

phillert:
ich habe diese lib

Und hoffentlich die einzige und richtig eingebunden.

na ich habe noch eine andere aber in dem sketch nicht

habe im sketch nur diese beiden

#include <Adafruit_NeoPixel.h>
#include <DS3231.h>

gibt es irgendeine lösung denn so langsam bin ich am verzweifeln

Sicher nicht richtig eingebunden.

GitHub - NorthernWidget/DS3231: Communicates between Arduino-programmed AVR and Maxim DS3231 RTC: splice of Ayars' (http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html) and Jeelabs/Ladyada's (https://github.com/adafruit/RTClib) libraries liefert eine DS3231.h Datei, in der eine class RTCLib und eine class DateTime deklariert wird.

Heute Mittag hat er noch die DS3231.h Datei gefunden, sich da aber zu Recht über ein RTCDateTime beschwert.


Mal ganz abgesehen davon, dass nur um 3 Bytes (hh:mm:ss) aus einer RTC zu lesen, man einfacher nur mit Wire.h arbeitet und das ganze Unixtime-Gedöns weglässt. (Oder aber gleich was mit automatischer Europäischer-Sommerzeit-Umschaltung nimmt.)

st du es denn umstellen wenn du nur wire.h nutzen wollen würdest

Guckst du dir eine RTC Library deiner Wahl an und findest die passenden Zeilen

const byte ADDRESS=0x68;

uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }

const int zero=0;

  Wire.beginTransmission(ADDRESS);
  Wire.write(zero); 
  Wire.endTransmission(); // könnte man auch auswerten, ob überhaupt eine RTC dran ist
  
  Wire.requestFrom(ADDRESS, 3);
  uint8_t ss = bcd2bin(Wire.read() & 0x7F); // könnte man auch auswerten, ob die Uhr läuft
  uint8_t mm = bcd2bin(Wire.read());
  uint8_t hh = bcd2bin(Wire.read());

Wobei die BCD <-> BIN Umwandlung hier etwas trickreich ist.
Die sechs sieben Code-Zeilen würde ich in eine Funktion packen, die die Uhrzeit in der dir am besten passenden Form liefert

hi,

das war mal mein sketch für meine uhr. kompiliert nicht mehr mit aktueller fastLED-library, aber Du kannst Dir die sache mit der zeit rausholen:

#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;

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

struct CRGB fh = { 50  ,  50  , 180};
struct CRGB fm = { 50  ,  50  , 180}; 
struct CRGB fs = {100  , 100  , 180}; 

boolean neu = true;

byte logarr[] = {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) % 12)*5+int((m+5)/12);
}

void setLED(byte led_, struct CRGB f, byte r_, byte g_, byte b_) {
  leds[led_].r = logarr[byte((r_ * f.r) / 255)];
  leds[led_].g = logarr[byte((g_ * f.g) / 255)];
  leds[led_].b = logarr[byte((b_ * f.b) / 255)];
}

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

void setup() {
  pinMode(8, INPUT);
  LED.init();
  memset(leds, 0, 180);
  LED.showRGB((byte*)leds, NUM_LEDS);
  Wire.begin();
  holeZeit();
  s--;
}

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

phillert:
na ich habe noch eine andere aber in dem sketch nicht

habe im sketch nur diese beiden

#include <Adafruit_NeoPixel.h>

#include <DS3231.h>




gibt es irgendeine lösung denn so langsam bin ich am verzweifeln

Hast Du schon mal darüber nachgedacht, entweder eine andere Library zu verwenden, oder das RTC-Modul ganz ohne RTC-Library nur mit Hilfe der Wire-Library selbst zu programmieren?

Wegen “anderer Library”: Für DS3231 soll wohl die Christensen-Library ganz gut funktionieren.https://github.com/JChristensen/DS3232RTC

Und wegen "ohne Library: Du brauchst doch nur eine handvoll Funktionen zum Initialisieren, Beschreiben und Auslesen des RTC-Moduls.

Sowas schaft Du nur per copy-and-paste mit fremdem Code und nicht selbst?

Zusatzfrage:
Und auf effektive Programmierung kommt es Dir nicht an?
Oder warum machst Du das:

 String hour = clock.dateFormat("g", dt);
    String minute = clock.dateFormat("i", dt);
    String second = clock.dateFormat("s", dt);
    int hLED = hour.toInt();
    int mLED = minute.toInt();
    int sLED = second.toInt();

Erst wandelst Du eine numerische Zeit in drei String Variable für hour, minute und second um, und gleich danach werden die Strings wieder in numerische Variablen hLED,mLED,sLED zurück gewandelt?

Was soll das?

Rechenzeit verbraten, damit dem Controller zwischen den Sekunden nicht langweilig wird?

also für mich war es erstmal das einfachste es so zu machen.... aber ich gebe dir recht es ist wirlich etwas umständlich gestalltet aber recht hilfreich um es erstmal zu verstehen wie was und wo.

aktuell habe ich es aber geschafft die uhr über die wire libary zum laufen zu bekommen aber da wird noch viel zeit rein fließen was ja aber an sich nicht schlimm ist da es das verständniss für vieles erhöht.

Der ursprüngliche Code bezieht sich auf die DS3231-LIB von Korneliusz Jarzebski (Arduino-DS3231-master, siehe GitHub - jarzebski/Arduino-DS3231: DS3231 Real-Time-Clock). Damit sollte er funktionieren (und ist wesentlich einfacher und übersichtlicher als über die Wire-LIB).