arduino:schlafphasenwecker:programmversion_0.8
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
arduino:schlafphasenwecker:programmversion_0.8 [23.04.2017 10:35] – Frickelpiet | arduino:schlafphasenwecker:programmversion_0.8 [18.05.2023 12:34] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Schlafphasenwecker Programmversion 0.8 ====== | ====== Schlafphasenwecker Programmversion 0.8 ====== | ||
- | Diese Programmversion | + | Diese Programmversion |
- | Neuerungen | + | Neuerungen |
* Die Sonnenaufgangs- und Sonnenuntergangsberechnung wurde integriert. | * Die Sonnenaufgangs- und Sonnenuntergangsberechnung wurde integriert. | ||
* Die Farbtemperatur des Standardziffernblatts wird nach Sonnenuntergang wärmer und nach Sonnenaufgang kälter. | * Die Farbtemperatur des Standardziffernblatts wird nach Sonnenuntergang wärmer und nach Sonnenaufgang kälter. | ||
* Die Sonnenaufgangs- und Sonnenuntergangszeit wird im Hauptmenü angezeigt. | * Die Sonnenaufgangs- und Sonnenuntergangszeit wird im Hauptmenü angezeigt. | ||
* Die Berechnung der Sonnenaufgangs- und Sonnenuntergangszeit berücksichtigt die Sommer- bzw. Winterzeit. | * Die Berechnung der Sonnenaufgangs- und Sonnenuntergangszeit berücksichtigt die Sommer- bzw. Winterzeit. | ||
+ | * Die auf dem NeoPixel-Ring angezeigte Uhrzeit wird nun mit der auf dem TFT-Screen angezeigten Uhrzeit synchronisiert. | ||
* Das " | * Das " | ||
* Die Abfrage des Lichtssensors (TSL2591) geschieht nun in einer eigenen Schleife. Diese Schleife wird nun alle 200 Millisekunden aufgerufen. Wenn der Lichtsensor z.B. alle 100 Millisekunden abgefragt wird, hält der Sonsor die Schleife für 126 Millisekunden aus. Der Lichtsensor darf also auf keinen Fall häufiger angefragt werden. (Diese Aussage gilt freilich nur für die im Code angegebene Konfiguration. Wenn die Genauigkeit des Sensors erhöht wird (d.h. der Messzeitraum), | * Die Abfrage des Lichtssensors (TSL2591) geschieht nun in einer eigenen Schleife. Diese Schleife wird nun alle 200 Millisekunden aufgerufen. Wenn der Lichtsensor z.B. alle 100 Millisekunden abgefragt wird, hält der Sonsor die Schleife für 126 Millisekunden aus. Der Lichtsensor darf also auf keinen Fall häufiger angefragt werden. (Diese Aussage gilt freilich nur für die im Code angegebene Konfiguration. Wenn die Genauigkeit des Sensors erhöht wird (d.h. der Messzeitraum), | ||
- | * Die Empfindlichkeit des Matratzensensors kann nun im Einstellungsmenü konfiguriert werden | + | * Die Empfindlichkeit des Matratzensensors kann nun im Einstellungsmenü konfiguriert werden. So lange das entsprechende Einstellungsmenü ausgewählt ist, werden Ereignisse auf den drei Achsen farblich kodiert auf dem NeoPixel-Ring visualisert. Die ausgewählten Schwellenwerte werden im EEPROM gespeichert. |
+ | * Die Auswertung des Matratzensensors wurde verbessert. Der Bezugswert wird nun als Mittelwert einer zweistelligen Anzahl (aktuell 40) von Einzelmessungen berechnet. Von diesem Bezugswert wird der aktuelle Messwert subtrahiert (und umgekehrt) und bei Überschreiten eines Grenzwerts ein Event gezählt. Damit nicht Extremwerte des unvermeidbaren Sensorrauschens ungewollte Events auslösen, wird jeweils der Medianwert einer bestimmten Anzahl (drei bis fünf) von Messwerten verwendet. | ||
+ | * Der Matratzensonsor wird nun nur noch ausgewertet, | ||
+ | * Es können verschiedene Ziffernblatteffekte ausgewählt werden. Welches Ziffernblatt ausgewählt ist, wird im EEPROM gespeichert. | ||
+ | * Wenn im Lichtweckwodus die eingestellte Weckzeit erreicht ist, ohne dass innerhalb der Weckvorlaufzeit ein visueller Alarm ausgelöst wurde, wird ein akustischer Alarm ausgelöst. | ||
* Auf der Gehäuserückseite kann nun an der (von hinten betrachtet) linken Kinkenbuchse ein externes DCF77-Empfangsmodul angeschlossen werden. Ist ein externes DCF77-Modul angeschlossen, | * Auf der Gehäuserückseite kann nun an der (von hinten betrachtet) linken Kinkenbuchse ein externes DCF77-Empfangsmodul angeschlossen werden. Ist ein externes DCF77-Modul angeschlossen, | ||
* Die Weckzeit wird nun unter Berücksichtigung der Weckvorlaufzeit immer korrekt berechnet. | * Die Weckzeit wird nun unter Berücksichtigung der Weckvorlaufzeit immer korrekt berechnet. | ||
Zeile 20: | Zeile 25: | ||
* Die Lautstärke des akustischen Weckalarms wird nun langsam erhöht. | * Die Lautstärke des akustischen Weckalarms wird nun langsam erhöht. | ||
* Alle Menüseiten sind nun an das neue Design angepasst. | * Alle Menüseiten sind nun an das neue Design angepasst. | ||
+ | * Um die Performance des Codes bewerten zu können, kann die Rate der durchlaufenen VOID-Schleifen an die serielle Schnittstelle ausgegeben werden. | ||
* Viele kleinere Programmkorrekturen. | * Viele kleinere Programmkorrekturen. | ||
* Kleine Optimierungen an den Menüs | * Kleine Optimierungen an den Menüs | ||
Zeile 29: | Zeile 35: | ||
* Der Verstärker macht bei den Dateien " | * Der Verstärker macht bei den Dateien " | ||
* Im Audiomodus wird die Datei " | * Im Audiomodus wird die Datei " | ||
- | * Wenn die Zielweckzeit erreicht ist, ohne dass ein Alarm ausgelöst wurde, muss ein Alarm ausgelöst werden. | ||
- | * Der Aufruf der Log-Funktion mit Alarm.timerRepeat funktioniert nicht. | ||
- | < | ||
- | // Schlafphasenwecker Version 0.8.2 | ||
- | // Bibliotheken einbinden | + | {{tag>Arduino |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | #include < | + | |
- | + | ||
- | // Fonts einbinden | + | |
- | #include " | + | |
- | #include " | + | |
- | #include " | + | |
- | #include " | + | |
- | #include " | + | |
- | #include " | + | |
- | #include " | + | |
- | + | ||
- | // Definiert Adressen im EEPROM | + | |
- | int addrAlarmHour = 0; | + | |
- | int addrAlarmMinute = 1; | + | |
- | int addrAlarmMode = 2; | + | |
- | int addrDisplayedAlarmHour = 3; | + | |
- | int addrDisplayedAlarmMinute = 4; | + | |
- | int addrAlarmAdvancetime = 5; // Vorlauf für die Alarmfunktion | + | |
- | int addrAlarmFile = 6; // Musikdatei für die Alarmfunktion | + | |
- | int addrSnoozleFile = 7; // Musikdatei für die Einschalffunktion (Snoozle) | + | |
- | int addrSnoozleGain = 8; // Lautstärke der Einschlaffunkion (Snoozle) | + | |
- | int addrAlarmGain = 9; // Lautstärke der Alarmfunktion | + | |
- | int addrAlarmEffect = 10; // Visueller Weckeffekt | + | |
- | int addrThresholdPitch = 11; // Grenzwert zur Einstellung der Empfindlichkeit der Pitchachse des Matratzensensors | + | |
- | int addrThresholdRoll = 12; // Grenzwert zur Einstellung der Empfindlichkeit der Rollachse des Matratzensensors | + | |
- | int addrThresholdAccelZ = 13; // Grenzwert zur Einstellung der Empfindlichkeit der Z-Achse des Matratzensensors | + | |
- | + | ||
- | // Definiert die Pins | + | |
- | #define DCFINT_PIN 2 // Signal-Pin für das interne DCF77-Modul | + | |
- | #define DCFINT_INTERRUPT 2 // Interrupt-Pin für das interne DCF77-Modul | + | |
- | #define DCFEXT_PIN 36 // Signal-Pin für das externe DCF77-Modul | + | |
- | #define DCFEXT_INTERRUPT 36 // Interrupt-Pin für das externe DCF77-Modul | + | |
- | #define DCFEXT_CONNECTED 35 // Liegt auf Masse, wenn das Externe DCF77-Modul angeschlossen ist | + | |
- | #define DHTPIN 3 // Signal-Pin für den Temperatursensor | + | |
- | #define TFTbacklightPin 4 // PWM Backlight TFT | + | |
- | #define NEOPIXELPIN 33 // NeoPixel | + | |
- | + | ||
- | // Definiert die DCF77-Bibliothek | + | |
- | DCF77 DCFINT = DCF77(DCFINT_PIN, | + | |
- | DCF77 DCFEXT = DCF77(DCFEXT_PIN, | + | |
- | + | ||
- | // The FT6206 uses hardware I2C (SCL/SDA) | + | |
- | Adafruit_FT6206 ctp = Adafruit_FT6206(); | + | |
- | + | ||
- | // The display also uses hardware SPI | + | |
- | #define TFT_DC 20 | + | |
- | #define TFT_CS 21 | + | |
- | #define TFT_RST 255 // Set to 255 when reset is not used | + | |
- | #define TFT_MOSI 7 | + | |
- | #define TFT_SCLK 14 | + | |
- | #define TFT_MISO 12 | + | |
- | + | ||
- | ILI9341_t3 tft = ILI9341_t3(TFT_CS, | + | |
- | + | ||
- | // pass in a number for the sensor identifier (for your use later) | + | |
- | Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591); | + | |
- | + | ||
- | // Assign a unique ID to this sensor at the same time | + | |
- | Adafruit_LSM303_Accel_Unified accel(30301); | + | |
- | Adafruit_LSM303_Mag_Unified | + | |
- | + | ||
- | // Create simple AHRS algorithm using the above sensors. | + | |
- | Adafruit_Simple_AHRS | + | |
- | + | ||
- | // Konfiguriert den NeoPixel-Ring | + | |
- | int numPixels = 60; // Anzahl der NeoPixel | + | |
- | Adafruit_NeoPixel strip = Adafruit_NeoPixel(numPixels, | + | |
- | + | ||
- | // Konfiguriert die Audio-Funktionen | + | |
- | AudioPlaySdWav | + | |
- | AudioPlaySdWav | + | |
- | AudioMixer4 | + | |
- | AudioMixer4 | + | |
- | AudioOutputI2S | + | |
- | AudioConnection | + | |
- | AudioConnection | + | |
- | AudioConnection | + | |
- | AudioConnection | + | |
- | AudioConnection | + | |
- | AudioConnection | + | |
- | AudioControlSGTL5000 | + | |
- | + | ||
- | // Stereo 2.8W Class D Audio Amplifier TPA2016 | + | |
- | Adafruit_TPA2016 audioamp = Adafruit_TPA2016(); | + | |
- | + | ||
- | // Initialisiert den DHT22-Sensor | + | |
- | #define DHTTYPE DHT22 | + | |
- | DHT dht(DHTPIN, DHTTYPE); | + | |
- | + | ||
- | // Definiert die Variablen | + | |
- | int flankUp = 0; | + | |
- | int flankDown = 0; | + | |
- | int PreviousflankUp; | + | |
- | boolean Up = false; | + | |
- | + | ||
- | boolean IMUconnected = false; | + | |
- | boolean DCFtimesignalFound = false; | + | |
- | + | ||
- | boolean extDCF = 1; // Wird Null, wenn ein externes DCF77-Modul angeschlossen ist | + | |
- | time_t DCFtime = 0; // Das aktuelleste erfolgreich empfangene Zeitzeichen im Variablenformat time_t (Sekunden seit dem 1.1.1970) | + | |
- | time_t t = 0; // Die Zeit der Real Time Clock im Variablenformat time_t (Sekunden seit dem 1.1.1970) | + | |
- | time_t DefaultTime = 1477958400; | + | |
- | //time_t startTime; | + | |
- | unsigned long timesinceDCFsignal; | + | |
- | unsigned long noDCFsignal; | + | |
- | time_t timestampDCFsignal; | + | |
- | unsigned long receivedDCFsignals = 0; // Zählt die Anzahl der erfolgreich empfangenen DCF77-Zeitzeichen seit dem Systemstart. | + | |
- | float DCFsuccessRate = 0; // Wert für die Quote der erfolgreich empfangenen DCF77-Zeitzeichen seit dem Systemstart. | + | |
- | + | ||
- | boolean clockfaceOn = true; // Kann auf falsch gesetzt werden, om das Ziffernblatt zugunsten anderer Effekte zu deaktivieren. | + | |
- | int8_t intensity = 1; // Wert für die Helligkeit des Ziffernblatts | + | |
- | + | ||
- | // float x = 4.712388980; | + | |
- | + | ||
- | int i; // Zählwert für verschiedene Beleuchtungseffekte | + | |
- | int j; // Zählwert für verschiedene Beleuchtungseffekte | + | |
- | int k; // Zählwert für verschiedene Beleuchtungseffekte | + | |
- | int l; // Zählwert für verschiedene Beleuchtungseffekte | + | |
- | int loopcounter; | + | |
- | + | ||
- | // Definiert die globalen RGBW-Werte für das NeoPixel-Ziffernblatt | + | |
- | byte r = 0; | + | |
- | byte g = 0; | + | |
- | byte b = 0; | + | |
- | byte w = 0; | + | |
- | + | ||
- | int AufgangMinuten; | + | |
- | int AufgangStunden; | + | |
- | int UntergangMinuten; | + | |
- | int UntergangStunden; | + | |
- | boolean daylight; | + | |
- | + | ||
- | int displayedAlarmHour = 6; // Stunde, die auf dem TFT als Alarmzeit angezeigt wird. Wird als Integer definiert, damit die Variable theoretisch negativ werden kann. (Das ist für den Rollover von 0 auf 23 nötig.) | + | |
- | int displayedAlarmMinute = 0; // Minute, die auf dem TFT als Alarmzeit angezeigt wird. Wird als Integer definiert, damit die Variable theoretisch negativ werden kann. (Das ist für den Rollover von 0 auf 45 nötig.) | + | |
- | int alarmHour = 5; // Stunde, zu der ein schlafphasensensibler Alarm frühestens ausgelöst werden soll. Wird als Integer definiert, damit die Variable theoretisch negativ werden kann. (Das ist für den Rollover von 0 auf 23 nötig.) | + | |
- | int alarmMinute = 30; // Minute, zu der ein schlafphasensensibler Alarm frühestens ausgelöst werden soll. Wird als Integer definiert, damit die Variable theoretisch negativ werden kann. (Das ist für den Rollover von 0 auf 45 nötig.) | + | |
- | int alarmAdvancetime = 30; // Größe des Zeitfensters in Minuten, in der der schlafphasensensible Alarm ausgelöst werden kann. | + | |
- | byte alarmMode = 0; // Alarmmodus (0 = Alarm aus; 1 = visuell, 2 = audio; 3 = audiovisuell) | + | |
- | byte alarmFile = 1; // Legt die WAV-Datei fest, die bei einem Alarm abgespielt wird | + | |
- | int8_t alarmEffect = 1; // visueller Alarmeffekt (1 = Morgenröthe; | + | |
- | int16_t alarmGain = 30; // Lautstärke der Alarmfunktion (wird mit 0.004 multipliziert). Wird als Integer definiert, damit sie theoretisch negativ weden kann. | + | |
- | int16_t alarmSetGain = 0; // Variable wird benötigt, um die Lautstärke des Weckalarms langsam erhöhen zu können. | + | |
- | boolean alarmOn = false; | + | |
- | time_t timestampAlarmStart; | + | |
- | + | ||
- | boolean snoozeOn = false; | + | |
- | int snoozeDelay = 600; // Schlummerzeit in Sekunden | + | |
- | int snoozeTime = 1477958400; | + | |
- | + | ||
- | boolean snoozleOn = false; | + | |
- | byte snoozleFile = 1; // Legt die WAV-Datei fest, die zum Snoozlen abgespielt wird | + | |
- | time_t snoozleTime = 1477958400; | + | |
- | int16_t snoozleGain = 70; // Lautstärke der Einschlaffunktion (wird mit 0.005 multipliziert). Wird als Integer definiert, damit sie theoretisch negativ weden kann. | + | |
- | int16_t sg; // Variable für das Fade out der Snoozle-Musik | + | |
- | + | ||
- | uint32_t lum; | + | |
- | uint16_t full; // Helligkeitswert für das Gesamtspektrum | + | |
- | uint16_t ir; // Helligkeitswert für den Infrarotanteil des Lichts | + | |
- | uint16_t lux; // Helligkeit in Lux | + | |
- | uint16_t filteredFull; | + | |
- | uint16_t filteredVisible; | + | |
- | uint16_t filteredIr; | + | |
- | uint16_t filteredLux; | + | |
- | + | ||
- | float accelX; | + | |
- | float accelY; | + | |
- | double accelZ, filteredAccelZ; | + | |
- | + | ||
- | double roll, filteredRoll; | + | |
- | double pitch, filteredPitch; | + | |
- | float heading; | + | |
- | + | ||
- | Kalman accelZFilter(0.25, | + | |
- | Kalman rollFilter(0.25, | + | |
- | Kalman pitchFilter(0.25, | + | |
- | Kalman fullFilter(0.25, | + | |
- | Kalman visibleFilter(0.25, | + | |
- | Kalman irFilter(0.25, | + | |
- | Kalman luxFilter(0.025, | + | |
- | + | ||
- | float thresholdAccelZ; | + | |
- | float thresholdRoll; | + | |
- | float thresholdPitch; | + | |
- | + | ||
- | int eventAccelZ = 0; // Summe der Ereignisse auf der Beschleunigungsachse Z | + | |
- | int preveventAccelZ = 0; | + | |
- | int eventRoll = 0; // Summe der Ereignisse auf der Rollachse | + | |
- | int preveventRoll = 0; | + | |
- | int eventPitch = 0; // Summe der Ereignisse auf der Pitchachse | + | |
- | int preveventPitch = 0; | + | |
- | int eventTotal = 0; // Summe der Ereignisse auf allen Achsen | + | |
- | + | ||
- | float h; // Wert für die Luftfeuchtigkeit | + | |
- | float c; // Wert für Temperatur in Grad Celsius | + | |
- | float f; // Wert für Temperatur in Fahrenheit | + | |
- | float taupunkt; | + | |
- | + | ||
- | boolean touch = false; | + | |
- | boolean prevtouch = false; | + | |
- | boolean touch2 = false; | + | |
- | boolean prevtouch2 = false; | + | |
- | + | ||
- | boolean TFTbacklightOn = false; | + | |
- | byte TFTbrightness = 0; // Wert für die aktuelle Helligkeit des TFT Backlights | + | |
- | //byte TFTmaxbrightness = 255; // Wert für die maximale Helligkeit des TFT backlights | + | |
- | //byte TFTminbrightness = 0; // Wert für die minimale Helligkeit des TFT backlights | + | |
- | const unsigned long TFTbacklightDelay = 60000; // Zeit in Millisekunden, | + | |
- | unsigned long TFTbacklightTime = 0; | + | |
- | boolean TFTrefresh = false; | + | |
- | + | ||
- | + | ||
- | byte menuPage = 0; // Wert für das aktuell auf dem TFT angezeigten Menü. Gestartet wird mit Menü Nr. 0. | + | |
- | byte previousmenuPage = 1; // Wert für die Menüseite, die in dem vormaligen Durchlauf aktuell war. | + | |
- | int tx; // Auf dem Touchscreen gedrücktes Pixel auf der x-Achse. Pixelspalte Nr. 0 ist links. | + | |
- | int ty; // Auf dem Touchscreen gedrücktes Pixel auf der y-Achse. Pixelzeile Nr. 0 ist oben. | + | |
- | + | ||
- | + | ||
- | // Definiert die Tracking-Variablen für die IF-Abfragen | + | |
- | unsigned long previousMillisSetRTC = 0; // Real time Clock | + | |
- | unsigned long previousMillisAlarmClock = 0; // Alarm-Funktion | + | |
- | unsigned long previousMillisSnoozleTime = 0; // Einschlaf-Funktion | + | |
- | unsigned long previousMillisClockFace = 0; // Ziffernblatt | + | |
- | unsigned long previousMillisTFTScreen = 0; // TFT-Screen | + | |
- | unsigned long previousMillisTouchScreen = 0; // Touch-Sensor | + | |
- | unsigned long previousMillisSensorData = 0; // IMU und TSL2591 | + | |
- | unsigned long previousMillisDHTSensor = 0; // DHT22 | + | |
- | unsigned long previousMillisSerialPrint = 0; // Serielle Ausgabe | + | |
- | unsigned long previousMillisDCFPulseLength = 0; // Pulsweitenmessung | + | |
- | + | ||
- | // Definiert die Intervalle für die IF-Abfragen in Millisekunden | + | |
- | const unsigned long intervalSetRTC = 1000; // konstanter Delay für Holen der Zeit | + | |
- | const unsigned long intervalAlarmClock = 500; // konstanter Delay für die Weckfunktionen | + | |
- | const unsigned long intervalSnoozleTime = 1000; // konstanter Delay für die Snoozlefunktion | + | |
- | const unsigned long intervalClockFace = 20; // konstanter Delay für das Ziffernblatt | + | |
- | unsigned long intervalTFTScreen = 100; // variabler Delay für Anteuerung des TFT-Screens | + | |
- | const unsigned long intervalTouchScreen = 50; // konstanter Delay für Anteuerung des kapazitiven Touchsreens | + | |
- | const unsigned long intervalSensorData = 100; // konstanter Delay für Auslesen der Sensoren | + | |
- | const unsigned long intervalDHTSensor = 60000; | + | |
- | const unsigned long intervalSerialPrint = 100; // konstanter Delay für serielle Ausgabe | + | |
- | const unsigned long intervalDCFPulseLength = 1; // konstanter Delay für die Messung der Periode und Pulsweite des Zeitsignals | + | |
- | + | ||
- | + | ||
- | void setup() | + | |
- | // Initalisiert die Pins | + | |
- | pinMode(DCFINT_PIN, | + | |
- | pinMode(DCFEXT_PIN, | + | |
- | pinMode(DCFEXT_CONNECTED, | + | |
- | pinMode(DHTPIN, | + | |
- | pinMode(TFTbacklightPin, | + | |
- | + | ||
- | // Initialisiert die serielle Schnittstelle | + | |
- | Serial.begin(115200); | + | |
- | + | ||
- | // set the Time library to use Teensy 3.0's RTC to keep time | + | |
- | setSyncProvider(getTeensy3Time); | + | |
- | + | ||
- | delay(2000); | + | |
- | if (timeStatus()!= timeSet) | + | |
- | Serial.println(" | + | |
- | } else { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | + | ||
- | // | + | |
- | if (! ctp.begin(40)) { // Stellt u.a. die Sensitivität des Touchscreens ein | + | |
- | Serial.println(" | + | |
- | //while (1); | + | |
- | } else { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | + | ||
- | // | + | |
- | if(!accel.begin()) { | + | |
- | /* There was a problem detecting the ADXL345 ... check your connections */ | + | |
- | Serial.println(" | + | |
- | // | + | |
- | } else { | + | |
- | IMUconnected = true; | + | |
- | } | + | |
- | if(!mag.begin()) { | + | |
- | /* There was a problem detecting the ADXL345 ... check your connections */ | + | |
- | Serial.println(" | + | |
- | // | + | |
- | } | + | |
- | + | ||
- | // Initialisiert den TFT-Bildschirm | + | |
- | tft.begin(); | + | |
- | tft.setRotation(1); | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | + | ||
- | // read diagnostics (optional but can help debug problems) | + | |
- | uint8_t x = tft.readcommand8(ILI9341_RDMODE); | + | |
- | Serial.print(" | + | |
- | x = tft.readcommand8(ILI9341_RDMADCTL); | + | |
- | Serial.print(" | + | |
- | x = tft.readcommand8(ILI9341_RDPIXFMT); | + | |
- | Serial.print(" | + | |
- | x = tft.readcommand8(ILI9341_RDIMGFMT); | + | |
- | Serial.print(" | + | |
- | x = tft.readcommand8(ILI9341_RDSELFDIAG); | + | |
- | Serial.print(" | + | |
- | + | ||
- | // Konfiguration des TSL2591 | + | |
- | // You can change the gain on the fly, to adapt to brighter/ | + | |
- | // tsl.setGain(TSL2591_GAIN_LOW); | + | |
- | tsl.setGain(TSL2591_GAIN_MED); | + | |
- | // tsl.setGain(TSL2591_GAIN_HIGH); | + | |
- | + | ||
- | // Changing the integration time gives you a longer time over which to sense light | + | |
- | // longer timelines are slower, but are good in very low light situtations! | + | |
- | tsl.setTiming(TSL2591_INTEGRATIONTIME_100MS); | + | |
- | // tsl.setTiming(TSL2591_INTEGRATIONTIME_200MS); | + | |
- | // tsl.setTiming(TSL2591_INTEGRATIONTIME_300MS); | + | |
- | // tsl.setTiming(TSL2591_INTEGRATIONTIME_400MS); | + | |
- | // tsl.setTiming(TSL2591_INTEGRATIONTIME_500MS); | + | |
- | // tsl.setTiming(TSL2591_INTEGRATIONTIME_600MS); | + | |
- | + | ||
- | // Initialisiert den TSL2591 | + | |
- | tsl.begin(); | + | |
- | + | ||
- | // Intitialisiert den DHT22 | + | |
- | dht.begin(); | + | |
- | + | ||
- | // Displays some basic information on this sensor from the unified sensor API sensor_t type | + | |
- | sensor_t sensor; | + | |
- | tsl.getSensor(& | + | |
- | Serial.println(" | + | |
- | Serial.print | + | |
- | Serial.print | + | |
- | Serial.print | + | |
- | Serial.print | + | |
- | Serial.print | + | |
- | Serial.print | + | |
- | Serial.println(" | + | |
- | Serial.println("" | + | |
- | + | ||
- | // Startet die Abfrage der DCF77-Module | + | |
- | DCFINT.Start(); | + | |
- | Serial.println(" | + | |
- | Serial.println(" | + | |
- | + | ||
- | DCFEXT.Start(); | + | |
- | Serial.println(" | + | |
- | Serial.println(" | + | |
- | + | ||
- | // Initialisiert das Audio Board und die SD-Karte | + | |
- | AudioMemory(12); | + | |
- | sgtl5000_1.enable(); | + | |
- | sgtl5000_1.muteHeadphone(); | + | |
- | sgtl5000_1.volume(0.8); | + | |
- | sgtl5000_1.audioPostProcessorEnable(); | + | |
- | sgtl5000_1.enhanceBassEnable(); | + | |
- | SPI.setMOSI(7); | + | |
- | SPI.setSCK(14); | + | |
- | if (!(SD.begin(10))) { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | Serial.println(" | + | |
- | + | ||
- | // Initialisiert den Class D Amplifier | + | |
- | audioamp.begin(); | + | |
- | audioamp.setAGCCompression(TPA2016_AGC_OFF); | + | |
- | // audioamp.setAGCCompression(TPA2016_AGC_2); | + | |
- | audioamp.setLimitLevelOn(); | + | |
- | audioamp.setLimitLevel(10); | + | |
- | + | ||
- | // Initialisiert den NeoPixel-Teststrip | + | |
- | strip.begin(); | + | |
- | strip.show(); | + | |
- | + | ||
- | // Lese die abgespeicherten Werte für die angezeigte Alarmzeit, die schlafphasenabhängige Alarmzeit und den Alarmmmodus | + | |
- | alarmHour = EEPROM.read(addrAlarmHour); | + | |
- | alarmMinute = EEPROM.read(addrAlarmMinute); | + | |
- | alarmMode = EEPROM.read(addrAlarmMode); | + | |
- | displayedAlarmMinute = EEPROM.read(addrDisplayedAlarmMinute); | + | |
- | displayedAlarmHour = EEPROM.read(addrDisplayedAlarmHour); | + | |
- | alarmAdvancetime = EEPROM.read(addrAlarmAdvancetime); | + | |
- | alarmFile = EEPROM.read(addrAlarmFile); | + | |
- | alarmEffect = EEPROM.read(addrAlarmEffect); | + | |
- | alarmGain = EEPROM.read(addrAlarmGain); | + | |
- | snoozleFile = EEPROM.read(addrSnoozleFile); | + | |
- | snoozleGain = EEPROM.read(addrSnoozleGain); | + | |
- | thresholdPitch = EEPROM.read(addrThresholdPitch); | + | |
- | thresholdRoll = EEPROM.read(addrThresholdRoll); | + | |
- | thresholdAccelZ = EEPROM.read(addrThresholdAccelZ); | + | |
- | + | ||
- | Serial.println(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | + | ||
- | // Es wird einmalig die Funktion zur Berechnung des Sonnenauf- und untergangs aufgerufen. | + | |
- | sunrise(); | + | |
- | Serial.print(" | + | |
- | Serial.print(AufgangStunden); | + | |
- | Serial.print(":" | + | |
- | if (AufgangMinuten< | + | |
- | Serial.print(AufgangMinuten); | + | |
- | Serial.println(); | + | |
- | Serial.print(" | + | |
- | Serial.print(UntergangStunden); | + | |
- | Serial.print(":" | + | |
- | if (UntergangMinuten< | + | |
- | Serial.print(UntergangMinuten); | + | |
- | Serial.println(); | + | |
- | + | ||
- | } | + | |
- | + | ||
- | + | ||
- | void loop() { | + | |
- | // Aktuelle Zeit abfragen | + | |
- | unsigned long currentMillis = millis(); | + | |
- | + | ||
- | + | ||
- | // Stelle die Real Time Clock (RTC) auf die aktuelle Zeit | + | |
- | if ((unsigned long)(currentMillis - previousMillisSetRTC) | + | |
- | extDCF = digitalRead(DCFEXT_CONNECTED); | + | |
- | if (extDCF == 0) { | + | |
- | DCFtime = DCFEXT.getTime(); | + | |
- | // Serial.println(" | + | |
- | } | + | |
- | else { | + | |
- | DCFtime = DCFINT.getTime(); | + | |
- | } | + | |
- | + | ||
- | // Wenn die serielle Schnittstelle verfügbar ist, setze die RTC auf diese Zeit | + | |
- | if (Serial.available()) { | + | |
- | t = processSyncMessage(); | + | |
- | if (t != 0) { | + | |
- | Teensy3Clock.set(t); | + | |
- | setTime(t); | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // Wenn ein Zeitsignal vom DCF77-Modul verfügbar ist, setze die RTC auf diese Zeit | + | |
- | if (DCFtime > DefaultTime) { | + | |
- | t = DCFtime; | + | |
- | Serial.println(" | + | |
- | Teensy3Clock.set(t); | + | |
- | setTime(t); | + | |
- | DCFtimesignalFound = true; // die Variable wird wahr | + | |
- | receivedDCFsignals = receivedDCFsignals + 1; | + | |
- | timestampDCFsignal = now(); | + | |
- | } | + | |
- | + | ||
- | // Berechne die Zeit die seit dem Empfang des letzten vollständig empfangenen Zeitsignals vergangen ist | + | |
- | if (DCFtimesignalFound == false) { | + | |
- | noDCFsignal = currentMillis / 1000; // in Sekunden | + | |
- | } | + | |
- | else { | + | |
- | timesinceDCFsignal = now() - timestampDCFsignal; | + | |
- | } | + | |
- | + | ||
- | // Berechnet die Quote erfolgreich empfangener DCF77-Signale seit dem letzten Systemstart | + | |
- | DCFsuccessRate = (float(receivedDCFsignals) / ((millis() / 60000))) * 100; | + | |
- | + | ||
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | previousMillisSetRTC = currentMillis; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Ziffernblatt | + | |
- | if ((unsigned long)(currentMillis - previousMillisClockFace) >= intervalClockFace) { | + | |
- | + | ||
- | // Berechnung der Variable daylight | + | |
- | if (daylight == false && hour() >= AufgangStunden) { | + | |
- | if (hour() > AufgangStunden) { | + | |
- | daylight = true; | + | |
- | } | + | |
- | if (minute() >= AufgangMinuten) { | + | |
- | daylight = true; | + | |
- | } | + | |
- | } | + | |
- | if (daylight == true && hour() >= UntergangStunden) { | + | |
- | if (hour() > UntergangStunden) { | + | |
- | daylight = false; | + | |
- | } | + | |
- | if (minute() >= UntergangMinuten) { | + | |
- | daylight = false; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // Berechnung der Helligkeit des Ziffernblatts | + | |
- | intensity = sqrt(filteredFull); | + | |
- | + | ||
- | if (intensity < 1) { | + | |
- | intensity = 1; | + | |
- | } | + | |
- | if (intensity > 255) { | + | |
- | intensity = 255; | + | |
- | } | + | |
- | + | ||
- | // Debugging | + | |
- | // Serial.print(" | + | |
- | + | ||
- | // Anmerkung: | + | |
- | // Wenn bei 7 NeoPixelen eine Farbe mit einem Wert von 32 (1/8 der max. Intensität) angesteuert wird, ist das für einen dunklen Raum zu hell. | + | |
- | // Je mehr NeoPixel von einem Ziffernblatteffekt verwendet werden, desto besser muss die Anzahl der aktiven NeoPixel berücksichtigt werden. | + | |
- | + | ||
- | if (clockfaceOn == true) { // Das Ziffernblatt wird angezeit, wenn die Variable wahr ist | + | |
- | strip.clear(); | + | |
- | /* | + | |
- | // Stundenskaka | + | |
- | for (int i = 0; i < 60; i = i + 5) { | + | |
- | strip.setPixelColor(i, | + | |
- | } | + | |
- | */ | + | |
- | // Stundenanzeige | + | |
- | if (hour() < 12) { | + | |
- | j = hour() * 5; | + | |
- | if (daylight == true) { | + | |
- | r = 0; | + | |
- | g = 0; | + | |
- | b = intensity; | + | |
- | w = intensity; | + | |
- | } | + | |
- | else { | + | |
- | r = intensity / 2; | + | |
- | g = intensity / 2; | + | |
- | b = 0; | + | |
- | w = intensity; | + | |
- | } | + | |
- | strip.setPixelColor(j, | + | |
- | } | + | |
- | else if (hour() >= 12) { | + | |
- | j = (hour() - 12) *5; | + | |
- | if (daylight == true) { | + | |
- | r = 0; | + | |
- | g = 0; | + | |
- | b = intensity; | + | |
- | w = intensity; | + | |
- | } | + | |
- | else { | + | |
- | r = intensity / 2; | + | |
- | g = intensity / 2; | + | |
- | b = 0; | + | |
- | w = intensity; | + | |
- | } | + | |
- | strip.setPixelColor(j, | + | |
- | } | + | |
- | // Minutenanzeige | + | |
- | k = minute(); | + | |
- | if (daylight == true) { | + | |
- | r = 0; | + | |
- | g = 0; | + | |
- | b = intensity; | + | |
- | w = intensity; | + | |
- | } | + | |
- | else { | + | |
- | r = intensity / 2; | + | |
- | g = intensity / 2; | + | |
- | b = 0; | + | |
- | w = intensity; | + | |
- | } | + | |
- | strip.setPixelColor(k, | + | |
- | + | ||
- | // Sekundenanzeige | + | |
- | l = second(); | + | |
- | if (daylight == true) { | + | |
- | r = 0; | + | |
- | g = 0; | + | |
- | b = intensity; | + | |
- | w = intensity; | + | |
- | } | + | |
- | else { | + | |
- | r = intensity / 2; | + | |
- | g = intensity / 2; | + | |
- | b = 0; | + | |
- | w = intensity; | + | |
- | } | + | |
- | strip.setPixelColor(l, | + | |
- | + | ||
- | strip.show(); | + | |
- | } | + | |
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | previousMillisClockFace = currentMillis; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Snoozle-Funktion | + | |
- | if ((unsigned long)(currentMillis - previousMillisSnoozleTime) >= intervalSnoozleTime) { | + | |
- | + | ||
- | /* | + | |
- | // Ausgabe an serielle Schnittstelle für Debugging | + | |
- | Serial.print(" | + | |
- | Serial.print(now()); | + | |
- | Serial.print("; | + | |
- | Serial.print(snoozleTime); | + | |
- | Serial.print("; | + | |
- | Serial.print(snoozleOn); | + | |
- | Serial.print("; | + | |
- | Serial.println(snoozleFile); | + | |
- | */ | + | |
- | + | ||
- | // Wenn die aktuelle Zeit kleiner ist als die eingestellte Snoozle-Zeit, | + | |
- | if (snoozleOn == true) { | + | |
- | + | ||
- | if (now() < snoozleTime) { | + | |
- | audioamp.enableChannel(true, | + | |
- | snoozleGain = EEPROM.read(addrSnoozleGain); | + | |
- | mixer1.gain(0, | + | |
- | mixer2.gain(0, | + | |
- | } | + | |
- | + | ||
- | if (playSdWav1.isPlaying() == false) { | + | |
- | Serial.println(" | + | |
- | if (snoozleFile == 1) { | + | |
- | playSdWav1.play(" | + | |
- | } | + | |
- | else if (snoozleFile == 2) { | + | |
- | playSdWav1.play(" | + | |
- | } | + | |
- | else if (snoozleFile == 3) { | + | |
- | playSdWav1.play(" | + | |
- | } | + | |
- | else if (snoozleFile == 4) { | + | |
- | playSdWav1.play(" | + | |
- | } | + | |
- | if (snoozleFile == 5) { | + | |
- | playSdWav1.play(" | + | |
- | } | + | |
- | else if (snoozleFile == 6) { | + | |
- | playSdWav1.play(" | + | |
- | } | + | |
- | else if (snoozleFile == 7) { | + | |
- | playSdWav1.play(" | + | |
- | } | + | |
- | else if (snoozleFile == 8) { | + | |
- | playSdWav1.play(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | if (menuPage != 8) { // Das Menü " | + | |
- | menuPage = 8; | + | |
- | TFTrefresh = true; | + | |
- | } | + | |
- | } | + | |
- | if (now() >= snoozleTime && snoozleOn == true) { | + | |
- | | + | |
- | + | ||
- | // Reduziere langsam die Lautstärke | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | + | ||
- | // Wenn die Lautstärke null ist, wird die Wiedergabe gestoppt und in das Hauptmenü gewechselt | + | |
- | if (snoozleGain <= 0) { | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | if (menuPage == 8) { // Wenn Menü " | + | |
- | | + | |
- | | + | |
- | | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | previousMillisSnoozleTime = currentMillis; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Alarm-Funktionen (alarm und Snooze) | + | |
- | if ((unsigned long)(currentMillis - previousMillisAlarmClock) >= intervalAlarmClock) { | + | |
- | + | ||
- | // Die Schleife wird durchlaufen, | + | |
- | if ((alarmMode != 0 && hour() == alarmHour && minute() == alarmMinute && second() == 0) || alarmOn == true) { | + | |
- | + | ||
- | // Einige Funktionen müssen zu Beginn einer Alarmphase einmalig ausgeführt werden. | + | |
- | if (alarmOn == false) { | + | |
- | eventAccelZ = 0; // Die Eventzähler müssen zu beginn einer Alarmphase einmalig zurückgesetzt werden | + | |
- | eventRoll = 0; | + | |
- | eventPitch = 0; | + | |
- | eventTotal = 0; | + | |
- | alarmGain = EEPROM.read(addrAlarmGain); | + | |
- | alarmSetGain = 0; // Wir einmalig auf Null gesetzt, damit die Lautsärke langsam erhöht werden kann | + | |
- | timestampAlarmStart = now(); | + | |
- | logAlarmActive (); // Die Aktiviertung der Weckfunktion wird auf die SD-Karte geloggt | + | |
- | } | + | |
- | + | ||
- | // Wecken mit Licht | + | |
- | if (alarmMode == 1) { | + | |
- | Serial.println(" | + | |
- | if (eventTotal >= 2) { // Weil dieser Alarm sehr schonend ist, kann er früh gestartet werden | + | |
- | Serial.println(" | + | |
- | // | + | |
- | if (clockfaceOn == true) { // Die Variablen für die Farbwerte der Neopixel werden einmalig auf Null gesetzt | + | |
- | r = 0; // Setzt einmalig die Variable r auf Null. | + | |
- | g = 0; // Setzt einmalig die Variable g auf Null. | + | |
- | b = 0; // Setzt einmalig die Variable b auf Null. | + | |
- | w = 0; // Setzt einmalig die Variable w auf Null. | + | |
- | strip.clear(); | + | |
- | loopcounter = 0; // Setzt einmalig den Schleifenzähler auf Null. | + | |
- | clockfaceOn = false; | + | |
- | } | + | |
- | + | ||
- | // Ansteuerung der NeoPixel | + | |
- | + | ||
- | if (alarmEffect == 1) { // Effekt " | + | |
- | i = random(0, numPixels); | + | |
- | if (loopcounter < 255) { | + | |
- | r = r + 1; | + | |
- | } | + | |
- | if (loopcounter > 255 && loopcounter < 356) { | + | |
- | g = g + 1; | + | |
- | } | + | |
- | if (loopcounter > 356 && loopcounter < 612) { | + | |
- | w = w + 1; | + | |
- | } | + | |
- | if (loopcounter > 612 && loopcounter < 868) { | + | |
- | b = b + 1; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | if (alarmEffect == 2) { // Effekt "Blaue Stunde" | + | |
- | i = random(0, numPixels); | + | |
- | if (loopcounter < 127) { | + | |
- | b = b + 1; | + | |
- | } | + | |
- | if (loopcounter > 127 && loopcounter < 255) { | + | |
- | r = r + 1; | + | |
- | } | + | |
- | if (loopcounter > 255 && loopcounter < 382) { | + | |
- | b = b - 1; | + | |
- | } | + | |
- | if (loopcounter > 382 && loopcounter < 452) { | + | |
- | g = g + 1; | + | |
- | } | + | |
- | if (loopcounter > 452 && loopcounter < 707) { | + | |
- | w = w + 1; | + | |
- | } | + | |
- | if (loopcounter > 707 && loopcounter < 962) { | + | |
- | b = b + 1; | + | |
- | } | + | |
- | } | + | |
- | loopcounter = loopcounter + 1; | + | |
- | + | ||
- | // Notabschaltung: | + | |
- | if (loopcounter > 3600) { | + | |
- | if (r > 0) { | + | |
- | r = r - 1; | + | |
- | } | + | |
- | if (g > 0) { | + | |
- | g = g - 1; | + | |
- | } | + | |
- | if (b > 0) { | + | |
- | b = b - 1; | + | |
- | } | + | |
- | if (w > 0) { | + | |
- | w = w - 1; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | strip.setPixelColor(i, | + | |
- | + | ||
- | strip.show(); | + | |
- | + | ||
- | // Debugging | + | |
- | Serial.print(loopcounter); | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | } | + | |
- | + | ||
- | // Akustischer Notalarm: Wenn bis zum Erreichen der eingestellten Weckzeit der visuelle Alarm nicht beendet wurde, wird ein akustischer Alarm ausgelöst. | + | |
- | if (now() >= timestampAlarmStart + (alarmAdvancetime *60)) { | + | |
- | audioamp.enableChannel(true, | + | |
- | //alarmGain = EEPROM.read(addrAlarmGain); | + | |
- | if (alarmSetGain < alarmGain) { | + | |
- | alarmSetGain = alarmSetGain + 1; | + | |
- | Serial.print(" | + | |
- | } | + | |
- | mixer1.gain(1, | + | |
- | mixer2.gain(1, | + | |
- | + | ||
- | + | ||
- | // | + | |
- | Serial.println(" | + | |
- | if (playSdWav2.isPlaying() == false) { | + | |
- | Serial.println(" | + | |
- | if (alarmFile == 1) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 2) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 3) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 4) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // Wecken mit Musik | + | |
- | else if (alarmMode == 2) { | + | |
- | Serial.println(" | + | |
- | if (eventTotal >= 2) { | + | |
- | audioamp.enableChannel(true, | + | |
- | //alarmGain = EEPROM.read(addrAlarmGain); | + | |
- | if (alarmSetGain < alarmGain) { | + | |
- | alarmSetGain = alarmSetGain + 1; | + | |
- | Serial.print(" | + | |
- | } | + | |
- | mixer1.gain(1, | + | |
- | mixer2.gain(1, | + | |
- | + | ||
- | + | ||
- | // | + | |
- | Serial.println(" | + | |
- | if (playSdWav2.isPlaying() == false) { | + | |
- | Serial.println(" | + | |
- | if (alarmFile == 1) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 2) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 3) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 4) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // Wecken mit Licht und Musik | + | |
- | else if (alarmMode == 3) { | + | |
- | Serial.println(" | + | |
- | if (eventTotal >= 2) { | + | |
- | audioamp.enableChannel(true, | + | |
- | //alarmGain = EEPROM.read(addrAlarmGain); | + | |
- | if (alarmSetGain < alarmGain) { | + | |
- | alarmSetGain = alarmSetGain + 1; | + | |
- | Serial.print(" | + | |
- | } | + | |
- | mixer1.gain(1, | + | |
- | mixer2.gain(1, | + | |
- | // | + | |
- | Serial.println(" | + | |
- | + | ||
- | if (playSdWav2.isPlaying() == false) { | + | |
- | Serial.println(" | + | |
- | if (alarmFile == 1) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 2) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 3) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 4) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // Lichteffekte | + | |
- | if (clockfaceOn == true) { // Die Variablen für die Farbwerte der Neopixel werden einmalig auf Null gesetzt | + | |
- | r = 0; // Setzt einmalig die Variable r auf Null. | + | |
- | g = 0; // Setzt einmalig die Variable g auf Null. | + | |
- | b = 0; // Setzt einmalig die Variable b auf Null. | + | |
- | w = 0; // Setzt einmalig die Variable w auf Null. | + | |
- | strip.clear(); | + | |
- | loopcounter = 0; // Setzt einmalig den Schleifenzähler auf Null. | + | |
- | clockfaceOn = false; | + | |
- | } | + | |
- | + | ||
- | // Ansteuerung der NeoPixel | + | |
- | + | ||
- | if (alarmEffect == 1) { // Effekt " | + | |
- | i = random(0, numPixels); | + | |
- | if (loopcounter < 255) { | + | |
- | r = r + 1; | + | |
- | } | + | |
- | if (loopcounter > 255 && loopcounter < 356) { | + | |
- | g = g + 1; | + | |
- | } | + | |
- | if (loopcounter > 356 && loopcounter < 612) { | + | |
- | w = w + 1; | + | |
- | } | + | |
- | if (loopcounter > 612 && loopcounter < 868) { | + | |
- | b = b + 1; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | if (alarmEffect == 2) { // Effekt "Blaue Stunde" | + | |
- | i = random(0, numPixels); | + | |
- | if (loopcounter < 127) { | + | |
- | b = b + 1; | + | |
- | } | + | |
- | if (loopcounter > 127 && loopcounter < 255) { | + | |
- | r = r + 1; | + | |
- | } | + | |
- | if (loopcounter > 255 && loopcounter < 382) { | + | |
- | b = b - 1; | + | |
- | } | + | |
- | if (loopcounter > 382 && loopcounter < 452) { | + | |
- | g = g + 1; | + | |
- | } | + | |
- | if (loopcounter > 452 && loopcounter < 707) { | + | |
- | w = w + 1; | + | |
- | } | + | |
- | if (loopcounter > 707 && loopcounter < 962) { | + | |
- | b = b + 1; | + | |
- | } | + | |
- | } | + | |
- | loopcounter = loopcounter + 1; | + | |
- | + | ||
- | // Notabschaltung: | + | |
- | if (loopcounter > 3600) { | + | |
- | if (r > 0) { | + | |
- | r = r - 1; | + | |
- | } | + | |
- | if (g > 0) { | + | |
- | g = g - 1; | + | |
- | } | + | |
- | if (b > 0) { | + | |
- | b = b - 1; | + | |
- | } | + | |
- | if (w > 0) { | + | |
- | w = w - 1; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | strip.setPixelColor(i, | + | |
- | + | ||
- | strip.show(); | + | |
- | + | ||
- | // Debugging | + | |
- | Serial.print(loopcounter); | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Anzeige des Menüs " | + | |
- | TFTbrightness = 255; | + | |
- | analogWrite(TFTbacklightPin, | + | |
- | TFTbacklightOn = true; // Das Backlight bleibt eingeschaltet, | + | |
- | alarmOn = true; | + | |
- | + | ||
- | if (menuPage != 7) { // Das Menü "Alarm aus/ | + | |
- | menuPage = 7; | + | |
- | TFTrefresh = true; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Schlummeralarm | + | |
- | if (snoozeOn == true && now() >= snoozeTime) { | + | |
- | Serial.println(" | + | |
- | if (playSdWav2.isPlaying() == false) { | + | |
- | audioamp.enableChannel(true, | + | |
- | alarmGain = EEPROM.read(addrAlarmGain); | + | |
- | mixer1.gain(1, | + | |
- | mixer2.gain(1, | + | |
- | logSnoozleAlarm (); | + | |
- | Serial.println(" | + | |
- | if (alarmFile == 1) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 2) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 3) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 4) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | } | + | |
- | // Anzeige des Menüs " | + | |
- | TFTbrightness = 255; | + | |
- | analogWrite(TFTbacklightPin, | + | |
- | TFTbacklightOn = true; // Das Backlight bleibt eingeschaltet, | + | |
- | snoozeOn = true; | + | |
- | + | ||
- | if (menuPage != 7) { // Das Menü "Alarm aus/ | + | |
- | menuPage = 7; | + | |
- | TFTrefresh = true; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | previousMillisAlarmClock = currentMillis; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Abfrage verschiedener Sensoren | + | |
- | if ((unsigned long)(currentMillis - previousMillisSensorData) >= intervalSensorData) { | + | |
- | + | ||
- | if (IMUconnected == true) { | + | |
- | // Auslesen des Beschleunigungs- / Lagesensors und Magnetometers LSM303 | + | |
- | sensors_event_t event; | + | |
- | accel.getEvent(& | + | |
- | sensors_vec_t | + | |
- | ahrs.getOrientation(& | + | |
- | + | ||
- | accelX = event.acceleration.x; | + | |
- | accelY = event.acceleration.y; | + | |
- | accelZ = event.acceleration.z; | + | |
- | + | ||
- | pitch = orientation.roll; | + | |
- | roll = orientation.pitch; | + | |
- | heading = orientation.heading; | + | |
- | } | + | |
- | + | ||
- | // Die Werte für accelZ, pitch und roll werden mit einem Kalman-Filter geglättet | + | |
- | filteredAccelZ = accelZFilter.getFilteredValue(accelZ); | + | |
- | filteredRoll = rollFilter.getFilteredValue(roll); | + | |
- | filteredPitch = pitchFilter.getFilteredValue(pitch); | + | |
- | + | ||
- | // Relativ schnelle Änderungen der Sensordaten lösen Ereignisse aus | + | |
- | // Die Grenzwerte werden durch 10 geteilt, damit sie im EEPROM als byte gespeichert werden können | + | |
- | if (filteredAccelZ - accelZ > (thresholdAccelZ /10) || filteredAccelZ - accelZ < - (thresholdAccelZ / 10)) { | + | |
- | eventAccelZ = eventAccelZ + 1; | + | |
- | logSDcard(); | + | |
- | } | + | |
- | if (filteredRoll - roll > (thresholdRoll / 10) || filteredRoll - roll < - (thresholdRoll / 10)) { | + | |
- | eventRoll = eventRoll + 1; | + | |
- | } | + | |
- | if (filteredPitch - pitch > (thresholdPitch / 10) || filteredPitch - pitch < - (thresholdPitch / 10)) { | + | |
- | eventPitch = eventPitch + 1; | + | |
- | } | + | |
- | + | ||
- | // Berechne die Summe aller Ereignisse | + | |
- | eventTotal = eventAccelZ + eventRoll + eventPitch; | + | |
- | + | ||
- | // Wenn das Menü " | + | |
- | if (menuPage == 33) { | + | |
- | if (eventPitch > preveventPitch) { | + | |
- | strip.setPixelColor(0, | + | |
- | strip.show(); | + | |
- | preveventPitch = eventPitch; | + | |
- | } | + | |
- | + | ||
- | if (eventRoll > preveventRoll) { | + | |
- | strip.setPixelColor(0, | + | |
- | strip.show(); | + | |
- | preveventRoll = eventRoll; | + | |
- | } | + | |
- | + | ||
- | if (eventAccelZ > preveventAccelZ) { | + | |
- | strip.setPixelColor(0, | + | |
- | strip.show(); | + | |
- | preveventAccelZ = eventAccelZ; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | /* | + | |
- | // Debugging | + | |
- | // Display the results (acceleration is measured in m/s^2) | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | + | ||
- | // ' | + | |
- | Serial.print(F("; | + | |
- | Serial.print(roll); | + | |
- | Serial.print(F(" | + | |
- | Serial.print(pitch); | + | |
- | Serial.print(F(" | + | |
- | Serial.print(heading); | + | |
- | Serial.print(F("" | + | |
- | + | ||
- | Serial.print("; | + | |
- | Serial.print(filteredAccelZ); | + | |
- | Serial.print("; | + | |
- | Serial.print(filteredRoll); | + | |
- | Serial.print("; | + | |
- | Serial.print(filteredPitch); | + | |
- | + | ||
- | Serial.print("; | + | |
- | Serial.print(eventAccelZ); | + | |
- | Serial.print("; | + | |
- | Serial.print(eventRoll); | + | |
- | Serial.print("; | + | |
- | Serial.print(eventPitch); | + | |
- | Serial.print("; | + | |
- | Serial.println(eventTotal); | + | |
- | */ | + | |
- | //Auslesen des Helligkeitssensors TSL2591 | + | |
- | lum = tsl.getFullLuminosity(); | + | |
- | ir = lum >> 16; | + | |
- | full = lum & 0xFFFF; | + | |
- | lux = tsl.calculateLux(full, | + | |
- | + | ||
- | // Die Werte für full, visible, ir und lux werden geglättet, damit sie nicht auf sehr temporäre Helligkeitsschwankungen reagiert | + | |
- | filteredFull = fullFilter.getFilteredValue(full); | + | |
- | filteredVisible = visibleFilter.getFilteredValue(full - ir); | + | |
- | filteredIr = visibleFilter.getFilteredValue(ir); | + | |
- | filteredLux = luxFilter.getFilteredValue(lux); | + | |
- | + | ||
- | /* | + | |
- | // Debugging | + | |
- | Serial.print(" | + | |
- | Serial.print(", | + | |
- | Serial.print(", | + | |
- | Serial.print(", | + | |
- | Serial.print(", | + | |
- | Serial.print(", | + | |
- | Serial.print(", | + | |
- | Serial.print(", | + | |
- | Serial.print(", | + | |
- | */ | + | |
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | previousMillisSensorData = currentMillis; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Abfrage des Temperatur- und Luftfeuchtigkeitssensors DHT22 | + | |
- | if ((unsigned long)(currentMillis - previousMillisDHTSensor) >= intervalDHTSensor) { | + | |
- | + | ||
- | // Auslesen des Temperatursensors DHT22 | + | |
- | // Reading temperature or humidity takes about 250 milliseconds! | + | |
- | // Sensor readings may also be up to 2 seconds ' | + | |
- | h = dht.readHumidity(); | + | |
- | // Read temperature as Celsius (the default) | + | |
- | c = dht.readTemperature(); | + | |
- | // Read temperature as Fahrenheit (isFahrenheit = true) | + | |
- | f = dht.readTemperature(true); | + | |
- | + | ||
- | // Check if any reads failed and exit early (to try again). | + | |
- | if (isnan(h) || isnan(c) || isnan(f)) { | + | |
- | Serial.println(" | + | |
- | return; | + | |
- | } | + | |
- | + | ||
- | // Compute heat index in Fahrenheit (the default) | + | |
- | float hif = dht.computeHeatIndex(f, | + | |
- | // Compute heat index in Celsius (isFahreheit = false) | + | |
- | float hic = dht.computeHeatIndex(c, | + | |
- | + | ||
- | // Taupunkt berechnen | + | |
- | float a = 17.271; | + | |
- | float b = 237.7; | + | |
- | float taupunktTmp = (a * c) / (b + c) + log(h/100); | + | |
- | taupunkt = (b * taupunktTmp) / (a - taupunktTmp); | + | |
- | + | ||
- | Serial.print(" | + | |
- | Serial.print(h); | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(c); | + | |
- | Serial.print(" | + | |
- | Serial.print(f); | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(hic); | + | |
- | Serial.print(" | + | |
- | Serial.print(hif); | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(taupunkt); | + | |
- | Serial.println(" | + | |
- | + | ||
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | previousMillisDHTSensor = currentMillis; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // TFT- umd Touchscreen | + | |
- | if ((unsigned long)(currentMillis - previousMillisTouchScreen) >= intervalTouchScreen) { | + | |
- | + | ||
- | // Auslesen des kapazitiven Touchsensors | + | |
- | if (ctp.touched()) { | + | |
- | // Retrieve a point | + | |
- | TS_Point p = ctp.getPoint(); | + | |
- | // Damit der Wert 0, 0 des Touchsensors mit dem Pixel 0, 0 des TFT-Screens übereinstimmt, | + | |
- | tx = map(p.y, 0, 320, 320, 0); | + | |
- | ty = p.x; | + | |
- | + | ||
- | // Variablen für die Steuerung des Backlights | + | |
- | touch = true; // Wird wahr, so lange der Touchsensor berührt wird (d.h. wird am Ende der TouchScreen-Schleife false). | + | |
- | prevtouch = touch; | + | |
- | TFTbacklightTime = currentMillis; | + | |
- | + | ||
- | // Variablen für die Steurung des Menüs | + | |
- | if (TFTbacklightOn == true) { | + | |
- | touch2 = true; | + | |
- | prevtouch2 = touch2; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // Das Backlight wird eingeschaltet, | + | |
- | if (touch == false && prevtouch == true) { | + | |
- | TFTbrightness = 255; | + | |
- | analogWrite(TFTbacklightPin, | + | |
- | TFTbacklightOn = true; | + | |
- | TFTrefresh = true; // Wenn das Backlight eingeschaltet wird, muss einmal das alte Menü aufgebaut werden | + | |
- | prevtouch = false; | + | |
- | } | + | |
- | + | ||
- | // Wenn das Backlight an ist, soll es nach einer bestimmten Zeit wieder ausgeschaltet werden. | + | |
- | // Allerdings nur dann, wenn a) keine Alarmfunktion, | + | |
- | if (alarmOn == false && snoozeOn == false && snoozleOn == false) { | + | |
- | if (TFTbacklightOn == true && (millis() > TFTbacklightTime + TFTbacklightDelay)) { | + | |
- | TFTbrightness = TFTbrightness - 1; | + | |
- | if (TFTbrightness == 0) { | + | |
- | TFTbacklightOn = false; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | } | + | |
- | analogWrite(TFTbacklightPin, | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // Wenn das Backlight an ist, kann das Menü mit dem Touchsensor bedient werden | + | |
- | // Es folgen für jedes einzelne Menü die Definitionen der jeweils sensiblen Bereiche einschließlich der Befehle, die jeweils ausgelöst werden sollen. | + | |
- | if (menuPage == 0 && touch2 == false && prevtouch2 == true) { // Wenn der Touchscreen losgelassen wurd und Menüseite 0 ausgewählt ist ... | + | |
- | if ((tx >= 0) && (tx <= 120) && (ty >= 0) && (ty <= 59)) { // ... und der TouchScreen in dem angegebenen Bereich berührt wird ... | + | |
- | menuPage = 1; // ... dann rufe Menüseite 1 auf. | + | |
- | } | + | |
- | else if ((tx >= 0) && (tx <= 120) && (ty >= 60) && (ty <= 120)) { | + | |
- | menuPage = 2; | + | |
- | } | + | |
- | else if ((tx >= 0) && (tx <= 120) && (ty >= 121) && (ty <= 180)) { | + | |
- | menuPage = 3; | + | |
- | } | + | |
- | else if ((tx >= 0) && (tx <= 120) && (ty >= 181) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | else if ((tx >= 121) && (tx <= 320) && (ty >= 1) && (ty <= 240)) { | + | |
- | menuPage = 5; | + | |
- | } | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; // Aktualisiere den Inhalt des TFT-Screens | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Menü Snoozle | + | |
- | if (menuPage == 1 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Hauptmenü | + | |
- | if ((tx >= 0) && (tx <= 49) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 0; | + | |
- | } | + | |
- | // Snoozle 15 Minuten | + | |
- | else if ((tx >= 50) && (tx <= 268) && (ty >= 0) && (ty <= 59)) { | + | |
- | snoozleOn = true; | + | |
- | snoozleTime = now() + 900; | + | |
- | } | + | |
- | // Snoozle 30 Minuten | + | |
- | else if ((tx >= 50) && (tx <= 268) && (ty >= 60) && (ty <= 119)) { | + | |
- | snoozleOn = true; | + | |
- | snoozleTime = now() + 1800; | + | |
- | } | + | |
- | // Snoozle 45 Minuten | + | |
- | else if ((tx >= 50) && (tx <= 268) && (ty >= 120) && (ty <= 179)) { | + | |
- | snoozleOn = true; | + | |
- | snoozleTime = now() + 2700; | + | |
- | } | + | |
- | // Snoozle 60 Minuten | + | |
- | else if ((tx >= 50) && (tx <= 268) && (ty >= 180) && (ty <= 239)) { | + | |
- | snoozleOn = true; | + | |
- | snoozleTime = now() + 3600; | + | |
- | } | + | |
- | // Zum Unteruntermenü Snoozle-Musik auswählen | + | |
- | else if ((tx >= 269) && (tx <= 319) && (ty >= 0) && (ty <= 239)) { | + | |
- | menuPage = 11; | + | |
- | } | + | |
- | // Debugging | + | |
- | Serial.print(" | + | |
- | Serial.print(", | + | |
- | + | ||
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü Auswahl Snoozlemusik | + | |
- | if (menuPage == 11 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Snoozle | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 1; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | } | + | |
- | // Auswahl Musik 1 | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 0) && (ty <= 59)) { | + | |
- | snoozleFile = 1; | + | |
- | EEPROM.update(addrSnoozleFile, | + | |
- | } | + | |
- | // Auswahl Musik 2 | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 60) && (ty <= 120)) { | + | |
- | snoozleFile = 2; | + | |
- | EEPROM.update(addrSnoozleFile, | + | |
- | } | + | |
- | // Auswahl Musik 3 | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 121) && (ty <= 180)) { | + | |
- | snoozleFile = 3; | + | |
- | EEPROM.update(addrSnoozleFile, | + | |
- | } | + | |
- | // Auswahl Musik 4 | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 181) && (ty <= 240)) { | + | |
- | snoozleFile = 4; | + | |
- | EEPROM.update(addrSnoozleFile, | + | |
- | } | + | |
- | // Auswahl Musik 5 | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 0) && (ty <= 59)) { | + | |
- | snoozleFile = 5; | + | |
- | EEPROM.update(addrSnoozleFile, | + | |
- | } | + | |
- | // Auswahl Musik 6 | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 60) && (ty <= 120)) { | + | |
- | snoozleFile = 6; | + | |
- | EEPROM.update(addrSnoozleFile, | + | |
- | } | + | |
- | // Auswahl Musik 7 | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 121) && (ty <= 180)) { | + | |
- | snoozleFile = 7; | + | |
- | EEPROM.update(addrSnoozleFile, | + | |
- | } | + | |
- | // Auswahl Musik 8 | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 181) && (ty <= 240)) { | + | |
- | snoozleFile = 8; | + | |
- | EEPROM.update(addrSnoozleFile, | + | |
- | } | + | |
- | + | ||
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Menü Ziffernblatt | + | |
- | if (menuPage == 2 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Hauptmenü | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 0; | + | |
- | } | + | |
- | else if ((tx >= 41) && (tx <= 320) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 0; | + | |
- | } | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Menü Einstellungen | + | |
- | if (menuPage == 3 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Hauptmenü | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 0; | + | |
- | } | + | |
- | // Zum Untermenü Weckzeitvorlauf | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 0) && (ty <= 59)) { | + | |
- | menuPage = 31; | + | |
- | } | + | |
- | // Zum Untermenü Auswahl des visuellen Weckeffekts | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 60) && (ty <= 120)) { | + | |
- | menuPage = 32; | + | |
- | } | + | |
- | // Zum Untermenü " | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 121) && (ty <= 180)) { | + | |
- | menuPage = 33; | + | |
- | preveventAccelZ = eventAccelZ; | + | |
- | preveventRoll = eventRoll; | + | |
- | preveventPitch = eventPitch; | + | |
- | } | + | |
- | + | ||
- | /*/ Zum Untermenü " | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 181) && (ty <= 240)) { | + | |
- | menuPage = 34; | + | |
- | } | + | |
- | // Zum Untermenü " | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 0) && (ty <= 59)) { | + | |
- | menuPage = 35; | + | |
- | } | + | |
- | // Zum Untermenü " | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 60) && (ty <= 120)) { | + | |
- | menuPage = 36; | + | |
- | } | + | |
- | // Zum Untermenü " | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 121) && (ty <= 180)) { | + | |
- | menuPage = 37; | + | |
- | } | + | |
- | // Zum Untermenü " | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 181) && (ty <= 240)) { | + | |
- | menuPage = 38; | + | |
- | } | + | |
- | */ | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Untermenü Weckzeitvorlauf einstellen | + | |
- | if (menuPage == 31 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Einstellungen | + | |
- | if ((tx >= 0) && (tx <= 49) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 3; | + | |
- | calcAlarmTime (); // Die Funktion berechnet aus der angezeigten Alarmzeit unter Berücksichtigung der Weckvorlaufzeit die Startzeit der schlafphasensensiblen Alarmzeit | + | |
- | + | ||
- | } | + | |
- | else if ((tx >= 50) && (tx <= 320) && (ty >= 0) && (ty <= 79)) { | + | |
- | alarmAdvancetime = 15; | + | |
- | EEPROM.update(addrAlarmAdvancetime, | + | |
- | } | + | |
- | else if ((tx >= 50) && (tx <= 320) && (ty >= 80) && (ty <= 159)) { | + | |
- | alarmAdvancetime = 30; | + | |
- | EEPROM.update(addrAlarmAdvancetime, | + | |
- | } | + | |
- | else if ((tx >= 50) && (tx <= 320) && (ty >= 160) && (ty <= 239)) { | + | |
- | alarmAdvancetime = 45; | + | |
- | EEPROM.update(addrAlarmAdvancetime, | + | |
- | } | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Unteruntermenü Weckmusik auswählen und Wecklautstärke stellen | + | |
- | if (menuPage == 32 && touch2 == false && prevtouch2 == true) { | + | |
- | + | ||
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 49) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 3; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | } | + | |
- | // Auswahl Effekt 1 | + | |
- | else if ((tx >= 51) && (tx <= 194) && (ty >= 0) && (ty <= 59)) { | + | |
- | alarmEffect = 1; | + | |
- | EEPROM.update(addrAlarmEffect, | + | |
- | } | + | |
- | // Auswahl Effekt 2 | + | |
- | else if ((tx >= 51) && (tx <= 194) && (ty >= 60) && (ty <= 120)) { | + | |
- | alarmEffect = 2; | + | |
- | EEPROM.update(addrAlarmEffect, | + | |
- | } | + | |
- | /* | + | |
- | // Auswahl Effekt 3 | + | |
- | else if ((tx >= 51) && (tx <= 194) && (ty >= 121) && (ty <= 180)) { | + | |
- | alarmEffect = 3; | + | |
- | EEPROM.update(addrAlarmEffect, | + | |
- | } | + | |
- | // Auswahl Effekt 4 | + | |
- | else if ((tx >= 51) && (tx <= 194) && (ty >= 181) && (ty <= 240)) { | + | |
- | alarmEffect = 4; | + | |
- | EEPROM.update(addrAlarmEffect, | + | |
- | } | + | |
- | */ | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Untermenü Empfindlichkeit des Matratzensensors einstellen | + | |
- | if (menuPage == 33 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Hauptmenü | + | |
- | if ((tx >= 0) && (tx <= 49) && (ty >= 0) && (ty <= 239)) { | + | |
- | menuPage = 3; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | + | ||
- | // Um das EEPROM zu schonen, werden die eingestellten Grenzwerte erst gespeichert, | + | |
- | EEPROM.update(addrThresholdPitch, | + | |
- | EEPROM.update(addrThresholdRoll, | + | |
- | EEPROM.update(addrThresholdAccelZ, | + | |
- | + | ||
- | // Ausgabe an die serielle Schnittstelle | + | |
- | Serial.print(" | + | |
- | Serial.print("; | + | |
- | Serial.print("; | + | |
- | + | ||
- | } | + | |
- | // Empfindlichkeit Pitchachse auf | + | |
- | else if ((tx >= 50) && (tx <= 139) && (ty >= 0) && (ty <= 119)) { | + | |
- | thresholdPitch = thresholdPitch + 5; | + | |
- | if (thresholdPitch >= 40) { | + | |
- | thresholdPitch = 40; | + | |
- | } | + | |
- | } | + | |
- | // Empfindlichkeit Rollachse auf | + | |
- | else if ((tx >= 140) && (tx <= 229) && (ty >= 0) && (ty <= 119)) { | + | |
- | thresholdRoll = thresholdRoll + 5; | + | |
- | if (thresholdRoll >= 40) { | + | |
- | thresholdRoll = 40; | + | |
- | } | + | |
- | } | + | |
- | // Empfindlichkeit Z-Achse auf | + | |
- | else if ((tx >= 230) && (tx <= 319) && (ty >= 0) && (ty <= 119)) { | + | |
- | thresholdAccelZ = thresholdAccelZ + 1; | + | |
- | if (thresholdAccelZ >= 8) { | + | |
- | thresholdAccelZ = 8; | + | |
- | } | + | |
- | } | + | |
- | // Empfindlichkeit Pitchaches ab | + | |
- | else if ((tx >= 50) && (tx <= 139) && (ty >= 120) && (ty <= 239)) { | + | |
- | thresholdPitch = thresholdPitch - 5; | + | |
- | if (thresholdPitch <= 5) { | + | |
- | thresholdPitch = 5; | + | |
- | } | + | |
- | } | + | |
- | // Empfindlichkeit Rollachse ab | + | |
- | else if ((tx >= 140) && (tx <= 229) && (ty >= 120) && (ty <= 239)) { | + | |
- | thresholdRoll = thresholdRoll - 5; | + | |
- | if (thresholdRoll <= 5) { | + | |
- | thresholdRoll = 5; | + | |
- | } | + | |
- | } | + | |
- | // Empfindlichkeit Z-Achse ab | + | |
- | else if ((tx >= 230) && (tx <= 319) && (ty >= 120) && (ty <= 239)) { | + | |
- | thresholdAccelZ = thresholdAccelZ - 1; | + | |
- | if (thresholdAccelZ <= 2) { | + | |
- | thresholdAccelZ = 2; | + | |
- | } | + | |
- | } | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Menü Informationen | + | |
- | if (menuPage == 4 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Hauptmenü | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 0; | + | |
- | } | + | |
- | // Zum Unteruntermenü DCF Zeitsignal | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 0) && (ty <= 59)) { | + | |
- | menuPage = 41; | + | |
- | } | + | |
- | // Zum Unteruntermenü LSM303 | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 60) && (ty <= 120)) { | + | |
- | menuPage = 42; | + | |
- | } | + | |
- | /* | + | |
- | // Zum Unteruntermenü " | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 121) && (ty <= 180)) { | + | |
- | menuPage = 43; | + | |
- | } | + | |
- | // Zum Unteruntermenü " | + | |
- | else if ((tx >= 51) && (tx <= 184) && (ty >= 181) && (ty <= 240)) { | + | |
- | menuPage = 44; | + | |
- | } | + | |
- | */ | + | |
- | // Zum Unteruntermenü TSL2591-Sensor | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 0) && (ty <= 59)) { | + | |
- | menuPage = 45; | + | |
- | } | + | |
- | // Zum Unteruntermenü DHT22 Sensor | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 60) && (ty <= 120)) { | + | |
- | menuPage = 46; | + | |
- | } | + | |
- | /* | + | |
- | // Zum Unteruntermenü " | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 121) && (ty <= 180)) { | + | |
- | menuPage = 47; | + | |
- | } | + | |
- | */ | + | |
- | // Zum Unteruntermenü " | + | |
- | else if ((tx >= 186) && (tx <= 319) && (ty >= 181) && (ty <= 240)) { | + | |
- | menuPage = 48; | + | |
- | } | + | |
- | + | ||
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü DCF77 Zeitsignal | + | |
- | if (menuPage == 41 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | else if ((tx >= 41) && (tx <= 320) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü TSL303 Sensor | + | |
- | if (menuPage == 42 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | else if ((tx >= 41) && (tx <= 320) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü TSL2591 Sensor | + | |
- | if (menuPage == 45 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | else if ((tx >= 41) && (tx <= 320) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü DHT22 Sensor | + | |
- | if (menuPage == 46 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | else if ((tx >= 41) && (tx <= 320) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü Softwareversion | + | |
- | if (menuPage == 48 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | else if ((tx >= 41) && (tx <= 320) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 4; | + | |
- | } | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Menü Alarmzeit stellen. Vor dem Speichern werden von der eingestellten Zeit 30 Minuten abgezogen. | + | |
- | if (menuPage == 5 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Hauptmenü | + | |
- | if ((tx >= 0) && (tx <= 49) && (ty >= 0) && (ty <= 239)) { | + | |
- | menuPage = 0; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | calcAlarmTime (); // Die Funktion berechnet aus der angezeigten Alarmzeit unter Berücksichtigung der Weckvorlaufzeit die Startzeit der schlafphasensensiblen Alarmzeit | + | |
- | } | + | |
- | // Stunden auf | + | |
- | else if ((tx >= 50) && (tx <= 159) && (ty >= 0) && (ty <= 119)) { | + | |
- | displayedAlarmHour = displayedAlarmHour + 1; | + | |
- | if (displayedAlarmHour >= 24) { | + | |
- | displayedAlarmHour = 0; | + | |
- | } | + | |
- | } | + | |
- | // Minuten auf | + | |
- | else if ((tx >= 160) && (tx <= 268) && (ty >= 0) && (ty <= 119)) { | + | |
- | displayedAlarmMinute = displayedAlarmMinute + 15; | + | |
- | if (displayedAlarmMinute >= 60) { | + | |
- | displayedAlarmMinute = 0; | + | |
- | displayedAlarmHour = displayedAlarmHour + 1; | + | |
- | } | + | |
- | } | + | |
- | // Stunden ab | + | |
- | else if ((tx >= 50) && (tx <= 159) && (ty >= 120) && (ty <= 239)) { | + | |
- | displayedAlarmHour = displayedAlarmHour - 1; | + | |
- | if (displayedAlarmHour < 0) { | + | |
- | displayedAlarmHour = 23; | + | |
- | } | + | |
- | } | + | |
- | // Minuten ab | + | |
- | else if ((tx >= 160) && (tx <= 268) && (ty >= 120) && (ty <= 239)) { | + | |
- | displayedAlarmMinute = displayedAlarmMinute - 15; | + | |
- | if (displayedAlarmMinute < 0) { | + | |
- | displayedAlarmMinute = 45; | + | |
- | displayedAlarmHour = displayedAlarmHour - 1; | + | |
- | } | + | |
- | } | + | |
- | // Zum Menü Weckmodus stellen | + | |
- | else if ((tx >= 269) && (tx <= 319) && (ty >= 0) && (ty <= 239)) { | + | |
- | menuPage = 51; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | } | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Untermenü Weckmodus stellen | + | |
- | if (menuPage == 51 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 49) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 5; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | } | + | |
- | else if ((tx >= 50) && (tx <= 268) && (ty >= 0) && (ty <= 59)) { | + | |
- | alarmMode = 0; | + | |
- | } | + | |
- | else if ((tx >= 50) && (tx <= 268) && (ty >= 60) && (ty <= 119)) { | + | |
- | alarmMode = 1; | + | |
- | } | + | |
- | else if ((tx >= 50) && (tx <= 268) && (ty >= 120) && (ty <= 179)) { | + | |
- | alarmMode = 2; | + | |
- | } | + | |
- | else if ((tx >= 50) && (tx <= 268) && (ty >= 180) && (ty <= 239)) { | + | |
- | alarmMode = 3; | + | |
- | } | + | |
- | // Zum Unteruntermenü Wecklautstärke stellen | + | |
- | else if ((tx >= 269) && (tx <= 319) && (ty >= 0) && (ty <= 239)) { | + | |
- | menuPage = 52; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | // Um die Wecklautstärke einstellen zu können, muss die in den EInstellungen ausgewählte Datei mit der eingestellten Lautstärke abgespielt werden | + | |
- | audioamp.enableChannel(true, | + | |
- | alarmGain = EEPROM.read(addrAlarmGain); | + | |
- | mixer1.gain(1, | + | |
- | mixer2.gain(1, | + | |
- | if (playSdWav2.isPlaying() == false) { | + | |
- | Serial.println(" | + | |
- | if (alarmFile == 1) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 2) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 3) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | else if (alarmFile == 4) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü Weckmusik auswählen und Wecklautstärke stellen | + | |
- | if (menuPage == 52 && touch2 == false && prevtouch2 == true) { | + | |
- | + | ||
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 49) && (ty >= 0) && (ty <= 240)) { | + | |
- | menuPage = 51; | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | playSdWav2.stop(); | + | |
- | Serial.println(" | + | |
- | audioamp.enableChannel(false, | + | |
- | } | + | |
- | // Auswahl Musik 1 | + | |
- | else if ((tx >= 51) && (tx <= 194) && (ty >= 0) && (ty <= 59)) { | + | |
- | if (alarmFile != 1) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | alarmFile = 1; | + | |
- | EEPROM.update(addrAlarmFile, | + | |
- | } | + | |
- | // Auswahl Musik 2 | + | |
- | else if ((tx >= 51) && (tx <= 194) && (ty >= 60) && (ty <= 120)) { | + | |
- | if (alarmFile != 2) { | + | |
- | playSdWav2.play(" | + | |
- | } alarmFile = 2; | + | |
- | EEPROM.update(addrAlarmFile, | + | |
- | } | + | |
- | // Auswahl Musik 3 | + | |
- | else if ((tx >= 51) && (tx <= 194) && (ty >= 121) && (ty <= 180)) { | + | |
- | if (alarmFile != 3) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | alarmFile = 3; | + | |
- | EEPROM.update(addrAlarmFile, | + | |
- | } | + | |
- | // Auswahl Musik 4 | + | |
- | else if ((tx >= 51) && (tx <= 194) && (ty >= 181) && (ty <= 240)) { | + | |
- | if (alarmFile != 4) { | + | |
- | playSdWav2.play(" | + | |
- | } | + | |
- | alarmFile = 4; | + | |
- | EEPROM.update(addrAlarmFile, | + | |
- | } | + | |
- | // Lautstärke einstellen | + | |
- | else if ((tx >= 214) && (tx <= 319) && (ty >= 0) && (ty <= 119)) { | + | |
- | // Lautstärke erhöhen | + | |
- | alarmGain = alarmGain + 10; | + | |
- | if (alarmGain >= 200) { | + | |
- | alarmGain = 200; | + | |
- | } | + | |
- | EEPROM.update(addrAlarmGain, | + | |
- | mixer1.gain(1, | + | |
- | mixer2.gain(1, | + | |
- | } | + | |
- | else if ((tx >= 214) && (tx <= 319) && (ty >= 120) && (ty <= 239)) { | + | |
- | // Lautstärke verringern | + | |
- | alarmGain = alarmGain - 10; | + | |
- | if (alarmGain <= 0) { | + | |
- | alarmGain = 0; | + | |
- | } | + | |
- | EEPROM.update(addrAlarmGain, | + | |
- | mixer1.gain(1, | + | |
- | mixer2.gain(1, | + | |
- | } | + | |
- | | + | |
- | + | ||
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 7 && touch2 == false && prevtouch2 == true) { | + | |
- | // Wecker aus | + | |
- | if ((tx >= 0) && (tx <= 213) && (ty >= 0) && (ty <= 239)) { | + | |
- | menuPage = 0; // Das Hauptmenü wird aufgerufen. | + | |
- | alarmOn = false; | + | |
- | snoozeOn = false; | + | |
- | clockfaceOn = true; // Das Ziffernblatt wirg ggf. aktiviert. | + | |
- | playSdWav2.stop(); | + | |
- | Serial.println(" | + | |
- | audioamp.enableChannel(false, | + | |
- | r = 0; // setzt den globalen Farbwert zurück | + | |
- | g = 0; // setzt den globalen Farbwert zurück | + | |
- | b = 0; // setzt den globalen Farbwert zurück | + | |
- | w = 0; // setzt den globalen Farbwert zurück | + | |
- | for (int i = 0; i < numPixels; i++) { | + | |
- | strip.setPixelColor(i, | + | |
- | } | + | |
- | strip.show(); | + | |
- | logAlarmStop (); // Das Beenden des Alarms wird auf die SD-Karte geloggt. | + | |
- | } | + | |
- | // Schlummern | + | |
- | else if ((tx >= 214) && (tx <= 319) && (ty >= 0) && (ty <= 239)) { | + | |
- | alarmOn = false; | + | |
- | snoozeOn = true; // Der Schlummerlarm wird aktiviert. | + | |
- | clockfaceOn = true; // Das Ziffernblatt wirg ggf. aktiviert. | + | |
- | playSdWav2.stop(); | + | |
- | Serial.println(" | + | |
- | audioamp.enableChannel(false, | + | |
- | r = 0; // setzt den globalen Farbwert zurück | + | |
- | g = 0; // setzt den globalen Farbwert zurück | + | |
- | b = 0; // setzt den globalen Farbwert zurück | + | |
- | w = 0; // setzt den globalen Farbwert zurück | + | |
- | for (int i = 0; i < numPixels; i++) { | + | |
- | strip.setPixelColor(i, | + | |
- | } | + | |
- | strip.show(); | + | |
- | logSnoozleStart (); | + | |
- | snoozeTime = now() + snoozeDelay; | + | |
- | + | ||
- | // Debugging | + | |
- | Serial.print(" | + | |
- | Serial.print(", | + | |
- | } | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 8 && touch2 == false && prevtouch2 == true) { | + | |
- | // Zurück zum Untermenü Informationen | + | |
- | if ((tx >= 0) && (tx <= 213) && (ty >= 0) && (ty <= 239)) { | + | |
- | menuPage = 0; | + | |
- | snoozleOn = false; | + | |
- | playSdWav1.stop(); | + | |
- | Serial.println(" | + | |
- | audioamp.enableChannel(false, | + | |
- | } | + | |
- | else if ((tx >= 214) && (tx <= 319) && (ty >= 0) && (ty <= 119)) { | + | |
- | // Lautstärke erhöhen | + | |
- | snoozleGain = snoozleGain + 10; | + | |
- | if (snoozleGain >= 200) { | + | |
- | snoozleGain = 200; | + | |
- | } | + | |
- | EEPROM.update(addrSnoozleGain, | + | |
- | mixer1.gain(0, | + | |
- | mixer2.gain(0, | + | |
- | } | + | |
- | else if ((tx >= 214) && (tx <= 319) && (ty >= 120) && (ty <= 239)) { | + | |
- | // Lautstärke verringern | + | |
- | snoozleGain = snoozleGain - 10; | + | |
- | if (snoozleGain <= 0) { | + | |
- | snoozleGain = 0; | + | |
- | } | + | |
- | EEPROM.update(addrSnoozleGain, | + | |
- | mixer1.gain(0, | + | |
- | mixer2.gain(0, | + | |
- | } | + | |
- | | + | |
- | TFTrefresh = true; | + | |
- | prevtouch2 = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Der Inhalt des Bildschirms wird nur dann neu aufgebaut, wenn a) das Backlight an ist und b) ein Refresh angewiesen wurde. | + | |
- | if (TFTbacklightOn == true) { | + | |
- | // Die Nummerierung der Menüseiten erfolgt nach dem folgendendem Muster: | + | |
- | // Hauptmenü = 0; von dort Verzweigungen zu den Untermenüs 1 bis 5 | + | |
- | + | ||
- | // Hauptmenü | + | |
- | if (menuPage == 0 && TFTrefresh == true) { | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | + | ||
- | // Linke Spalte des Menüs | + | |
- | tft.drawRoundRect(1, | + | |
- | tft.drawRoundRect(1, | + | |
- | tft.drawRoundRect(1, | + | |
- | tft.drawRoundRect(1, | + | |
- | + | ||
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_11_Bold); | + | |
- | tft.setCursor(15, | + | |
- | tft.print(" | + | |
- | tft.setCursor(15, | + | |
- | tft.print(" | + | |
- | tft.setCursor(15, | + | |
- | tft.print(" | + | |
- | tft.setCursor(15, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Anzeige Zeitsignal | + | |
- | if (DCFtimesignalFound == true) { | + | |
- | tft.setCursor(210, | + | |
- | tft.setFont(AwesomeF180_10); | + | |
- | if (timesinceDCFsignal >= 86400) { // Die Farbe des Symbols hängt vom Alter des zuletzt erfolgreich empfangenen Zeitsignals ab | + | |
- | tft.setTextColor(ILI9341_RED); | + | |
- | } | + | |
- | else if (timesinceDCFsignal < 86400 && timesinceDCFsignal >= 43200) { | + | |
- | tft.setTextColor(ILI9341_DARKGREY); | + | |
- | } | + | |
- | else if (timesinceDCFsignal < 43200 && timesinceDCFsignal >= 3600) { | + | |
- | tft.setTextColor(ILI9341_LIGHTGREY); | + | |
- | } | + | |
- | else if (timesinceDCFsignal < 3600) { | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | } | + | |
- | tft.print((char)107); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | } | + | |
- | else { | + | |
- | tft.setTextColor(ILI9341_RED); | + | |
- | tft.setFont(AwesomeF180_10); | + | |
- | tft.setCursor(210, | + | |
- | tft.print((char)107); | + | |
- | } | + | |
- | + | ||
- | // Anzeige Sonnenaufgang und Sonnenuntergang | + | |
- | tft.setTextColor(ILI9341_YELLOW); | + | |
- | tft.setFont(AwesomeF180_10); | + | |
- | tft.setCursor(128, | + | |
- | tft.print((char)5); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.setCursor(146, | + | |
- | tft.print(AufgangStunden); | + | |
- | tft.print(":" | + | |
- | if (AufgangMinuten< | + | |
- | tft.print(AufgangMinuten); | + | |
- | + | ||
- | tft.setTextColor(ILI9341_BLUE); | + | |
- | tft.setFont(AwesomeF180_10); | + | |
- | tft.setCursor(260, | + | |
- | tft.print((char)6); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(278, | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.print(UntergangStunden); | + | |
- | tft.print(":" | + | |
- | if (UntergangMinuten< | + | |
- | tft.print(UntergangMinuten); | + | |
- | + | ||
- | // Die Uhrzeit wird unabhängig davon einmal pro Sekunde aktualisiert | + | |
- | + | ||
- | tft.fillRect(130, | + | |
- | + | ||
- | //Anzeige Alarmzeit | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | if (alarmMode == 0) { | + | |
- | tft.setFont(DroidSans_24); | + | |
- | tft.setCursor(140, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.setCursor(185, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setFont(DroidSans_24); | + | |
- | tft.setCursor(165, | + | |
- | if(alarmHour < 10) { | + | |
- | tft.print(' | + | |
- | } | + | |
- | tft.print(displayedAlarmHour); | + | |
- | tft.print(" | + | |
- | if(displayedAlarmMinute < 10) { | + | |
- | tft.print(' | + | |
- | } | + | |
- | tft.print(displayedAlarmMinute); | + | |
- | + | ||
- | // Weckmodus anzeigen | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | if (alarmMode == 1) { | + | |
- | tft.setCursor(150, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else if (alarmMode == 2) { | + | |
- | tft.setCursor(150, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else if (alarmMode == 3) { | + | |
- | tft.setCursor(130, | + | |
- | tft.print(" | + | |
- | } | + | |
- | } | + | |
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | if (menuPage == 0 && ((unsigned long)(currentMillis - previousMillisTFTScreen) >= intervalTFTScreen)) { | + | |
- | intervalTFTScreen = 1000; | + | |
- | + | ||
- | tft.fillRect(140, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(155, | + | |
- | tft.setFont(DroidSans_24); | + | |
- | if(hour() < 10) { | + | |
- | tft.print(' | + | |
- | } | + | |
- | tft.print(hour()); | + | |
- | tftprintDigits(minute()); | + | |
- | tftprintDigits(second()); | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.setCursor(185, | + | |
- | tft.print(day()); | + | |
- | tft.print(" | + | |
- | tft.print(month()); | + | |
- | tft.print(" | + | |
- | tft.print(year()); | + | |
- | + | ||
- | previousMillisTFTScreen = currentMillis; | + | |
- | } | + | |
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 1 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Hauptmenü | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Optionen | + | |
- | tft.drawRoundRect(69, | + | |
- | tft.drawRoundRect(69, | + | |
- | tft.drawRoundRect(69, | + | |
- | tft.drawRoundRect(69, | + | |
- | + | ||
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.setCursor(84, | + | |
- | tft.print(" | + | |
- | tft.setCursor(84, | + | |
- | tft.print(" | + | |
- | tft.setCursor(84, | + | |
- | tft.print(" | + | |
- | tft.setCursor(84, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Weiter zur Auswahl der WAV-Datei | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(290, | + | |
- | tft.print((char)1); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü " | + | |
- | if (menuPage == 11 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Snoozlemenü | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Optionen | + | |
- | tft.setFont(DroidSans_9_Bold); | + | |
- | if (snoozleFile == 1) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (snoozleFile == 2) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (snoozleFile == 3) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (snoozleFile == 4) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (snoozleFile == 5) { | + | |
- | tft.fillRect(184, | + | |
- | tft.fillRoundRect(184, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (snoozleFile == 6) { | + | |
- | tft.fillRect(184, | + | |
- | tft.fillRoundRect(184, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (snoozleFile == 7) { | + | |
- | tft.fillRect(184, | + | |
- | tft.fillRoundRect(184, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (snoozleFile == 8) { | + | |
- | tft.fillRect(184, | + | |
- | tft.fillRoundRect(184, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 2 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Hauptmenü | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Effekte einstellen | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_8); | + | |
- | tft.setCursor(50, | + | |
- | tft.print(" | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 3 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Hauptmenü | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Optionen | + | |
- | tft.setFont(DroidSans_9_Bold); | + | |
- | // Linke Spalte | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | + | ||
- | + | ||
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | + | ||
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Rechte Spalte | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | + | ||
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | tft.setCursor(199, | + | |
- | tft.print(" | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 31 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum " | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Optionen | + | |
- | tft.setFont(DroidSans_9_Bold); | + | |
- | if (alarmAdvancetime == 15) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (alarmAdvancetime == 30) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (alarmAdvancetime == 45) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 32 && TFTrefresh == true) { | + | |
- | + | ||
- | // Zurück zu " | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Weckmusik | + | |
- | tft.setFont(DroidSans_9_Bold); | + | |
- | if (alarmEffect == 1) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (alarmEffect == 2) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | /* | + | |
- | if (alarmEffect == 3) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | if (alarmEffect == 4) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | */ | + | |
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 33 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Hauptmenü | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | + | ||
- | // Empfindlichkeit des Sensors einstellen | + | |
- | tft.drawRoundRect(59, | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(70, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Pitch-Empfindlichkeit auf | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(100, | + | |
- | tft.print((char)6); | + | |
- | tft.setFont(DroidSans_9); | + | |
- | tft.setCursor(78, | + | |
- | tft.print(" | + | |
- | tft.setCursor(88, | + | |
- | tft.print(" | + | |
- | tft.setCursor(78, | + | |
- | tft.print(" | + | |
- | + | ||
- | + | ||
- | // Grenzwert für Pitchachse anzeigen | + | |
- | tft.fillRect(90, | + | |
- | tft.setFont(DroidSans_14); | + | |
- | tft.setTextColor(ILI9341_RED); | + | |
- | tft.setCursor(95, | + | |
- | tft.print(thresholdPitch / 10); | + | |
- | + | ||
- | // Pitch-Empfindlichkeit ab | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(100, | + | |
- | tft.print((char)7); | + | |
- | + | ||
- | + | ||
- | // Roll-Empfindlichkeit auf | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(177, | + | |
- | tft.print((char)6); | + | |
- | tft.setFont(DroidSans_9); | + | |
- | tft.setCursor(159, | + | |
- | tft.print(" | + | |
- | tft.setCursor(168, | + | |
- | tft.print(" | + | |
- | tft.setCursor(154, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Grenzwert für Rollachse anzeigen | + | |
- | tft.fillRect(167, | + | |
- | tft.setFont(DroidSans_14); | + | |
- | tft.setTextColor(ILI9341_GREEN); | + | |
- | tft.setCursor(172, | + | |
- | tft.print(thresholdRoll / 10); | + | |
- | + | ||
- | // Roll-Empfindlichkeit ab | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(177, | + | |
- | tft.print((char)7); | + | |
- | + | ||
- | + | ||
- | // Z-Beschleunigung auf | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(255, | + | |
- | tft.print((char)6); | + | |
- | tft.setFont(DroidSans_9); | + | |
- | tft.setCursor(245, | + | |
- | tft.print(" | + | |
- | tft.setCursor(245, | + | |
- | tft.print(" | + | |
- | tft.setCursor(235, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Grenzwert für Z-Achse anzeigen | + | |
- | tft.fillRect(245, | + | |
- | tft.setFont(DroidSans_14); | + | |
- | tft.setTextColor(ILI9341_BLUE); | + | |
- | tft.setCursor(252, | + | |
- | tft.print(thresholdAccelZ / 10); | + | |
- | + | ||
- | // Z-Beschleunigung ab | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(255, | + | |
- | tft.print((char)7); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 4 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Hauptmenü | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Linke Spalte | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | + | ||
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_9_Bold); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Rechte Spalte | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | tft.drawRoundRect(184, | + | |
- | + | ||
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_9_Bold); | + | |
- | tft.setCursor(194, | + | |
- | tft.print(" | + | |
- | tft.setCursor(194, | + | |
- | tft.print(" | + | |
- | tft.setCursor(194, | + | |
- | tft.print(" | + | |
- | tft.setCursor(194, | + | |
- | tft.print(" | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü " | + | |
- | if (menuPage == 41 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Untermenü Informationen | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | if (menuPage == 41 && ((unsigned long)(currentMillis - previousMillisTFTScreen) >= intervalTFTScreen)) { | + | |
- | intervalTFTScreen = 50; | + | |
- | + | ||
- | tft.setFontAdafruit(); | + | |
- | tft.setTextSize(1); | + | |
- | + | ||
- | // Datenausgabe | + | |
- | tft.setFontAdafruit(); | + | |
- | tft.setTextSize(1); | + | |
- | + | ||
- | if (DCFtimesignalFound == false){ | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | + | ||
- | int seconds = noDCFsignal % 60; | + | |
- | int minutes = (noDCFsignal | + | |
- | int hours = (noDCFsignal / 3600) % 24; | + | |
- | int days = (noDCFsignal / 86400) % 1; | + | |
- | + | ||
- | tft.print(days); | + | |
- | tft.print(hours); | + | |
- | tft.print(minutes); | + | |
- | tft.print(seconds); | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.println(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | + | ||
- | int seconds = timesinceDCFsignal % 60; | + | |
- | int minutes = (timesinceDCFsignal | + | |
- | int hours = (timesinceDCFsignal / 3600) % 24; | + | |
- | int days = (timesinceDCFsignal / 86400) % 1; | + | |
- | + | ||
- | tft.print(days); | + | |
- | tft.print(hours); | + | |
- | tft.print(minutes); | + | |
- | tft.print(seconds); | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.print(receivedDCFsignals); | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.print(DCFsuccessRate); | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.print(millis()/ | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.fillRect(60, | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.print(flankUp-PreviousflankUp); | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.print(flankDown - flankUp); | + | |
- | + | ||
- | if (extDCF == 0) { | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | previousMillisTFTScreen = currentMillis; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü " | + | |
- | if (menuPage == 42 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Untermenü Informationen | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | if (menuPage == 42 && ((unsigned long)(currentMillis - previousMillisTFTScreen) >= intervalTFTScreen)) { | + | |
- | intervalTFTScreen = 50; | + | |
- | + | ||
- | // Datenausgabe | + | |
- | tft.setFontAdafruit(); | + | |
- | tft.setTextSize(1); | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | + | ||
- | previousMillisTFTScreen = currentMillis; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü " | + | |
- | if (menuPage == 45 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Untermenü Informationen | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | if (menuPage == 45 && ((unsigned long)(currentMillis - previousMillisTFTScreen) >= intervalTFTScreen)) { | + | |
- | intervalTFTScreen = 500; | + | |
- | + | ||
- | // Datenausgabe | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.setCursor(50, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setFontAdafruit(); | + | |
- | tft.setTextSize(1); | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.setTextColor(ILI9341_BLACK, | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.setTextColor(ILI9341_BLACK, | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.setTextColor(ILI9341_BLACK, | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.setTextColor(ILI9341_BLACK, | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED, | + | |
- | tft.setTextColor(ILI9341_BLACK, | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE, | + | |
- | tft.print(" | + | |
- | + | ||
- | previousMillisTFTScreen = currentMillis; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü " | + | |
- | if (menuPage == 46 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Untermenü Informationen | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Datenausgabe | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_9); | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED); | + | |
- | tft.print(c); | + | |
- | tft.print(f); | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED); | + | |
- | tft.print(h); | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.print(" | + | |
- | tft.setTextColor(ILI9341_RED); | + | |
- | tft.print(taupunkt); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü " | + | |
- | if (menuPage == 48 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Untermenü Informationen | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Daten | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_9); | + | |
- | + | ||
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | | + | |
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 5 && TFTrefresh == true) { | + | |
- | // | + | |
- | + | ||
- | // Zurück zum Hauptmenü | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | + | ||
- | // Weckzeit einstellen | + | |
- | tft.drawRoundRect(59, | + | |
- | tft.setFont(DroidSans_10_Bold); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(80, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Stunden auf | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(100, | + | |
- | tft.print((char)6); | + | |
- | + | ||
- | // Stunde anzeigen | + | |
- | tft.fillRect(90, | + | |
- | tft.setFont(DroidSans_24); | + | |
- | tft.setCursor(95, | + | |
- | if(displayedAlarmHour < 10) { | + | |
- | tft.print(' | + | |
- | | + | |
- | tft.print(displayedAlarmHour); | + | |
- | + | ||
- | // Stunde ab | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(100, | + | |
- | tft.print((char)7); | + | |
- | + | ||
- | // Doppelpunkt | + | |
- | tft.setCursor(159, | + | |
- | tft.setFont(DroidSans_24); | + | |
- | tft.print(":" | + | |
- | + | ||
- | // Minuten auf | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(195, | + | |
- | tft.print((char)6); | + | |
- | + | ||
- | // Minuten anzeigen | + | |
- | tft.fillRect(185, | + | |
- | tft.setFont(DroidSans_24); | + | |
- | tft.setCursor(192, | + | |
- | if(displayedAlarmMinute < 10) { | + | |
- | tft.print(' | + | |
- | } | + | |
- | tft.print(displayedAlarmMinute); | + | |
- | + | ||
- | // Minuten ab | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(195, | + | |
- | tft.print((char)7); | + | |
- | + | ||
- | + | ||
- | // Anzeige des frühesten Weckzeitpunkts | + | |
- | tft.fillRect(200, | + | |
- | tft.setFont(DroidSans_10); | + | |
- | tft.setCursor(80, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Weckmodus anzeigen | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | if (alarmMode == 0) { | + | |
- | tft.setCursor(125, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else if (alarmMode == 1) { | + | |
- | tft.setCursor(95, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else if (alarmMode == 2) { | + | |
- | tft.setCursor(95, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else if (alarmMode == 3) { | + | |
- | tft.setCursor(75, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | // Weiter zur Auswahl des Programmmodus | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(290, | + | |
- | tft.print((char)1); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | // Unteruntermenü " | + | |
- | if (menuPage == 51 && TFTrefresh == true) { | + | |
- | + | ||
- | // Zurück zum " | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Weckmodus auswählen | + | |
- | tft.setFont(DroidSans_9_Bold); | + | |
- | if (alarmMode == 0) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (alarmMode == 1) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (alarmMode == 2) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | if (alarmMode == 3) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | // Weiter zur Auswahl der Weckmusik und der Wecklautstärke | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(290, | + | |
- | tft.print((char)1); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 52 && TFTrefresh == true) { | + | |
- | + | ||
- | // Zurück zu " | + | |
- | tft.setFont(AwesomeF100_32); | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(6, | + | |
- | tft.print((char)0); | + | |
- | + | ||
- | // Weckmusik | + | |
- | tft.setFont(DroidSans_9_Bold); | + | |
- | if (alarmFile == 1) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (alarmFile == 2) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | if (alarmFile == 3) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | if (alarmFile == 4) { | + | |
- | tft.fillRect(49, | + | |
- | tft.fillRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_BLACK); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.fillRect(49, | + | |
- | tft.drawRoundRect(49, | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setCursor(64, | + | |
- | tft.print(" | + | |
- | } | + | |
- | + | ||
- | // Wecklautstärke | + | |
- | tft.fillRect(213, | + | |
- | + | ||
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(AwesomeF000_28); | + | |
- | tft.setCursor(250, | + | |
- | tft.print((char)40); | + | |
- | + | ||
- | tft.fillRect(225, | + | |
- | tft.setFont(DroidSans_10); | + | |
- | tft.setCursor(225, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setFont(AwesomeF000_28); | + | |
- | tft.setCursor(255, | + | |
- | tft.print((char)39); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 7 && TFTrefresh == true) { | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | + | ||
- | // Wecker/ | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_18_Bold); | + | |
- | if (snoozeOn == false) { | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | } | + | |
- | else if (snoozeOn == true) { | + | |
- | tft.setCursor(30, | + | |
- | tft.print(" | + | |
- | } | + | |
- | tft.setCursor(85, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.fillRect(213, | + | |
- | + | ||
- | // Schlummern | + | |
- | tft.setFont(DroidSans_10); | + | |
- | tft.setCursor(225, | + | |
- | tft.print(" | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | + | ||
- | // Untermenü " | + | |
- | if (menuPage == 8 && TFTrefresh == true) { | + | |
- | tft.fillScreen(ILI9341_BLACK); | + | |
- | + | ||
- | // Snoozle aus | + | |
- | tft.setTextColor(ILI9341_WHITE); | + | |
- | tft.setFont(DroidSans_18_Bold); | + | |
- | tft.setCursor(60, | + | |
- | tft.print(" | + | |
- | tft.setCursor(85, | + | |
- | tft.print(" | + | |
- | + | ||
- | // Lautstärke | + | |
- | tft.fillRect(213, | + | |
- | + | ||
- | tft.setFont(AwesomeF000_28); | + | |
- | tft.setCursor(250, | + | |
- | tft.print((char)40); | + | |
- | + | ||
- | tft.setFont(DroidSans_10); | + | |
- | tft.setCursor(225, | + | |
- | tft.print(" | + | |
- | + | ||
- | tft.setFont(AwesomeF000_28); | + | |
- | tft.setCursor(255, | + | |
- | tft.print((char)39); | + | |
- | + | ||
- | TFTrefresh = false; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | touch = false; | + | |
- | touch2 = false; | + | |
- | + | ||
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | | + | |
- | } | + | |
- | + | ||
- | // Ausgabe an die serielle Schnittstelle | + | |
- | if ((unsigned long)(currentMillis - previousMillisSerialPrint) >= intervalSerialPrint) { | + | |
- | /* | + | |
- | // Gibt die aktuelle Zeit aus | + | |
- | Serial.print(hour()); | + | |
- | printDigits(minute()); | + | |
- | printDigits(second()); | + | |
- | Serial.print(" | + | |
- | Serial.print(day()); | + | |
- | Serial.print(" | + | |
- | Serial.print(month()); | + | |
- | Serial.print(" | + | |
- | Serial.print(year()); | + | |
- | Serial.print(" | + | |
- | Serial.print(weekday()); | + | |
- | printDCFsyncTime(); | + | |
- | + | ||
- | Serial.print(" | + | |
- | Serial.print(menuPage); | + | |
- | Serial.print("; | + | |
- | Serial.print(TFTbrightness); | + | |
- | + | ||
- | Serial.print("; | + | |
- | Serial.print(receivedDCFsignals); | + | |
- | */ | + | |
- | + | ||
- | Serial.println(); | + | |
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | previousMillisSerialPrint = currentMillis; | + | |
- | } | + | |
- | + | ||
- | // Misst die Periode und Pusweite des vom DCF77-Modul empfangenen Signals in Millisekunden | + | |
- | if ((unsigned long)(currentMillis - previousMillisDCFPulseLength) >= intervalDCFPulseLength) { | + | |
- | + | ||
- | int sensorValue = !digitalRead(DCFEXT_PIN); | + | |
- | if (sensorValue) { | + | |
- | if (!Up) { | + | |
- | flankUp=millis(); | + | |
- | Up = true; | + | |
- | } | + | |
- | } else { | + | |
- | if (Up) { | + | |
- | flankDown=millis(); | + | |
- | Serial.print(" | + | |
- | Serial.print(flankUp-PreviousflankUp); | + | |
- | Serial.print(" | + | |
- | Serial.println(flankDown - flankUp); | + | |
- | PreviousflankUp = flankUp; | + | |
- | Up = false; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | //Speichere die aktuelle Zeit in die zughörige Variable | + | |
- | previousMillisDCFPulseLength = currentMillis; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | // Aufruf der Sonnenuntergangsberechnung beim Datumswechsel | + | |
- | if (hour() == 0 && minute() == 0 && second() <= 1) { | + | |
- | sunrise(); | + | |
- | } | + | |
- | + | ||
- | + | ||
- | } | + | |
- | + | ||
- | + | ||
- | time_t getTeensy3Time() | + | |
- | { | + | |
- | return Teensy3Clock.get(); | + | |
- | } | + | |
- | + | ||
- | + | ||
- | /* code to process time sync messages from the serial port */ | + | |
- | #define TIME_HEADER | + | |
- | + | ||
- | unsigned long processSyncMessage() { | + | |
- | time_t pctime = 0L; | + | |
- | //unsigned long pctime = 0L; | + | |
- | + | ||
- | if(Serial.find(TIME_HEADER)) { | + | |
- | | + | |
- | | + | |
- | if( pctime < DefaultTime) { // check the value is a valid time (greater than Nov 1 2016) | + | |
- | | + | |
- | } | + | |
- | } | + | |
- | return pctime; | + | |
- | Serial.print(" | + | |
- | Serial.print(pctime); | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void tftprintDigits(int digits) { | + | |
- | // utility function for digital clock display: prints preceding colon and leading 0 | + | |
- | tft.print(":" | + | |
- | if(digits < 10) | + | |
- | tft.print(' | + | |
- | tft.print(digits); | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void printDigits(int digits) { | + | |
- | // utility function for digital clock display: prints preceding colon and leading 0 | + | |
- | Serial.print(":" | + | |
- | if(digits < 10) | + | |
- | Serial.print(' | + | |
- | Serial.print(digits); | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void tftprintDCFsyncTime() { | + | |
- | if (DCFtimesignalFound == false){ | + | |
- | tft.println(" | + | |
- | tft.print(noDCFsignal); | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.println(" | + | |
- | tft.print(timesinceDCFsignal); | + | |
- | tft.print(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void printDCFsyncTime() { | + | |
- | if (DCFtimesignalFound == false){ | + | |
- | Serial.print(" | + | |
- | Serial.print(noDCFsignal); | + | |
- | Serial.print(" | + | |
- | } | + | |
- | else { | + | |
- | Serial.print(" | + | |
- | Serial.print(timesinceDCFsignal); | + | |
- | Serial.print(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void tftprintDCFsyncCycle() { | + | |
- | if (DCFtimesignalFound == false){ | + | |
- | tft.println(" | + | |
- | tft.print(noDCFsignal / 60); | + | |
- | tft.print(" | + | |
- | } | + | |
- | else { | + | |
- | tft.println(" | + | |
- | tft.print(timesinceDCFsignal /60); | + | |
- | tft.print(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | void calcAlarmTime () { | + | |
- | // Vor dem Speichern der Alarmzeit ins EEPROM wird die angezeigte Alarmzeit in die schlafphasensensible Alarmzeit umgerechnet | + | |
- | alarmMinute = displayedAlarmMinute; | + | |
- | alarmHour = displayedAlarmHour; | + | |
- | + | ||
- | if (alarmAdvancetime == 15) { | + | |
- | if (displayedAlarmMinute == 0) { | + | |
- | alarmMinute = 45; | + | |
- | alarmHour = displayedAlarmHour - 1; | + | |
- | if (alarmHour < 0) { | + | |
- | alarmHour = 23; | + | |
- | } | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 15) { | + | |
- | alarmMinute = 0; | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 30) { | + | |
- | alarmMinute = 15; | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 45) { | + | |
- | alarmMinute = 30; | + | |
- | } | + | |
- | } | + | |
- | else if (alarmAdvancetime == 30) { | + | |
- | if (displayedAlarmMinute == 0) { | + | |
- | alarmMinute = 30; | + | |
- | alarmHour = displayedAlarmHour - 1; | + | |
- | if (alarmHour < 0) { | + | |
- | alarmHour = 23; | + | |
- | } | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 15) { | + | |
- | alarmMinute = 45; | + | |
- | alarmHour = displayedAlarmHour - 1; | + | |
- | if (alarmHour < 0) { | + | |
- | alarmHour = 23; | + | |
- | } | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 30) { | + | |
- | alarmMinute = 0; | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 45) { | + | |
- | alarmMinute = 15; | + | |
- | } | + | |
- | } | + | |
- | else if (alarmAdvancetime == 45) { | + | |
- | if (displayedAlarmMinute == 0) { | + | |
- | alarmMinute = 15; | + | |
- | alarmHour = displayedAlarmHour -1; | + | |
- | if (alarmHour < 0) { | + | |
- | alarmHour = 23; | + | |
- | } | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 15) { | + | |
- | alarmMinute = 30; | + | |
- | alarmHour = displayedAlarmHour -1; | + | |
- | if (alarmHour < 0) { | + | |
- | alarmHour = 23; | + | |
- | } | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 30) { | + | |
- | alarmMinute = 45; | + | |
- | alarmHour = displayedAlarmHour -1; | + | |
- | if (alarmHour < 0) { | + | |
- | alarmHour = 23; | + | |
- | } | + | |
- | } | + | |
- | else if (displayedAlarmMinute == 45) { | + | |
- | alarmMinute = 0; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | // Um das EEPROM zu schonen, werden die Alarmzeit und der Alarmmodus erst gespeichert, | + | |
- | // Um Speicherplatz im EEPROM zu sparen, werden die Integervariablen alarmHour, alarmMinute etc. als unsigned char (0 - 255) gespeichert. | + | |
- | EEPROM.update(addrDisplayedAlarmHour, | + | |
- | EEPROM.update(addrDisplayedAlarmMinute, | + | |
- | EEPROM.update(addrAlarmHour, | + | |
- | EEPROM.update(addrAlarmMinute, | + | |
- | EEPROM.update(addrAlarmMode, | + | |
- | + | ||
- | // Ausgabe an die serielle Schnittstelle | + | |
- | Serial.print(" | + | |
- | Serial.print(":" | + | |
- | Serial.print(" | + | |
- | Serial.print(" | + | |
- | Serial.print(":" | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void logAlarmActive () { | + | |
- | File dataFile = SD.open(" | + | |
- | if (dataFile) { | + | |
- | dataFile.print(" | + | |
- | if (day() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(day()); | + | |
- | dataFile.print(" | + | |
- | if (month() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(month()); | + | |
- | dataFile.print(" | + | |
- | dataFile.print(year()); | + | |
- | dataFile.print(" | + | |
- | if (hour() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(hour()); | + | |
- | dataFile.print(":" | + | |
- | if (minute() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(minute()); | + | |
- | dataFile.print(":" | + | |
- | if (second() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(second()); | + | |
- | dataFile.print("; | + | |
- | dataFile.println(alarmMode); | + | |
- | dataFile.close(); | + | |
- | } | + | |
- | // if the file isn't open, pop up an error: | + | |
- | else { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void logAlarmStart () { | + | |
- | File dataFile = SD.open(" | + | |
- | if (dataFile) { | + | |
- | dataFile.print(" | + | |
- | if (day() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(day()); | + | |
- | dataFile.print(" | + | |
- | if (month() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(month()); | + | |
- | dataFile.print(" | + | |
- | dataFile.print(year()); | + | |
- | dataFile.print(" | + | |
- | if (hour() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(hour()); | + | |
- | dataFile.print(":" | + | |
- | if (minute() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(minute()); | + | |
- | dataFile.print(":" | + | |
- | if (second() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.println(second()); | + | |
- | } | + | |
- | // if the file isn't open, pop up an error: | + | |
- | else { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void logAlarmStop () { | + | |
- | File dataFile = SD.open(" | + | |
- | if (dataFile) { | + | |
- | dataFile.print(" | + | |
- | if (day() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(day()); | + | |
- | dataFile.print(" | + | |
- | if (month() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(month()); | + | |
- | dataFile.print(" | + | |
- | dataFile.print(year()); | + | |
- | dataFile.print(" | + | |
- | if (hour() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(hour()); | + | |
- | dataFile.print(":" | + | |
- | if (minute() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(minute()); | + | |
- | dataFile.print(":" | + | |
- | if (second() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.println(second()); | + | |
- | } | + | |
- | // if the file isn't open, pop up an error: | + | |
- | else { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void logSnoozleStart () { | + | |
- | File dataFile = SD.open(" | + | |
- | if (dataFile) { | + | |
- | dataFile.print(" | + | |
- | if (day() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(day()); | + | |
- | dataFile.print(" | + | |
- | if (month() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(month()); | + | |
- | dataFile.print(" | + | |
- | dataFile.print(year()); | + | |
- | dataFile.print(" | + | |
- | if (hour() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(hour()); | + | |
- | dataFile.print(":" | + | |
- | if (minute() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(minute()); | + | |
- | dataFile.print(":" | + | |
- | if (second() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(second()); | + | |
- | dataFile.print("; | + | |
- | dataFile.println(snoozeDelay); | + | |
- | } | + | |
- | // if the file isn't open, pop up an error: | + | |
- | else { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void logSnoozleAlarm () { | + | |
- | File dataFile = SD.open(" | + | |
- | if (dataFile) { | + | |
- | dataFile.print(" | + | |
- | if (day() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(day()); | + | |
- | dataFile.print(" | + | |
- | if (month() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(month()); | + | |
- | dataFile.print(" | + | |
- | dataFile.print(year()); | + | |
- | dataFile.print(" | + | |
- | if (hour() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(hour()); | + | |
- | dataFile.print(":" | + | |
- | if (minute() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.print(minute()); | + | |
- | dataFile.print(":" | + | |
- | if (second() < 10) { | + | |
- | dataFile.print(" | + | |
- | } | + | |
- | dataFile.println(second()); | + | |
- | + | ||
- | } | + | |
- | // if the file isn't open, pop up an error: | + | |
- | else { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void logSDcard() { | + | |
- | + | ||
- | // Daten auf SD-Karte loggen | + | |
- | // open the file. note that only one file can be open at a time, | + | |
- | // so you have to close this one before opening another. | + | |
- | File dataFile = SD.open(" | + | |
- | + | ||
- | // if the file is available, write to it: | + | |
- | if (dataFile) { | + | |
- | dataFile.print(day()); | + | |
- | dataFile.print(" | + | |
- | dataFile.print(month()); | + | |
- | dataFile.print(" | + | |
- | dataFile.print(year()); | + | |
- | dataFile.print(" | + | |
- | dataFile.print(hour()); | + | |
- | dataFile.print(":" | + | |
- | dataFile.print(minute()); | + | |
- | dataFile.print(":" | + | |
- | dataFile.print(second()); | + | |
- | dataFile.print(" | + | |
- | dataFile.println(accelZ); | + | |
- | dataFile.close(); | + | |
- | // print to the serial port too: | + | |
- | Serial.print(day()); | + | |
- | Serial.print(" | + | |
- | Serial.print(month()); | + | |
- | Serial.print(" | + | |
- | Serial.print(year()); | + | |
- | Serial.print(" | + | |
- | Serial.print(hour()); | + | |
- | Serial.print(":" | + | |
- | Serial.print(minute()); | + | |
- | Serial.print(":" | + | |
- | Serial.print(second()); | + | |
- | Serial.print(" | + | |
- | Serial.println(accelZ); | + | |
- | } | + | |
- | // if the file isn't open, pop up an error: | + | |
- | else { | + | |
- | Serial.println(" | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | </ | + | |
- | Der Sketch verwendet 163.040 Bytes (15%) des Programmspeicherplatzes. Das Maximum sind 1.048.576 Bytes. | + | |
- | Globale Variablen verwenden 13.400 Bytes (5%) des dynamischen Speichers, 248.744 Bytes für lokale Variablen verbleiben. Das Maximum sind 262.144 Bytes. | + | |
- | Tags: #Arduino # | + |
arduino/schlafphasenwecker/programmversion_0.8.1492936529.txt.gz · Zuletzt geändert: 18.05.2023 12:16 (Externe Bearbeitung)