IGLORENZ

7segmUhr

Oct 27th, 2024
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.74 KB | Source Code | 0 0
  1. #include <ESP8266WiFi.h>                    //https://github.com/esp8266/Arduino
  2. #include "WiFiManager.h"                    //https://github.com/tzapu/WiFiManager
  3. #include <Timezone.h>                       //https://github.com/JChristensen/Timezone
  4. #include <TimeLib.h>                        //https://github.com/PaulStoffregen/Time
  5. #include <WiFiUdp.h>
  6. #include <Wire.h>
  7. #include <Servo.h>
  8.  
  9. int h, m, s, w, mo, ye, d;                  // variablen für die lokale Zeit
  10.  
  11. // NTP Serverpool für die Schweiz:
  12. static const char ntpServerName[] = "ch.pool.ntp.org";    //Finde lokale Server unter http://www.pool.ntp.org/zone/ch
  13. const int timeZone = 0;                     // 0 wenn mit <Timezone.h> gearbeitet wird sonst stimmt es nachher nicht
  14. WiFiUDP Udp;
  15. unsigned int localPort = 8888;              // lokaler Port zum Abhören von UDP-Paketen
  16.  
  17. time_t getNtpTime();
  18. void digitalClockDisplay();
  19. void printDigits(int digits);
  20. void sendNTPpacket(IPAddress &address);
  21.  
  22. // - Timezone. - //
  23. // Bearbeiten Sie diese Zeilen entsprechend Ihrer Zeitzone und Sommerzeit.
  24. // TimeZone Einstellungen Details https://github.com/JChristensen/Timezone
  25. TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};     //Central European Time (Frankfurt, Paris)
  26. TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60};       //Central European Time (Frankfurt, Paris)
  27. Timezone CE(CEST, CET);
  28.  
  29. Servo secondsOnes;
  30. Servo secondsTens;
  31. Servo minutesOnes;
  32. Servo minutesTens;
  33. Servo hoursOnes;
  34. Servo hoursTens;
  35.  
  36. String inString = "";
  37.  
  38. void setup() {
  39.   Serial.begin(115200);
  40.   WiFiManager wifiManager;  
  41.   //wifiManager.resetSettings();          //mit diesem befehl kannst die gespeicherten werte löschen              
  42.   wifiManager.autoConnect("clock");
  43.   Serial.println("verbunden!");
  44.   Udp.begin(localPort);
  45.   Serial.print("lokaler Port: ");
  46.   Serial.println(Udp.localPort());
  47.   Serial.println("Warten auf die Synchronisation");
  48.   setSyncProvider(getNtpTime);
  49.   setSyncInterval(86400);                    // Anzahl der Sekunden zwischen dem erneuten Synchronisieren ein. 86400 = 1 Tag
  50.  
  51. // secondsOnes.write(0);
  52.  // secondsTens.write(0);
  53.   minutesOnes.write(0);
  54.   minutesTens.write(0);
  55.   hoursOnes.write(0);
  56.   hoursTens.write(0);
  57.  
  58.   //secondsOnes.attach(2);
  59.  // secondsTens.attach(3);
  60.   minutesOnes.attach(D2);
  61.   minutesTens.attach(D3);
  62.   hoursOnes.attach(D4);
  63.   hoursTens.attach(D5);
  64.  
  65.   Wire.begin();
  66.   delay(500);
  67.   Serial.println("Seven Segment Clock Begin");
  68. }
  69.  
  70. time_t prevDisplay = 0; // wenn die Digitaluhr angezeigt wurde
  71.  
  72. void loop()
  73. {
  74.   if (timeStatus() != timeNotSet) {             // wenn die Zeit über NTP gesetzt wurde
  75.   lokaleZeit();
  76.   digitalClockDisplay();
  77.   delay(1000);
  78.  
  79.   //Split the secondss into Tens and Ones
  80.   int curSecsTens = second()/10;
  81.   int curSecsOnes = second()%10;
  82.   //Convert it into angles
  83.   int curSecsTensAngle = curSecsTens * 20;
  84.   int curSecsOnesAngle = curSecsOnes * 20;
  85.   //Write Seconds Motors
  86.   secondsTens.write(curSecsTensAngle);
  87.   secondsOnes.write(curSecsOnesAngle);
  88.  
  89.   //Split the Minutes into Tens and Ones
  90.   int curMinsTens = minute()/10;
  91.   int curMinsOnes = minute()%10;
  92.   //Convert it into angles
  93.   int curMinsTensAngle = curMinsTens * 20;
  94.   int curMinsOnesAngle = curMinsOnes * 20;
  95.   //Write Minutes Motors
  96.   minutesTens.write(curMinsTensAngle);
  97.   minutesOnes.write(curMinsOnesAngle);
  98.  
  99.  
  100.   //Split the hours into Tens and Ones
  101.   int curHoursTens = hour()/10;
  102.   int curHoursOnes = hour()%10;
  103.   //Convert it into angles
  104.   int curHoursTensAngle = curHoursTens * 20;
  105.   int curHoursOnesAngle = curHoursOnes * 20;
  106.   //Write Hours Motors
  107.   hoursTens.write(curHoursTensAngle);
  108.   hoursOnes.write(curHoursOnesAngle);
  109.  
  110.   }
  111. }
  112.  
  113.  
  114. void lokaleZeit()
  115. {
  116.   time_t tT = now();
  117.   time_t tTlocal = CE.toLocal(tT);
  118.   w = weekday(tTlocal);
  119.   d = day(tTlocal);
  120.   mo = month(tTlocal);
  121.   ye = year(tTlocal);
  122.   h = hour(tTlocal);
  123.   m = minute(tTlocal);
  124.   s = second(tTlocal);
  125.  
  126. }
  127.  
  128. void digitalClockDisplay()
  129. {
  130.   // digitale Uhrzeitanzeige
  131.   Serial.print(h);
  132.   printDigits(m);
  133.   printDigits(s);
  134.   Serial.print(" ");
  135.   Serial.print(d);
  136.   Serial.print(".");
  137.   Serial.print(mo);
  138.   Serial.print(".");
  139.   Serial.println(ye);
  140. }
  141.  
  142. void printDigits(int digits)
  143. {
  144.   // Utility für digitale Uhrenanzeige: druckt vor Doppelpunkt und führende 0
  145.   Serial.print(":");
  146.   if (digits < 10)
  147.     Serial.print('0');
  148.   Serial.print(digits);
  149. }
  150.  
  151. /*-------- NTP code ----------*/
  152.  
  153. const int NTP_PACKET_SIZE = 48; // NTP-Zeit in den ersten 48 Bytes der Nachricht
  154. byte packetBuffer[NTP_PACKET_SIZE]; //Puffer für eingehende und ausgehende Pakete
  155.  
  156. time_t getNtpTime()
  157. {
  158.   IPAddress ntpServerIP; // NTP server's ip Adresse
  159.  
  160.   while (Udp.parsePacket() > 0) ; // alle zuvor empfangenen Pakete verwerfen
  161.   Serial.println("Transmit NTP Request");
  162.   // einen zufälligen Server aus dem Pool holen
  163.   WiFi.hostByName(ntpServerName, ntpServerIP);
  164.   Serial.print(ntpServerName);
  165.   Serial.print(": ");
  166.   Serial.println(ntpServerIP);
  167.   sendNTPpacket(ntpServerIP);
  168.   uint32_t beginWait = millis();
  169.   while (millis() - beginWait < 1500) {
  170.     int size = Udp.parsePacket();
  171.     if (size >= NTP_PACKET_SIZE) {
  172.       Serial.println("Receive NTP Response");
  173.       Udp.read(packetBuffer, NTP_PACKET_SIZE);  // Paket in den Puffer einlesen
  174.       unsigned long secsSince1900;
  175.       // vier Bytes ab Position 40 in eine lange Ganzzahl umwandeln
  176.       secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
  177.       secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
  178.       secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
  179.       secsSince1900 |= (unsigned long)packetBuffer[43];
  180.       return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
  181.     }
  182.   }
  183.   Serial.println("keine NTP Antwort");
  184.   return 0; // gibt 0 zurück, wenn die Zeit nicht ermittelt werden kann.
  185. }
  186.  
  187. // send an NTP request to the time server at the given address
  188. void sendNTPpacket(IPAddress &address)
  189. {
  190.   // alle Bytes im Puffer auf 0 setzen
  191.   memset(packetBuffer, 0, NTP_PACKET_SIZE);
  192.   // Initialisieren von Werten, die für die Bildung von NTP-Requests benötigt werden.
  193.   // (siehe URL oben für Details zu den Paketen)
  194.   packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  195.   packetBuffer[1] = 0;     // Stratum, or type of clock
  196.   packetBuffer[2] = 6;     // Polling Interval
  197.   packetBuffer[3] = 0xEC;  // Peer Clock Precision
  198.   // 8 bytes of zero for Root Delay & Root Dispersion
  199.   packetBuffer[12] = 49;
  200.   packetBuffer[13] = 0x4E;
  201.   packetBuffer[14] = 49;
  202.   packetBuffer[15] = 52;
  203.   // alle NTP-Felder wurden jetzt mit Werten versehen
  204.   // Sie können ein Paket senden, das einen Zeitstempel anfordert.:
  205.   Udp.beginPacket(address, 123); //NTP-Requests sollen auf Port 123 erfolgen
  206.   Udp.write(packetBuffer, NTP_PACKET_SIZE);
  207.   Udp.endPacket();
  208. }
  209.  
Add Comment
Please, Sign In to add comment