arduino:schlafphasenwecker:programmversion_0.2
Schlafphasenwecker Programmversion 0.2
Achtung
Dies ist eine alte Programmversion.
Diese Programmversion behebt kleinere Fehler der Programmversion 0.1 und bindet den kapazitiven Touchscreen und den TSL2591 ein. Der Sketch enthält ein experimentelles Menü, das sich über den Touchsensor bedienen lässt. Wie bei dem Programmmodustaster derNeoPixel-Beleuchtung für meinen PC wird die ausgewählte Aktion erst beim Loslassen des Touchscreens ausgeführt, um Fehlbedienungen zu vermeiden.
Hilfreiche Links:
// Schlafphasenwecker Version 0.2
// Bibliotheken einbinden
#include <TimeLib.h> // Stellt verschiedene Zeitfunktionen zur Verfügung
#include "DCF77.h" // Bibliothek für das DCF77-Modul
#include <Adafruit_GFX.h> // Core graphics library
#include <SPI.h> // this is needed for display
#include <Adafruit_ILI9341.h> // TFT-Display
#include <Wire.h> // this is needed for FT6206
#include <Adafruit_FT6206.h> // Kapazitiver Touchsensor
#include <Adafruit_Sensor.h> // Adafruit Unified Sensor Driver
#include "Adafruit_TSL2591.h" // Bibliothek für den TSL2591
// Definiert die Pins
#define DCF_PIN 2 // Connection pin to DCF 77 device
#define DCF_INTERRUPT 2 // Interrupt number associated with pin
// Definiert die DCF77-Bibliothek
DCF77 DCF = DCF77(DCF_PIN, DCF_INTERRUPT, false);
// The FT6206 uses hardware I2C (SCL/SDA)
Adafruit_FT6206 ctp = Adafruit_FT6206();
// The display also uses hardware SPI, plus #9 & #10
#define TFT_CS 10
#define TFT_DC 9
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// pass in a number for the sensor identifier (for your use later)
Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591);
// Definiert die Variablen
bool DCFTimeFound = false; // wurde ein gueltiges Signal gefunden
time_t DCFtime = 0;
time_t t = 0;
const unsigned long DefaultTime = 1477958400; // Nov 1 2016
unsigned long lastDCFsignal;
unsigned long noDCFsignal;
unsigned long currentDCFsignal;
uint16_t ir;
uint16_t full;
uint32_t lum;
int menuePage = 0; // Nummer des Menüs. Das Menü mit der Nummer 0 soll zuerst aufgerufen werden.
int touchtouched = 0; // Touchscreen gedrückt?
int tx;
int ty;
int debouncetime = 50; // Zeit für Entprellung
unsigned long touchtime = 0;
// Definiert die Tracking-Variablen für die IF-Abfragen
unsigned long previousMillisSetRTC = 0;
unsigned long previousMillisTFTScreen = 0;
unsigned long previousMillisTouchScreen = 0;
unsigned long previousMillisSensorData = 0;
unsigned long previousMillisSerialPrint = 0;
// Definiert die Intervalle für die IF-Abfragen
int intervalSetRTC = 1000; // Delay für Holen der Zeit
int intervalTFTScreen = 50; // Delay für Anteuerung des TFT-Screens
int intervalTouchScreen = 50; // Delay für Anteuerung des kapazitiven Touchsreens
int intervalSensorData = 1000; // Delay für Auslesen der Sensoren
int intervalSerialPrint = 1000; // Delay für serielle Ausgabe
void setup() {
// Initalisiert die Pins
//pinMode(PIN_LED, OUTPUT); // On-board LED
pinMode(DCF_PIN, INPUT_PULLUP); // DFC77-Modul
// set the Time library to use Teensy 3.0's RTC to keep time
setSyncProvider(getTeensy3Time);
// Initialisiert den TFT-Bildschirm
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
// Initialisiert die serielle Schnittstelle
Serial.begin(115200);
delay(100); // Kurze Pause, weil sonst der serielle Monitor noch nicht bereit ist. Der soll aber auch keine Voraussetzung sein.
if (timeStatus()!= timeSet) {
Serial.println("Unable to sync with the RTC");
} else {
Serial.println("RTC has set the system time");
}
if (! ctp.begin(40)) { // Stellt u.a. die Sensitivität des Touchscreens ein
Serial.println("Couldn't start FT6206 touchscreen controller");
//while (1);
} else {
Serial.println("Capacitive touchscreen started");
}
// Konfiguration des TSL2591
// You can change the gain on the fly, to adapt to brighter/dimmer light situations
//tsl.setGain(TSL2591_GAIN_LOW); // 1x gain (bright light)
tsl.setGain(TSL2591_GAIN_MED); // 25x gain
// tsl.setGain(TSL2591_GAIN_HIGH); // 428x gain
// 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); // shortest integration time (bright light)
// 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); // longest integration time (dim light)
// Startet die Abfrage des DCF77-Moduls
DCF.Start();
Serial.println("Waiting for DCF77 time ... ");
Serial.println("It will take at least 2 minutes until a first update can be processed.");
// Initialisiert den TSL2591
tsl.begin(); //Lichtsensor
}
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(); // Check if new DCF77 time is available
// Wenn die serielle Schnittstelle verfügbar ist, setze die RTC auf diese Zeit
if (Serial.available() && DCFtime < DefaultTime) {
t = processSyncMessage();
if (t != 0) {
Teensy3Clock.set(t); // set the RTC
setTime(t);
}
}
// Wenn ein Zeitsignal vom DCF77-Modul verfügbar ist, setze die RTC auf diese Zeit
if (DCFtime > DefaultTime) {
t = DCFtime;
Serial.println("RTC has been updated to DCF77 time");
Teensy3Clock.set(t); // set the RTC
setTime(t);
DCFTimeFound = true;
currentDCFsignal = millis();
}
// Berechne die Zeit (in Sekunden) die seit dem Empfang des letzten gültigen DCF-Signals vergangen ist
if (DCFTimeFound == false) {
noDCFsignal = millis() /1000;
}
else {
lastDCFsignal = (millis() - currentDCFsignal) / 1000;
}
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisSetRTC = currentMillis;
}
// Sensoren /TSL 2591
if ((unsigned long)(currentMillis - previousMillisSensorData) >= intervalSensorData) {
//Auslesen des Helligkeitssensors
lum = tsl.getFullLuminosity();
ir = lum >> 16;
full = lum & 0xFFFF;
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisSensorData = currentMillis;
}
// TFT-Screen
if ((unsigned long)(currentMillis - previousMillisTFTScreen) >= intervalTFTScreen) {
// Hauptmenü (weiß)
if (menuePage == 0) {
//tft.fillScreen(ILI9341_BLACK);
tft.fillRect(0, 0, 106, 30, ILI9341_RED);
tft.fillRect(107, 0, 106, 30, ILI9341_YELLOW);
tft.fillRect(214, 0, 106, 30, ILI9341_GREEN);
}
// Untermenü 1 (rot)
if (menuePage == 1) {
//tft.fillScreen(ILI9341_BLACK);
tft.fillRect(0, 0, 106, 30, ILI9341_WHITE);
tft.fillRect(107, 0, 106, 30, ILI9341_YELLOW);
tft.fillRect(214, 0, 106, 30, ILI9341_GREEN);
}
// Untermenü 2 (gelb)
if (menuePage == 2) {
//tft.fillScreen(ILI9341_BLACK);
tft.fillRect(0, 0, 106, 30, ILI9341_WHITE);
tft.fillRect(107, 0, 106, 30, ILI9341_RED);
tft.fillRect(214, 0, 106, 30, ILI9341_GREEN);
}
// Untermenü 3 (grün)
if (menuePage == 3) {
//tft.fillScreen(ILI9341_BLACK);
tft.fillRect(0, 0, 106, 30, ILI9341_WHITE);
tft.fillRect(107, 0, 106, 30, ILI9341_RED);
tft.fillRect(214, 0, 106, 30, ILI9341_YELLOW);
}
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisTFTScreen = currentMillis;
}
// Touchscreen
if ((unsigned long)(currentMillis - previousMillisTouchScreen) >= intervalTouchScreen) {
// Wait for a touch
if (ctp.touched()) {
// Retrieve a point
TS_Point p = ctp.getPoint();
touchtime = millis(); // aktualisiere Touchzeit
touchtouched = 1;
// Damit der Wert 0, 0 des Touchsensors mit dem Pixel 0, 0 des TFT-Screens übereinstimmt, müssen p.x und p.y rekodiert werden
tx = map(p.y, 0, 320, 320, 0);
ty = p.x;
}
if (menuePage == 0 && touchtouched == 1 && (millis() - touchtime > debouncetime)) { // Wenn Menüseite 0 ausgewählt und der Touchscreen berührt wird und die debouncetime verstrichen ist ...
if ((tx >= 0) && (tx <= 106) && (ty >= 0) && (ty <= 30)) { // ... und der TouchScreen in dem angegebenen Bereich berührt wird ...
tft.drawRect(0, 0, 106, 30, ILI9341_BLACK);
menuePage = 1; // ... dann rufe Menüseite 1 auf.
}
else if ((tx >= 107) && (tx <= 213) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(107, 0, 106, 30, ILI9341_BLACK);
menuePage = 2;
}
else if ((tx >= 214) && (tx <= 320) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(214, 0, 106, 30, ILI9341_BLACK);
menuePage = 3;
}
touchtouched = 0; // Setze die Varibale auf 0, damit nicht die nächste if-Schleife aufgerufen wird
}
if (menuePage == 1 && touchtouched == 1 && (millis() - touchtime > debouncetime)) {
if ((tx >= 0) && (tx <= 106) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(0, 0, 106, 30, ILI9341_BLACK);
menuePage = 0;
}
else if ((tx >= 107) && (tx <= 213) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(107, 0, 106, 30, ILI9341_BLACK);
menuePage = 2;
}
else if ((tx >= 214) && (tx <= 320) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(214, 0, 106, 30, ILI9341_BLACK);
menuePage = 3;
}
touchtouched = 0;
}
if (menuePage == 2 && touchtouched == 1 && (millis() - touchtime > debouncetime)) {
if ((tx >= 0) && (tx <= 106) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(0, 0, 106, 30, ILI9341_BLACK);
menuePage = 0;
}
else if ((tx >= 107) && (tx <= 213) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(107, 0, 106, 30, ILI9341_BLACK);
menuePage = 1;
}
else if ((tx >= 214) && (tx <= 320) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(214, 0, 106, 30, ILI9341_BLACK);
menuePage = 3;
}
touchtouched = 0;
}
if (menuePage == 3 && touchtouched == 1 && (millis() - touchtime > debouncetime)) {
if ((tx >= 0) && (tx <= 106) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(0, 0, 106, 30, ILI9341_BLACK);
menuePage = 0;
}
else if ((tx >= 107) && (tx <= 213) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(107, 0, 106, 30, ILI9341_BLACK);
menuePage = 1;
}
else if ((tx >= 214) && (tx <= 320) && (ty >= 0) && (ty <= 30)) {
tft.drawRect(214, 0, 106, 30, ILI9341_BLACK);
menuePage = 2;
}
touchtouched = 0;
}
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisTouchScreen = currentMillis;
}
// 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());
printDCFsyncTime();
Serial.print(menuePage);
Serial.println();
//Speichere die aktuelle Zeit in die zughörige Variable
previousMillisSerialPrint = currentMillis;
}
}
time_t getTeensy3Time()
{
return Teensy3Clock.get();
}
/* code to process time sync messages from the serial port */
#define TIME_HEADER "T" // Header tag for serial time sync message
unsigned long processSyncMessage() {
unsigned long pctime = 0L;
if(Serial.find(TIME_HEADER)) {
pctime = Serial.parseInt();
return pctime;
if( pctime < DefaultTime) { // check the value is a valid time (greater than Nov 1 2016)
pctime = 0L; // return 0 to indicate that the time is not valid
}
}
return pctime;
}
void tftprintDigits(int digits) {
// utility function for digital clock display: prints preceding colon and leading 0
tft.print(":");
if(digits < 10)
tft.print('0');
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('0');
Serial.print(digits);
}
void tftprintDCFsyncTime() {
if (DCFTimeFound == false){
tft.println("Kein Zeitsignal empfangen seit ");
tft.print(noDCFsignal);
tft.print(" Sek.");
}
else {
tft.println("Zeitsignal empfangen vor ");
tft.print(lastDCFsignal);
tft.print(" Sek.");
}
}
void printDCFsyncTime() {
if (DCFTimeFound == false){
Serial.print(" no DCF77 sync since ");
Serial.print(noDCFsignal);
Serial.print(" sec.");
}
else {
Serial.print(" last DCF77 sync ");
Serial.print(lastDCFsignal);
Serial.print(" sec. ago");
}
}
Der Sketch verwendet 42.108 Bytes (4%) des Programmspeicherplatzes. Das Maximum sind 1.048.576 Bytes. Globale Variablen verwenden 6.216 Bytes (2%) des dynamischen Speichers, 255.928 Bytes für lokale Variablen verbleiben. Das Maximum sind 262.144 Bytes.
arduino/schlafphasenwecker/programmversion_0.2.txt · Zuletzt geändert: 18.05.2023 12:34 von 127.0.0.1