#include "DHTesp.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "TempHumidNN.h" // TinyML model converted to C
// Pins
static const int DHT_PIN = 15;
static const int SDA_PIN = 13;
static const int SCL_PIN = 14;
static const int LED_OK = 2; // LED turns on when “Normal”
static const int LED_WARN = 4; // LED turns on when “Extreme”
// Constants
static const unsigned long READ_INTERVAL = 2500; // ms
DHTesp sensor;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
// Sensor init
sensor.setup(DHT_PIN, DHTesp::DHT22);
// LEDs
pinMode(LED_OK, OUTPUT);
pinMode(LED_WARN, OUTPUT);
digitalWrite(LED_OK, LOW);
digitalWrite(LED_WARN, LOW);
// I²C + LCD init
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init();
lcd.backlight();
// Load model
initModel();
}
void loop() {
static unsigned long lastRead = 0;
unsigned long now = millis();
if (now - lastRead < READ_INTERVAL) return;
lastRead = now;
// Read sensor
TempAndHumidity env = sensor.getTempAndHumidity();
float inputData[2] = { env.temperature, env.humidity };
// Run inference
int classId = tempHumidNN.predict(inputData);
// Display & LEDs
showStatus(env.temperature, env.humidity, classId);
// Debug output
Serial.printf("Temp=%.1f°C Hum=%.0f%% -> %s\n",
env.temperature,
env.humidity,
classId == 0 ? "Normal" : "Extreme");
}
void initModel() {
while (!tempHumidNN.begin()) {
Serial.println("Model init error: " + String(tempHumidNN.getErrorMessage()));
delay(500);
}
Serial.println("Model ready!");
}
void showStatus(float temp, float hum, int cls) {
char line1[17];
snprintf(line1, sizeof(line1), "T:%.1fC H:%.0f%%", temp, hum);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
if (cls == 0) {
lcd.print("Status: OK ");
digitalWrite(LED_OK, HIGH);
digitalWrite(LED_WARN, LOW);
} else {
lcd.print("Status: WARN ");
digitalWrite(LED_OK, LOW);
digitalWrite(LED_WARN, HIGH);
}
}