#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
#define ONE_WIRE_BUS 32 // DS18B20 on GPIO32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature tempSensor(&oneWire);
// Pins
const int pressureSensorPin = 34;
const int greenLedPin = 25;
const int yellowLedPin = 26;
const int redLedPin = 27;
const int buzzerPin = 14;
// Tank Parameters
const float MAX_PRESSURE = 3000.0; // psi
const float CRITICAL_PRESSURE = 500.0;
const float WARNING_PRESSURE = 1000.0;
const float CRITICAL_TEMP = 50.0; // °C (Alert if too high)
void setup() {
Serial.begin(115200);
// Initialize display
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Initialize temperature sensor
tempSensor.begin();
// Initialize pins
pinMode(greenLedPin, OUTPUT);
pinMode(yellowLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Show startup message
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Oxygen Tank Monitor");
display.println("Initializing...");
display.display();
delay(3000);
}
void loop() {
// Read sensors
float pressure = readPressure();
float temperature = readTemperature();
// Determine status
if (pressure <= CRITICAL_PRESSURE || temperature >= CRITICAL_TEMP) {
criticalAlert();
} else if (pressure <= WARNING_PRESSURE) {
warningAlert();
} else {
normalStatus();
}
// Update display
updateDisplay(pressure, temperature);
// Print to Serial Monitor (for debugging)
Serial.print("Pressure: ");
Serial.print(pressure);
Serial.print(" psi | Temp: ");
Serial.print(temperature);
Serial.println(" °C");
delay(1000); // Update every second
}
float readPressure() {
int sensorValue = analogRead(pressureSensorPin);
return map(sensorValue, 0, 4095, 0, MAX_PRESSURE);
}
float readTemperature() {
tempSensor.requestTemperatures();
return tempSensor.getTempCByIndex(0); // °C
}
void updateDisplay(float pressure, float temp) {
display.clearDisplay();
display.setCursor(0,0);
display.println("OXYGEN TANK STATUS");
display.print("Pressure: ");
display.print(pressure);
display.println(" psi");
display.print("Temp: ");
display.print(temp);
display.println(" C");
// Add status message
if (pressure <= CRITICAL_PRESSURE) {
display.println("STATUS: CRITICAL!");
} else if (pressure <= WARNING_PRESSURE) {
display.println("STATUS: WARNING");
} else if (temp >= CRITICAL_TEMP) {
display.println("STATUS: OVERHEAT!");
} else {
display.println("STATUS: NORMAL");
}
display.display();
}
// Status indicators
void normalStatus() {
digitalWrite(greenLedPin, HIGH);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, LOW);
noTone(buzzerPin);
}
void warningAlert() {
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, HIGH);
digitalWrite(redLedPin, LOW);
tone(buzzerPin, 1000, 500); // Beep every second
}
void criticalAlert() {
digitalWrite(greenLedPin, LOW);
digitalWrite(yellowLedPin, LOW);
digitalWrite(redLedPin, HIGH);
tone(buzzerPin, 2000); // Continuous alarm
}