#include <OneWire.h>
#include <DallasTemperature.h>
#include <lvgl.h>
// DS18B20 Configuration
#define ONE_WIRE_BUS 13 // Pin connected to DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Relay Configuration
#define RELAY_PIN 10 // Pin connected to relay
bool heating = false;
// GUI Variables
lv_obj_t *label_temp, *label_setpoint, *label_timer;
float current_temp = 0.0;
float setpoint_temp = 75.0; // Default setpoint in Fahrenheit
int timer_hours = 0, timer_minutes = 0;
unsigned long timer_start = 0;
bool timer_running = false;
// LVGL Callbacks
void set_temp_cb(lv_event_t *e) {
setpoint_temp = lv_slider_get_value(lv_event_get_target(e));
lv_label_set_text_fmt(label_setpoint, "Set Temp: %.1f°F", setpoint_temp);
}
void set_timer_cb(lv_event_t *e) {
int time = lv_slider_get_value(lv_event_get_target(e));
timer_hours = time / 60;
timer_minutes = time % 60;
lv_label_set_text_fmt(label_timer, "Timer: %02d:%02d", timer_hours, timer_minutes);
}
// Setup GUI
void setup_gui() {
lv_obj_t *scr = lv_scr_act();
// Current Temperature Display
label_temp = lv_label_create(scr);
lv_label_set_text(label_temp, "Current Temp: 0.0°F");
lv_obj_align(label_temp, LV_ALIGN_TOP_MID, 0, 20);
// Setpoint Temperature Slider
lv_obj_t *slider_temp = lv_slider_create(scr);
lv_slider_set_range(slider_temp, 50, 100); // Range 50-100°F
lv_slider_set_value(slider_temp, setpoint_temp, LV_ANIM_OFF);
lv_obj_add_event_cb(slider_temp, set_temp_cb, LV_EVENT_VALUE_CHANGED, NULL);
lv_obj_align(slider_temp, LV_ALIGN_CENTER, 0, -50);
label_setpoint = lv_label_create(scr);
lv_label_set_text_fmt(label_setpoint, "Set Temp: %.1f°F", setpoint_temp);
lv_obj_align(label_setpoint, LV_ALIGN_CENTER, 0, -80);
// Timer Slider
lv_obj_t *slider_timer = lv_slider_create(scr);
lv_slider_set_range(slider_timer, 0, 240); // Range 0-240 minutes (4 hours)
lv_slider_set_value(slider_timer, 0, LV_ANIM_OFF);
lv_obj_add_event_cb(slider_timer, set_timer_cb, LV_EVENT_VALUE_CHANGED, NULL);
lv_obj_align(slider_timer, LV_ALIGN_CENTER, 0, 50);
label_timer = lv_label_create(scr);
lv_label_set_text(label_timer, "Timer: 00:00");
lv_obj_align(label_timer, LV_ALIGN_CENTER, 0, 20);
}
// Heating Control Logic
void control_heating() {
if (current_temp < setpoint_temp && timer_running) {
digitalWrite(RELAY_PIN, HIGH);
heating = true;
} else {
digitalWrite(RELAY_PIN, LOW);
heating = false;
}
}
// Timer Logic
void update_timer() {
if (timer_running) {
unsigned long elapsed = (millis() - timer_start) / 60000; // Minutes elapsed
int remaining = (timer_hours * 60 + timer_minutes) - elapsed;
if (remaining <= 0) {
timer_running = false;
digitalWrite(RELAY_PIN, LOW); // Turn off heating
lv_label_set_text(label_timer, "Timer: 00:00");
} else {
int hrs = remaining / 60;
int mins = remaining % 60;
lv_label_set_text_fmt(label_timer, "Timer: %02d:%02d", hrs, mins);
}
}
}
// Arduino Setup
void setup() {
Serial.begin(115200);
sensors.begin();
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
lv_init();
setup_gui();
}
// Arduino Loop
void loop() {
lv_timer_handler(); // Handle LVGL
delay(5);
sensors.requestTemperatures();
current_temp = sensors.getTempFByIndex(0); // Fahrenheit
lv_label_set_text_fmt(label_temp, "Current Temp: %.1f°F", current_temp);
if (timer_hours > 0 || timer_minutes > 0) {
timer_running = true;
timer_start = millis();
}
control_heating();
update_timer();
}
Loading
esp32-s3-box-3
esp32-s3-box-3
Loading
ds18b20
ds18b20
Loading
ili9341-cap-touch
ili9341-cap-touch