
Aufgepasst!
Günstige Hardware und kostenlose eBooks für den Arduino gibt es bei AZ Delivery
Info zu meinen Partnerlinks
Heute habe ich endlich die große Version der Kleinen Lichtspiel-Uhr mit Arduino und Neopixels fertiggestellt.
Eigtl. war die Uhr schon vor einer Woche fertig, aber ich wollte unbedingt das Innenleben noch einigermaßen ordentlich verbaut haben und so musste spontan noch ein 170-Loch-Breadboard her, welches leider auf sich warten ließ.
Aber nun ist’s vollbracht und ich mag berichten.
Die Uhr basiert auf einem Arduino Nano und einem 60er RGB-LED-Ring nach Neopixel. Dazu noch ein paar Kabel, weißes Plexi, Holz und Schrauben und fertig ist die Uhr.
Sie kann eigtl. nix, außer die Zeit anzuzeigen und dabei gut aussehen. Reicht mir.
Das Zusammenlöten der vier Segmente (27 21 Lötstellen!!!) war übrigens ein Krampf. Ich wollte das ganze möglichst flach halten, damit der Ring später eben auf der Grundplatte aufliegen kann.
Am Anfang war es dann nur ein Ring, der eine Demo abgespielt hat, aber allein so, hätte ich mir das Teil schon überall hingehängt.
Video-Link: https://youtu.be/0z8m1tVU8C4
Dann hab ich den Code der kleinen Lichtspiel-Uhr ein wenig angepass, rumprobiert und hatte quasi meine Lieblingsuhr, die dann ungefähr so aussah. Rote LED zeigt die Stunde, grüne LED zeigt Minute.
Video-Link: https://youtu.be/bOsvHqStGAg
Anschließend habe ich zuvor benanntes, weißes Plexi gekauft, den Ring mit Heißkleber auf eine Holzplatte gepappt und dieses per ausgeklügelter Schraubtechnik zwischen die Plexiplexiplatten gebastelt.
Mit Plexi druff sieht’s schon ganz anders aus.
Leider stellte sich beim Zusammenbau heraus, dass längere Schrauben nötig waren. Diese gab’s in entsprechender Länge dummerweise nicht mit Innensechskant, sodass ich auf hässlichen Kreuzschlitz zurückgreifen musste. Blöd! Muss ich mal suchen, ob ich nicht doch noch welche finde, die schicker aussehen.
Nachdem dann endlich die 170-Loch-Breadboards geliefert wurden, konnte ich das Innenleben einigermaßen sauber verbauen.
Tja, das war’s eigentlich schon.
In Fertig sieht das Ganze dann in etwa so aus:
Ich hatte kurzfristig eine 9V-Batterie angeschlossen, allerdings ziehen die LEDs wohl genug Energie, um regelmäßig auszufallen. Oder die Batterie war einfach fertig. Jedenfalls gab’s kurzfristig einen „Energiesparmodus“, der aber nicht geschockt hat.
Video-Link: https://youtu.be/68aCa6cDsXc
Der volle Zyklus in bunt ist einfach schöner und so läuft die Uhr nun per Netzteil.
Warum auch nicht.
Der Materialwert – nur, falls es interessiert – beläuft sich auf bummelig 65€. Plus Wartezeit für den Plexizuschnitt, Montage und frickeln.
Da es bei einigen immer wieder Probleme mit der DS3231.h gibt, habe ich meine Version mal bereitgestellt (klick).
Update:
Offenbar gibt es keine Pflege mehr für die Library, jedoch gibt es hier einen Fix:
https://github.com/jarzebski/Arduino-DS3231/issues/22#issuecomment-443542205
Hier der aktuelle Code:
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
#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); } |
Man könnte jetzt noch 2 Knöppe anbringen, um die Stunden und Minuten ohne PC einstellen zu können, aber wir wollen ja nicht gleich übertreiben.
2 be continued…
Wenn Dir dieser Beitrag geholfen hat und/oder Du mich finanziell unterstützen magst, kannst Du dies gerne per Paypal machen.
Alternativ kannst Du Dir meinen Amazon-Partnerlink in die Favoriten legen und Amazon bei Deinen zukünftigen Einkäufen darüber aufrufen:
Es entstehen Dir dadurch keine Mehrkosten, ich erhalte aber eine kleine Provision.
Über einen Kommentar freue ich mich natürlich auch :-)

Jan B-Punkt

Neueste Artikel von Jan B-Punkt (alle ansehen)
- Adventskalender Gewinnspiele 2024 - 1. Dezember 2024
- Freie News für freie User – Schneller als die Paywall - 22. April 2024
- Adventskalender Gewinnspiele 2023 - 1. Dezember 2023
- Angespielt: Starship Troopers: Extermination - 19. Mai 2023
- Fazit zum ATOMSTACK A5 pro nach zwei Monaten Nutzung - 9. Mai 2023
hey leider funktioniert hier garnichts. er bringt mir immer n fehler das er bei #include ds3231.h was nicht will. hab schon zick libs probiert er findet nichts
Welches Clock-Modul setzt Du denn ein?
Der Arduino kann von Haus aus keine Uhrzeiten. Er braucht zwingend ein RTC-Modul (RealTimeClock) dafür.
Ansonsten sollte die Lib ohne Probleme funktionieren.
hey habe versucht deines erstmal nachzubauen und ja ich habe das gleiche problem das er mit der libary nicht klar kommt und anscheinend ist irgendetwas mit der deklaration nicht i.o….. hier 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 sketch_may10c:11: error: ‚RTCDateTime‘ does not name a type RTCDateTime dt; ^ C:Users\AppDataLocalTemparduino_modified_sketch_964999sketch_may10c.ino: In function ‚void setup()‘: sketch_may10c:21: error: ‚class DS3231‘ has no member named ‚begin‘ clock.begin(); ^ C:Users\AppDataLocalTemparduino_modified_sketch_964999sketch_may10c.ino: In function ‚void loop()‘: sketch_may10c:27: error: ‚dt‘ was not declared in this scope dt = clock.getDateTime(); ^… Weiterlesen »
Moin Holger,
1. es wäre ganz cool, wenn Du zukünftig vllt. Dienste wie z.B. pastebin.com nutzt, um längere Meldungen zu posten. Das erleichtert das Lesen ungemein.
2. ich habe mal die lib, die ich einsetze, an den Beitrag angehängt (Satz über Sourcecode). Offenbar unterscheiden sich einige Versionen erheblich.
Grüße,
Jan
hallo jan habe es jetzt nochmal mit deiner lib getestet und bin immernoch nicht weiter…..
ich bin gerade deshalt auch im arduino.cc forum unterwegs und habe da mal gefragt ob mir jemand helfen kann.
hier nochmal die fehler:
https://pastebin.com/embed_js/HjyUhUA8
hast du eventuell noch eine idee oder hast du eventuell etwas anders gemacht als ich
Hast Du mein Beispiel 1:1 kopiert?
Dann müsste es mit meiner lib ja laufen.
Wenn Du eigenen Code hast, kannste den ja auch nochmal zu Pastebin laden und hier verlinkten. Dann riskier ich mal einen Blick.
Es kann auch sein, dass Du falsch verdrahtet hast und er die Hardware evtl. gar nicht erkennt.
Generell bist Du mit sowas im Forum echt super aufgehoben :)
ja im forum dreht sich die frage erstmal um die lib aber da ist noch keine lösung in sicht….
habe erstmal deinen code 1 zu 1 genommen weil mir die effekte gut gefallen und wollte daraus dann was eigenes stricken aber naja dazu muss es erstmal laufen
die verkabelung ist ja recht simpel VCC und GND ist klar an der RTC SCL -> A4 SDA->A5
4 und 5 mal getauscht? Nur so zum Spaß? Manche Boards haben auch direkte SCL und SDA Ports.
Hauptsache, Du berichtest, wie das Problem schlussendlich gelöst wurde, wenn’s läuft :)
Gehe aber eigtl. mit den Posts im Forum konform, dass da was nicht richtig angelegt wurde. Also lib-mäßig.
Hallo Jan, hab das Projekt nachgebaut und mit der richtigen ds3221 lib funktioniert es gleich beim ersten mal :) meine Frage: kann man die Stundenmarkierungen dauerhaft eingeblendet lassen ?
Hey Heiko,
danke für die Rückmeldung und Glückwunsch zur neuen Uhr :)
Was genau meinst Du mit „dauerhaft“?
Vllt. dass der Kreis nach und nach „voll läuft“?
Das ließe sich bestimmt über Codeanpassungen lösen. Das überlasse ich aber Dir – learning by doing ;-)
Hallo, ich h,abe.eine Frage zum Löten. Wie kommen Sie auf 27 Lötstellen?
8 mal GND + Kabel = 9
6 mal DC + Kabel = 7
6 mal Daten + Kabel = 7
Was muss noch gelötet werden
Da muss ich mich damals wohl vertippt haben.
Es sind 21 Lötstellen:
3 oben (Verbindung zum Ino)
6 rechts (je 3 pro Segment)
6 unten (je 3 pro Segment)
6 links (je 3 pro Segment)
plus ein paar am RTC-Modul und am Ino selbst, wenn man nicht mit Steckverbindern arbeiten will.
Welche Lichtdurchlässigkeit hat denn das weiße Opal Acrylglas?
Moin Domi,
ich kann Dir hier leider keine konkreten Werte nennen, da ich die Platte damals im Baumarkt aus der Restekiste geholt habe.
Nimm doch einfach eine von den verwendeten LEDs (inkl. Stromquelle) mit in den Baumarkt und teste dort die Lichtdurchlässigkeit :-)
Grüße
Jan
PS: hier werden keine Kommentare gelöscht, sondern der erste Kommentar eines neuen Users erscheint erst dann, wenn ich diesen freigebe. Deinen zweiten Kommentar lösche ich aber, weil sich dieser nicht auf den Blogpost bezieht.
Hallo Jan, besteht die Möglichkeit nur jeweils eine LED für den Sekundenzeiger an zusteuern? Was müsste ich denn dann aus dem Code entfernen?
Du müsstest dafür die LEDs, die nicht angezeigt werden sollen – also alle, die vor dem aktuellen Sekundenwert liegen – auf schwarz (0,0,0) setzen.
Der Code ist recht einfach. Ich werde ihn hier nicht erklären.
Ich habe zuerste die alte Lib benutzt hatte leide rnicht funktioniert, aber nun habe ich das Update mit dem Link zur Lib benutzt und funktionierete zuletzt doch ganz gut. Aber eine Anmerkung habe ich dennoch, Ich habe Hilfsmarkierungen hinzugefügt zum besseren ablesen nur hab ich hier das Problem wenn er bei 12 Uhr dann ist überschreibt er die LED nicht (wechselt die Farbe von Rot auf Grün nicht.
Danke im Voraus für eure Antwort.