Last active 1766034188

penyiraman-iot.ino Raw
1#include <WiFi.h>
2#include <Firebase_ESP_Client.h>
3#include <DHT.h>
4#include "addons/TokenHelper.h"
5#include "addons/RTDBHelper.h"
6
7// ====== KONFIGURASI WIFI ======
8#define WIFI_SSID "REDMI 15C"
9#define WIFI_PASSWORD "12312345"
10
11// ====== KONFIGURASI FIREBASE ======
12#define API_KEY "AIzaSyAO4ja4G-y20Qv20pe_kU7-vItW908nec4"
13#define DATABASE_URL "https://penyiramanotomatis-3f962-default-rtdb.asia-southeast1.firebasedatabase.app/"
14
15// ====== PIN SENSOR DAN RELAY ======
16#define DHTPIN 4
17#define DHTTYPE DHT11
18#define SOIL_PIN 36
19#define RELAY_PIN 5
20
21DHT dht(DHTPIN, DHTTYPE);
22
23FirebaseData fbdo;
24FirebaseAuth auth;
25FirebaseConfig config;
26
27unsigned long sendDataPrevMillis = 0;
28bool signupOK = false;
29bool modeOtomatis = true;
30
31int moistureThreshold = 30; // default kalau Firebase gagal
32unsigned long lastFetchThreshold = 0;
33
34void fetchThresholdFromFirebase() {
35 if (Firebase.RTDB.getInt(&fbdo, "controls/pump/moisture_threshold")) {
36 moistureThreshold = fbdo.intData();
37 Serial.println("Threshold diperbarui: " + String(moistureThreshold) + "%");
38 } else {
39 Serial.println("Gagal ambil threshold: " + fbdo.errorReason());
40 }
41}
42
43void setup() {
44 Serial.begin(115200);
45 dht.begin();
46 pinMode(SOIL_PIN, INPUT);
47 pinMode(RELAY_PIN, OUTPUT);
48 digitalWrite(RELAY_PIN, HIGH);
49
50 // ====== KONEKSI WIFI ======
51 WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
52 Serial.print("Menghubungkan WiFi");
53 while (WiFi.status() != WL_CONNECTED) {
54 Serial.print(".");
55 delay(300);
56 }
57 Serial.println("\nTerhubung ke WiFi!");
58
59 // ====== KONFIGURASI FIREBASE ======
60 config.api_key = API_KEY;
61 config.database_url = DATABASE_URL;
62
63 if (Firebase.signUp(&config, &auth, "", "")) {
64 Serial.println("Firebase SignUp OK");
65 signupOK = true;
66 } else {
67 Serial.printf("SignUp Error: %s\n", config.signer.signupError.message.c_str());
68 }
69
70 Firebase.begin(&config, &auth);
71 Firebase.reconnectWiFi(true);
72}
73
74void loop() {
75 if (!Firebase.ready() || !signupOK) return;
76
77 // === BACA SENSOR ===
78 float suhu = dht.readTemperature();
79 float kelembapanUdara = dht.readHumidity();
80 int soilValue = analogRead(SOIL_PIN);
81 float kelembapanTanah = map(soilValue, 4095, 0, 0, 100);
82
83 Serial.println("===========================");
84 Serial.println("Suhu: " + String(suhu) + "°C");
85 Serial.println("Kelembapan Udara: " + String(kelembapanUdara) + "%");
86 Serial.println("Kelembapan Tanah: " + String(kelembapanTanah) + "%");
87
88 // === BACA MODE DARI FIREBASE ===
89 if (Firebase.RTDB.getString(&fbdo, "controls/pump/mode")) {
90 String mode = fbdo.stringData();
91 modeOtomatis = (mode == "auto");
92 }
93
94 // === KONTROL POMPA ===
95 if (modeOtomatis) {
96 fetchThresholdFromFirebase();
97 if (kelembapanTanah < moistureThreshold) {
98 digitalWrite(RELAY_PIN, LOW); // pompa menyala
99 Firebase.RTDB.setString(&fbdo, "status/pompa", "ON");
100 Serial.println("Pompa ON (otomatis - tanah kering)");
101 } else {
102 digitalWrite(RELAY_PIN, HIGH); // pompa mati
103 Firebase.RTDB.setString(&fbdo, "status/pompa", "OFF");
104 Serial.println("Pompa OFF (otomatis - tanah lembap)");
105 }
106 } else {
107 // === MODE MANUAL ===
108 if (Firebase.RTDB.getString(&fbdo, "status/pompa")) {
109 String control = fbdo.stringData();
110 if (control == "ON") {
111 digitalWrite(RELAY_PIN, LOW);
112 Serial.println("Pompa ON (manual)");
113 } else {
114 digitalWrite(RELAY_PIN, HIGH);
115 Serial.println("Pompa OFF (manual)");
116 }
117 }
118 }
119
120 // === KIRIM DATA SENSOR SETIAP 2 DETIK ===
121 if (millis() - sendDataPrevMillis > 3000) {
122 sendDataPrevMillis = millis();
123 Firebase.RTDB.setFloat(&fbdo, "sensor/suhu", suhu);
124 Firebase.RTDB.setFloat(&fbdo, "sensor/kelembapan_udara", kelembapanUdara);
125 Firebase.RTDB.setFloat(&fbdo, "sensor/kelembapan_tanah", kelembapanTanah);
126 Serial.println("Data sensor dikirim ke Firebase!");
127 }
128
129 delay(1000);
130}