#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
// OLED display settings
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// DS18B20 settings
#define ONE_WIRE_BUS 2 // Temperature sensor pin
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Button pins
#define UP_BUTTON 3
#define DOWN_BUTTON 4
#define LED_PIN 9
// EEPROM address for setpoint
#define EEPROM_ADDRESS 0
float currentTemp = 0.0;
float setpoint = 25.0; // Default setpoint
void setup() {
// Initialize serial communication
Serial.begin(9600);
// Initialize OLED display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
// Initialize temperature sensor
sensors.begin();
// Initialize buttons
pinMode(UP_BUTTON, INPUT_PULLUP);
pinMode(DOWN_BUTTON, INPUT_PULLUP);
// Read stored setpoint from EEPROM
EEPROM.get(EEPROM_ADDRESS, setpoint);
if (isnan(setpoint) || setpoint < 0 || setpoint > 100) {
setpoint = 99.0; // Default value if EEPROM is empty or invalid
// setpoint = currentTemp;
}
}
void loop() {
// Read temperature
sensors.requestTemperatures();
currentTemp = sensors.getTempCByIndex(0);
// Handle button presses
if (digitalRead(UP_BUTTON) == LOW) {
setpoint += 0.01;
if (setpoint > 999.99) setpoint = 999.99;
EEPROM.put(EEPROM_ADDRESS, setpoint);
delay(200); // Debounce
}
if (digitalRead(DOWN_BUTTON) == LOW) {
setpoint -= 0.01;
if (setpoint < 0) setpoint = 0;
EEPROM.put(EEPROM_ADDRESS, setpoint);
delay(200); // Debounce
}
// LED control based on temperature comparison
if (currentTemp < setpoint) {
digitalWrite(LED_PIN, HIGH); // LED ON when temp is below setpoint
} else {
digitalWrite(LED_PIN, LOW); // LED OFF when temp is at or above setpoint
}
// Update display
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
// Display current temperature
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Current Temp:");
display.setTextSize(2);
display.setCursor(0, 20);
display.print(currentTemp, 2); // Display with 1 decimal place
display.print(" C");
// Display setpoint
display.setTextSize(1);
display.setCursor(0, 50);
display.print("Setpoint: ");
display.print(setpoint, 2);
display.print(" C");
display.display();
delay(100); // Update rate
}