#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
IPAddress targetIP(10,10,0,2); // ESP32-B IP
const unsigned int targetPort = 4210;
WiFiUDP udp;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define POTENTIOMETER D0
#define BUTTON D6
const unsigned long debounceDelay = 50;
int lastStableState = HIGH;
int lastReading = HIGH;
unsigned long lastDebounceTime = 0;
enum State {
SLEEPING,
TIME_SELECTION
};
enum State currentDeviceState = SLEEPING;
int currentMinutes = 0;
const unsigned char heartBitmap[] PROGMEM = {
0b00001100, 0b00110000,
0b00011110, 0b01111000,
0b00111111, 0b11111100,
0b01111111, 0b11111110,
0b01111111, 0b11111110,
0b01111111, 0b11111110,
0b00111111, 0b11111100,
0b00011111, 0b11111000,
0b00001111, 0b11110000,
0b00000111, 0b11100000,
0b00000011, 0b11000000,
0b00000001, 0b10000000,
0b00000000, 0b00000000,
0b00000000, 0b00000000,
0b00000000, 0b00000000,
0b00000000, 0b00000000
};
void setup() {
Serial.begin(115200);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(POTENTIOMETER, INPUT);
Wire.begin(6, 7); // SDA=GPIO6, SCL=GPIO7
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // bleibt hier hängen, falls Display nicht gefunden
}
display.clearDisplay();
display.setTextSize(0.8);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Hallo Madame");
display.println("Mit Liebe gemacht\n\n");
display.drawBitmap(0, 20, heartBitmap, 16, 16, SSD1306_WHITE);
display.display();
delay(2000);
display.clearDisplay();
display.display();
WiFi.begin(ssid, password);
udp.begin(4211);
display.setCursor(0, 0);
display.print("Connecting to WiFi ");
display.println(ssid);
display.display();
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
display.print(".");
display.display();
}
Serial.println("\nConnected to WiFi");
display.clearDisplay();
display.setCursor(0, 0);
display.println("Connected!");
display.display();
delay(1000);
display.clearDisplay();
display.display();
}
void loop() {
int reading = digitalRead(BUTTON);
float timeValue = analogRead(POTENTIOMETER);
currentMinutes = map(timeValue, 0, 4095, 0, 60);
if (reading != lastReading) {
lastDebounceTime = millis();
lastReading = reading;
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != lastStableState) {
lastStableState = reading;
if (lastStableState == LOW) {
Serial.println("BUTTON PRESSED");
switch (currentDeviceState) {
case SLEEPING:
Serial.println("WOKE UP");
currentDeviceState = TIME_SELECTION;
break;
case TIME_SELECTION:
display.clearDisplay();
display.display();
Serial.println("GOING TO SLEEP");
udp.beginPacket(targetIP, targetPort);
udp.print("ping");
udp.print(currentMinutes);
udp.endPacket();
Serial.println("Ping sent!");
display.setCursor(0, 0);
currentDeviceState = SLEEPING;
display.setTextSize(1);
display.println("Geniess deine Pause");
display.drawBitmap(0, 10, heartBitmap, 16, 16, SSD1306_WHITE);
display.display();
delay(3000);
display.clearDisplay();
display.display();
break;
}
} else {
Serial.println("BUTTON RELEASED");
}
}
}
switch (currentDeviceState) {
case SLEEPING:
break;
case TIME_SELECTION:
displayTimeSelection();
break;
}
}
void displayTimeSelection() {
display.clearDisplay();
// Rahmen zeichnen
display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE);
// Überschrift "Zeit"
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor((SCREEN_WIDTH - 4 * 12) / 2, 5); // zentrieren (ungefähr)
display.println("Zeit");
// Minuten groß anzeigen
display.setTextSize(3);
display.setCursor(15, 30); // etwas nach links/unten setzen
display.print(currentMinutes);
display.println(" min");
display.display();
}