#include <TinyWireM.h>
#include <Tiny4kOLED.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
// Pin definitions
#define ONE_WIRE_BUS PB1 // DS18B20 Data (pin 3)
#define SWITCH_UP PB3 // Increase setpoint (pin 2)
#define SWITCH_DOWN PB4 // Decrease setpoint (pin 6)
#define LED_PIN PB5 // LED output (pin 1)
#define EEPROM_ADDRESS 0
// Initialize OneWire and DallasTemperature
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Global variable for setpoint
float setpoint = 25.0;
void prepareDisplay() {
oled.clear();
oled.setCursor(0, 0);
oled.print(F("Temp:"));
oled.setCursor(0, 1);
oled.print(F("Set:"));
}
float getTemperature() {
sensors.requestTemperatures();
return sensors.getTempCByIndex(0);
}
void updateSetpoint() {
static long lastDebounce = 0;
long currentTime = millis();
if ((currentTime - lastDebounce) > 50) {
if (!digitalRead(SWITCH_UP)) {
setpoint += 0.5;
if (setpoint > 50.0) setpoint = 50.0;
EEPROM.put(EEPROM_ADDRESS, setpoint);
lastDebounce = currentTime;
displaySetpoint();
}
if (!digitalRead(SWITCH_DOWN)) {
setpoint -= 0.5;
if (setpoint < 0.0) setpoint = 0.0;
EEPROM.put(EEPROM_ADDRESS, setpoint);
lastDebounce = currentTime;
displaySetpoint();
}
}
}
void displaySetpoint() {
oled.setCursor(36, 1);
oled.print(setpoint, 1);
oled.print(F("C "));
}
void controlLED(float temperature) {
if (temperature == DEVICE_DISCONNECTED_C) {
digitalWrite(LED_PIN, LOW); // LED off if sensor error
} else {
digitalWrite(LED_PIN, temperature < setpoint ? HIGH : LOW); // ON if below setpoint, OFF if above
}
}
void setup() {
pinMode(SWITCH_UP, INPUT_PULLUP);
pinMode(SWITCH_DOWN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // Initial state off
TinyWireM.begin();
oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);
oled.setFont(FONT6X8);
oled.clear();
oled.on();
sensors.begin();
EEPROM.get(EEPROM_ADDRESS, setpoint);
if (setpoint < 0 || setpoint > 50 || isnan(setpoint)) setpoint = 25.0;
prepareDisplay();
displaySetpoint();
}
void loop() {
static long startTime = 0;
long currentTime = millis();
if ((currentTime - startTime) > 1000) {
startTime = currentTime;
float temperature = getTemperature();
oled.setCursor(36, 0);
if (temperature == DEVICE_DISCONNECTED_C) {
oled.print(F("Err "));
} else {
oled.print(temperature, 1);
oled.print(F("C "));
}
displaySetpoint();
controlLED(temperature); // Update LED state
}
updateSetpoint();
}