kode esp
This commit is contained in:
parent
e0a3d3cf25
commit
0a95cd834a
|
@ -0,0 +1,151 @@
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <Firebase_ESP_Client.h>
|
||||||
|
#include <DHT.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <LiquidCrystal_I2C.h>
|
||||||
|
|
||||||
|
// === KREDENSIAL ===
|
||||||
|
#define WIFI_SSID "nanaaaaa"
|
||||||
|
#define WIFI_PASSWORD "nanaaaaa"
|
||||||
|
#define API_KEY "AIzaSyBB40eRLlP7kp52g2Hvmx3PkrkzYjuFnpo"
|
||||||
|
#define DATABASE_URL "https://smartfarming-7bd96-default-rtdb.firebaseio.com/"
|
||||||
|
#define LEGACY_TOKEN "ShlkXYkTpTh2o4b38tqZozBv2oLXyUSnZUUXUCslu"
|
||||||
|
|
||||||
|
// === PIN ===
|
||||||
|
#define DHTPIN 14
|
||||||
|
#define DHTTYPE DHT11
|
||||||
|
#define RELAY_KIPAS 26
|
||||||
|
#define RELAY_POMPA 27
|
||||||
|
|
||||||
|
// === OBJEK ===
|
||||||
|
FirebaseData fbdo;
|
||||||
|
FirebaseAuth auth;
|
||||||
|
FirebaseConfig config;
|
||||||
|
DHT dht(DHTPIN, DHTTYPE);
|
||||||
|
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C umum
|
||||||
|
|
||||||
|
// === VARIABEL ===
|
||||||
|
unsigned long lastUpdate = 0;
|
||||||
|
unsigned long interval = 5000;
|
||||||
|
float thresholdSuhu = 29.0;
|
||||||
|
float thresholdKelembaban = 50.0;
|
||||||
|
bool isManual = true;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
dht.begin();
|
||||||
|
|
||||||
|
pinMode(RELAY_KIPAS, OUTPUT);
|
||||||
|
pinMode(RELAY_POMPA, OUTPUT);
|
||||||
|
digitalWrite(RELAY_KIPAS, HIGH); // Active LOW
|
||||||
|
digitalWrite(RELAY_POMPA, HIGH);
|
||||||
|
|
||||||
|
Wire.begin(21, 22); // LCD I2C pin SDA = 21, SCL = 22
|
||||||
|
lcd.init();
|
||||||
|
lcd.backlight();
|
||||||
|
lcd.setCursor(0, 0);
|
||||||
|
lcd.print("Menghubungkan...");
|
||||||
|
|
||||||
|
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
|
||||||
|
while (WiFi.status() != WL_CONNECTED) {
|
||||||
|
delay(500);
|
||||||
|
Serial.print(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
lcd.clear();
|
||||||
|
lcd.setCursor(0, 0);
|
||||||
|
lcd.print("WiFi Terhubung");
|
||||||
|
delay(1000);
|
||||||
|
|
||||||
|
config.api_key = API_KEY;
|
||||||
|
config.database_url = DATABASE_URL;
|
||||||
|
config.signer.tokens.legacy_token = LEGACY_TOKEN;
|
||||||
|
Firebase.begin(&config, &auth);
|
||||||
|
Firebase.reconnectWiFi(true);
|
||||||
|
|
||||||
|
lcd.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (millis() - lastUpdate >= interval && Firebase.ready()) {
|
||||||
|
lastUpdate = millis();
|
||||||
|
|
||||||
|
float suhu = dht.readTemperature();
|
||||||
|
float kelembaban = dht.readHumidity();
|
||||||
|
|
||||||
|
// Ambil nilai kontrol manual dari Firebase
|
||||||
|
if (Firebase.RTDB.getBool(&fbdo, "/control/manual")) {
|
||||||
|
isManual = fbdo.boolData();
|
||||||
|
Serial.println(isManual ? "Mode: MANUAL" : "Mode: OTOMATIS");
|
||||||
|
} else {
|
||||||
|
Serial.println("Gagal ambil mode manual, pakai default (MANUAL)");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ambil threshold suhu & kelembaban
|
||||||
|
if (!isManual) {
|
||||||
|
if (Firebase.RTDB.getFloat(&fbdo, "/treshold/suhu")) {
|
||||||
|
thresholdSuhu = fbdo.floatData();
|
||||||
|
}
|
||||||
|
if (Firebase.RTDB.getFloat(&fbdo, "/treshold/kelembaban")) {
|
||||||
|
thresholdKelembaban = fbdo.floatData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.printf("Suhu: %.2f °C, Kelembaban: %.2f %%\n", suhu, kelembaban);
|
||||||
|
|
||||||
|
// Tampilkan ke LCD
|
||||||
|
lcd.setCursor(0, 0);
|
||||||
|
lcd.print("Suhu: ");
|
||||||
|
lcd.print(suhu, 1);
|
||||||
|
lcd.print((char)223);
|
||||||
|
lcd.print("C ");
|
||||||
|
lcd.setCursor(0, 1);
|
||||||
|
lcd.print("Lembab: ");
|
||||||
|
lcd.print(kelembaban, 1);
|
||||||
|
lcd.print("% ");
|
||||||
|
|
||||||
|
// Kirim sensor ke Firebase
|
||||||
|
Firebase.RTDB.setFloat(&fbdo, "/dht11/suhu", suhu);
|
||||||
|
Firebase.RTDB.setFloat(&fbdo, "/dht11/humidity", kelembaban);
|
||||||
|
|
||||||
|
// === MODE MANUAL ===
|
||||||
|
if (isManual) {
|
||||||
|
// Ambil status kipas & pompa dari Firebase
|
||||||
|
if (Firebase.RTDB.getBool(&fbdo, "/status/kipas")) {
|
||||||
|
bool kipas_status = fbdo.boolData();
|
||||||
|
digitalWrite(RELAY_KIPAS, kipas_status ? LOW : HIGH);
|
||||||
|
Serial.println("Kipas: " + String(kipas_status ? "ON (manual)" : "OFF"));
|
||||||
|
}
|
||||||
|
if (Firebase.RTDB.getBool(&fbdo, "/status/pompa")) {
|
||||||
|
bool pompa_status = fbdo.boolData();
|
||||||
|
digitalWrite(RELAY_POMPA, pompa_status ? LOW : HIGH);
|
||||||
|
Serial.println("Pompa: " + String(pompa_status ? "ON (manual)" : "OFF"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// === MODE OTOMATIS ===
|
||||||
|
else {
|
||||||
|
// Pompa otomatis
|
||||||
|
if (kelembaban <= thresholdKelembaban) {
|
||||||
|
digitalWrite(RELAY_POMPA, LOW);
|
||||||
|
Firebase.RTDB.setBool(&fbdo, "/status/pompa", true);
|
||||||
|
Serial.println("Pompa ON (otomatis)");
|
||||||
|
} else {
|
||||||
|
digitalWrite(RELAY_POMPA, HIGH);
|
||||||
|
Firebase.RTDB.setBool(&fbdo, "/status/pompa", false);
|
||||||
|
Serial.println("Pompa OFF (otomatis)");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kipas otomatis
|
||||||
|
if (suhu >= thresholdSuhu) {
|
||||||
|
digitalWrite(RELAY_KIPAS, LOW);
|
||||||
|
Firebase.RTDB.setBool(&fbdo, "/status/kipas", true);
|
||||||
|
Serial.println("Kipas ON (otomatis)");
|
||||||
|
} else {
|
||||||
|
digitalWrite(RELAY_KIPAS, HIGH);
|
||||||
|
Firebase.RTDB.setBool(&fbdo, "/status/kipas", false);
|
||||||
|
Serial.println("Kipas OFF (otomatis)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue