{{ :elektronik:binaeruhr_dcf77:header_binaeruhr.jpg?nolink&3000 |}} ====== Binäruhr mit DCF77 / NTP ====== Noch ein Projekt, welches ich schon vor sehr langer Zeit gemacht habe: Eine Binäruhr, welche sich synchronisieren lässt.\\ Dieses Projekt habe ich auch mehrmals aufgegriffen. Für alle, die nicht wissen um was es sich hierbei handelt: {{wp:de>Binäre Uhr}} ===== 1. Variante ohne Zeitsynchronisation ===== Die erste Version war ein Nachbau von jb-electronics mit einem PIC-Mikrocontroller welche ich während der Ausbildung gebaut hatte (erstes Mikrocontroller-Projekt). Das Projekt kann man hier finden: [[http://www.jb-electronics.de/html/elektronik/digital/d_binaeruhr2.htm|Mini-Binäruhr]]\\ Allerdings hatte diese noch keine Zeitsynchronisation und auch keine Sekundenanzeige. {{:elektronik:binaeruhr_dcf77:binary_clock_01.jpg?direct&400|}} Deswegen habe ich mir im nächsten Schritt selber eine gebaut. ===== 2. Eigenbauvariante mit ATmega und DCF77 ===== Die zweite Variante war die erste selbstentwickelte Binäruhr. Basierend auf einem 40-Pin Atmega16. Die Uhr war prinzipiell freilaufend, musste aber initial über das DCF77-Signal synchronisiert werden. Die LEDs und das DCF77-Modul sind direkt mit dem Mikrocontroller verdrahtet. Die Gehäusewahl ist im Nachhinein betrachtet nich ganz so optimal. Durch das transparente Gehäuse kann man zwar die LEDs sehen, aber nur recht unscharf. {{:elektronik:binaeruhr_dcf77:binaeruhr_v2.jpg?direct&300|}} \\ geöffnetes Gehäuse {{:elektronik:binaeruhr_dcf77:binaeruhr_v2_aktiv.jpg?direct&300|}} \\ aktive Schaltung ==== Download ==== {{ :elektronik:binaeruhr_dcf77:binaeruhr_v2.zip |}} ===== 3. Eigenbauvariante mit ESP8266 und WS2812B ===== Die aktuellste Variante, die ich gebaut habe enthält einen ESP8266 als Mikrocontroller. Die Uhrzeit wird hier über WLAN von einem NTP-Server geholt. Angezeigt wird das ganze über RGB-LEDs. Vom Konzept ist das ein bisschen an eine Word-Clock angelehnt. Hier diese Variante im Video:\\ {{:elektronik:binaeruhr_dcf77:binaeruhr.mp4|}} Der Fokus liegt hier ganz klar auf dem 3D-Druck. In das Gehäuse wird in die entsprechende Aussparung eine USB-Platine eingeklebt. In die entsprechenden Segmente wird jeweils ein Papierstück geklebt, das dafür sorgt, dass die Zahlen matt leuchten. Als Zwischenschicht zwischen LED und Auge. Prinzipiell lassen sich die LEDs in jeder Farbe steuern. Und auch entsprechend animieren. Ich habe mich hier aber für eine simple Darstellung entschieden: Jede Reihe eine andere Grundfarbe. Der Vorteil an den WS2812B ist aber, dass man flexibel ist und das einfach ändern kann, wenn es einem nicht mehr gefällt. Alles in allem ist es wesentlich umproblematischer (und günstiger) mit einem WLAN-fähigen Mikrocontroller gegenüber einem DCF77-Modul. Da man nicht von einem guten DCF77-Empfang abhängig ist und WLAN ja heute überall in den Wohnungen bereit steht. ==== Bilder ==== {{:elektronik:binaeruhr_dcf77:binaeruhr_v3.jpg?direct&300|}} \\ Binär-Uhr, die 01:02:23 anzeigt {{:elektronik:binaeruhr_dcf77:binaeruhr_v3_intern.jpg?direct&300|}} \\ Innenleben der Binäruhr ==== Software ==== Als externe Bibliothek wird [[https://github.com/tzapu/WiFiManager|WiFiManager]], [[https://github.com/arduino-libraries/NTPClient|NTPClient]] und [[https://github.com/adafruit/Adafruit_NeoPixel|Adafruit NeoPixel]] benötigt. Die Software stellt ein WLAN bereit zum Konfigurieren (der Konfigurationsmodus erscheint wieder, wenn sich die Uhr beim Start nicht mit dem WLAN verbinden kann). Nach dem Eingeben der Verbindungsdaten holt die Uhr die aktuelle Uhrzeit via NTP und gibt sie über die RGB-Streifen als Binärcode wieder aus. Eine Unterscheidung für Sommer-/Winterzeit ist aktuell noch nicht integriert. Die Sommerzeit ist aktuell als Konstante hinterlegt. Das lässt sich aber relativ einfach nachrüsten, wie z.B. [[https://forum.arduino.cc/index.php?topic=172044.msg1278536#msg1278536|hier]] beschrieben ist. ++++ binary_clock.ino | #include #include #include #include #include #include #include #define PIN 2 #define NUMPIXELS 17 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); WiFiManager wifiManager; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); void setup() { // // Get Wifi-Reset // pinMode(3, INPUT_PULLUP); bool resetwifi = !digitalRead(3); // // Reset Wifi & open Portal? // if(resetwifi) { wifiManager.resetSettings(); } wifiManager.autoConnect("BinaryClock"); timeClient.begin(); timeClient.setTimeOffset(60*60*2); timeClient.setUpdateInterval(1000*60*30); //update every 30min pixels.begin(); Serial.begin(115200); for(int i=0;i ++++ ==== OpenSCAD-Code ==== **binaeuhr_v3.svg (umgewandelt in *.dxf)** {{:elektronik:binaeruhr_dcf77:binaeuhr_v3.svg?300|}} ++++ binaeuhr_v3.scad | color("green") union() { difference() { cube([110,50,2.5]); translate([0,0,-1]) linear_extrude(height = 50, center = true, convexity = 10, twist = 0) import("binaeuhr_v3.dxf"); } for ( j = [0 : 2] ){ translate([0,1+j*15,0]) union() { for ( i = [0 : 1] ){ translate([23*i+4,0,-5]) difference() { cube([23, 17, 5]); translate([1.5,1.5,-1]) cube([23-3, 17-3, 7]); } } for ( i = [0 : 3] ){ translate([14.5*i+50,0,-5]) difference() { cube([14.5, 17, 5]); translate([1.5,1.5,-1]) cube([14.5-3, 17-3, 7]); } } } } difference() { union() { difference() { translate([0,0,-30]) difference() { cube([110,50,30]); translate([2,2,-1]) cube([110-4,50-4,50]); } union() { for ( i = [0 : 2] ){ translate([-5/2 + 20 + i*35,-1,-30+4]) cube([5,5,2]); } for ( i = [0 : 2] ){ translate([-5/2 + 20 + i*35,50-4,-30+4]) cube([5,5,2]); } translate([-1,(50-5)/2,-30+4]) cube([5,5,2]); translate([110-5+1,(50-5)/2,-30+4]) cube([5,5,2]); } } translate([0,0,-(30-17/2)]) cube([17,5,17]); } union() { translate([2.5/2,0+3.5,-(30-17/2)+3.5/2]) cube([14.5,5,13.5]); translate([-1,0+3.5+1.5,-(30-17/2)+3.5/2+5.5/2]) cube([10,3,8]); } } } color("red") union() { translate([0,0,-30-2]) cube([110,50,2]); union() { for ( i = [0 : 2] ){ translate([-5/2 + 20 + i*35+1,0,-30+4+0.25]) cube([3,5,1.5]); } for ( i = [0 : 2] ){ translate([-5/2 + 20 + i*35+1,50-5,-30+4+0.25]) cube([3,5,1.5]); } translate([0,((50-5)/2)+1,-30+4+0.25]) cube([5,3,1.5]); translate([110-6+1,((50-5)/2)+1,-30+4+0.25]) cube([5,3,1.5]); } union() { for ( i = [0 : 2] ){ translate([-5/2 + 20 + i*35+1,2,-30+4-4]) cube([3,3,5]); } for ( i = [0 : 2] ){ translate([-5/2 + 20 + i*35+1,50-5,-30+4-4]) cube([3,3,5]); } translate([2,((50-5)/2)+1,-30+4-4]) cube([3,3,5]); translate([110-6+1,((50-5)/2)+1,-30+4-4]) cube([3,3,5]); } } ++++ ==== 3D-Modell ==== {{:elektronik:binaeruhr_dcf77:binaeuhr_v3_gehaeuse.stl?h=200&w=300&bgcolor=#ffffff|Gehäuse}} {{:elektronik:binaeruhr_dcf77:binaeuhr_v3_deckel.stl?h=200&w=300&bgcolor=#ffffff|Deckel}} {{tag>[avr binär dcf77 funkuhr mikrocontroller pic uhr esp8266 ntp ws2812b]}} \\ ~~DISQUS~~