#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Pin Definitions
#define ONE_WIRE_BUS 12 // DS18B20 data wire connected to pin 2
#define BUZZER_PIN 11 // Buzzer pin
#define SCREEN_WIDTH 128 // OLED display width
#define SCREEN_HEIGHT 32 // OLED display height
#define OLED_RESET -1 // Reset pin (or -1 if sharing Arduino reset pin)
#define TEMP_THRESHOLD 30 // Temperature threshold in Celsius
// Calibration offset (adjustable)
float calibrationOffset = 0.0;
// Create OneWire and DallasTemperature objects
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Create Adafruit SSD1306 OLED display object
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
// Initialize DS18B20 temperature sensor
sensors.begin();
// Initialize OLED display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Perform calibration if necessary
calibrationRoutine();
// Clear the display buffer
display.clearDisplay();
display.display();
}
void loop() {
// Read temperature from DS18B20 sensor
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0) + calibrationOffset;
// Display temperature on OLED display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print(F("Temp: "));
display.print(tempC);
display.print(F("C"));
display.display();
// Check if temperature exceeds threshold
if (tempC > TEMP_THRESHOLD) {
highTone();
} else {
lowTone();
}
delay(1000); // Update temperature every second
}
void highTone() {
tone(11, 500, 25);
delay(25);
noTone(11);
}
void lowTone() {
noTone(11);
}
void calibrationRoutine() {
Serial.println("Starting calibration routine...");
Serial.println("Current calibration offset: " + String(calibrationOffset, 2));
Serial.println("Enter the calibration offset (e.g., -0.1 for -0.1°C or 1.0 for +1.0°C):");
while (!Serial.available()) {} // Wait for user input
float offset = Serial.parseFloat();
calibrationOffset = offset;
Serial.println("Calibration successful. New offset: " + String(calibrationOffset, 2) + "°C");
}