Hệ thống tưới cây năng lượng mặt trời độc lập 100%
Hệ tưới cây hoàn toàn off-grid: solar panel 20W + battery + ESP32 + bơm + cảm biến. Chạy mãi mãi không cần adapter điện lưới. Phù hợp vườn rau xa nhà.
Mục tiêu: chạy 24/7, qua mưa 3 ngày liên tục, vườn xa không có điện.
Tải:
Solar + battery:
Conclusion: 20W panel + 8Ah battery overkill nhưng đủ buffer cho mưa nhiều ngày.
Solar 20W → Charge Controller PWM → Battery 12.8V 8Ah
│
┌────────────────────┴────────────────────┐
│ │
Buck 5V 12V tải khác (none)
│
┌────────┴────────┐
│ │
ESP32 Bơm 5V (qua relay)
│
Cảm biến đất ×4
Charge controller bảo vệ battery khỏi over-discharge (cut off khi < 11V) và over-charge (cut off khi > 14.4V). Quan trọng cho tuổi thọ LiFePO4.
Logic:
#include <WiFi.h>
#include <HTTPClient.h>
#include <esp_sleep.h>
const char* SSID = "FarmGateway";
const char* PASS = "farmpass";
const String API_KEY = "YOUR_TS_KEY";
const int PIN_PUMP_RELAY = 26;
const int PIN_SOIL[4] = {34, 35, 36, 39};
const int PIN_VBAT = 33;
const int SOIL_DRY = 35;
const int PUMP_DURATION_MS = 60000;
float readBattery() {
// Voltage divider: V_bat → R1(100k) → ADC pin → R2(20k) → GND
// V_adc = V_bat × R2/(R1+R2) = V_bat × 20/120 = V_bat / 6
int raw = analogRead(PIN_VBAT);
return raw * (3.3 / 4095) * 6;
}
int readSoil(int pin) {
long sum = 0;
for (int i = 0; i < 10; i++) { sum += analogRead(pin); delay(2); }
float v = sum / 10.0;
int pct = map(v, 3200, 1400, 0, 100);
return constrain(pct, 0, 100);
}
void setup() {
Serial.begin(115200);
pinMode(PIN_PUMP_RELAY, OUTPUT);
digitalWrite(PIN_PUMP_RELAY, LOW);
float vbat = readBattery();
Serial.printf("Battery: %.2fV\n", vbat);
// Bao ve: khong tuoi neu pin yeu
if (vbat < 11.5) {
Serial.println("Battery yeu — bo qua tuoi");
} else {
int soil[4];
int minSoil = 100;
for (int i = 0; i < 4; i++) {
soil[i] = readSoil(PIN_SOIL[i]);
Serial.printf("Soil %d: %d%%\n", i, soil[i]);
if (soil[i] < minSoil) minSoil = soil[i];
}
if (minSoil < SOIL_DRY) {
Serial.println("Tuoi cay");
digitalWrite(PIN_PUMP_RELAY, HIGH);
delay(PUMP_DURATION_MS);
digitalWrite(PIN_PUMP_RELAY, LOW);
}
// Try upload data (timeout 15s)
WiFi.begin(SSID, PASS);
uint32_t start = millis();
while (WiFi.status() != WL_CONNECTED && millis() - start < 15000) delay(500);
if (WiFi.status() == WL_CONNECTED) {
String url = "http://api.thingspeak.com/update?api_key=" + API_KEY +
"&field1=" + String(soil[0]) +
"&field2=" + String(soil[1]) +
"&field3=" + String(soil[2]) +
"&field4=" + String(soil[3]) +
"&field5=" + String(vbat, 2);
HTTPClient http;
http.begin(url);
http.GET();
http.end();
}
}
// Deep sleep 30 phut
esp_sleep_enable_timer_wakeup(30ULL * 60 * 1000000);
esp_deep_sleep_start();
}
void loop() {}
Maintenance:
Mở rộng: