#include <WiFi.h>
#include <FirebaseESP32.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Thông tin kết nối WiFi và Firebase
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASSWORD "your_wifi_password"
#define FIREBASE_HOST "your_firebase_host"
#define FIREBASE_AUTH "your_firebase_auth_token"
// Khai báo chân cảm biến khoảng cách
const int trigPin = 5;
const int echoPin = 18;
// Khai báo chân LED
const int ledRed = 12;
const int ledGreen = 13;
// Cài đặt cho màn hình OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Cài đặt cho Firebase
FirebaseData firebaseData;
// Kích thước thùng chứa (2m x 2m x 2m)
const float tankWidth = 2.0; // Chiều rộng của thùng chứa (m)
const float tankLength = 2.0; // Chiều dài của thùng chứa (m)
const float tankHeight = 2.0; // Chiều cao của thùng chứa (m)
float fuelLevel = 0; // Chiều cao nhiên liệu còn lại (m)
float fuelVolume = 0; // Thể tích nhiên liệu còn lại (m^3)
float maxVolume = tankWidth * tankLength * tankHeight; // Thể tích tối đa
// Hàm kết nối WiFi
void connectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
}
// Hàm khởi tạo Firebase
void initFirebase() {
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
}
// Hàm đo khoảng cách (cm) từ cảm biến
float getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = (duration * 0.034) / 2; // Đo khoảng cách (cm)
return distance / 100.0; // Chuyển đổi sang mét
}
// Hàm tính toán thể tích xăng còn lại
float calculateVolume(float fuelHeight) {
return tankWidth * tankLength * fuelHeight; // Tính thể tích xăng còn lại (m^3)
}
// Hàm cập nhật thông tin lên Firebase
void updateFirebase(float fuelLevel, float fuelVolume) {
Firebase.setFloat(firebaseData, "/fuelLevelPercentage", (fuelLevel / tankHeight) * 100);
Firebase.setFloat(firebaseData, "/fuelVolume", fuelVolume);
if (fuelVolume <= maxVolume * 0.05) {
Firebase.setString(firebaseData, "/status", "Empty");
} else if (fuelVolume >= maxVolume * 0.95) {
Firebase.setString(firebaseData, "/status", "Full");
} else {
Firebase.setString(firebaseData, "/status", "Normal");
}
}
// Hàm hiển thị thông tin lên OLED
void updateOLED(float fuelLevel, float fuelVolume) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Fuel Level: ");
display.print((fuelLevel / tankHeight) * 100);
display.println("%");
display.setCursor(0, 16);
display.print("Volume: ");
display.print(fuelVolume);
display.println(" m^3");
display.display();
}
// Hàm điều khiển LED
void updateLED(float fuelVolume) {
if (fuelVolume <= maxVolume * 0.05) {
digitalWrite(ledRed, HIGH);
digitalWrite(ledGreen, LOW);
} else if (fuelVolume >= maxVolume * 0.95) {
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, HIGH);
} else {
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, LOW);
}
}
void setup() {
Serial.begin(115200);
// Khởi tạo chân cảm biến, LED, và OLED
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Địa chỉ I2C mặc định của OLED
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Dừng chương trình nếu không khởi tạo được OLED
}
display.display();
delay(2000); // Chờ màn hình khởi động
display.clearDisplay();
connectWiFi();
initFirebase();
}
void loop() {
float distance = getDistance(); // Đo khoảng cách từ cảm biến (m)
fuelLevel = tankHeight - distance; // Tính chiều cao nhiên liệu còn lại (m)
fuelVolume = calculateVolume(fuelLevel); // Tính thể tích nhiên liệu còn lại (m^3)
// Cập nhật OLED và Firebase
updateOLED(fuelLevel, fuelVolume);
updateFirebase(fuelLevel, fuelVolume);
updateLED(fuelVolume);
// In ra Serial để theo dõi
Serial.print("Fuel Level: ");
Serial.print((fuelLevel / tankHeight) * 100);
Serial.println("%");
Serial.print("Fuel Volume: ");
Serial.print(fuelVolume);
Serial.println(" m^3");
delay(5000); // Đợi 5 giây trước khi đo lại
}