#include <Arduino.h>
#include "SHT31.h"
#include <LiquidCrystal_I2C.h>
#include <temperature.h>
// Indexbezeichner für Arrays
constexpr uint8_t shtDevIdx1 {0};
constexpr uint8_t shtDevIdx2 {1};
constexpr uint8_t humIdx {0};
constexpr uint8_t tempIdx {1};
constexpr uint8_t absHumIdx {2};
constexpr uint8_t shtDevNum {2};
constexpr uint8_t sht31Addresses[shtDevNum] {0x44, 0x45};
constexpr uint8_t lcdMaxColumns {20};
constexpr uint8_t lcdMaxRows {4};
constexpr uint8_t lcdMaxDataColumns {2};
//
// Eigene Datentypen
//
struct Position {
const int8_t column;
const int8_t row;
};
struct MeasurementData {
Position pos;
float value;
unsigned char unit[3];
};
struct ColumnData {
Position pos;
const char* label;
MeasurementData mdata[lcdMaxRows-1];
};
using MeasurementDataArray = MeasurementData[lcdMaxRows - 1];
using ColumnDataArray = ColumnData[lcdMaxDataColumns];
//
// globale Objekte, Variablen
//
ColumnData columnData[2] {
{{0, 0}, "Abluft", {{{0, 1}, 0.0, {0x25}}, {{0, 2}, 0.0, {223, 67}}, {{0, 3}, 0.0, {103}}}},
{{8, 0}, "Raumluft", {{{8, 1}, 0.0, {0x25}}, {{8, 2}, 0.0, {223, 67}}, {{8, 3}, 0.0, {103}}}}
};
LiquidCrystal_I2C lcd(0x27, lcdMaxColumns, lcdMaxRows);
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
SHT31 shtDevices[shtDevNum] {
{sht31Addresses[shtDevIdx1], &Wire},
{sht31Addresses[shtDevIdx2], &Wire}
};
bool shtIsAvailable[shtDevNum];
//
// Funktionen
//
void getMeasurmentData(SHT31& device, MeasurementDataArray &mdArray) {
// device.read();
// Zufallswerte als Dummy für die (nicht vorhandenen) Sensoren.
mdArray[humIdx].value = static_cast<float>(random(0,10))/10 + random(0,66);
mdArray[tempIdx].value = static_cast<float>(random(0,10))/10 + random(5,51);
// mdArray[humIdx].value = device.getHumidity();
// mdArray[tempIdx].value = device.getTemperature();
mdArray[absHumIdx].value = absoluteHumidity(mdArray[tempIdx].value, mdArray[humIdx].value);
}
void displayData(LiquidCrystal_I2C& out, ColumnDataArray& cda ) {
// Werte aus Speichervariablen ausgeben
for (const auto& data : cda) {
out.setCursor(data.pos.column, data.pos.row);
lcd.print(data.label);
// Über jeden Zeilenwert (für eine Spalte) Iterieren
for (auto md : data.mdata) {
uint8_t offset {(static_cast<int>(md.value) < 10) ? 1 : 0};
lcd.setCursor(md.pos.column + offset, md.pos.row);
lcd.print(md.value, 1);
for (auto ascii : md.unit) { lcd.write(ascii); } // Einheit über ASCII Codes ausgeben.
}
}
}
//
// Hauptprogramm
//
void setup() {
lcd.begin(lcdMaxColumns, lcdMaxRows);
randomSeed(A1);
}
void loop() {
bool shtIsAvailable[shtDevNum] {true, true};
// Iteration über alle definierten SHT Geräte. Sensorwerte in Speichervariablen schreiben
for (size_t i {shtDevIdx1}; i < shtDevNum; ++i) {
if (shtIsAvailable[i]) { getMeasurmentData(shtDevices[i], columnData[i].mdata); }
}
// Werte aus Speichervariablen ausgeben
displayData(lcd, columnData);
delay(1000);
}