Hallo liebes Forum,
Ich verwende für den Arduino GIGA Schild, die Arduino_GigaDisplay_GFX die, die Adafruit-GFX-Library intern mit einbindet, allerdings habe ich das Problem bei den mitgelieferten Fonts sowohl als auch bei den Custom Fonts das die Schriften ununterbrochen flackern, durch das übermalen des alten Textes beim Anzeigen von Datum der RTC habe ich das semi gut beheben können indem der Text erst übermalt wird wenn sich der Text auch wirklich ändert das geht auch flackert dann nur noch 1x in der Minute satt alle 2 Sekunden. ich möchte aber auch werte eines SHT31 Sensors auslesen dort geht das nicht so einfach, da der Sensor Parament Werte liefert.
kennt da jemand einen Workaround das Flackern mit der Adafruit-GFX-Library in den Griff zu bekommen? Oder gibt es für das GIGA Shield eine Alternative die mit Schriften, Farben und Bitmaps/bmps umgehen kann?
Hier ist noch mein aktueller Code:
#include "Arduino_GigaDisplay_GFX.h"
GigaDisplay_GFX display;
#include <Arduino_GigaDisplay.h>
GigaDisplayRGB rgb;
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
#include <Adafruit_SHT31.h>
Adafruit_SHT31 sht31 = Adafruit_SHT31();
#define RED 0xf800
#define BLUE 0x459F
#define WHITE 0xffff
#define BLACK 0x0000
#include "bitmap.h"
#include <Fonts/calibri40pt7b.h> // Beispiel einer Schriftart
const int motionSensorPin = 2; // Pin, an den der AM312 Bewegungsmelder angeschlossen ist
const int backlightPin = D74; // Pin für die Steuerung der Hintergrundbeleuchtung
unsigned long motionDetectedTime = 0; // Zeit, zu der die letzte Bewegung erkannt wurde
const unsigned long backlightDuration = 5000; // 5 Minuten in Millisekunden
bool isBacklightOn = false; // Status der Hintergrundbeleuchtung
boolean isSummer; // Globale Variable deklarieren
void adjustForDST(DateTime &d)
{
if (isSummer)
{
d = d + TimeSpan(0,1,0,0);
}
}
void setup()
{
pinMode(motionSensorPin, INPUT); // Setze den Bewegungsmelder-Pin als Eingang
pinMode(backlightPin, OUTPUT); // Setze den Hintergrundbeleuchtungs-Pin als Ausgang
digitalWrite(backlightPin, LOW); // Stelle sicher, dass die Hintergrundbeleuchtung zu Beginn ausgeschaltet ist
Wire.begin(); // SDA an Pin 20, SCL an Pin 21
rtc.begin();
sht31.begin(0x44);
display.begin();
display.setRotation(1); // 1: 90 Grad im Uhrzeigersinn drehen, 2: 180 Grad, 3: 270 Grad
display.fillScreen(BLUE);
display.drawRGBBitmap(15, 150, bitmap, 528, 104);
rgb.begin();
}
void loop()
{
readAndPrintRTC();
backlightOnOff(); // Rufe die Funktion zur Steuerung der Hintergrundbeleuchtung auf
//LEDfedback_receivingDATA();
//readAndPrintSensorData();
}
void backlightOnOff() {
int motionState = digitalRead(motionSensorPin); // Lese den Zustand des Bewegungsmelders
if (motionState == HIGH) { // Wenn Bewegung erkannt wird
motionDetectedTime = millis(); // Speichere die aktuelle Zeit
if (!isBacklightOn) { // Wenn die Hintergrundbeleuchtung nicht bereits eingeschaltet ist
digitalWrite(backlightPin, HIGH); // Schalte die Hintergrundbeleuchtung ein
isBacklightOn = true; // Aktualisiere den Status
}
}
// Prüfe, ob die 5 sek vergangen sind, seit die letzte Bewegung erkannt wurde
if (isBacklightOn && (millis() - motionDetectedTime >= backlightDuration)) {
digitalWrite(backlightPin, LOW); // Schalte die Hintergrundbeleuchtung aus
isBacklightOn = false; // Aktualisiere den Status
}
}
/*
void LEDfedback_receivingDATA()
{
rgb.on(0, 255, 0);
delay(250);
rgb.off();
}
void readAndPrintSensorData()
{
float Temperatur = sht31.readTemperature();
float Luftfeuchtigkeit = sht31.readHumidity();
tft.drawString(String(Temperatur, 1) + " °C", 223, 305); // IN Temp
tft.setTextPadding(tft.textWidth("888 8"));
tft.drawString(String((int)Luftfeuchtigkeit) + " %", 463 , 305); // IN Humidity
}
*/
void check_SummerTime()
{
DateTime now = rtc.now();
isSummer = summertime_EU(now.year(), now.month(), now.day(), now.hour(), 1);
}
boolean summertime_EU(int year, byte month, byte day, byte hour, byte tzHours)
{
if (month < 3 || month > 10) return false;
if (month > 3 && month < 10) return true;
if (month == 3 && (hour + 24 * day) >= (1 + tzHours + 24 * (31 - (5 * year / 4 + 4) % 7)) || month == 10 && (hour + 24 * day) < (1 + tzHours + 24 * (31 - (5 * year / 4 + 1) % 7)))
return true;
else
return false;
}
char lastTimeDisplay[15] = "";
char lastDateDisplay[15] = "";
void readAndPrintRTC()
{
DateTime now = rtc.now();
check_SummerTime(); // Aufruf der Funktion zur Überprüfung der Sommerzeit
adjustForDST(now);
char dateDisplay[15];
char timeDisplay[15];
sprintf(dateDisplay, "%.02d.%.02d.%.2d", now.day(), now.month(), now.year());
sprintf(timeDisplay, "%.02d:%02d", now.hour(), now.minute());
if (strcmp(timeDisplay, lastTimeDisplay) != 0)
{
display.fillRect(10, 20, 220, 70, BLACK);
display.setTextColor(WHITE);
display.setFont(&calibri40pt7b);
display.setCursor(10, 70);
display.print(timeDisplay);
strcpy(lastTimeDisplay, timeDisplay); // Speichere den aktuellen Zeitstring
}
if (strcmp(dateDisplay, lastDateDisplay) != 0)
{
display.fillRect(240, 20, 150, 70, BLACK);
display.setTextColor(WHITE);
display.setFont(&calibri40pt7b);
display.setCursor(240, 70);
display.print(dateDisplay);
strcpy(lastDateDisplay, dateDisplay); // Speichere den aktuellen Datumsstring
}
}
Ich sage schonmal vielen Dank im Voraus😊