#include "DHT.h" // DHT11 / DHT22 Bibliothek
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
DHT dht1(2, DHT22); // DHT_PIN / DHT_Type
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // 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 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
float t1; // Variable für Temperaturwerte der 3 Sensoren
uint8_t sollwert = 30; // Gewünschter Sollwert der Temperatur
// Für Abstand der Messungen
uint32_t messen_time = 0; // Zeit der letzten Messung
uint16_t messabstand = 5000; // Zeitabstand zwischen den Messungen
// KY-040 Rotary Encoder
const uint8_t clk1_pin = 6; // Pin für clk
const uint8_t dt1_pin = 5; // Pin für dt
boolean clk1_pin_alt; // Um Drehimpuls zu erkennen
boolean clk1_pin_neu; // Um Drehimpuls zu erkennen
boolean dt1_pin_alt; // Um Drehimpuls zu erkennen
boolean dt1_pin_neu; // Um Drehimpuls zu erkennen
// KY-040 Taster
const uint8_t sw1_pin = 3; // Pin für Tastendruck
boolean sw1_pos_neu = LOW; // Um Tastendruck zu erkenne
boolean sw1_pos_alt = LOW; // Um Tastendruck zu erkenne
uint32_t sw1_time = 0; // Zeitmessung zum entprellen
uint32_t entprellen = 200; // Verzögerung der entprellung
boolean sollwert_fest = true; // Verhindern das der Sollwert geändert werden kann
const uint8_t ssr1_pin = 9; // Pin für SSR
boolean heizung = false; // Heizung an oder aus
// --- setup -----------------------------------------------------------------
void setup() {
Serial.begin(115200);
pinMode (clk1_pin, INPUT_PULLUP);
pinMode (dt1_pin, INPUT_PULLUP);
pinMode (sw1_pin, INPUT_PULLUP);
pinMode (ssr1_pin, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Clear the buffer
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1); // Draw 2X-scale text
display.setCursor(0, 10);
display.print("L\201ftersteuerung");
printSollWert(sollwert);
digitalWrite(ssr1_pin, LOW); // SSR1 aus
clk1_pin_alt = digitalRead(clk1_pin);
dht1.begin();
// 1. Messung ohne Zeitverzögerung
messen();
anzeigen_ser();
anzeigen();
messen_time = millis();
ssr();
}
// --- loop -----------------------------------------------------------------
void loop() {
if (millis() - messen_time > messabstand) {
messen_time = millis();
messen();
anzeigen_ser();
anzeigen();
ssr();
}
Rotary_Taster();
if (sollwert_fest == false) {
Rotary();
}
}
void messen() {
t1 = dht1.readTemperature();
}
void anzeigen_ser() {
Serial.print("\t");
Serial.print("T1: ");
Serial.print(t1);
Serial.print(" C\t");
}
void anzeigen() {
static float lastVal;
display.setTextColor(SSD1306_BLACK);
anzeigen2(lastVal);
display.setTextColor(SSD1306_WHITE);
anzeigen2(t1);
display.display();
lastVal = t1;
}
void anzeigen2(float val) {
display.setCursor(0, 24);
display.print("Aktuell: ");
display.print(val);
display.print((char)247);
display.print("C");
}
// --- Rotary Taster auswerten -----------------------------------------------
void Rotary_Taster() {
sw1_pos_neu = digitalRead(sw1_pin); // aktuelle Tasterposition abfragen
if (sw1_pos_neu == LOW && sw1_pos_alt == HIGH && millis() - sw1_time > entprellen) {
sw1_time = millis(); // Wenn sich Position geändert hat und entprellt ist
sw1_pos_alt = LOW;
sollwert_fest = !sollwert_fest; // Rotary Sperre wechseln
printStar(!sollwert_fest);
} else {
sw1_pos_alt = HIGH;
}
}
// --- Rotary Encoder auswerten ------------------------------------------------
void Rotary() {
clk1_pin_neu = digitalRead(clk1_pin); // Auslesen des aktuellen Statuses
dt1_pin_neu = digitalRead(dt1_pin);
if (clk1_pin_neu == false || dt1_pin_neu == false) { // Überprüfung auf Änderung
if (dt1_pin_neu) {
if (sollwert < 50) { // Und Sollwert ist kleiner 50
sollwert ++;
}
} else {
if (sollwert > 20) { // Und Sollwert ist größer 20
sollwert--;
}
}
printSollWert(sollwert);
Serial.print("sollwert: ");
Serial.println(sollwert);
}
}
// --- SSR ------------------------------------------------------------------
void ssr() {
if (sollwert < t1) {
digitalWrite(ssr1_pin, HIGH);
printState(true);
Serial.println("H");
} else {
digitalWrite(ssr1_pin, LOW);
printState(false);
Serial.println(" ");
}
}
void printSollWert(uint8_t val) {
static uint8_t lastVal;
display.setTextColor(SSD1306_BLACK);
printSollWert2(lastVal);
display.setTextColor(SSD1306_WHITE);
printSollWert2(val);
display.display();
lastVal = val;
}
void printSollWert2(uint8_t val) {
display.setCursor(0, 40);
display.print("Soll: ");
display.print(val);
display.print((char)247);
display.print("C");
}
void printStar(bool val){
display.setCursor(30, 40);
if (!val) display.setTextColor(SSD1306_BLACK);
display.print("*");
display.display();
display.setTextColor(SSD1306_WHITE);
}
void printState (boolean val) {
display.setCursor(10, 54);
display.setTextColor(SSD1306_BLACK);
val ? display.print("AUS") : display.print("AN");
display.setCursor(10, 54);
display.setTextColor(SSD1306_WHITE);
val ? display.print("AN") : display.print("AUS");
display.display();
}