#include <SPI.h>
#include <Wire.h> // Bibliothek für I2C-Protokoll
#include <Adafruit_GFX.h>
#include <Adafruit_BusIO_Register.h>
#include <Adafruit_SSD1306.h> // Bibliothek für SSD1306-Display
#include <DHT.h> // Bibliothek für DHT22-Sensor
//NEU für Sleep Mode
#include <avr/sleep.h> // Bibliothek für Deep Sleep
#include <avr/power.h>
const int buttonPin = 3; // Taster an Pin D3
volatile bool buttonPressed = false;
unsigned long lastButtonPressTime = 0;
const unsigned long wakeupInterval = 600000; // 10 Minuten in Millisekunden
ISR(PCINT0_vect) {
if (digitalRead(buttonPin) == LOW) {
buttonPressed = true;
}
}
#define DHTPIN 2 // DHT22-Sensor ist an Pin 2 angeschlossen
#define DHTTYPE DHT22 // DHT22-Sensor verwenden
DHT dht(DHTPIN, DHTTYPE);
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 oled(128, 32, &Wire, -1);
//NEU
unsigned long previousMillis = 0;
const long Interval = (1*60 * 1000UL);
//NEU
void setup() {
Serial.begin(9600); // Serielle Kommunikation starten
dht.begin(); // DHT22-Sensor initialisieren
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!oled.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
//NEU für Sleep Modus
pinMode(buttonPin, INPUT_PULLUP);
// Pin Change Interrupts für den Taster konfigurieren
PCICR |= _BV(PCIE0); // Pin Change Interrupt aktivieren für Gruppe 0
PCMSK0 |= _BV(PCINT3); // Pin D3 für Pin Change Interrupt konfigurieren in Gruppe 0
// Power Down-Modus konfigurieren
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sei(); // Globale Interrupts aktivieren
}
void loop() {
//NEU für Sleep Modus
if (buttonPressed) {
// Aufwachen für 10 Minuten (600.000 Millisekunden)
sleep_bod_disable(); // Brown-out Detector ausschalten für geringeren Stromverbrauch
sleep_mode();
buttonPressed = false; // Zurücksetzen des Tastenstatus
lastButtonPressTime = millis(); // Zeitpunkt des letzten Tastendrucks speichern
}
delay(1000); // 1 Sekunde warten zwischen jeder Messung
float h = dht.readHumidity(); // Luftfeuchtigkeit lesen
float t = dht.readTemperature(); // Temperatur lesen
// Wenn die Messung fehlschlägt, eine Fehlermeldung ausgeben
if (isnan(h) || isnan(t)) {
Serial.println("Fehler beim Lesen des DHT22-Sensors");
return;
}
// Die Temperatur und Luftfeuchtigkeit auf beiden Displays ausgeben
//SSD 1306
oled.display(); // Display anzeigen
delay(1000);
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setTextSize(2);
oled.setCursor(0, 0);
oled.print("Temperatur" + String(t) + " C");
oled.display(); // SSD1306-Display anzeigen
delay(2000);
oled.clearDisplay();
oled.setCursor(0, 0);
oled.print("Feuchte: " + String(h) + " %");
oled.display(); // SSD1306-Display anzeigen
delay(2000);
//NEU
unsigned long currentMillis =millis();
if (currentMillis - previousMillis >=Interval) {
previousMillis = currentMillis;
}
//NEU
// Überprüfen, ob die Zeit abgelaufen ist, und wieder in den Deep Sleep-Modus wechseln
if ((millis() - lastButtonPressTime) >= wakeupInterval) {
sleep_enable(); // Sleep-Modus erneut aktivieren
lastButtonPressTime = millis(); // Zeitpunkt des letzten Tastendrucks aktualisieren
}
}