//#include <RTClib.h>
//#include <RTClib.h>
//#include <I2C_RTC.h>
//#include <Stepper.h>
//#include <TFT.h>
/**Dieser Sketch regelt das Gehwerk und damit auch die Zifferblattanzeige einer TurmUhr, die so eingestellt ist, daß sie in 12 h ca 1,5 min vorgeht, dann angehalten wird
*bis 12 h auf einerRTC Uhr abgelaufen sind Nach diesen 12h wird sie wieder freigegeben und das Spiel beginnt wieder von
*von vorne. Es werden dadurch Gangunregelmäßigkeiten der Uhr aufgefangen und nicht aufsummiert. Die Uhr geht dadurch vergleichsweise genau.
*
*Es handelt sich um eine Mannhardt Turmuhr mit einem 1,11Sek Pendel d.h 2,22sek für eine komplette Pendelschwingung (hin + her), einem Hemmungsrad mit 90 Stiften einer
*Übersetzung zwischen Minutenachse und Hemmungsrad von 144:8 = 18.d.h. 12h = 43200sec = 216 Udr. Hemmungsrad = 216:18 = 12 UdrMin-Zeiger= 38800 Ticks (a 1,11sec) = 19440 Pendelschwingungen
*(a2,22Sec).
*
*Mit einem induktiven Sensor werden die Spaichen der SchloßScheibe gezählt, Counter0 >5 (bzw- =6 während des 12h Schlag) bedeutet wir sind im Bereich des 12UhrSchlages.
*Es kann der Pendelfänger ausgelöst werden.
*Mit dem 12-Uhr Schlagen wird ein Pendelfänger ausgelöst, der das Pendel im Umkehrpunkt der Schwingung fängt und somit des Gehwerk anhält. Der
*12Uhrschlag wird noch vollständig ausgeführt. Das Pendel wird dann bei 12Uhr auf der RTC wieder freigegeben.Das Gehwerk (mit den Schlagwerken)
*läuft wieder an bis zum nächsten 12Uhr Schlag bei dem es wieder angehalten wird. usw.
*Output Pin 3 schalte den Pendelfänger ein. Output Pin 4schaltet ihn wieder aus.
*Interruptpin 2 zählt die Spaichen. SDA, SCL sind mit RTC verbunden.
*
*Connections
* connect SDA of the RTC with SDAArduino
* connect SCL of the RTC with ECLArduino
* connect Pin 2 mit Induktiven Sensor
* connect PIN 3 MIT eINSCHALTRELAIS pENDELFÄNGER
* connect Pin 4 mir Ausschaltrelais Pendelfänger
*/
//#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time;
int Day;
//#include <LiquidCrystal.h>
int Month;
int Year;
int Secs;
int Minutes;
int Hours;
int dofweek; // day of week
String myDate;
String myTime;
boolean DST = false;
boolean abgleich = false;
volatile int counter0 = 0;
void setup() {
// Initialisierung der LED_BUILTIN
pinMode(LED_BUILTIN, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(3, OUTPUT);
digitalWrite(3, LOW); //Pendelfänger einschalten
delay(250);
digitalWrite(3, HIGH);
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
Serial.begin(9600);
delay(3000); // wait for console opening
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1)
;
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// Comment out below lines once you set the date & time.
// Following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Following line sets the RTC with an explicit date & time
// for example to set January 27 2017 at 12:56 you would call:
// rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0));
}
attachInterrupt(digitalPinToInterrupt(2), irq_Svc0, LOW);
delay(3000);
digitalWrite(4, LOW); //Pendel freigeben
delay(250);
digitalWrite(4, HIGH);
delay(250);
counter0 = 0;
// nur ein Test-Kommentar
Serial.println("Implementierungskommentar");
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
// nur ein Test-Kommentar
DateTime now = rtc.now();
digitalWrite(LED_BUILTIN, LOW);
Day = now.day();
Month = now.month();
Year = now.year();
Secs = now.second();
Hours = now.hour();
Minutes = now.minute();
dofweek = daysOfTheWeek[now.dayOfTheWeek()];
Serial.println(dofweek);
//myDate = myDate + dofweek + " " + Day + "/" + Month + "/" + Year;
//myTime = myTime + Hours + ":" + Minutes + ":" + Secs;
// send to serial monitor
if (Month <= 2 || Month >= 11) {
DST = false;
}
if (Month >= 4 && Month <= 9) {
DST = true;
}
if (Month == 3 && Day - dofweek >= 25) { //Begin SommerZeit
DST = true;
}
if (Month == 10 && Day - dofweek < 25) {
DST = true;
}
if (DST == true) {
Hours += 1;
}
if (Hours > 12) {
Hours -= 12;
}
if (counter0 >= 6 && abgleich == false){
digitalWrite(3, LOW);
abgleich = true;
delay(250);
digitalWrite(3, HIGH); //Pendelfänger ein
//counter0 = 0;
}
delay(100);
if (abgleich == true) {
if ((Hours == 00 )||(Hours == 12 )) {
if(Minutes == 00 && Secs == 00) {
digitalWrite(4, LOW);
abgleich = false;
counter0 = 0;
delay(250);
digitalWrite(4, HIGH);
}
}
}
//Serial.println(dofweek);
//Serial.println(myDate);
//Serial.println(myTime);
Serial.println("Neue_Zeit");
Serial.println(Hours);
Serial.println(Minutes);
Serial.println(Secs);
Serial.println(counter0);
Serial.println(abgleich);
delay(250);
}
//interrupt
void irq_Svc0() {
interrupt_time = millis();
if(interrupt_time-last_interrupt_time >= 500){
counter0 = counter0 + 1;
}
last_interrupt_time = interrupt_time;
}