// DI SITU UDAH BERUBAH KAN YA?
#include <ESP32Servo.h>
#include <Arduino.h>
#if defined(ESP32)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif
#include <FirebaseESP32.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "DHT.h"
//Provide the token generation process info.
#include "addons/TokenHelper.h"
//Provide the RTDB payload printing info and other helper functions.
#include "addons/RTDBHelper.h"
const String url = "http://worldtimeapi.org/api/timezone/Asia/Jakarta";
// Insert your network credentials
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Insert Firebase project API Key
#define FIREBASE_AUTH "E0oNBBfw7T9KpTKqjFcpoPl11LtTXRTcysXF7wih" //ini ambilnya di bagian Project Settings > Service Accounts > Database Secret
// Insert RTDB URLefine the RTDB URL */
#define FIREBASE_HOST "https://db-burung-default-rtdb.asia-southeast1.firebasedatabase.app/"
FirebaseData firebaseData;
FirebaseData timerData;
FirebaseData pakanData;
FirebaseData minumData;
String json = "";
String timeNow = "";
const int servoPin = 13;
#define RELAY 15
#define trigPinAir 4
#define echoPinAir 2
#define trigPinPakan 14
#define echoPinPakan 27
#define DHTPIN 26
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
Servo servo;
//API TIME
void getTime() {
HTTPClient http;
http.useHTTP10(true);
http.begin(url);
http.GET();
String result = http.getString();
DynamicJsonDocument doc(2048);
DeserializationError error = deserializeJson(doc, result);
// Test if parsing succeeds.
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
}
String timenow = doc["datetime"].as<String>();
http.end();
String valid_time = timenow.substring(11, 16);
Serial.println(valid_time);
timeNow = valid_time;
}
void setup() {
servo.attach(servoPin, 500, 2400);
Serial.begin (9600);
dht.begin();
pinMode(RELAY, OUTPUT);
pinMode(trigPinAir, OUTPUT);
pinMode(echoPinAir, INPUT);
pinMode(trigPinPakan, OUTPUT);
pinMode(echoPinPakan, INPUT);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
Firebase.reconnectWiFi(true);
}
int pos = 0;
bool sudahDikasiMakan = false;
void loop() {
getTime();
if (Firebase.getString(timerData, "/burung/time")){
Serial.println(timerData.stringData());
if (timerData.stringData() == timeNow){
if (!sudahDikasiMakan){
if (Firebase.getString(pakanData, "/burung/pakan"))
Serial.println(pakanData.stringData());
if (pakanData.stringData() == "15 g") {
//servo
for (pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(15);
}
for (pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(15);
}
}
if (Firebase.getString(pakanData, "/burung/pakan"))
Serial.println(pakanData.stringData());
if (pakanData.stringData() == "10 g") {
//servo
for (pos = 0; pos <= 270; pos += 1) {
servo.write(pos);
delay(15);
}
for (pos = 0; pos <= 270; pos += 1) {
servo.write(pos);
delay(15);
}
}
if (Firebase.getString(minumData, "/burung/minum"))
Serial.println(minumData.stringData());
if (minumData.stringData() == "100 ml") {
//water pump
digitalWrite(RELAY, HIGH);
Serial.println("lampu hidup");
delay(1000);
digitalWrite(RELAY, LOW);
Serial.println("lampu mati");
delay(2000);
}
if (Firebase.getString(minumData, "/burung/minum"))
Serial.println(minumData.stringData());
if (minumData.stringData() == "50 ml") {
//water pump
digitalWrite(RELAY, HIGH);
Serial.println("lampu hidup");
delay(500);
digitalWrite(RELAY, LOW);
Serial.println("lampu mati");
delay(2000);
}
if (Firebase.setString(firebaseData, "/laporan/ket", "Berhasil"))
{
Serial.println("Laporan Data Terkirim");
}
if (Firebase.setString(firebaseData, "/laporan/time", timeNow))
{
Serial.println("Laporan Data Terkirim");
}
else
{
Serial.println("Gagal");
Serial.println("Keterangan gagal : " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
sudahDikasiMakan = true;
}
}
else{
sudahDikasiMakan = false;
}
}else{
Serial.println("Gagal");
Serial.println("Keterangan gagal : " + timerData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
//persediaan air
long durasiAir, jarakAir; //Varibel durasi dan jarak
digitalWrite(trigPinAir,LOW);
delayMicroseconds(2);
digitalWrite(trigPinAir, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinAir, LOW);
durasiAir = pulseIn(echoPinAir, HIGH);
jarakAir = (durasiAir/2) / 29; //Perhitungan untuk pembacaan jarak
if(jarakAir < 10 ){
if (Firebase.setString(firebaseData, "/persediaan/statusAir", "Tersedia"))
{
Serial.println("Data Persediaan Terkirim");
}
else
{
Serial.println("Gagal");
Serial.println("Keterangan gagal : " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
}
else{
if (Firebase.setString(firebaseData, "/persediaan/statusAir", "Tidak Tersedia"))
{
Serial.println("Data Persediaan Terkirim");
}
else {
Serial.println("Gagal");
Serial.println("Keterangan gagal : " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
}
//persediaan pakan
long durasiPakan, jarakPakan; //Varibel durasi dan jarak
digitalWrite(trigPinPakan,LOW);
delayMicroseconds(2);
digitalWrite(trigPinPakan, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinPakan, LOW);
durasiPakan = pulseIn(echoPinPakan, HIGH);
jarakPakan = (durasiPakan/2) / 29; //Perhitungan untuk pembacaan jarak
if(jarakPakan < 10 ){
if (Firebase.setString(firebaseData, "/persediaan/statusPakan", "Tersedia"))
{
Serial.println("Data Persediaan Terkirim");
}
else
{
Serial.println("Gagal");
Serial.println("Keterangan gagal : " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
}
else{
if (Firebase.setString(firebaseData, "/persediaan/statusPakan", "Tidak Tersedia"))
{
Serial.println("Data Persediaan Terkirim");
}
else {
Serial.println("Gagal");
Serial.println("Keterangan gagal : " + firebaseData.errorReason());
Serial.println("------------------------------------");
Serial.println();
}
}
//suhu dan temperatur
float h = dht.readHumidity();
float t = dht.readTemperature();
// Memeriksa apakah sensor berhasil mambaca suhu dan kelembaban
if (isnan(t) || isnan(h)) {
Serial.println("Gagal membaca sensor DHT11");
return;
}
Serial.print("Temperature : ");
Serial.print(t);
Serial.print(" Humidity : ");
Serial.println(h);
if (Firebase.setFloat(firebaseData, "/suhu/temperatur", t)){
Serial.println("Suhu terkirim");
} else{
Serial.println("Suhu tidak terkirim");
Serial.println("Karena: " + firebaseData.errorReason());
}
if (Firebase.setFloat(firebaseData, "/suhu/humadity", h)){
Serial.println("Kelembaban terkirim");
Serial.println();
} else{
Serial.println("Kelembaban tidak terkirim");
Serial.println("Karena: " + firebaseData.errorReason());
}
delay(2000);
}