Hallo zusammen,
Kurz zu mir Mein Name ist Mathias, 44 Jahre, Grob aus der Nähe vonm Dortmund.
ich bin ganz neu hier und ziemlich neu im programmieren.
Jetzt benötige ich wohl eure Hilfe.
Bisher hab ich einige kleinere Projekte dank guten Beispielen und viel Code übernehmen hinbekommen.
Jetzt baue ich eine Uhr oder auch einen Wecker der sich Zeit und Datum aus dem Netz holt,
Die Uhr zeigt Nachts einfsch nur "Schlaf weiter" an und keine Uhrzeit.
Ist ein Geschenk für eine Freundin, die Probleme mit dem wieder Einschlafen hat, wenn sie erstmal die Uhrzeit gesehen hat.
Es klappt auch alles so wie ich es geplant habe, nur wird das Display mit jedem loop durchlauf aktualisiert. Dadurch flackert es furchtbar.
Ich habe keine Ahnung, wie ich das beheben kann, außer durch ein Delay am Ende des Codes. Das ist aber nicht schön finde ich und es flackert ja trotzdem im delay tackt.
hier mal der Code den ich bisher zusammen gewürfelt habe.
#include "time.h"
//#include <SPI.h>
#include <TFT_eSPI.h>
#include <WiFiMulti.h>
#include "Arduino.h"
WiFiMulti wifiMulti;
TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0; // Saved H, M, S x & y multipliers
float sdeg = 0, mdeg = 0, hdeg = 0;
uint32_t targetTime = 0; // for next 1 second timeout
bool initial = 1;
static uint8_t conv2d(const char* p) {
uint8_t v = 0;
if ('0' <= *p && *p <= '9')
v = *p - '0';
return 10 * v + *++p - '0';
}
uint8_t hh = conv2d(__TIME__), mm = conv2d(__TIME__ + 3), ss = conv2d(__TIME__ + 6); // Get H, M, S from compile time
// statischeIP = false -> IP-Adresse über DHCP vergeben
// statischeIP = true -> statische IP festlegen
// ip und gateway müssen an das lokale Netz angepasst werden
bool statischeIP = true;
IPAddress ip(192, 168, 0, 200);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
/*
öffentliche DNS-Server
-----------------------------------------------
OpenDNS 208, 67, 222, 222 (USA)
Google 8, 8, 8, 8 (USA)
Cloudfare 1, 1, 1, 1 (USA)
DNSWWatch 84, 200, 69, 80 (Deutschland)
Quad9 9, 9, 9, 9 (Schweiz)
Neustar UltraDNS 56, 154, 70, 3 (USA, gefiltert)
Deutsche Telekom 217, 5,100,185
------------------------------------------------
oder die im Router eingetragene IP
im Beispiel: 192, 168, 1, 20
*/
IPAddress primaryDNS(217, 5, 100, 152);
IPAddress secondaryDNS(9, 9, 9, 9);
// NTP-Server aus dem Pool
#define Zeitserver "de.pool.ntp.org"
/*
Liste der Zeitzonen
https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
CEST = Central European Summer Time von
M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
#define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"
// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit;
/*
Struktur tm
tm_hour -> Stunde: 0 bis 23
tm_min -> Minuten: 0 bis 59
tm_sec -> Sekunden 0 bis 59
tm_mday -> Tag 1 bis 31
tm_wday -> Wochentag (0 = Sonntag, 6 = Samstag)
tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
tm_year -> Jahre seit 1900
tm_yday -> vergangene Tage seit 1. Januar des Jahres
tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;
WiFiServer Server(80);
WiFiClient Client;
void setup() {
targetTime = millis() + 1000;
// Zeitzone: Parameter für die zu ermittelnde Zeit
configTzTime(Zeitzone, Zeitserver);
Serial.begin(115200);
tft.begin();
{
tft.init();
tft.setRotation(-45);
tft.setCursor(30, 8, 6);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREEN, TFT_BLACK); // Adding a black background colour erases previous text automatically
}
wifiMulti.addAP("ABC", "123");
wifiMulti.addAP("DEF", "456");
wifiMulti.addAP("GHI", "789");
Serial.println("Connecting Wifi...");
if (wifiMulti.run() == WL_CONNECTED) {
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
}
void loop() {
uint16_t t_x = 0, t_y = 0;
bool pressed = tft.getTouch(&t_x, &t_y);
if (pressed) {
tft.fillScreen(TFT_BLACK);
tft.print("Test");
Serial.println("X= " + String(t_x) + " | Y= " + String(t_y));
}
time(&aktuelleZeit);
// localtime_r -> Zeit in die lokale Zeitzone setzen
localtime_r(&aktuelleZeit, &Zeit);
// es kann bis zu 30 Sekunden dauern
// bis die Zeit ermittelt wird
tft.fillScreen(TFT_BLACK);
tft.setCursor(15, 20, 4);
tft.setTextSize(2);
if ((Zeit.tm_hour <= 5) || (Zeit.tm_hour >= 21)) {
tft.setSwapBytes(true);
tft.print("Schlaf weiter");
}
else {
// Name des Wochentages 0-6
switch (Zeit.tm_wday) {
case 0:
tft.setCursor(65, 20, 4);
tft.fillScreen(TFT_BLACK);
tft.print("Sonntag");
break;
case 1:
tft.setCursor(65, 20, 4);
tft.fillScreen(TFT_BLACK);
tft.print("Montag");
break;
case 2:
tft.setCursor(65, 20, 4);
tft.fillScreen(TFT_BLACK);
tft.print("Dienstag");
break;
case 3:
tft.setCursor(65, 20, 4);
tft.fillScreen(TFT_BLACK);
tft.print("Mittwoch");
break;
case 4:
tft.setCursor(55, 20, 4);
tft.fillScreen(TFT_BLACK);
tft.print("Donnerstag");
break;
case 5:
tft.setCursor(65, 20, 4);
tft.fillScreen(TFT_BLACK);
tft.print("Freitag");
break;
case 6:
tft.setCursor(65, 20, 4);
tft.fillScreen(TFT_BLACK);
tft.print("Samstag");
break;
}
// Datum und Zeit
tft.setCursor(75, 90, 2);
// Tag
if (Zeit.tm_mday < 10) tft.print("0");
tft.print(Zeit.tm_mday);
tft.print(".");
// Monat
if ((Zeit.tm_mon + 1) < 10) tft.print("0");
tft.print(Zeit.tm_mon + 1);
tft.print(".");
// Jahr
tft.print(Zeit.tm_year + 1900);
tft.print(" ");
// Stunde
tft.setCursor(85, 140, 4);
if (Zeit.tm_hour < 10)
tft.print("0");
tft.print(Zeit.tm_hour);
tft.print(":");
// Minute
if (Zeit.tm_min < 10) tft.print("0");
tft.print(Zeit.tm_min);
//delay(5000);
}
}
Der Bereich mit dem Touch wird noch weiter bearbeitet, der ist noch nicht fertig.
damit will ich später einen Pin auf high schalten um eine LED zu steuern.
Vielen Dank schon mal für eure Hilfe und einen guten Rutsch.
LG Mathias
