Da hier viele sehr kompetente Leute unterwegs sind, stelle ich direkt mal meine nächsten Fragen ![]()
Ich habe nebenher ein kleineres Projekt laufen. Ich möchte ganz gern einen Wecker bauen, mit TFT-Display und einer hellen LED, die so eine halbe Stunde oder so vor der eigentlichen Weckzeit ganz langsam heller wird. Evtl auch mal Temperatur-Sensoren oder so. Soweit so gut.
Diesbezüglich hab ich hab ich erstmal wieder ziemlich einfach angefangen, ich hab mir ein Adafruit 1,8" TFT geschnappt, ein RTC-Modul, und das ganze mit einem Arduino Nano zusammengesteckt.
Momentan ist das ganze nur mal zum Erfahrungen sammeln und Lernen da.
Ein vorläufiger Code, der einfach nur Zeit und Datum anzeigt sieht so aus:
// Includes
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
// Settings
String Clock_Version = "0.1";
unsigned long intervall_timecheck = 100;
int color_clock = ST7735_BLUE;
int color_date = ST7735_BLUE;
int color_text = ST7735_RED;
int color_background = ST7735_BLACK;
int color_secs = ST7735_RED;
int size_secs = 5;
int pos_secs_x = 155;
int pos_secs_y = 5;
int font_size_def_x = 5;
int font_size_def_y = 7;
int font_size_clock = 5;
int font_size_text = 1;
int font_size_date = 1;
int pos_text_x = 0;
int pos_text_y = 30;
int pos_clock_x = 0;
int pos_clock_y = 50;
int pos_date_x = 0;
int pos_date_y = 100;
// Pins
#define TFT_CS 6
#define TFT_RST 8
#define TFT_DC 7
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// Systemvariablen
int alt_day = 0;
int alt_month = 0;
int alt_year = 0;
String alt_dow;
int alt_hour = 0;
int alt_min = 0;
int alt_sec = 0;
int new_day = 0;
int new_month = 0;
int new_year = 0;
String new_dow;
int new_hour = 0;
int new_min = 0;
int new_sec = 0;
int stat_secs = 0;
unsigned long last_timecheck = 0;
RTC_DS1307 RTC;
void setup(void)
{
Wire.begin();
RTC.begin();
if (! RTC.isrunning())
{RTC.adjust(DateTime(__DATE__, __TIME__));}
tft.initR(INITR_BLACKTAB);
tft.fillScreen(color_background);
tft.setRotation(1);
tft.setTextWrap(false);
tft.setCursor(pos_text_x, pos_text_y);
tft.setTextColor(color_text);
tft.setTextSize(font_size_text);
tft.print("TFT-Clock V");
tft.print(Clock_Version);
int pos_dotdot_x = pos_clock_x + (font_size_clock * 2) + (font_size_clock * font_size_def_x * 2);
tft.setCursor(pos_dotdot_x, pos_clock_y);
tft.setTextColor(color_clock);
tft.setTextSize(font_size_clock);
tft.print(":");
}
void loop(void)
{
if(millis() > last_timecheck + intervall_timecheck)
{
displayTime();
last_timecheck = millis();
}
}
void displayTime()
{
DateTime datetime=RTC.now();
new_day = datetime.day(),DEC;
new_month = datetime.month(),DEC;
new_year = datetime.year(),DEC;
new_dow = get_day_of_week(datetime.dayOfWeek());
new_hour = datetime.hour(),DEC;
new_min = datetime.minute(),DEC;
new_sec = datetime.second(),DEC;
if(new_hour != alt_hour)
{
tft.setTextSize(font_size_clock);
tft.setCursor(pos_clock_x, pos_clock_y);
tft.setTextColor(color_background);
if(alt_hour<10)tft.print(0);
tft.print(alt_hour);
tft.setCursor(pos_clock_x, pos_clock_y);
tft.setTextColor(color_clock);
if(new_hour<10)tft.print(0);
tft.print(new_hour);
alt_hour = new_hour;
}
if(new_min != alt_min)
{
int pos_min_x = pos_clock_x + (font_size_clock * font_size_def_x * 3) + (font_size_clock * 3);
tft.setTextSize(font_size_clock);
tft.setCursor(pos_min_x, pos_clock_y);
tft.setTextColor(color_background);
if(alt_min<10)tft.print(0);
tft.print(alt_min);
tft.setCursor(pos_min_x, pos_clock_y);
tft.setTextColor(color_clock);
if(new_min<10)tft.print(0);
tft.print(new_min);
alt_min = new_min;
}
if(new_sec != alt_sec)
{
if (stat_secs == 0)
{
tft.fillCircle(pos_secs_x, pos_secs_y, size_secs, color_secs);
stat_secs = 1;
}
else
{
tft.fillCircle(pos_secs_x, pos_secs_y, size_secs, color_background);
stat_secs = 0;
}
alt_sec = new_sec;
}
if(new_day != alt_day)
{
tft.setTextSize(1);
tft.setCursor(pos_date_x, pos_date_y);
tft.setTextColor(ST7735_BLACK);
tft.print(alt_dow);
tft.print(", ");
if(alt_day<10)tft.print(0);
tft.print(alt_day);
tft.print(".");
if(alt_month<10)tft.print(0);
tft.print(alt_month);
tft.print(".");
tft.print(alt_year);
tft.setTextSize(1);
tft.setCursor(pos_date_x, pos_date_y);
tft.setTextColor(ST7735_BLUE);
tft.print(new_dow);
tft.print(", ");
if(new_day<10)tft.print(0);
tft.print(new_day);
tft.print(".");
if(new_month<10)tft.print(0);
tft.print(new_month);
tft.print(".");
tft.print(new_year);
alt_day = new_day;
alt_month = new_month;
alt_year = new_year;
alt_dow = new_dow;
}
}
String get_day_of_week(uint8_t dow)
{
String dows=" ";
switch(dow)
{
case 0: dows="So"; break;
case 1: dows="Mo"; break;
case 2: dows="Di"; break;
case 3: dows="Mi"; break;
case 4: dows="Do"; break;
case 5: dows="Fr"; break;
case 6: dows="Sa"; break;
}
return dows;
}
Jaja ich weiß, diese Mischung aus deutschen und englischen Namen für die Variablen, grausam ![]()
Aber die Sache funktioniert sehr schön und zuverlässig.
Jetzt hab ich aber 2 Punkte die mir Sorgen machen:
-
Selbst über Hardware-SPI ist das Display sehr langsam. Ich hab jetzt so programmiert, dass immer nur die Teile, die sich tatsächlich ändern, erst mit der Hintergrundfarbe überschrieben werden und dann neu geschrieben werden. Aber selbst da flackert es noch ganz schön auch wenn sich nur die Minute ändert. Die zweite Möglichkeit wäre noch, den Teil direkt zu überschreiben und die Hintergrundfarbe mit anzugeben, aber ob das schneller geht wage ich mal zu bezweifeln.
Wenn ich dann mal Menüs einbaue usw könnte das durchaus zu einer hässlichen Angelegenheit werden. Ich stelle mir das so vor dass ich auf "Menü" drücke um den Wecker einzustellen und dann jedesmal 2sec. dem Display zuschaue wie es die neue Seite aufbaut. Das möchte ich eigentlich nicht.
Gibt es da eine Option? Wäre vielleicht ein Leonardo bzw Micro schneller? Oder vielleicht gleich ein Due, wobei der ja wirklich hoffnungslos überdimensioniert wäre
-
Meines Wissens geht die Hintergrundbeleuchtung nicht per Software zum Abschalten, oder gibts da inzwischen eine Möglichkeit? Die Beleuchtung hat auch keinen extra herausgeführten Pin auf der Platine.
Ich möchte die Beleuchtung aber unbedingt abschalten können, da das Display Nachts definitiv zu hell ist... Die letzte Möglichkeit wäre vermutlich eine Leiterbahn auf der Platine aufzutrennen, aber das will ich eigentlich nicht unbedingt.
Sollte ich die Idee mit dem TFT vielleicht wieder verwerfen und einfach auf ein LCD umsteigen? Oder gibts irgendwie schnellere Alternativen?
Ich finde halt LCDs nicht wirklich schön...


