// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <EEPROM.h>
#include <OneButton.h>
//#include <DS3231.h>
#include "characters.h" //Sonderzeichen
#include "constvar.h"
#include "functions.h"
#include "displays.h"
#include "RTClib.h"
RTC_DS3231 rtc;
DateTime now = rtc.now();
//char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//Objekte und Konstanten
OneButton startKey(startKeyPin, HIGH, true); //Low aktiv mit internem Pullup-Widerstand
OneButton minusKey(minusKeyPin, HIGH, true);
OneButton plusKey(plusKeyPin, HIGH, true);
OneButton quitKey(quitKeyPin, HIGH, true);
void setup ()
{
Serial.begin(9600);
Wire.begin(); //I2C-Bus starten
rtc.begin();
lcd.init();
lcd.backlight();
pinMode(freigabePin, INPUT_PULLUP); //Pin X als Eingang für Freigabe durch Hauptschalter an mit internem Pullup-Widerstand
pinMode(7, OUTPUT);
// getVersName( __FILE__ );
// getVersDat( __DATE__ );
//Timing der Tasten
startKey.setDebounceTicks(10);
minusKey.setDebounceTicks(10);
plusKey.setDebounceTicks(10);
quitKey.setDebounceTicks(10);
startKey.setClickTicks(250);
minusKey.setClickTicks(250);
plusKey.setClickTicks(250);
quitKey.setClickTicks(250);
//Zuordnung von auszuführender Funktion zur auslösenden Taste
startKey.attachClick(startClicked);
startKey.attachDoubleClick(startDoubleClick);
startKey.attachLongPressStart(startLongPressed);
minusKey.attachClick(minusClicked);
minusKey.attachDoubleClick(minusDoubleClick);
minusKey.attachDuringLongPress(minusLongPressed);
plusKey.attachClick(plusClicked);
plusKey.attachDoubleClick(plusDoubleClick);
plusKey.attachDuringLongPress(plusLongPressed);
quitKey.attachClick(quitClicked);
quitKey.attachLongPressStart(quitLongPressed);
quitKey.attachDoubleClick(quitDoubleClick);
uBatt = 2.9;
structure_flag = 1;
set_structure(structure_flag);
initPID(ukReg);
T = 30;
pH = 5935;
kr = 25.4; kr_start = 20.0;
tn = 400; tn_start = 600;
tv = 100; df = 15;
setTemp = 85.0;
relTemp = 25.3;
ukReg = 66.7;
ukFan = 49.3;
mainDSPConfig = 1;
arbeit = 10.2;
Tw = 55; Ta = 75;
PTermOut = -9999; ITermOut = 100; DTermOut = -9999;
//lcd.setCursor(0,0);
//lcd.print("Hallo");
//delay(1000);
dspNum = 100;
}
void loop ()
{
unsigned long currentDSPTime = millis();
/*************Watchdog*********************************/
//Zeilen In HW - Version benötigt
now = rtc.now();
wdSec = now.second();
if (wdSec != prev_wdSec)
{
prev_wdSec = wdSec;
digitalWrite(7, !digitalRead(7));
//Uhr
if (uhrAdjustFlag == 0) //nicht verstellt oder wieder freigegeben - Uhrzeit live
{
tag = now.day(); // Tag von Uhr
woTag = now.dayOfTheWeek();
//woTag = woTagStr[];
monat = now.month(); // Monat von Uhr holen
jahr = now.year() - 2000; // Jahr von Uhr holen
stunde = now.hour(); //Stunde von Uhr holen
minut = now.minute(); // Minute von Uhr holen
sekunde = now.second();
/*
woTag = dtNow.Dow; // Wochentag von Uhr holen
tag = dtNow.Day; // Tag von Uhr holen
monat = dtNow.Month; // Monat von Uhr holen
jahr = dtNow.Year; // Jahr von Uhr holen
stunde = dtNow.Hour; //Stunde von Uhr holen
minut = dtNow.Minute; // Minute von Uhr holen
sekunde = wdSec;*/
}
/*************Auslösen der Messung 1x / s und des Reglers mit eigenem Unter-Takt*********************************/
sync_meas = 1; //Messung auslösen
if (baFlag == 0)
{
ctrl_cnt++;
if (ctrl_cnt == T)
{
sync_ctrl = 1;
ctrl_cnt = 0;
}
}
if (baFlag == 1)
{
//ukDim = mapf(ukHand, 0, 100, pwmNull, pwmHundert);
//DACval = round(mapf(ukDim, 0, 100, DACmin, DACmax)); //Testen
//analogWrite(pwmPin, DACval);
}
// /*************Ausschalten der DSP - Beleuchtung*********************************/
if (((dspNum == 0) || (dspNum == 2)) && (lcdBacklightState == 1)) //Steuerung der Displaybeleuchtung (aus in Haupt- und Urlaubs-DSP, wenn 30s kein Tastendruck, ein bei Tastendruck)
{
lcdLightOffCnt--;
if (lcdLightOffCnt == 0)
{
lcdBacklightCntrl(0);
}
}
}
/*************Tastaturabfrage - maximal mögliche Abtastfrequenz*************/
//funktionierende Version (DSP-Beleuchtung hart abschalten)
if ((prevTaste == 0) && (globalTaste != 0))
{
lcdLightOffCnt = lcdLightOffCntSet; //Tastenflanke erkannt-->Zähler zurücksetzen
}
prevTaste = globalTaste;
if ((lcdBacklightState == 1) && (keyTickState == 0) && (digitalRead(startKeyPin) == HIGH) && (digitalRead(minusKeyPin) == HIGH) && (digitalRead(plusKeyPin) == HIGH) && (digitalRead(quitKeyPin) == HIGH)) keyTickState = 1; //Licht an und alle Tasten losgelassen-->OneButton ist aktiv
if (lcdBacklightState == 0) //abgespeckte Tastaturabfrage ist aktiv
{
if ((digitalRead(startKeyPin) == LOW) || (digitalRead(minusKeyPin) == LOW) || (digitalRead(plusKeyPin) == LOW) || (digitalRead(quitKeyPin) == LOW))//Mindestens 1 Taste gedrückt
{
lcdLightOffCnt = lcdLightOffCntSet;
lcdBacklightCntrl(1);
}
}
if (keyTickState == 1) //Licht an und alle Tasten losgelassen --> Tastaturabfrage über OneButton
{
startKey.tick();
minusKey.tick();
plusKey.tick();
quitKey.tick();
}
if (sync_meas == 1)
{
for (byte i = 59; i >= 1; i--) //Alle Werte um 1 Stelle nach hinten schieben
{
roomTempADCArr[i] = roomTempADCArr[i - 1];
}
roomTempADCArr[0] = analogRead(tempInPin);
for (byte i = 0; i < 60; i++)
{
roomTempADCSum = roomTempADCSum + roomTempADCArr[i];
}
roomTemp = (int(round(roomTempADCSum / 60)) + 0.5) * 99.9 / 1024;
roomTempADCSum = 0;
roomTemp_1 = roomTemp;
sync_meas = 0;
}
if (currentDSPTime - previousDSPTime > 100)
{
previousDSPTime = currentDSPTime;
//dtostrf(roomTemp, 4, 1, float21Str); //Formatieren des Istwertes
if (dspNum == 0) ausDSP();
if (dspNum == 1) startDSP();
if (dspNum == 2) mainDSP();
if (dspNum == 3) setUp1DSP();
if (dspNum == 4) setUp2DSP();
if (dspNum == 5) setUp3DSP();
if (dspNum == 6) handDSP();
if (dspNum == 100) versionDSP();
/****************************************************************************************************/
}//Alle DSPs
}