// Setzen der Bibliotheken
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
// Adresse für den LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pin für den DS18B20-Datenpin
#define ONE_WIRE_BUS 9
// OneWire-Objekt erstellen
OneWire oneWire(ONE_WIRE_BUS);
// DallasTemperature-Objekt erstellen
DallasTemperature sensors(&oneWire);
// Belegung der Pins
// Belegung der Taster
#define start_button_input 12
#define increase_button_input 11
#define decrease_button_input 10
// Belegung der Aktuatoren
#define status_led 8
#define heater 7
#define fan 6
// Variablen für den Toggle-Switch
bool button_on = false;
bool button_read = false;
bool switch1 = false;
// Variablen zum setzen der Aktuatoren
bool status_led_flag = false;
bool heater_flag = false;
int fan_speed = 0;
int fan_speed_percent = 0;
// Variablen für das Erhöhen und senken des SetPoints
bool button_decrease = false;
bool button_increase = false;
// Variable für den Temperatur_Sensor
float temperature = 0;
// Setzen des SetPoints
int setpoint = 20;
// Setzen der Timer
unsigned long serial_millis = 0;
unsigned long button_millis = 0;
unsigned long lcd_millis = 0;
unsigned long button_increase_millis = 0;
unsigned long button_decrease_millis = 0;
// Implementierung der State-Machine
enum operating_state {
state_off,
state_heating,
state_passiv,
state_cooling,
};
operating_state operating_state = state_off;
// Vorausdeklaration der Void_Abschnitte
void read_ds18b20(float temperature);
void serial_monitor(float temperature);
void lcd_display(float temperature);
void toggle_button();
void update_value(float temperature);
void manage_state(float temperature);
void update_state();
void setup() {
// Setzen der Pins
pinMode(start_button_input, INPUT_PULLUP);
pinMode(increase_button_input, INPUT_PULLUP);
pinMode(decrease_button_input, INPUT_PULLUP);
pinMode(status_led, OUTPUT);
pinMode(heater, OUTPUT);
pinMode(fan, OUTPUT);
// Seriellen Monitor starten
Serial.begin(9600);
// DallasTemperature-Sensoren initialisieren
sensors.begin();
Serial.println("DS18B20 Temperatur-Sensor Test");
// Initialisierung des LCD
lcd.begin(20, 4);
lcd.backlight();
}
void loop() {
// Sensoren auffordern, Temperatur zu messen
sensors.requestTemperatures();
// Temperatur vom ersten Sensor auslesen
temperature = sensors.getTempCByIndex(0);
// Auslesen des ds18b20
read_ds18b20(temperature);
// Abruf des Serial-Monitors
serial_monitor(temperature);
// Abruf des LCD-Displays
lcd_display(temperature);
// Abruf des Toggle-Schalters
toggle_button();
// Abruf des aktualisierten SOLL-Wertes
update_value(temperature);
// Abruf der aktualisierten States
manage_state(temperature);
// Update des States
update_state();
}
////====================================////
////===========Funktionen===============////
////====================================////
void read_ds18b20(float temperature) {}
////====================================////
////===========Funktionen===============////
////====================================////
void serial_monitor(float temperature) {
// Variablen für diesen Abschnitt
unsigned long serial_timer = millis() - serial_millis;
if (serial_timer > 250) {
Serial.print(" temperature == ");
Serial.println(temperature);
Serial.print(" switch1 == ");
Serial.print(switch1);
Serial.print(" SetPoint == ");
Serial.print(setpoint);
Serial.print(" Speed == ");
Serial.print(fan_speed);
Serial.print(" opertaing_state == ");
Serial.print(operating_state);
serial_millis = millis();
}
}
////====================================////
////===========Funktionen===============////
////====================================////
void lcd_display(float temperature) {
// Variablen für diesen Abschnitt
unsigned long lcd_timer = millis() - lcd_millis;
fan_speed_percent = map(fan_speed, 0, 255, 0, 100);
if (lcd_timer > 250) {
// Ausgabe Temperatur
lcd.setCursor(0, 0);
lcd.print("Temperatur :");
lcd.setCursor(12, 0);
lcd.print(temperature);
lcd.setCursor(18, 0);
lcd.write(223); // Grad-Symbol
lcd.setCursor(19, 0);
lcd.print("C");
// Ausgabe SetPoint
lcd.setCursor(0, 1);
lcd.print("SetPoint :");
lcd.setCursor(12, 1);
lcd.print(setpoint);
lcd.setCursor(18, 1);
lcd.write(223);
lcd.setCursor(19, 1);
lcd.print("C");
// Ausgabe SetPoint
lcd.setCursor(0, 3);
lcd.print("Speed :");
lcd.setCursor(12, 3);
lcd.print(fan_speed_percent);
lcd.setCursor(19, 3);
lcd.print("%");
// Ausgabe für Heating
lcd.setCursor(0, 2);
lcd.print("Auto :");
if (switch1) {
lcd.setCursor(12, 2);
lcd.print("ON ");
} else {
lcd.setCursor(12, 2);
lcd.print("OFF ");
}
lcd_millis = millis();
}
}
////====================================////
////===========Funktionen===============////
////====================================////
void toggle_button() {
// Variablen für diesen Abschnitt
button_read = digitalRead(start_button_input);
unsigned long button_timer = millis() - button_millis;
if (button_read == true) {
button_millis = millis();
}
if (button_read == false && button_on == false && button_timer > 20) {
button_on = true;
}
if (button_read == true && button_on == true) {
button_on = false;
switch1 = !switch1;
}
}
////====================================////
////===========Funktionen===============////
////====================================////
void update_value(float temperature) {
// Setzen der Variablen für diesen Abschnitt
button_decrease = digitalRead(decrease_button_input);
button_increase = digitalRead(increase_button_input);
unsigned long button_increase_timer = millis() - button_increase_millis;
unsigned long button_decrease_timer = millis() - button_decrease_millis;
if (button_decrease == false && button_decrease_timer > 250) {
setpoint--;
button_decrease_millis = millis();
}
if (button_increase == false && button_increase_timer > 250) {
setpoint++;
button_increase_millis = millis();
}
}
////====================================////
////===========Funktionen===============////
////====================================////
void manage_state(float temperature) {
if (switch1) {
if (temperature < setpoint) {
operating_state = state_heating;
} else if (temperature > setpoint && temperature < (setpoint + 5)) {
operating_state = state_passiv;
} else if (temperature > (setpoint + 5)) {
operating_state = state_cooling;
}
} else {
operating_state = state_off;
}
}
////====================================////
////===========Funktionen===============////
////====================================////
void update_state() {
// Variablen für diesen Abschnitt
int diff = temperature - setpoint;
fan_speed = map(diff, 5, 10, 0, 255);
fan_speed = constrain(fan_speed, 0, 255);
switch (operating_state) {
case state_off:
status_led_flag = false;
heater_flag = false;
fan_speed = 0;
break;
case state_heating:
status_led_flag = true;
heater_flag = true;
fan_speed = 0;
break;
case state_passiv:
status_led_flag = true;
heater_flag = false;
fan_speed = 0;
break;
case state_cooling:
status_led_flag = true;
heater_flag = false;
}
digitalWrite(status_led, status_led_flag);
digitalWrite(heater, heater_flag);
analogWrite(fan, fan_speed);
}
////====================================////
////===============ENDE=================////
////====================================////