#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pin definitions
const int oilSensorPin = 34; // Oil quality sensor (potentiometer)
#define ONE_WIRE_BUS 27 // DS18B20 sensor
const int yellowLedPin = 15; // Yellow LED
const int redLedPin = 4; // Red LED
// Initialize DS18B20 and LCDs
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C mainDisplay(0x27, 16, 2); // Main display (I2C address 0x27)
LiquidCrystal_I2C dataDisplay(0x26, 16, 2); // Data display (I2C address 0x26)
void setup() {
Serial.begin(115200);
// Initialize sensors and LCDs
sensors.begin();
mainDisplay.init();
mainDisplay.backlight();
dataDisplay.init();
dataDisplay.backlight();
// Configure LED pins as outputs
pinMode(yellowLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
// Ensure LEDs are off initially
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, LOW);
Serial.println("Setup complete!");
}
void loop() {
// Simulate oil quality
int oilSensorValue = analogRead(oilSensorPin);
float oilQuality = (oilSensorValue / 4095.0) * 100.0;
// Read coolant temperature
sensors.requestTemperatures();
float coolantTemp = sensors.getTempCByIndex(0);
// Handle invalid DS18B20 readings
if (coolantTemp == DEVICE_DISCONNECTED_C || coolantTemp == -127.0) {
Serial.println("DS18B20 not working. Using random temperature for debugging.");
coolantTemp = random(20, 81); // Simulate random temperature for now
}
Serial.println("Oil Quality: " + String(oilQuality) + "%");
Serial.println("Coolant Temp: " + String(coolantTemp) + "°C");
// Indicators logic
int issues = 0;
if (oilQuality < 5.0) issues++;
if (coolantTemp > 50.0) issues++;
// Control LEDs and Main Display
mainDisplay.clear();
if (issues == 0) {
mainDisplay.setCursor(0, 0);
mainDisplay.print("System Normal");
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, LOW);
} else if (issues == 1) {
mainDisplay.setCursor(0, 0);
mainDisplay.print("Check System!");
mainDisplay.setCursor(0, 1);
mainDisplay.print("1 Issue Found");
digitalWrite(yellowLedPin, HIGH);
digitalWrite(redLedPin, LOW);
} else {
mainDisplay.setCursor(0, 0);
mainDisplay.print("IMMEDIATE ATT!");
mainDisplay.setCursor(0, 1);
mainDisplay.print("2 Issues Found");
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, HIGH);
}
// Update Data Display with Coolant Temp and Oil Quality
dataDisplay.clear();
dataDisplay.setCursor(0, 0);
dataDisplay.print("Temp: ");
dataDisplay.print(coolantTemp);
dataDisplay.print("C");
dataDisplay.setCursor(0, 1);
dataDisplay.print("Oil: ");
dataDisplay.print(oilQuality);
dataDisplay.print("%");
delay(15000); // Wait 15 seconds before next check
}