/*
* Mobiles Wasser-Thermometer (0-80°C) mit Reset-Funktion
* Hardware: Arduino Nano, OLED SSD1306 (0.96"), DS18B20 (wasserdicht)
* * Features:
* - Aktuelle Temperatur (groß)
* - Minimum & Maximum Werte
* - Reset-Taster an Pin D3 (gegen GND)
* - Batterie-Status (simuliert)
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Reset Pin auf -1, da die meisten 0.96" OLEDs keinen Reset-Pin am Header haben
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define ONE_WIRE_BUS 2
#define RESET_BUTTON_PIN 3 // Taster zwischen Pin D3 und GND
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Variablen für Min/Max Speicher
float maxTemp = -999.0;
float minTemp = 999.0;
void setup() {
sensors.begin();
// Taster mit internem Pull-up Widerstand konfigurieren
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP);
// 0x3C ist die Standard-Adresse für die meisten 0.96" OLEDs.
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;); // Stoppt bei Hardware-Fehler
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
// Start-Animation
display.setTextSize(1);
display.setCursor(15, 20);
display.println(F("WASSERTEMPERATUR"));
display.drawFastHLine(15, 32, 98, SSD1306_WHITE);
display.setCursor(20, 40);
display.println(F("Reset-Pin: D3/GND"));
display.display();
delay(2000);
}
void loop() {
sensors.requestTemperatures();
float currentTemp = sensors.getTempCByIndex(0);
// Einfache Fehlerprüfung für den Sensor
if (currentTemp < -50 || currentTemp > 130) return;
// Reset-Logik: Wenn Taster gedrückt (LOW), Min/Max auf aktuelle Temp setzen
if (digitalRead(RESET_BUTTON_PIN) == LOW) {
maxTemp = currentTemp;
minTemp = currentTemp;
// Kurze Bestätigung auf dem Display
display.fillRect(0, 50, 128, 14, SSD1306_BLACK);
display.setCursor(35, 54);
display.setTextSize(1);
display.println(F("RESET OK!"));
display.display();
delay(500);
}
// Min/Max Logik (Fortlaufend aktualisieren)
if (currentTemp > maxTemp || maxTemp == -999.0) maxTemp = currentTemp;
if (currentTemp < minTemp || minTemp == 999.0) minTemp = currentTemp;
display.clearDisplay();
// 1. Kopfzeile: Batterie-Symbol
display.drawRect(105, 2, 20, 8, SSD1306_WHITE);
display.fillRect(125, 4, 2, 4, SSD1306_WHITE);
display.fillRect(107, 4, 12, 4, SSD1306_WHITE);
// 2. Hauptwert (Aktuelle Temp)
display.setTextSize(1);
display.setCursor(0, 2);
display.print(F("AKTUELL:"));
display.setTextSize(3);
display.setCursor(10, 18);
display.print(currentTemp, 1);
display.setTextSize(2);
display.print(F(" C"));
// 3. Fußzeile: Min und Max
display.drawFastHLine(0, 48, 128, SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 54);
display.print(F("Min: "));
display.print(minTemp, 1);
display.setCursor(70, 54);
display.print(F("Max: "));
display.print(maxTemp, 1);
display.display();
delay(200); // Kürzere Pause für bessere Reaktionszeit des Tasters
}