//.............................................................................. // Import Standard Library #include // Import Fremd Library #include #include #include #include //.............................................................................. // Initialisierung LCD, RTC und Dallas DS1820 // Adressraum PCF8574T 0x20 bis 0x27 // Rangierung LCD (addr,en,rw,rs,d4,d5,d6,d7,bl,LiPos/Neg) LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //LiquidCrystal_I2C lcd1(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //LiquidCrystal_I2C lcd(0x22, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // RTC PCF8563T Rtc_Pcf8563 rtc; // Temperatursensor Dallas DS1820 #define OneWireBusAdr 2 OneWire oneWire(OneWireBusAdr); DallasTemperature DS1820(&oneWire); //.............................................................................. // Variablen definieren int led = 13; int set = 1; int intTmp; float IstTempC; int SollStunde; int SollMinute; int SollSekunde; int SollTag; int SollWochentag; int SollMonat; int SollJahr; int IstStunde; int IstMinute; int IstSekunde; int IstTag; int IstWochentag; int IstMonat; int IstJahr; int Stadt = 0; int Raster = 1; int NzSz = 0; // Normalzeit, Sommerzeit (NZ =0, SZ =1) char Versatz[][3] = { "--", "==", "++" }; char Wochentag [][7] = { "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" }; // 46 (91) Orte der Zeitzonen Normalzeit und Sommerzeit const int AnzahlStadt = 41; const int NormalSommerZeit[2][AnzahlStadt] = { { +1030, +600, +200, +100, -900, // +500, +200, +1300, -100, +300, // +400, +700, -400, +800, +200, // +100, +100, +600, -500, +100, +1000, +100, -300, -400, +0, // -600, -700, +530, -600, +930, -700, +400, +500, +400, +1300, // +1000, -400, +200, +200, +1100, +800, -1000, +800, +900, +500, // +200, +430, +200, +530, -100, +500, +545, +800, +300, +0, // -800, +1100, +1200, -400, -600, -1100, +300, -300, +300, +300, // -500, -300, +500, +800, -700, +630, -600, -300, -200, +100, // +900, +800, -330, -200, +1100, // +800, +500, +330, +400, -800, +900, +1300, +800, +200, +1000, +100 }, { +930, +600, +300, +200, -800, // +500, +300, +1200, +0, +300, // +400, +700, -400, +800, +300, // +200, +200, +600, -500, +100, +1000, +200, -300, -400, +100, // -500, -600, +530, -600, +930, -600, +400, +500, +400, +1200, // +1000, -300, +200, +300, +1000, +800, -1000, +800, +900, +500, // +300, +430, +200, +530, -100, +500, +545, +800, +300, +100, // -700, +1100, +1200, -400, -500, -1100, +300, -300, +300, +300, // -400, -200, +500, +800, -700, +630, -600, -300, -300, +200, // +900, +800, -230, -200, +1000, // +800, +500, +430, +400, -700, +900, +1300, +900, +100, +1000, +200 } }; const char* const ZoneStadt[] = { "Adelaide ", "Almaty ", "Amman ", "Amsterdam ", "Anchorage ", // "Asgabat ", "Athen ", "Auckland ", "Azoren ", "Bagdad ", // "Baku ", "Bankok ", "Barbados ", "Beijing ", "Beirut ", // "Belgrad ", "Berlin ", "Bischkek ", "Bogota ", "Brazzaville ", "Brisbane ", "Bruessel ", "Buenos Aires ", "Caracas ", "Casablanca ", // "Chicago ", "Chihuahua ", "Colombo ", "Costa Rica ", "Darwin ", "Denver ", "Dubai ", "Duschanbe ", "Eriwan ", "Fidschi ", // "Guam ", "Halifax ", "Harare ", "Helsinki ", "Hobart ", "Hongkong ", "Honolulu ", "Irkutsk ", "Jakutsk ", "Jekaterinburg", // "Jerusalem ", "Kabul ", "Kairo ", "Kalkutta ", "Kap Verde ", "Karatschi ", "Kathmandu ", "Kuala Lumpur ", "Kuwait ", "London ", // "Los Angeles ", "Magadan ", "Majuro ", "Manaus ", "Mexiko-Stadt ", "Midway ", "Minsk ", "Montevideo ", "Moskau ", "Nairobi ", // "New York ", "Nuuk ", "Oral ", "Perth ", "Phoenix ", "Rangun ", "Regina ", "Santiago ", "Sao Paulo ", "Sarajevo ", // "Seoul ", "Singapur ", "St. Johns ", "Suedgeorgien ", "Sydney ", // "Taipeh ", "Taschkent ", "Teheran ", "Tiflis ", "Tijuana ", "Tokio ", "Tongatapu ", "Ulaanbaatar ", "Windhoek ", "Wladiwostok ", "Zagreb " }; //.............................................................................. void setup() { // Serielle Schnittstelle konfigurieren (für PC oder Bluetooth) Serial.begin(9600); // Initialisierung LCD lcd.begin(20, 4); // Init LCD 20 Zeichen, 4 Zeilen, Licht ein // Initialisierung Temperatursensor DS1820 DS1820.begin(); // Ausgabe Info auf LCD LcdInfo(); } //.............................................................................. void loop() { if(Serial.available()) RxBluetooth(); // Werte über Bluetooth-Terminal einlesen ZeitSchreiben(); ZeitLesen(); NormalLcdPrt(); TempDs1820(); MezMesz(); WeltLcdPrt(); Zeitzone(Stadt); Stadt = Stadt + Raster; if (Stadt >= AnzahlStadt) {Stadt -= AnzahlStadt;}; if (Stadt < 0) {Stadt += AnzahlStadt;}; delay(1000); } //.............................................................................. void ZeitSchreiben() { if (set == 0) { // Uhr initialisieren rtc.initClock(); // Init RTC, Register löschen // Tag, Wochentag, Monat, Jahrhundert (1=1900, 0=2000), Jahr rtc.setDate(SollTag, SollWochentag, SollMonat, 1, SollJahr-2000); // Stunde, Minute, Sekunde rtc.setTime(SollStunde, SollMinute, SollSekunde); set = 1; } } //.............................................................................. void ZeitLesen() { IstStunde = rtc.getHour(); IstMinute = rtc.getMinute(); IstSekunde = rtc.getSecond(); IstTag = rtc.getDay(); IstWochentag = rtc.getWeekday(); IstMonat = rtc.getMonth(); IstJahr = rtc.getYear()+2000; } //.............................................................................. void NormalLcdPrt() { lcd.setCursor(0, 0); //Start at character x on line y LcdPrt(IstTag, "."); LcdPrt(IstMonat, "."); LcdPrt(IstJahr, " "); LcdPrt(IstStunde, ":"); LcdPrt(IstMinute, ":"); LcdPrt(IstSekunde, ""); } //.............................................................................. void TempDs1820() { lcd.setCursor(0, 1); //Start at character x on line y DS1820.requestTemperatures(); // Start Temperatur Wandlung starten IstTempC= DS1820.getTempCByIndex(0); // Temperatur auslesen if (IstTempC < 100) lcd.print(F(" ")); if (IstTempC < 10) lcd.print(F(" ")); lcd.print(IstTempC,1); lcd.print(F(" ")); lcd.print(char(0xdf)); // ä 0xE1, ö 0xEF, ü 0xF5, ß 0xE2, Grad 0xDF, Ohm 0xF4 lcd.print(F("C ")); } //.............................................................................. void MezMesz() { // Umschaltung auf Sommerzeit letzter So im März um 2:00 +1, auf Normalzeit letzter So im Okt um 3:00 -1 if (IstMonat < 3 || IstMonat > 10) NzSz = 0; // keine Sommerzeit im Jan, Feb und Nov, Dez if (IstMonat > 3 && IstMonat < 10) NzSz = 1; // Sommerzeit im Apr, Mai, Jun, Jul, Aug, Sep // if (IstMonat == 3 && (IstStunde + 24 * IstTag) >= (1 + tzHours + 24 * (31 - (5 * year / 4 + 4) % 7)) // || // IstMonat == 10 && (IstStunde + 24 * IstTag) < (1 + tzHours + 24 * (31 - (5 * year / 4 + 1) % 7))) lcd.setCursor(10, 1); //Start at character x on line y lcd.print(F(" ")); lcd.print(Wochentag[IstWochentag]); if (NzSz == 0) lcd.print(F(" MEZ ")); else lcd.print(F(" MESZ")); } //.............................................................................. void WeltLcdPrt() { lcd.setCursor(0, 2); //Start at character x on line y lcd.print(F("UTC ")); lcd.setCursor(0, 3); //Start at character x on line y intTmp = IstStunde - 1 - NzSz; if (intTmp < 0) intTmp = intTmp + 24; LcdPrt(intTmp, ":"); LcdPrt(IstMinute, " "); } //.............................................................................. void Zeitzone(int zone) { int tmpIstMinute; int tmpIstStunde; int tmpVersatz; lcd.setCursor(7, 2); //Start at character x on line y lcd.print(ZoneStadt[zone]); lcd.setCursor(7, 3); //Start at character x on line y tmpIstStunde = IstStunde - 1 - NzSz + NormalSommerZeit[NzSz][zone] / 100; tmpIstMinute = IstMinute + NormalSommerZeit[NzSz][zone] - (NormalSommerZeit[NzSz][zone] / 100) * 100; if (tmpIstMinute < 0) {tmpIstMinute = tmpIstMinute + 60; tmpIstStunde =-1;} if (tmpIstMinute >= 60) {tmpIstMinute = tmpIstMinute - 60; tmpIstStunde =+1;} if (tmpIstStunde < 0) {tmpIstStunde = tmpIstStunde + 24;}; if (tmpIstStunde >= 24) {tmpIstStunde = tmpIstStunde - 24;}; tmpVersatz = - 1 - NzSz + NormalSommerZeit[NzSz][zone] / 100; if (tmpVersatz < 0) { tmpVersatz = 0; } else { if (tmpVersatz > 0) {tmpVersatz = 2;} else {tmpVersatz = 1;}; }; lcd.print(Versatz[tmpVersatz]); lcd.print("> "); LcdPrt(tmpIstStunde, ":"); LcdPrt(tmpIstMinute, " <"); lcd.print(Versatz[tmpVersatz]); } //.............................................................................. void LcdPrt(int wert, char tren[]) { if (wert < 10) lcd.print("0"); lcd.print(wert); lcd.print(tren); } //.............................................................................. void SerPrt(int wert, char tren[]) { if (wert < 10) Serial.print("0"); Serial.print(wert); Serial.print(tren); } //.............................................................................. void SerSollZeitDatum() { SerPrt(SollStunde, ":"); SerPrt(SollMinute, ":"); SerPrt(SollSekunde, " "); SerPrt(SollTag, "."); SerPrt(SollMonat, "."); SerPrt(SollJahr, " "); Serial.print(Wochentag[SollWochentag]); } //.............................................................................. void SerIstZeitDatum() { SerPrt(IstStunde, ":"); SerPrt(IstMinute, ":"); SerPrt(IstSekunde, " "); SerPrt(IstTag, "."); SerPrt(IstMonat, "."); SerPrt(IstJahr, " "); Serial.print(Wochentag[IstWochentag]); } //.............................................................................. void LcdInfo() { // Licht 1 * blinken lcd.noBacklight(); delay(250); lcd.backlight(); delay(250); // Starttext lcd.setCursor(0, 0); //Start at character x on line y lcd.print(F("Weltzeituhr MEZ/UTC")); delay(1000); lcd.setCursor(0, 1); //Start at character x on line y lcd.print(F("Terminal / Bluetooth")); lcd.setCursor(0, 2); //Start at character x on line y lcd.print(F("--------------------")); lcd.setCursor(0, 3); //Start at character x on line y lcd.print(F("(c) by Jan von K")); lcd.print(char(0xef)); // ä 0xE1, ö 0xEF, ü 0xF5, ß 0xE2, Grad 0xDF, Ohm 0xF4 lcd.print(F("lle")); delay(2000); // Licht 1 * blinken lcd.noBacklight(); delay(250); lcd.backlight(); delay(250); } //..............................................................................