arduino:schlafphasenwecker:programmversion_0.6
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
arduino:schlafphasenwecker:programmversion_0.6 [27.12.2016 22:24] – Frickelpiet | arduino:schlafphasenwecker:programmversion_0.6 [18.05.2023 12:34] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Schlafphasenwecker Programmversion 0.6 ====== | ====== Schlafphasenwecker Programmversion 0.6 ====== | ||
- | Der Schlafphasenwecker soll nicht nur durch Licht wecken können, sondern auch akustisch. Es soll aber kein hässlicher Alarmsound abgespielt werden, sondern sanfte Naturgeräusche. In dieser Programmversion sollen daher die Audiofunktionen des Weckers an den Start gebracht werden. | + | <box 30% green right|**Achtung**> |
+ | Um das Display zu beschleunigen muss die Bibliothek // | ||
+ | |||
+ | In der Bibliothek ILI9341_t3.h werden die folgenden Farben definiert: | ||
+ | < | ||
+ | #define ILI9341_BLACK | ||
+ | #define ILI9341_NAVY | ||
+ | #define ILI9341_DARKGREEN | ||
+ | #define ILI9341_DARKCYAN | ||
+ | #define ILI9341_MAROON | ||
+ | #define ILI9341_PURPLE | ||
+ | #define ILI9341_OLIVE | ||
+ | #define ILI9341_LIGHTGREY | ||
+ | #define ILI9341_DARKGREY | ||
+ | #define ILI9341_BLUE | ||
+ | #define ILI9341_GREEN | ||
+ | #define ILI9341_CYAN | ||
+ | #define ILI9341_RED | ||
+ | #define ILI9341_MAGENTA | ||
+ | #define ILI9341_YELLOW | ||
+ | #define ILI9341_WHITE | ||
+ | #define ILI9341_ORANGE | ||
+ | #define ILI9341_GREENYELLOW 0xAFE5 | ||
+ | #define ILI9341_PINK | ||
+ | </ | ||
+ | < | ||
+ | // Schlafphasenwecker Version 0.6.3 | ||
+ | // Umstellung von Adafruit_ILI9341.h auf ILI9341_t3.h | ||
+ | // Snoozle-Funktion | ||
+ | // Erweiterung und Überarbeitung des Menüs | ||
- | Hilfreiche Links: | + | // Bibliotheken einbinden |
- | * TPA 2016: https://learn.adafruit.com/adafruit-tpa2016-2-8w-agc-stereo-audio-amplifier/overview | + | #include < |
- | * Wie man den Onboard SD Card Slot ans Laufen bekommt: https://forum.pjrc.com/threads/37652-microSD-slot-on-teensy-3-6 | + | #include <EEPROM.h> // Ermöglicht den Zugriff auf den EEPROM |
+ | #include <DCF77.h> // Bibliothek für das DCF77-Modul | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include " | ||
+ | #include " | ||
+ | #include " | ||
+ | #include " | ||
+ | #include " | ||
- | Um die SDFat beta zum Laufen zu bringen, müssen im Board Manager die Arduino AVR Boards Version 1.6.11 installiert werden. | ||
- | * Die TeensySdioDemo läuft | ||
- | < | + | // Definiert Adressen im EEPROM |
- | SdFatSdioEX uses extended multi-block transfers without DMA. | + | int addrAlarmHour = 0; |
- | SdFatSdio uses a traditional DMA SDIO implementation. | + | int addrAlarmMinute = 1; |
- | Note the difference is speed and busy yield time. | + | int addrAlarmMode = 2; |
+ | int addrDisplayedAlarmHour = 3; | ||
+ | int addrDisplayedAlarmMinute = 4; | ||
+ | int addrAlarmAdvancetime = 5; | ||
+ | int addrAlarmFile = 6; | ||
+ | int addrSnoozleFile = 7; | ||
- | Type ' | + | // Definiert die Pins |
+ | #define DCF_PIN | ||
+ | #define DCF_INTERRUPT 2 // Interrupt number associated with pin | ||
+ | #define TFTbacklightPin 4 // PWM Backlight TFT | ||
- | size, | + | // Definiert die Farben für das Menü (im RGB585-Format) |
- | bytes,KB/sec,KB/sec | + | #define white 0xFFFF |
- | 512, | + | #define black 0x0000 |
- | 1024, | + | #define red 0xF800 |
- | 2048, | + | #define orange |
- | 4096, | + | #define darkyellow 0xFB20 |
- | 8192, | + | #define darkblue 0xFB20 |
- | 16384, | + | |
- | 32768, | + | |
- | totalMicros | + | |
- | yieldMicros | + | // Definiert die DCF77-Bibliothek |
- | yieldCalls | + | DCF77 DCF = DCF77(DCF_PIN, |
- | yieldMaxUsec 7896 | + | |
- | kHzSdClk | + | // The FT6206 uses hardware I2C (SCL/SDA) |
- | Done | + | 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 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(); | ||
+ | |||
+ | // Definiert die Variablen | ||
+ | int flankUp = 0; | ||
+ | int flankDown = 0; | ||
+ | int PreviousflankUp; | ||
+ | bool Up = false; | ||
+ | |||
+ | boolean IMUconnected = false; | ||
+ | boolean DCFtimesignalFound = false; | ||
+ | |||
+ | 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; | ||
+ | unsigned long lastDCFsignal; | ||
+ | unsigned long noDCFsignal; | ||
+ | unsigned long currentDCFsignal; | ||
+ | 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. | ||
+ | |||
+ | 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) | ||
+ | byte alarmFile = 1; // Legt die WAV-Datei fest, die bei einem Alarm abgespielt wird | ||
+ | boolean alarmOn = false; | ||
+ | |||
+ | 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; | ||
+ | float snoozleGain = 0.3; // Verstärkung/ | ||
+ | |||
+ | uint16_t ir; // Helligkeitswert für den Infrarotanteil des Lichts | ||
+ | uint16_t full; // Helligkeitswert für das Infrarotanteil und das sichtbare Licht | ||
+ | uint32_t lum; | ||
+ | uint16_t lux; | ||
+ | |||
+ | 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, | ||
+ | |||
+ | int eventAccelZ = 0; // Zählt Ereignisse auf der Beschleunigungsachse Z | ||
+ | int eventRoll = 0; // Zählt Ereignisse auf der Rollachse | ||
+ | int eventPitch = 0; // Zählt Ereignisse auf der Pitchachse | ||
+ | int eventTotal = 0; | ||
+ | |||
+ | 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; | ||
+ | unsigned long previousMillisAlarmClock = 0; | ||
+ | unsigned long previousMillisSnoozleTime = 0; | ||
+ | unsigned long previousMillisTFTScreen = 0; | ||
+ | unsigned long previousMillisTouchScreen = 0; | ||
+ | unsigned long previousMillisSensorData = 0; | ||
+ | unsigned long previousMillisSerialPrint = 0; | ||
+ | unsigned long previousMillisDCFPulseLength = 0; | ||
+ | |||
+ | // 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 = 1000; // konstanter Delay für die Weckfunktionen | ||
+ | const unsigned long intervalSnoozleTime = 1000; // konstanter Delay für die Snoozlefunktion | ||
+ | unsigned long intervalTFTScreen = 100; // variabler Delay für Anteuerung des TFT-Screens | ||
+ | const unsigned long intervalTouchScreen = 50; | ||
+ | const unsigned long intervalSensorData = 100; // konstanter Delay für Auslesen der Sensoren | ||
+ | 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(DCF_PIN, | ||
+ | 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_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_600MS); | ||
+ | |||
+ | // Initialisiert den TSL2591 | ||
+ | tsl.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 des DCF77-Moduls | ||
+ | DCF.Start(); | ||
+ | Serial.println(" | ||
+ | Serial.println(" | ||
+ | |||
+ | // Initialisiert das Audio Board und die SD-Karte | ||
+ | AudioMemory(100); | ||
+ | sgtl5000_1.enable(); | ||
+ | sgtl5000_1.volume(0.8); | ||
+ | sgtl5000_1.enhanceBassEnable(); | ||
+ | SPI.setMOSI(7); | ||
+ | SPI.setSCK(14); | ||
+ | if (!(SD.begin(10))) { | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | // Initialisiert den Class D Amplifier | ||
+ | audioamp.begin(); | ||
+ | // Turn off AGC for the gain test | ||
+ | audioamp.setAGCCompression(TPA2016_AGC_OFF); | ||
+ | // we also have to turn off the release to really turn off AGC | ||
+ | audioamp.setReleaseControl(0); | ||
+ | audioamp.setLimitLevelOn(); | ||
+ | audioamp.setLimitLevel(5); | ||
+ | |||
+ | // 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); | ||
+ | snoozleFile = EEPROM.read(addrSnoozleFile); | ||
+ | |||
+ | // Es wird einmalig die Funktion zur Berechnung des Sonnenauf- und untergangs aufgerufen. | ||
+ | sunrise(); | ||
+ | } | ||
+ | |||
+ | |||
+ | void loop() { | ||
+ | // Aktuelle Zeit abfragen | ||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | |||
+ | // Stelle die Real Time Clock (RTC) auf die aktuelle Zeit | ||
+ | if ((unsigned long)(currentMillis - previousMillisSetRTC) >= intervalSetRTC) { | ||
+ | |||
+ | DCFtime = DCF.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; | ||
+ | receivedDCFsignals = receivedDCFsignals + 1; | ||
+ | currentDCFsignal = millis(); | ||
+ | } | ||
+ | |||
+ | // Berechne die Zeit (in Sekunden) die seit dem Empfang des letzten gültigen DCF-Signals vergangen ist | ||
+ | if (DCFtimesignalFound == false) { | ||
+ | noDCFsignal = millis() /1000; | ||
+ | } | ||
+ | else { | ||
+ | lastDCFsignal = (millis() - currentDCFsignal) / 1000; | ||
+ | } | ||
+ | |||
+ | |||
+ | // Berechnet die Quote erfolgreich empfangener DCF77-Signale seit dem letzten Systemstart | ||
+ | DCFsuccessRate = (receivedDCFsignals / ((millis() / 60000))) * 100; | ||
+ | |||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisSetRTC = 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.println(snoozleOn); | ||
+ | */ | ||
+ | |||
+ | // Wenn die aktuelle Zeit kleiner ist als die eingestellte Snoozle-Zeit, | ||
+ | if (snoozleOn == true) { | ||
+ | audioamp.enableChannel(true, | ||
+ | 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 (menuPage != 8) { // Das Menü " | ||
+ | menuPage = 8; | ||
+ | TFTrefresh = true; | ||
+ | } | ||
+ | } | ||
+ | if (now() >= snoozleTime && snoozleOn == true) { | ||
+ | if (menuPage == 8) { // Wenn Menü " | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | } | ||
+ | |||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisSnoozleTime = currentMillis; | ||
+ | } | ||
+ | |||
+ | |||
+ | // Alarm-Funktionen | ||
+ | if ((unsigned long)(currentMillis - previousMillisAlarmClock) >= intervalAlarmClock) { | ||
+ | |||
+ | // Die Schleife wird durchlaufen, | ||
+ | if (alarmMode != 0 && hour() == alarmHour && minute() == alarmMinute && second() == 0 || alarmOn == true) { | ||
+ | |||
+ | // Die Eventzähler müssen zu beginn einer Alarmphase einmalig zurückgesetzt werden | ||
+ | if (alarmOn == false) { | ||
+ | eventAccelZ = 0; | ||
+ | eventRoll = 0; | ||
+ | eventPitch = 0; | ||
+ | eventTotal = 0; | ||
+ | } | ||
+ | |||
+ | // Wecken mit Licht | ||
+ | if (alarmMode == 1) { | ||
+ | Serial.println(" | ||
+ | if (eventTotal >= 100) { | ||
+ | Serial.print(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Wecken mit Musik | ||
+ | else if (alarmMode == 2) { | ||
+ | Serial.println(" | ||
+ | if (eventTotal >= 100) { | ||
+ | Serial.print(" | ||
+ | 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 >= 100) { | ||
+ | Serial.print(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Schlummeralarm | ||
+ | if (snoozeOn == true && now() >= snoozeTime) { | ||
+ | Serial.print(" | ||
+ | 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(" | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // 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; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //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 | ||
+ | if (filteredAccelZ - accelZ > 1 || filteredAccelZ - accelZ < -1) { | ||
+ | eventAccelZ = eventAccelZ + 1; | ||
+ | logSDcard(); | ||
+ | } | ||
+ | if (filteredRoll - roll > 5 || filteredRoll - roll < -5) { | ||
+ | eventRoll = eventRoll + 1; | ||
+ | } | ||
+ | if (filteredPitch - pitch > 5 || filteredPitch - pitch < -5) { | ||
+ | eventPitch = eventPitch + 1; | ||
+ | } | ||
+ | |||
+ | // Berechne die Summe aller Ereignisse | ||
+ | eventTotal = eventAccelZ + eventRoll + eventPitch; | ||
+ | |||
+ | //Auslesen des Helligkeitssensors TSL2591 | ||
+ | lum = tsl.getFullLuminosity(); | ||
+ | ir = lum >> 16; | ||
+ | full = lum & 0xFFFF; | ||
+ | lux = tsl.calculateLux(full, | ||
+ | |||
+ | /* | ||
+ | // 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(currentMillis); | ||
+ | dataFile.print("," | ||
+ | dataFile.println(lux); | ||
+ | dataFile.close(); | ||
+ | // print to the serial port too: | ||
+ | Serial.print(currentMillis); | ||
+ | Serial.print("," | ||
+ | Serial.print(lux); | ||
+ | } | ||
+ | // if the file isn't open, pop up an error: | ||
+ | else { | ||
+ | Serial.println(" | ||
+ | } | ||
+ | */ | ||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisSensorData = currentMillis; | ||
+ | } | ||
+ | |||
+ | |||
+ | // TFT- imd 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 oder b) keine Snoozlemusik läuft. | ||
+ | if (alarmOn == 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; | ||
+ | } | ||
+ | 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; | ||
+ | } | ||
+ | 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; | ||
+ | } | ||
+ | // Auswahl Musik 1 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 0) && (ty <= 59)) { | ||
+ | snoozleFile = 1; | ||
+ | EEPROM.write(addrSnoozleFile, | ||
+ | } | ||
+ | // Auswahl Musik 2 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 60) && (ty <= 120)) { | ||
+ | snoozleFile = 2; | ||
+ | EEPROM.write(addrSnoozleFile, | ||
+ | } | ||
+ | // Auswahl Musik 3 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 121) && (ty <= 180)) { | ||
+ | snoozleFile = 3; | ||
+ | EEPROM.write(addrSnoozleFile, | ||
+ | } | ||
+ | // Auswahl Musik 4 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 181) && (ty <= 240)) { | ||
+ | snoozleFile = 4; | ||
+ | EEPROM.write(addrSnoozleFile, | ||
+ | } | ||
+ | /* | ||
+ | // Auswahl Musik 5 | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 0) && (ty <= 59)) { | ||
+ | snoozleFile = 5; | ||
+ | EEPROM.write(addrSnoozleFile, | ||
+ | } | ||
+ | // Auswahl Musik 6 | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 60) && (ty <= 120)) { | ||
+ | snoozleFile = 6; | ||
+ | EEPROM.write(addrSnoozleFile, | ||
+ | } | ||
+ | // Auswahl Musik 7 | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 121) && (ty <= 180)) { | ||
+ | snoozleFile = 7; | ||
+ | EEPROM.write(addrSnoozleFile, | ||
+ | } | ||
+ | // Auswahl Musik 8 | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 181) && (ty <= 240)) { | ||
+ | snoozleFile = 8; | ||
+ | EEPROM.write(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ü Weckmusik | ||
+ | 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; | ||
+ | } | ||
+ | // 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; | ||
+ | } | ||
+ | */ | ||
+ | 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; | ||
+ | } | ||
+ | else if ((tx >= 50) && (tx <= 320) && (ty >= 0) && (ty <= 79)) { | ||
+ | alarmAdvancetime = 15; | ||
+ | EEPROM.write(addrAlarmAdvancetime, | ||
+ | } | ||
+ | else if ((tx >= 50) && (tx <= 320) && (ty >= 80) && (ty <= 159)) { | ||
+ | alarmAdvancetime = 30; | ||
+ | EEPROM.write(addrAlarmAdvancetime, | ||
+ | } | ||
+ | else if ((tx >= 50) && (tx <= 320) && (ty >= 160) && (ty <= 239)) { | ||
+ | alarmAdvancetime = 45; | ||
+ | EEPROM.write(addrAlarmAdvancetime, | ||
+ | } | ||
+ | TFTrefresh = true; | ||
+ | prevtouch2 = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü Weckmusikauswahl | ||
+ | if (menuPage == 32 && touch2 == false && prevtouch2 == true) { | ||
+ | // Zurück zum Untermenü Einstellungen | ||
+ | if ((tx >= 0) && (tx <= 40) && (ty >= 0) && (ty <= 240)) { | ||
+ | menuPage = 3; | ||
+ | } | ||
+ | // Auswahl Musik 1 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 0) && (ty <= 59)) { | ||
+ | alarmFile = 1; | ||
+ | EEPROM.write(addrAlarmFile, | ||
+ | } | ||
+ | // Auswahl Musik 2 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 60) && (ty <= 120)) { | ||
+ | alarmFile = 2; | ||
+ | EEPROM.write(addrAlarmFile, | ||
+ | } | ||
+ | // Auswahl Musik 3 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 121) && (ty <= 180)) { | ||
+ | alarmFile = 3; | ||
+ | EEPROM.write(addrAlarmFile, | ||
+ | } | ||
+ | // Auswahl Musik 4 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 181) && (ty <= 240)) { | ||
+ | alarmFile = 4; | ||
+ | EEPROM.write(addrAlarmFile, | ||
+ | } | ||
+ | /* | ||
+ | // Auswahl Musik 5 | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 0) && (ty <= 59)) { | ||
+ | alarmFile = 5; | ||
+ | EEPROM.write(addrAlarmFile, | ||
+ | } | ||
+ | // Auswahl Musik 6 | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 60) && (ty <= 120)) { | ||
+ | alarmFile = 6; | ||
+ | EEPROM.write(addrAlarmFile, | ||
+ | } | ||
+ | // Auswahl Musik 7 | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 121) && (ty <= 180)) { | ||
+ | alarmFile = 7; | ||
+ | EEPROM.write(addrAlarmFile, | ||
+ | } | ||
+ | // Auswahl Musik 8 | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 181) && (ty <= 240)) { | ||
+ | alarmFile = 8; | ||
+ | EEPROM.write(addrAlarmFile, | ||
+ | } | ||
+ | */ | ||
+ | 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 Uhntermenü DCF Zeitsignal | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 0) && (ty <= 59)) { | ||
+ | menuPage = 41; | ||
+ | } | ||
+ | // Zum Untermenü LSM303 | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 60) && (ty <= 120)) { | ||
+ | menuPage = 42; | ||
+ | } | ||
+ | /* | ||
+ | // Zum Menü " | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 121) && (ty <= 180)) { | ||
+ | menuPage = 43; | ||
+ | } | ||
+ | // Zum Menü " | ||
+ | else if ((tx >= 51) && (tx <= 184) && (ty >= 181) && (ty <= 240)) { | ||
+ | menuPage = 44; | ||
+ | } | ||
+ | */ | ||
+ | // Zum Menü TSL2591-Sensor | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 0) && (ty <= 59)) { | ||
+ | menuPage = 45; | ||
+ | } | ||
+ | /* | ||
+ | // Zum Menü " | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 60) && (ty <= 120)) { | ||
+ | menuPage = 46; | ||
+ | } | ||
+ | // Zum Menü " | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 121) && (ty <= 180)) { | ||
+ | menuPage = 47; | ||
+ | } | ||
+ | // Zum Menü " | ||
+ | else if ((tx >= 186) && (tx <= 319) && (ty >= 181) && (ty <= 240)) { | ||
+ | menuPage = 48; | ||
+ | } | ||
+ | */ | ||
+ | TFTrefresh = true; | ||
+ | prevtouch2 = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü 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; | ||
+ | } | ||
+ | TFTrefresh = true; | ||
+ | prevtouch2 = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü 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; | ||
+ | } | ||
+ | TFTrefresh = true; | ||
+ | prevtouch2 = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü 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; | ||
+ | } | ||
+ | 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); | ||
+ | |||
+ | // 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 = displayedAlarmMinute - 15; | ||
+ | alarmHour = displayedAlarmHour - 1; | ||
+ | if (alarmHour < 0) { | ||
+ | alarmHour = 23; | ||
+ | } | ||
+ | } | ||
+ | else if (displayedAlarmMinute == 15) { | ||
+ | alarmMinute = displayedAlarmMinute - 15; | ||
+ | } | ||
+ | else if (displayedAlarmMinute == 30) { | ||
+ | alarmMinute = displayedAlarmMinute - 15; | ||
+ | } | ||
+ | else if (displayedAlarmMinute == 45) { | ||
+ | alarmMinute = displayedAlarmMinute - 15; | ||
+ | } | ||
+ | } | ||
+ | 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 = displayedAlarmMinute - 45; | ||
+ | alarmHour = displayedAlarmHour -1; | ||
+ | if (alarmHour < 0) { | ||
+ | alarmHour = 23; | ||
+ | } | ||
+ | } | ||
+ | else if (displayedAlarmMinute == 15) { | ||
+ | alarmMinute = displayedAlarmMinute - 45; | ||
+ | alarmHour = displayedAlarmHour -1; | ||
+ | if (alarmHour < 0) { | ||
+ | alarmHour = 23; | ||
+ | } | ||
+ | } | ||
+ | else if (displayedAlarmMinute == 30) { | ||
+ | alarmMinute = displayedAlarmMinute - 45; | ||
+ | alarmHour = displayedAlarmHour -1; | ||
+ | if (alarmHour < 0) { | ||
+ | alarmHour = 23; | ||
+ | } | ||
+ | } | ||
+ | else if (displayedAlarmMinute == 45) { | ||
+ | alarmMinute = displayedAlarmMinute - 45; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // 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 Byte gespeichert. | ||
+ | EEPROM.write(addrDisplayedAlarmHour, | ||
+ | EEPROM.write(addrDisplayedAlarmMinute, | ||
+ | EEPROM.write(addrAlarmHour, | ||
+ | EEPROM.write(addrAlarmMinute, | ||
+ | EEPROM.write(addrAlarmMode, | ||
+ | |||
+ | // Ausgabe an die serielle Schnittstelle | ||
+ | Serial.print(" | ||
+ | Serial.print(":" | ||
+ | Serial.print(" | ||
+ | Serial.print(":" | ||
+ | } | ||
+ | // 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; | ||
+ | } | ||
+ | else if ((tx >= 50) && (tx <= 320) && (ty >= 0) && (ty <= 59)) { | ||
+ | alarmMode = 0; | ||
+ | } | ||
+ | else if ((tx >= 50) && (tx <= 320) && (ty >= 60) && (ty <= 119)) { | ||
+ | alarmMode = 1; | ||
+ | } | ||
+ | else if ((tx >= 50) && (tx <= 320) && (ty >= 120) && (ty <= 179)) { | ||
+ | alarmMode = 2; | ||
+ | } | ||
+ | else if ((tx >= 50) && (tx <= 320) && (ty >= 180) && (ty <= 239)) { | ||
+ | alarmMode = 3; | ||
+ | } | ||
+ | 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; | ||
+ | alarmOn = false; | ||
+ | snoozeOn = false; | ||
+ | playSdWav2.stop(); | ||
+ | } | ||
+ | // Schlummern | ||
+ | else if ((tx >= 214) && (tx <= 319) && (ty >= 0) && (ty <= 239)) { | ||
+ | snoozeOn = true; | ||
+ | playSdWav2.stop(); | ||
+ | snoozeTime = now() + snoozeDelay; | ||
+ | } | ||
+ | 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(); | ||
+ | audioamp.enableChannel(false, | ||
+ | } | ||
+ | else if ((tx >= 214) && (tx <= 319) && (ty >= 0) && (ty <= 119)) { | ||
+ | // Lautstärke erhöhen | ||
+ | snoozleGain = snoozleGain + 0.1; | ||
+ | if (snoozleGain >= 0.8) { | ||
+ | snoozleGain = 0.8; | ||
+ | } | ||
+ | // | ||
+ | mixer1.gain(0, | ||
+ | mixer2.gain(0, | ||
+ | } | ||
+ | else if ((tx >= 214) && (tx <= 319) && (ty >= 120) && (ty <= 239)) { | ||
+ | // Lautstärke verringern | ||
+ | snoozleGain = snoozleGain - 0.1; | ||
+ | if (snoozleGain <= 0.0) { | ||
+ | snoozleGain = 0.0; | ||
+ | } | ||
+ | // | ||
+ | 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.fillCircle(20, | ||
+ | tft.fillCircle(20, | ||
+ | tft.fillCircle(20, | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(15, | ||
+ | tft.print(" | ||
+ | tft.setCursor(15, | ||
+ | tft.print(" | ||
+ | tft.setCursor(15, | ||
+ | tft.print(" | ||
+ | tft.setCursor(15, | ||
+ | tft.print(" | ||
+ | |||
+ | // Anzeige Uhrzeit | ||
+ | tft.setTextColor(white, | ||
+ | tft.setFont(DroidSans_13); | ||
+ | tft.setCursor(190, | ||
+ | tft.print(" | ||
+ | if (DCFtimesignalFound == true) { | ||
+ | tft.setTextColor(red, | ||
+ | tft.setFont(DroidSans_8); | ||
+ | tft.print(" | ||
+ | tft.setTextColor(white, | ||
+ | } | ||
+ | |||
+ | /* | ||
+ | // Anzeige Sonnenaufgang und Sonnenuntergang | ||
+ | tft.setTextColor(darkyellow); | ||
+ | tft.setFont(AwesomeF180_13); | ||
+ | tft.setCursor(140, | ||
+ | tft.print((char)5); | ||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_13); | ||
+ | tft.print(AufgangStunden); | ||
+ | tft.print(":" | ||
+ | if (AufgangMinuten< | ||
+ | tft.print(AufgangMinuten); | ||
+ | |||
+ | tft.setTextColor(darkblue); | ||
+ | tft.setFont(AwesomeF180_13); | ||
+ | tft.setCursor(140, | ||
+ | tft.print((char)6); | ||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_13); | ||
+ | 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(white, | ||
+ | if (alarmMode == 0) { | ||
+ | tft.setFont(DroidSans_24); | ||
+ | tft.setCursor(140, | ||
+ | tft.print(" | ||
+ | } | ||
+ | else { | ||
+ | tft.setFont(DroidSans_13); | ||
+ | tft.setCursor(180, | ||
+ | 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); | ||
+ | tft.setFont(DroidSans_13); | ||
+ | tft.setCursor(155, | ||
+ | tft.print(" | ||
+ | tft.print(alarmMode); | ||
+ | } | ||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | if (menuPage == 0 && ((unsigned long)(currentMillis - previousMillisTFTScreen) >= intervalTFTScreen)) { | ||
+ | intervalTFTScreen = 1000; | ||
+ | |||
+ | tft.fillRect(140, | ||
+ | tft.setTextColor(white, | ||
+ | tft.setCursor(150, | ||
+ | tft.setFont(DroidSans_24); | ||
+ | if(hour() < 10) { | ||
+ | tft.print(' | ||
+ | } | ||
+ | tft.print(hour()); | ||
+ | tftprintDigits(minute()); | ||
+ | tftprintDigits(second()); | ||
+ | tft.setFont(DroidSans_13); | ||
+ | tft.setCursor(180, | ||
+ | tft.print(day()); | ||
+ | tft.print(" | ||
+ | tft.print(month()); | ||
+ | tft.print(" | ||
+ | tft.print(year()); | ||
+ | |||
+ | previousMillisTFTScreen = currentMillis; | ||
+ | } | ||
+ | |||
+ | // Untermenü " | ||
+ | if (menuPage == 1 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Hauptmenü | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Optionen | ||
+ | tft.fillCircle(89, | ||
+ | tft.fillCircle(89, | ||
+ | tft.fillCircle(89, | ||
+ | tft.fillCircle(89, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_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.fillCircle(299, | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Unteruntermenü " | ||
+ | if (menuPage == 11 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Snoozlemenü | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Linke Spalte | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | |||
+ | // Rechte Spalte | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(194, | ||
+ | tft.print(" | ||
+ | tft.setCursor(194, | ||
+ | tft.print(" | ||
+ | tft.setCursor(194, | ||
+ | tft.print(" | ||
+ | tft.setCursor(194, | ||
+ | tft.print(" | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü " | ||
+ | if (menuPage == 2 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Hauptmenü | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Effekte einstellen | ||
+ | tft.setTextColor(white, | ||
+ | tft.setFont(DroidSans_8); | ||
+ | tft.setCursor(50, | ||
+ | tft.print(" | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü " | ||
+ | if (menuPage == 3 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Hauptmenü | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Linke Spalte | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | |||
+ | // Rechte Spalte | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_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 == 31 && TFTrefresh == true) { | ||
+ | | ||
+ | |||
+ | // Zurück zum " | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Optionen | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(84, | ||
+ | if (alarmAdvancetime == 15) { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(white); | ||
+ | } | ||
+ | else { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(red); | ||
+ | } | ||
+ | tft.print(" | ||
+ | |||
+ | tft.setCursor(84, | ||
+ | if (alarmAdvancetime == 30) { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(white); | ||
+ | } | ||
+ | else { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(red); | ||
+ | } | ||
+ | tft.print(" | ||
+ | |||
+ | tft.setCursor(84, | ||
+ | if (alarmAdvancetime == 45) { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(white); | ||
+ | } | ||
+ | else { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(red); | ||
+ | } | ||
+ | tft.print(" | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Unteruntermenü " | ||
+ | if (menuPage == 32 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Hauptmenü | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Linke Spalte | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | |||
+ | // Rechte Spalte | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(194, | ||
+ | tft.print(" | ||
+ | tft.setCursor(194, | ||
+ | tft.print(" | ||
+ | tft.setCursor(194, | ||
+ | tft.print(" | ||
+ | tft.setCursor(194, | ||
+ | tft.print(" | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü " | ||
+ | if (menuPage == 4 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Hauptmenü | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Linke Spalte | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | tft.fillCircle(69, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | tft.setCursor(64, | ||
+ | tft.print(" | ||
+ | |||
+ | // Rechte Spalte | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | tft.fillCircle(199, | ||
+ | |||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_12_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) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Untermenü Informationen | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | 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(white, | ||
+ | tft.print(" | ||
+ | tft.setCursor(60, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(noDCFsignal); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | } | ||
+ | else { | ||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.println(" | ||
+ | tft.setCursor(60, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(lastDCFsignal); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | } | ||
+ | |||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setCursor(60, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(receivedDCFsignals); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | |||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setCursor(60, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(DCFsuccessRate); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | |||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(millis()/ | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | |||
+ | |||
+ | tft.fillRect(60, | ||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(flankUp-PreviousflankUp); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(flankDown - flankUp); | ||
+ | |||
+ | previousMillisTFTScreen = currentMillis; | ||
+ | } | ||
+ | |||
+ | // Unteruntermenü " | ||
+ | if (menuPage == 42 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Untermenü Informationen | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | if (menuPage == 42 && ((unsigned long)(currentMillis - previousMillisTFTScreen) >= intervalTFTScreen)) { | ||
+ | intervalTFTScreen = 50; | ||
+ | |||
+ | // Datenausgabe | ||
+ | tft.setFontAdafruit(); | ||
+ | tft.setTextSize(1); | ||
+ | |||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setCursor(60, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(accelX); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(accelY); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(accelZ); | ||
+ | |||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setCursor(60, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(roll); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(pitch); | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.print(heading); | ||
+ | |||
+ | previousMillisTFTScreen = currentMillis; | ||
+ | } | ||
+ | |||
+ | // Unteruntermenü " | ||
+ | if (menuPage == 45 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Untermenü Informationen | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | if (menuPage == 45 && ((unsigned long)(currentMillis - previousMillisTFTScreen) >= intervalTFTScreen)) { | ||
+ | intervalTFTScreen = 500; | ||
+ | |||
+ | // Datenausgabe | ||
+ | tft.setFontAdafruit(); | ||
+ | tft.setTextSize(1); | ||
+ | |||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.println(ir); | ||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.println(full); | ||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.println(full - ir); | ||
+ | tft.setCursor(60, | ||
+ | tft.setTextColor(white, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(red, | ||
+ | tft.println(lux); | ||
+ | |||
+ | previousMillisTFTScreen = currentMillis; | ||
+ | } | ||
+ | |||
+ | // Unteruntermenü " | ||
+ | if (menuPage == 46 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Untermenü Informationen | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Obere Reihe des Menüs | ||
+ | tft.setTextSize(1); | ||
+ | tft.setTextColor(black, | ||
+ | tft.setCursor(35, | ||
+ | tft.print(" | ||
+ | tft.setCursor(145, | ||
+ | tft.print(" | ||
+ | |||
+ | // Bereich der Datenausgabe | ||
+ | tft.print(" | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Unteruntermenü " | ||
+ | if (menuPage == 48 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Untermenü Informationen | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Obere Reihe des Menüs | ||
+ | tft.setTextSize(1); | ||
+ | tft.setTextColor(black, | ||
+ | tft.setCursor(35, | ||
+ | tft.print(" | ||
+ | tft.setCursor(145, | ||
+ | tft.print(" | ||
+ | tft.setTextColor(white, | ||
+ | tft.setCursor(255, | ||
+ | tft.print(" | ||
+ | tft.setCursor(245, | ||
+ | tft.print(" | ||
+ | |||
+ | // Bereich der Datenausgabe | ||
+ | tft.print(" | ||
+ | tft.print(millis() / 60000); | ||
+ | tft.print(" | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü " | ||
+ | if (menuPage == 5 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Zurück zum Hauptmenü | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Wecker stellen | ||
+ | tft.fillCircle(105, | ||
+ | tft.fillCircle(214, | ||
+ | tft.fillCircle(105, | ||
+ | tft.fillCircle(214, | ||
+ | |||
+ | tft.setFont(DroidSans_13); | ||
+ | tft.setTextColor(white, | ||
+ | tft.setCursor(125, | ||
+ | tft.print(" | ||
+ | |||
+ | tft.fillRect(80, | ||
+ | tft.setFont(DroidSans_24); | ||
+ | tft.setTextColor(red, | ||
+ | tft.setCursor(90, | ||
+ | if(displayedAlarmHour < 10) { | ||
+ | tft.print(' | ||
+ | } | ||
+ | tft.print(displayedAlarmHour); | ||
+ | |||
+ | tft.setCursor(159, | ||
+ | tft.print(":" | ||
+ | |||
+ | tft.fillRect(185, | ||
+ | tft.setCursor(195, | ||
+ | if(displayedAlarmMinute < 10) { | ||
+ | tft.print(' | ||
+ | } | ||
+ | tft.print(displayedAlarmMinute); | ||
+ | |||
+ | tft.setFont(DroidSans_13); | ||
+ | tft.setTextColor(white, | ||
+ | tft.setCursor(125, | ||
+ | if (alarmMode == 0) { | ||
+ | tft.print(" | ||
+ | } | ||
+ | else if (alarmMode == 1) { | ||
+ | tft.print(" | ||
+ | } | ||
+ | |||
+ | // Weiter zur Auswahl des Programmmodus | ||
+ | tft.fillCircle(299, | ||
+ | |||
+ | tft.setTextSize(0); | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Unteruntermenü " | ||
+ | if (menuPage == 51 && TFTrefresh == true) { | ||
+ | // Zurück zum " | ||
+ | tft.fillCircle(20, | ||
+ | |||
+ | // Optionen | ||
+ | tft.setFont(DroidSans_12_Bold); | ||
+ | tft.setCursor(84, | ||
+ | if (alarmMode == 0) { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(white); | ||
+ | } | ||
+ | else { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(red); | ||
+ | } | ||
+ | tft.print(" | ||
+ | |||
+ | tft.setCursor(84, | ||
+ | if (alarmMode == 1) { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(white); | ||
+ | } | ||
+ | else { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(red); | ||
+ | } | ||
+ | tft.print(" | ||
+ | |||
+ | tft.setCursor(84, | ||
+ | if (alarmMode == 2) { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(white); | ||
+ | } | ||
+ | else { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(red); | ||
+ | } | ||
+ | tft.print(" | ||
+ | |||
+ | tft.setCursor(84, | ||
+ | if (alarmMode == 3) { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(white); | ||
+ | } | ||
+ | else { | ||
+ | tft.fillCircle(89, | ||
+ | tft.setTextColor(red); | ||
+ | } | ||
+ | tft.print(" | ||
+ | |||
+ | TFTrefresh = false; | ||
+ | } | ||
+ | |||
+ | // Untermenü " | ||
+ | if (menuPage == 7 && TFTrefresh == true) { | ||
+ | tft.fillScreen(ILI9341_BLACK); | ||
+ | |||
+ | // Wecker/ | ||
+ | tft.setTextColor(white); | ||
+ | tft.setFont(DroidSans_18_Bold); | ||
+ | if (snoozeOn == false) { | ||
+ | tft.setCursor(60, | ||
+ | tft.print(" | ||
+ | } | ||
+ | else if (snoozeOn == true) { | ||
+ | tft.setCursor(50, | ||
+ | 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(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); | ||
+ | */ | ||
+ | // Display the results (acceleration is measured in m/s^2) | ||
+ | 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(eventRoll); | ||
+ | Serial.print("; | ||
+ | Serial.print(eventPitch); | ||
+ | |||
+ | 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(DCF_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; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | 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(lastDCFsignal); | ||
+ | tft.print(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | void printDCFsyncTime() { | ||
+ | if (DCFtimesignalFound == false){ | ||
+ | Serial.print(" | ||
+ | Serial.print(noDCFsignal); | ||
+ | Serial.print(" | ||
+ | } | ||
+ | else { | ||
+ | Serial.print(" | ||
+ | Serial.print(lastDCFsignal); | ||
+ | Serial.print(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | void tftprintDCFsyncCycle() { | ||
+ | if (DCFtimesignalFound == false){ | ||
+ | tft.println(" | ||
+ | tft.print(noDCFsignal / 60); | ||
+ | tft.print(" | ||
+ | } | ||
+ | else { | ||
+ | tft.println(" | ||
+ | tft.print(lastDCFsignal /60); | ||
+ | tft.print(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | 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(millis()); | ||
+ | dataFile.print("," | ||
+ | dataFile.println(accelZ); | ||
+ | dataFile.close(); | ||
+ | // print to the serial port too: | ||
+ | Serial.print(millis()); | ||
+ | Serial.print("," | ||
+ | Serial.println(lux); | ||
+ | } | ||
+ | // if the file isn't open, pop up an error: | ||
+ | else { | ||
+ | Serial.println(" | ||
+ | } | ||
+ | } | ||
</ | </ | ||
+ | |||
+ | Der Sketch verwendet 119.152 Bytes (11%) des Programmspeicherplatzes. Das Maximum sind 1.048.576 Bytes. | ||
+ | Globale Variablen verwenden 35.556 Bytes (13%) des dynamischen Speichers, 226.588 Bytes für lokale Variablen verbleiben. Das Maximum sind 262.144 Bytes. | ||
+ | |||
+ | {{tag> |
arduino/schlafphasenwecker/programmversion_0.6.txt · Zuletzt geändert: 18.05.2023 12:34 von 127.0.0.1