#include <glcd.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// DS18B20 on digital pin 12
#define ONE_WIRE_BUS 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Button pins
#define BUTTON_UP A4
#define BUTTON_DOWN A5
// Relay or output pin
#define RELAY_PIN 13
// Variables
int setTemp = 25;
unsigned long lastDebounce = 0;
const int debounceDelay = 200;
void setup() {
GLCD.Init();
sensors.begin();
pinMode(BUTTON_UP, INPUT_PULLUP);
pinMode(BUTTON_DOWN, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT);
GLCD.ClearScreen();
GLCD.SelectFont(System5x7); // Use small font to fit more text
}
void loop() {
// Simple debounce
if (millis() - lastDebounce > debounceDelay) {
if (digitalRead(BUTTON_UP) == LOW) {
setTemp++;
lastDebounce = millis();
}
if (digitalRead(BUTTON_DOWN) == LOW) {
setTemp--;
lastDebounce = millis();
}
}
// Read temperature
sensors.requestTemperatures();
float currentTemp = sensors.getTempCByIndex(0);
// Control output
if (currentTemp < setTemp) {
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
// Display on GLCD
GLCD.ClearScreen();
// Draw labels
GLCD.CursorTo(0, 0);
GLCD.print("DIGITAL THERMOSTAT");
GLCD.CursorTo(0, 2);
GLCD.print("Current: ");
GLCD.print(currentTemp, 1);
GLCD.print((char)223); // Degree symbol
GLCD.print("C");
GLCD.CursorTo(0, 4);
GLCD.print("Set Temp: ");
GLCD.print(setTemp);
GLCD.print((char)223);
GLCD.print("C");
GLCD.CursorTo(0, 6);
GLCD.print("Heater: ");
GLCD.print((currentTemp < setTemp) ? "ON " : "OFF");
delay(500); // Keep display readable and stable
}