#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <WiFi.h>
#include <time.h>
#include <qrcode.h>
#include <QRCodeGenerator.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 128
#define OLED_RESET -1 // Reset-Pin des OLED, falls benötigt
Adafruit_SH1107 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int scaler = 3;
// WLAN-Zugangsdaten
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// NTP-Server und Zeitzone
const char* ntpServer = "pool.ntp.org";
const char* timeZone = "CET-1CEST,M3.5.0/2,M10.5.0/3"; // Automatische Sommer-/Winterzeitregelung
void connectToWiFi() {
Serial.print("Verbinde mit WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi verbunden!");
Serial.print("IP-Adresse: ");
Serial.println(WiFi.localIP());
}
void setup() {
Wire.begin();
Serial.begin(115200);
// OLED initialisieren
if (!display.begin(0x3C, true)) { // I2C-Adresse 0x3C
Serial.println("Display konnte nicht initialisiert werden.");
while (1);
}
display.clearDisplay();
// Mit WiFi verbinden
connectToWiFi();
// NTP-Zeit initialisieren mit automatischer Sommer-/Winterzeitregelung
configTzTime(timeZone, ntpServer);
// Warte, bis die Zeit synchronisiert ist
Serial.println("Synchronisiere Zeit...");
struct tm timeinfo;
while (!getLocalTime(&timeinfo)) {
Serial.println("Zeit konnte nicht abgerufen werden. Versuche erneut...");
delay(1000);
}
Serial.println("Zeit erfolgreich synchronisiert!");
}
void loop() {
// Lokale Zeit abrufen
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Fehler beim Abrufen der Zeit");
return;
}
// Zeit als String formatieren
char timeString[9];
strftime(timeString, sizeof(timeString), "%H:%M:%S", &timeinfo);
// QR-Code erstellen
QRCode qrcode;
uint8_t qrcodeData[qrcode_getBufferSize(3)];
qrcode_initText(&qrcode, qrcodeData, 3, 0, timeString);
// Display löschen
display.clearDisplay();
// QR-Code auf das Display zeichnen
int offsetX = 0;
int offsetY = 5;
int sizeofQR = qrcode.size * scaler;
for (uint8_t y = 0; y < sizeofQR; y++) {
for (uint8_t x = 0; x < sizeofQR; x++) {
if (qrcode_getModule(&qrcode, x / scaler, y / scaler)) {
for (int z = 0; z < scaler; z++) {
display.writePixel(offsetX + x, offsetY + y + z, SH110X_WHITE);
}
} else {
for (int z = 0; z < scaler; z++) {
display.writePixel(offsetX + x, offsetY + y + z, SH110X_BLACK);
}
}
}
}
// Zeit als Text anzeigen
display.setCursor(10, 120);
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.print(timeString);
display.display();
// Eine Sekunde warten
delay(1000);
}
Loading
grove-oled-sh1107
grove-oled-sh1107