Advertisement
NittyGritty

Jahresuhr.ino

Jan 8th, 2017
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.07 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <Wire.h>
  3. #include <Time.h>
  4. #include <Timezone.h>  
  5. #include <string.h>
  6. #include <DS3232RTC.h>  // A  DS3231/DS3232 library
  7. #include <TimeLord.h>
  8.  
  9. double Lw = 8;
  10. double Ln = 48;
  11.  
  12. // Adjust this block of code if you have another LCD (e.g. direct connected)
  13. #include <LiquidCrystal_I2C.h>
  14.  
  15. #define I2C_ADDR    0x27
  16. #define BACKLIGHT_PIN     3
  17. #define En_pin  2
  18. #define Rw_pin  1
  19. #define Rs_pin  0
  20. #define D4_pin  4
  21. #define D5_pin  5
  22. #define D6_pin  6
  23. #define D7_pin  7
  24.  
  25. LiquidCrystal_I2C    lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin, BACKLIGHT_PIN, POSITIVE);
  26. // =============================================
  27.  
  28.  
  29. // it's a 16x2 LCD so...
  30. int screenWidth = 24;
  31. int screenHeight = 2;
  32.  
  33.  
  34. int countMovement = 0;
  35. int stringStart = 0;
  36. int stringStop = 0;
  37. int scrollCursor = 0;
  38.  
  39. char cb[40];
  40. char* weekdays[] = { "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" };
  41.  
  42. //Central European Time (Frankfurt, Paris)
  43. TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};     //Central European Summer Time
  44. TimeChangeRule  CET = {"CET ", Last, Sun, Oct, 3, 60};      //Central European Standard Time
  45. Timezone CE(CEST, CET);
  46.  
  47. TimeChangeRule *tcr;        //pointer to the time change rule, use to get TZ abbrev
  48. time_t utc, local;
  49.  
  50. #define BUFF_MAX 128
  51.  
  52. // uint8_t time[8];
  53. // char recv[BUFF_MAX];
  54. unsigned int recv_size = 0;
  55. unsigned long prev, interval = 1000;
  56.  
  57. int osec = -1;
  58. int I = 50;
  59.  
  60. // Tor stuff
  61. // Tor = 0 - auf
  62. // Tor = 1 - zu
  63. // Stunden           0    1    2    3    4    5    6    7    8    9
  64. char* Torzeit [] = {"1", "1", "1", "1", "1", "1", "0", "0", "0", "0",
  65.                     "0", "0", "0", "0", "0", "0", "0", "0", "0", "0",
  66.                     "1", "1", "1", "1"
  67.                     };
  68. //Wochentage        So,  Mo,  Di,  Mi,  Do,  Fr,  Sa
  69. char* TorTage [] = {"1", "0", "0", "0", "0", "0", "1" };
  70.  
  71. // Tor = Hour(t) > Tor TorZuZeit
  72. boolean Tor = 0;
  73. int Relay = 12;
  74.  
  75. const char compile_date[] =  __DATE__ "-" __TIME__;
  76. const char compile_file[] =  __FILE__ ;
  77.  
  78.  
  79. // ------------------------------------------------------------------------------
  80. void setup()
  81. {
  82.  
  83.   pinMode(Relay, OUTPUT);
  84.  
  85.   Serial.begin(9600);
  86.  
  87.   lcd.begin(screenWidth, screenHeight);             // LCD Hintergrundbeleuchtung aktivieren
  88.   lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  89.   lcd.clear();
  90.   lcd.setCursor(0, 0);
  91.  
  92.   // ------- Quick 3 blinks of backlight  -------------
  93.   for(int i = 0; i< 3; i++)
  94.   {
  95.     lcd.backlight();
  96.     delay(250);
  97.     digitalWrite(Relay, LOW);
  98.     lcd.noBacklight();
  99.     delay(250);
  100.     digitalWrite(Relay, HIGH);
  101.   }
  102.   lcd.backlight(); // finish with backlight on  
  103.  
  104.   Serial.println(compile_date);
  105.   roop(0, compile_date, 100);
  106.  
  107.   Serial.println(compile_file);
  108.   roop(1, compile_file, 100);
  109.  
  110.   delay(1000);
  111.  
  112.  
  113.   setSyncProvider(RTC.get);   // the function to get the time from the RTC
  114.  
  115.   if(timeStatus()!= timeSet)
  116.   {
  117.     lcd.println(F("RTC sync Error"));
  118.   }  
  119.   else
  120.   {
  121.     lcd.print(F("RTC sync OK"));
  122.   }
  123.  
  124.   // memset(recv, 0, BUFF_MAX);
  125.  
  126.  
  127.   delay(2000);
  128.   lcd.clear();
  129.   lcd.setCursor(0, 0);
  130.  
  131.   setTime(hour(),minute(),second(),day(),month(),(year()-2000) );
  132.  
  133.   digitalClockDisplay();
  134.   CheckTor();
  135. }
  136.  
  137. void loop()
  138. {
  139.  
  140. if (second() != osec)
  141.  {
  142.  
  143.     switch (second())
  144.     {
  145.     case 0:
  146.  
  147.       break;
  148.  
  149.     case 1:
  150.       CheckTor();
  151.       break;
  152.  
  153.     case 15:
  154.  
  155.       break;
  156.  
  157.     case 30:
  158.  
  159.       break;
  160.  
  161.     case 45:
  162.  
  163.       break;
  164.     }
  165.     osec = second();
  166.  
  167.     digitalClockDisplay();
  168.     CheckClockSet();
  169.   }
  170. }
  171. // ---------------------------------------------------
  172. // Tor = 0 - auf
  173. // Tor = 1 - zu
  174. // Tor = Hour(t) > Tor TorZuZeit
  175. void CheckTor()
  176. {
  177.   local = CE.toLocal(utc, &tcr);
  178.   boolean TestTor1 = CheckTorZeit(local, tcr -> abbrev);
  179.   sprintf(cb, "Lt. TorZeit soll Tor %s sein", (TestTor1)?"zu":"auf" ) ;
  180.   Serial.println(cb);
  181.  
  182.   boolean TestTor2 = CheckTorTage(local, tcr -> abbrev);
  183.   sprintf(cb, "Lt. TorTag soll Tor %s sein", (TestTor2)?"zu":"auf" ) ;
  184.   Serial.println(cb);
  185.  
  186.   local = CE.toLocal(utc, &tcr);
  187.   boolean TestFeiertag =feiertag(local, tcr -> abbrev);   // Ermittelt ob heute ein Feiertag ist
  188.   sprintf(cb, "Heute ist %s Feiertag", (TestFeiertag)?"ein":"kein" ) ;
  189.   Serial.println(cb);
  190.  
  191.   Tor = TestTor1 || TestTor2 || TestFeiertag;
  192.   sprintf(cb, "Tor ist %s", (Tor)?"zu":"auf" ) ;
  193.   Serial.println(cb);
  194.  
  195.   digitalWrite(Relay, (Tor)?HIGH:LOW);
  196.  
  197.   PrintSunRise();
  198. }
  199.  
  200. boolean CheckTorZeit(time_t t, char *tz)
  201. {
  202.   sprintf(cb, "Stunde %02d, Tor %s",hour(t), Torzeit[hour(t)] ) ;
  203.   Serial.println(cb);
  204.   if ( Torzeit[hour(t)] == "1" )
  205.   {
  206.     return true;
  207.   } else {
  208.     return false;
  209.   }  
  210. }  
  211.  
  212. boolean CheckTorTage(time_t t, char *tz)
  213. {
  214.   sprintf(cb, "Wochentag %01d, Tor %s",weekday(t), TorTage[weekday(t) - 1] ) ;
  215.   Serial.println(cb);
  216.   if ( TorTage[weekday(t) - 1] == "1" )
  217.   {
  218.     return true;
  219.   } else {
  220.     return false;
  221.   }  
  222. }  
  223. /*
  224.  lcd.clear();
  225.  lcd.setCursor(0, 1);
  226.  lcd.print("Scroll-row0");
  227.  scroll(0, "The quick brown fox jumps over the lazy dog",200);
  228.  */
  229.  
  230.  
  231. // ==========================================
  232. void scroll(int row, String line, int speed) {
  233.   countMovement = 0;
  234.   stringStart = 0;
  235.   stringStop = 0;
  236.   scrollCursor = 0;
  237.  
  238.   // Serial.print(countMovement); Serial.print("-"); Serial.println(line.length() + 1);
  239.   while ( ( countMovement ) < (line.length() + 2 )  )
  240.   {
  241.     lcd.setCursor(scrollCursor, row);
  242.     // Serial.print("Cursor: "); Serial.print(scrollCursor); Serial.print(" "); Serial.println(row);
  243.     lcd.print(line.substring(stringStart, stringStop));
  244.     // Serial.println( line.substring(stringStart, stringStop) );
  245.     delay(speed);
  246.  
  247.     if (stringStart == 0 && scrollCursor > 0) {
  248.       // Serial.println(scrollCursor);
  249.       scrollCursor--;
  250.       stringStop++;
  251.     }
  252.     else if (stringStart == stringStop) {
  253.       stringStart = stringStop = 0;
  254.       scrollCursor = screenWidth;
  255.     }
  256.     else if (stringStop == line.length() && scrollCursor == 0) {
  257.       stringStart++;
  258.     }
  259.     else {
  260.       stringStart++;
  261.       stringStop++;
  262.     }
  263.     countMovement++;
  264.   }
  265. }
  266.  
  267. // =================================================================
  268. void digitalClockDisplay() {
  269.   utc = now();
  270.   local = CE.toLocal(utc, &tcr);
  271.   printTimeLCD(local, tcr -> abbrev);
  272. }
  273.  
  274. void printTimeLCD(time_t t, char *tz) {
  275.   // lcd.clear();
  276.   lcd.setCursor(0, 0);  
  277.   sprintf(cb, "%s %02d.%02d.%02d %s",  (weekdays[weekday(t) - 1]), day(t), month(t), year(t) - 2000, tz);
  278.   lcd.print(cb);
  279.  
  280.   lcd.setCursor(0, 1);  
  281.   sprintf(cb, "%02d:%02d:%02d Tor %s", hour(t), minute(t), second(t), (Tor)?"zu ":"auf" ) ;
  282.   lcd.print(cb);
  283.  
  284.   utc = now();
  285. //  printTime(utc, "UTC");
  286.   local = CE.toLocal(utc, &tcr);
  287.   printTime(local, tcr -> abbrev);
  288.  
  289. }
  290. // ----------------------------------------------
  291. // Function to print time with time zone
  292. // ----------------------------------------------
  293. void printTime(time_t t, char *tz)
  294. {
  295.   sprintf(cb, "%s, %02d.%02d.%04d %02d:%02d:%02d %s", (weekdays[weekday(t) - 1]), day(t), month(t),year(t), hour(t), minute(t), second(t), tz ) ;
  296.   Serial.println(cb);
  297. }
  298.  
  299. // ------------------------------------------------------------------------------------------------------
  300. boolean feiertag(time_t t, char *tz)
  301. {
  302.   String testDate;
  303.   int tag;
  304.   int monat=3;
  305.   int ostersonntag;
  306.  
  307.   testDate = String(day(t)) +"."+ String(month(t));
  308.  
  309.   // Zuerst die festen Feiertage
  310.   // Hinweis: 24.12 und 31.12 sind eigentlich keine Feiertage, werden aber hier als solche behandelt
  311.   if (testDate==("1.1"))   { return true; }     // Neujahr
  312.   if (testDate==("1.5"))   { return true; }     // Maifeiertag
  313.   if (testDate==("3.10"))  { return true; }     // Tag d. dt. Einheit
  314.   if (testDate==("24.12")) { return true; }     // Heiligabend (eigentlich kein Feiertag)
  315.   if (testDate==("25.12")) { return true; }     // Erster Weihnachtsfeirtag
  316.   if (testDate==("26.12")) { return true; }     // Zweiter Weihnachsfeiertag
  317.   if (testDate==("31.12")) { return true; }     // Silvester (eigentlich kein Feiertag)
  318.  
  319.   // Nachfolgend einige Feiertage die nicht bundeseinheitlich sind: (ggf. auskommentieren)
  320.   if (testDate==("6.1"))   { return true; }     // Heilige Drei Könige (nur in best. Bundesländern)
  321. //if (testDate==("15.8"))  { return true; }     // Mariae Himmelfahrt (nur im Saarland)
  322. //if (testDate==("31.10")) { return true; }     // Reformationstag (nur in best. Bundesländern)
  323.   if (testDate==("1.11"))  { return true; }     // Allerheiligen (nur in best. Bundesländern)
  324.  
  325.   if (month(t)==3) { tag=day(t); }            // Wenn März, aktuellen Tag ermitteln
  326.   if (month(t)==4) { tag=day(t)+31; }
  327.   if (month(t)==5) { tag=day(t)+31+30; }
  328.   if (month(t)==6) { tag=day(t)+31+30+31; }
  329.  
  330.   ostersonntag = berechne_Ostern();
  331.   if (ostersonntag-2 ==tag) { return true; }    // Karfreitag
  332.   if (ostersonntag   ==tag) { return true; }    // Ostersonntag
  333.   if (ostersonntag+1 ==tag) { return true; }    // Ostermontag
  334.   if (ostersonntag+39==tag) { return true; }    // Christi Himmelfahrt
  335.   if (ostersonntag+49==tag) { return true; }    // Pfingstsonntag
  336.   if (ostersonntag+50==tag) { return true; }    // Pfingstmontag
  337.   if (ostersonntag+60==tag) { return true; }    // Fronleichnam (nicht bundeseinheitlich)
  338.  
  339.   // Buss- und Bettag gibt es nur in einigen Bundeländern, also ggf. auskommentieren
  340.   // if (BussUndBettag()) {return true;}
  341.  
  342.   return false;
  343. }
  344.  
  345. int berechne_Ostern()
  346. {
  347.   // nach der Gauß-Formel
  348.   // Rückgabewert: Datum von Ostern ab 1. März (max=56 für 25. April)
  349.  
  350.   int a; int b; int c; int d; int e; int f; int k; int M; int N; int p; int q;
  351.   int jahr=year();
  352.  
  353.   // Die "magische" Gauss-Formel anwenden:
  354.   a = jahr % 19;
  355.   b = jahr % 4;
  356.   c = jahr % 7;
  357.   k = jahr / 100;
  358.   p = (8*k+13) / 25;
  359.   q = k / 4;
  360.   M =(15 + k - p - q) % 30;
  361.   N = (4 + k-q) % 7;
  362.   d = (19*a + M) % 30;
  363.   e = (2*b + 4*c + 6*d + N) % 7;
  364.   f = 22+d+e;   // Tag auf Maerz bezogen: 32 bedeutet Erster April usw.
  365.  
  366.  
  367.   if (f==57) {
  368.     f=50;
  369.   }   // Wenn der 26. April ermittelt wird (31+26=57), dann muss Ostern am 19.4. sein (19+31=50)
  370.   /// Falls der 25. April ermittelt wird, gilt dies nur wenn d=28 und a>10
  371.   if ((f==56) && (d==28) && (a>10))  {
  372.     f=49;
  373.   }
  374.   return f;
  375.  
  376. }
  377. // -------------------- kein Problem mit dem Datum und der Zeitzone, daher ohne (t) -----------------
  378. boolean BussUndBettag()
  379. {
  380.   // Buss- und Bettag fällt auf den Mittwoch zwischen demm 16. und 22. November
  381.   if ( (month()==11) && (day()>15) && (day ()< 23) )
  382.   {
  383.     if (weekday() == 4) {
  384.       return true;
  385.     }  // Wenn heute Mittwoch ist
  386.   }
  387.  
  388.   return false;
  389.  
  390. }
  391.  
  392. // ---------------------------------------------------
  393. void CheckFeiertag ()
  394. {
  395.   local = CE.toLocal(utc, &tcr);
  396.   boolean TestFeiertag = feiertag(local, tcr -> abbrev);   // Ermittelt ob heute ein Feiertag ist
  397.   sprintf(cb, "Heute ist %s Feiertag\r\n", (TestFeiertag)?"ein":"kein" ) ;
  398.   Serial.print(cb);
  399. }
  400.  
  401. // ------------------------------------------------------------------------
  402. void CheckClockSet() {
  403.   if (Serial.available()) {
  404.     time_t t = processSyncMessage();
  405.     if (t > 0)
  406.     {
  407.       RTC.set(t);   // set the RTC and the system time to the received value
  408.       setTime(t);
  409.  
  410.       Serial.println("New Tiime has been set");
  411.       utc = now();
  412.       printTime(utc, "UTC");
  413.       local = CE.toLocal(utc, &tcr);
  414.       printTime(local, tcr -> abbrev);
  415.     }
  416.   } // if no input, just return
  417. }
  418.  
  419. /*  code to process time sync messages from the serial port   */
  420. #define TIME_MSG_LEN  11   // time sync to PC is HEADER followed by unix time_t as ten ascii digits
  421. #define TIME_HEADER  'T'   // Header tag for serial time sync message
  422.  
  423. time_t processSyncMessage() {
  424.   // return the time if a valid sync message is received on the serial port.
  425.   while (Serial.available() >=  TIME_MSG_LEN ) { // time message consists of a header and ten ascii digits
  426.     char c = Serial.read() ;
  427.     Serial.print(c);
  428.     if ( c == TIME_HEADER ) {
  429.       time_t pctime = 0;
  430.       for (int i = 0; i < TIME_MSG_LEN - 1; i++) {
  431.         c = Serial.read();
  432.         if ( c >= '0' && c <= '9') {
  433.           pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
  434.         }
  435.       }
  436.       return pctime;
  437.     }
  438.   }
  439.   return 0;
  440. }
  441.  
  442. // ==========================================
  443. void roop(int Reihe, String line2, int speed) {
  444.   countMovement = 0;
  445.   stringStart = 0;
  446.   stringStop = 0;
  447.   scrollCursor = 0;
  448.  
  449.   // Serial.print(countMovement); Serial.print("-"); Serial.println(line2.length() + 1);
  450.   while ( ( countMovement ) < (line2.length() + 2 )  )
  451.   {
  452.     lcd.setCursor(scrollCursor, Reihe);
  453.     // Serial.print("Cursor: "); Serial.print(scrollCursor); Serial.print(" "); Serial.println(Reihe);
  454.     lcd.print(line2.substring(stringStart, stringStop));
  455.     // Serial.println( line2.substring(stringStart, stringStop) );
  456.     delay(speed);
  457.  
  458.     if (stringStart == 0 && scrollCursor > 0) {
  459.       // Serial.println(scrollCursor);
  460.       scrollCursor--;
  461.       stringStop++;
  462.     } else if (stringStart == stringStop) {
  463.       stringStart = stringStop = 0;
  464.       scrollCursor = screenWidth;
  465.     } else if (stringStop == line2.length() && scrollCursor == 0) {
  466.       stringStart++;
  467.     } else {
  468.       stringStart++;
  469.       stringStop++;
  470.     }
  471.     countMovement++;
  472.   }
  473. }
  474. // ==============================================================================
  475. void SunRise(time_t t, char *tz)
  476. {
  477.   byte day1[] = { 0, 0, 12, day(t), month(t), year(t) }; // noon
  478.  
  479.   TimeLord tardis;
  480.   tardis.TimeZone(2 * 60);
  481.   tardis.Position(Ln, Lw);
  482.  
  483.   if (tardis.SunRise(day1))
  484.   {
  485.     sprintf(cb, "Sunrise: %02d:", (day1[tl_hour]) );
  486.     Serial.print(cb);
  487.     sprintf(cb, "%02d", (day1[tl_minute] ));
  488.     Serial.println(cb);
  489.  
  490.   }
  491.  
  492.   if (tardis.SunSet(day1))
  493.   {
  494. //    sprintf(cb, "Sunset:  %02d:%02d", (day1[tl_hour], day1[tl_minute] ) ) ;
  495. //     Serial.println(cb);
  496.     sprintf(cb, "Sunset:  %02d:", (day1[tl_hour]) );
  497.     Serial.print(cb);
  498.     sprintf(cb, "%02d", (day1[tl_minute] ));
  499.     Serial.println(cb);
  500.  
  501.   }
  502. }
  503.  
  504. void PrintSunRise()
  505. {
  506.       local = CE.toLocal(utc, &tcr);
  507.       SunRise(local, tcr -> abbrev);
  508. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement