Araba, motosiklet veya UPS sistemlerinde kullandığımız 12V kurşun-asit akülerin uzun ömürlü olması için doğru voltajda şarj edilmeleri ve dolduklarında şarj akımının kesilmesi şarttır. Sürekli yüksek voltaja maruz kalan aküler "kaynama" yapar ve sülfatlaşarak hızlıca bozulur.
Bu projede, harici hiçbir hosting veya internet ağına muhtaç kalmadan, ESP8266'nın kendi lokal web arayüzü üzerinden akü voltajını anlık izleyecek ve akü 14.4V'a ulaştığında şarjı otomatik kesen bir sistem kuracağız.
ESP8266’nın analog giriş pini (A0) en fazla 3.3V ölçebilir. Bizim akümüz ise şarj sırasında 15V seviyelerine kadar çıkabilir. Bu yüksek voltajı ESP8266'nın güvenle okuyabileceği 0-3.3V aralığına düşürmek için Gerilim Bölücü (Voltage Divider) devre mantığını kullanacağız.
Matematiksel Mantık: Aküden 15V gelse bile, bu iki direnç voltajı tam olarak oranlar:
Voltaj Ölçüm Bağlantısı:
Röle Bağlantısı:
Aşağıdaki kod, akünün voltajını saniyede bir ölçer. Akü 14.4V'a ulaştığında (Tam Dolum) şarjı keser, akü voltajı 12.4V'a düştüğünde ise şarjı otomatik olarak yeniden başlatır.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char* ssid = "WIFI_ADINIZ";
const char* password = "WIFI_SIFRENIZ";
ESP8266WebServer server(80);
const int rolePin = 4; // Röle D2 (GPIO4) pininde
const int analogPin = A0; // Voltaj okuma pini
float akuVoltaj = 0.0;
int akuYuzde = 0;
bool sarjDurumu = true;
void setup() {
Serial.begin(115200);
pinMode(rolePin, OUTPUT);
digitalWrite(rolePin, HIGH); // Başlangıçta şarjı başlat (Röle çekili)
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWi-Fi Bağlandı. IP:");
Serial.println(WiFi.localIP());
// Web arayüzü tasarımı
server.on("/", []() {
String html = "<!DOCTYPE html><html><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, initial-scale=1'>";
html += "<style>html{font-family:Arial; text-align:center; margin-top:50px; background:#f4f6f7;} .card{background:white; padding:30px; display:inline-block; border-radius:10px; box-shadow:0 4px 8px rgba(0,0,0,0.1);} h1{color:#2c3e50;} .status{font-size:22px; margin:15px; color:#34495e;}</style></head>";
html += "<body><div class='card'><h1>12V Akü Şarj İstasyonu</h1>";
html += "<p class='status'><b>Akü Voltajı:</b> " + String(akuVoltaj, 2) + " V</p>";
html += "<p class='status'><b>Tahmini Doluluk:</b> %" + String(akuYuzde) + "</p>";
html += "<p class='status'><b>Şarj Modu:</b> " + String(sarjDurumu ? "<span style='color:green;font-weight:bold;'>ŞARJ EDİLİYOR</span>" : "<span style='color:red;font-weight:bold;'>ŞARJ KESİLDİ (DOLU)</span>") + "</p>";
html += "</div><script>setInterval(function(){ location.reload(); }, 3000);</script></body></html>";
server.send(200, "text/html", html);
});
server.begin();
}
void loop() {
server.handleClient();
// 1. ADIM: Analog değeri oku
int rawAnalog = analogRead(analogPin);
// 2. ADIM: Voltajı Hesapla
// 100k ve 22k direnç bölücü çarpanı: (100 + 22) / 22 = 5.545
float vOut = (rawAnalog * 3.3) / 1023.0;
akuVoltaj = vOut * 5.545;
// 3. ADIM: Akü Yüzde Hesabı (Deşarj sınırı 10.5V, Tam dolu şarj kesim sonrası dinlenmiş akü 12.7V)
akuYuzde = map(constrain(akuVoltaj * 10, 105, 127), 105, 127, 0, 100);
// 4. ADIM: Şarj Kontrol Algoritması (Histerezisli Döngü)
if (akuVoltaj >= 14.40 && sarjDurumu) {
digitalWrite(rolePin, LOW); // Röleyi bırak, şarjı akımı kes
sarjDurumu = false;
Serial.println("Akü 14.4V'a ulaştı. Şarj güvenli bir şekilde kesildi.");
}
if (akuVoltaj <= 12.40 && !sarjDurumu) {
digitalWrite(rolePin, HIGH); // Akü deşarj oldu, şarjı tekrar başlat
sarjDurumu = true;
Serial.println("Akü voltajı düştü. Şarj yeniden başlatılıyor...");
}
delay(1000);
}

videolu anlatım gelir mi
İlerleyen zamanda gelir.