#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Sensor on pin 2
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Outputs
const int greenLED = 7;
const int redLED = 8;
const int buzzer = 9;
// Temperature thresholds
const float HIGH_TEMP = 30.0; // Red LED + buzzer
const float LOW_TEMP = 10.0; // Buzzer only
unsigned long previousBeepTime = 0;
bool beepState = false;
void setup() {
sensors.begin();
lcd.init();
lcd.backlight();
pinMode(greenLED, OUTPUT);
pinMode(redLED, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(greenLED, LOW);
digitalWrite(redLED, LOW);
digitalWrite(buzzer, LOW);
}
void loop() {
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
float tempF = tempC * 9.0 / 5.0 + 32.0;
// Display: Temp: 30°C - 86°F
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.print(tempC, 0);
lcd.write(223); // degree symbol
lcd.print("C : ");
lcd.print(tempF, 0);
lcd.write(223); // degree symbol
lcd.print("F");
// LED + buzzer + status
lcd.setCursor(0, 1);
lcd.print(" "); // Clear line
if (tempC >= HIGH_TEMP) {
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
periodicBeep();
lcd.setCursor(0, 1);
lcd.print(" High Temp");
}
else if (tempC <= LOW_TEMP) {
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
periodicBeep();
lcd.setCursor(0, 1);
lcd.print(" Low Temp ");
}
else {
digitalWrite(greenLED, HIGH);
digitalWrite(redLED, LOW);
digitalWrite(buzzer, LOW);
lcd.setCursor(0, 1);
lcd.print(" Normal ");
}
delay(500);
}
// Buzzer beeps every 1 sec
void periodicBeep() {
unsigned long currentMillis = millis();
if (currentMillis - previousBeepTime >= 1000) {
beepState = !beepState;
digitalWrite(buzzer, beepState);
previousBeepTime = currentMillis;
}
}