#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);
// Pin definitions
#define LM35_PIN A0 // LM35 connected to analog pin A0
#define UP_BUTTON 3
#define DOWN_BUTTON 4
// 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 pins
pinMode(LM35_PIN, INPUT);
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 = 25.0; // Default value if EEPROM is empty or invalid
}
}
float readTemperature() {
// Read analog value and convert to temperature
int sensorValue = analogRead(LM35_PIN);
// Convert to voltage (5V reference, 10-bit ADC)
float voltage = sensorValue * (5.0 / 1023.0);
// LM35 outputs 10mV per °C
float temperature = voltage * 100.0;
return temperature;
}
void loop() {
// Read temperature
currentTemp = readTemperature();
// Handle button presses
if (digitalRead(UP_BUTTON) == LOW) {
setpoint += 0.5;
if (setpoint > 999.9) setpoint = 999.9;
EEPROM.put(EEPROM_ADDRESS, setpoint);
delay(200); // Debounce
}
if (digitalRead(DOWN_BUTTON) == LOW) {
setpoint -= 0.5;
if (setpoint < 0) setpoint = 0;
EEPROM.put(EEPROM_ADDRESS, setpoint);
delay(200); // Debounce
}
// 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);
// Format temperature to always show two digits before decimal
if (currentTemp < 0) display.print("0");
display.print(currentTemp, 2); // Display with 1 decimal place
display.print(" C");
// Display setpoint
display.setTextSize(1);
display.setCursor(0, 50);
display.print("Setpoint: ");
if (setpoint < 0) display.print("0");
display.print(setpoint, 1);
display.print(" C");
display.display();
delay(100); // Update rate
}