/// Autor: Luca-Raphael Löscher
// Datum: 25.01.2025
// Version: 1.0
// Beschreibung: Temperatur und Feuchtigkeitssensor mit Ausgabe der Werte + Taupunkttemperatur
// Bibliotheken
#include "DHTesp.h"
#include "LiquidCrystal_I2C.h"
#include "ArduinoJson.h"
// ---- Variablen ----
float gTau;
float gTemperature;
float gHumidity;
float gMesswertnummer;
// -- Task --
QueueHandle_t sensorQueue;
// -- Konstanten --
const int DHT_PIN = 33;
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
// -- Display definieren --
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// -- Sensor definieren --
DHTesp dhtSensor;
// Task 1, einlesen der Messwerte und senden über Queue
void TaskReadValues(void *pvParameters) {
(void)pvParameters;
// Temperatur und Luftfeuchtigkeitssensor starten
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
while (1) {
// Auslesen des Wertes und senden über die Queue
TempAndHumidity data = dhtSensor.getTempAndHumidity();
xQueueSend(sensorQueue, &data, portMAX_DELAY);
// Setzen der globalen Variablen
gTemperature = data.temperature;
gHumidity = data.humidity;
gMesswertnummer += 1;
vTaskDelay(pdMS_TO_TICKS(1000)); // 1000ms Wartezeit
}
}
// Task 2, auslesen der Werte der Queue und berechnen des Taupunktes + Display Ausgabe
void TaskCalculateValues(void *pvParameters) {
(void)pvParameters;
float temperature;
float humidity;
TempAndHumidity data;
while (1) {
if (xQueueReceive(sensorQueue, &data, portMAX_DELAY)) {
// Auslesen der Werte und setzen, um Berechnungen verständlicher zu gestalten
temperature = data.temperature;
humidity = data.humidity;
gTau = pow(humidity, 1/8.02) * (109.8 + temperature) - 109.8;
// Setzen des Cursors, Spalte Zeile, Text kommt in der Spalte danach erst
// leeren des Displays
lcd.clear();
// Werteanzeige, ohne °-Symbol da es das Display nicht anzeigen kann
lcd.setCursor(0, 0);
lcd.print("Temp " + String(temperature, 2) + "C");
lcd.setCursor(0, 1);
lcd.print("Humi " + String(humidity, 2) + "%");
lcd.setCursor(0, 2);
lcd.print("TauP " + String(gTau, 2) + "C");
vTaskDelay(pdMS_TO_TICKS(10)); // 10ms Wartezeit
}
}
}
// Task 3, Werte Ausgabe über den seriellen Monitor
void TaskPrintValues(void *pvParameters) {
(void)pvParameters;
JsonDocument docData;
String jsonString;
while (1) {
// Erstellen des JSON-Formates
docData["Messwertnummer: "] = gMesswertnummer;
docData["Temperatur (°C): "] = gTemperature;
docData["Luftfeuchtigkeit (%): "] = gHumidity;
docData["Taupunkttemperatur (°C): "] = gTau;
// Printen des JSON-Formates
serializeJsonPretty(docData, jsonString);
Serial.println(jsonString);
vTaskDelay(pdMS_TO_TICKS(5000)); // Alle 1000 ms ausgeben
}
}
void setup() {
// Serieller Monitor
Serial.begin(115200);
// LCD Display
lcd.init();
lcd.backlight();
// Queue erstellen
sensorQueue = xQueueCreate(20, sizeof(TempAndHumidity)); // Platz für 20 Werte
// Task erstellen
xTaskCreate(TaskReadValues, "ReadValues", 10000, NULL, 1, NULL);
xTaskCreate(TaskCalculateValues, "CalculateValues", 10000, NULL, 1, NULL);
xTaskCreate(TaskPrintValues, "PrintValues", 10000, NULL, 1, NULL);
}
void loop() {
}