#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <string>
#include <NewPing.h>
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
// WiFi configurationku
const char *mqttUser = "";
const char *mqttPassword = "";
const char *ssid = "Wokwi-GUEST";
const char *password = "";
// const char *mqttServer = "0.tcp.ap.ngrok.io";
// const int mqttPort = 14388;
// char mqttTopic[] = "IOT";
// WiFiClient espClient;
// PubSubClient client(espClient);
// Ultrasonic sensor configuration
const int triggerPin = 33;
const int echoPin = 32;
NewPing sonar(triggerPin, echoPin);
// Koding Servo
#include <ESP32Servo.h>
const int servoPin = 5;
Servo mekanik;
// Koding LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
// Koneksi ke WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// // Koneksi ke broker MQTT
// client.setServer(mqttServer, mqttPort);
// client.setCallback(callback);
// while (!client.connected()) {
// Serial.println("Connecting to MQTT...");
// if (client.connect("ESP8266Client", mqttUser, mqttPassword)) {
// Serial.println("Connected to MQTT");
// } else {
// Serial.print("Failed with state ");
// Serial.print(client.state());
// delay(2000);
// }
// }
// Koding Servo
mekanik.attach(servoPin);
mekanik.write(0);
// Koding LCD
lcd.init();
lcd.backlight();
lcd.clear();
// Coding RTC
Wire.begin();
if (!rtc.begin()) {
Serial.println("RTC tidak terhubung");
while (1);
}
lcd.clear();
}
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message received on topic: ");
Serial.println(topic);
Serial.print("Payload: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
// void publishProximity(unsigned int proximity) {
// char message[10];
// snprintf(message, sizeof(message), "%u", proximity);
// client.publish(mqttTopic, message);
// }
void loop() {
// client.loop();
// Measure distance using ultrasonic sensor
unsigned int proximity = sonar.ping_cm();
// // Publish proximity to MQTT
// publishProximity(proximity);
// Wait for a moment before the next measurement
delay(1000);
Serial.println("Ketinggian Pakan: " + String(proximity) + " cm");
// Beri tahu jarak ketinggian pakan dengan tutup atas
if (proximity > 150 & proximity <= 200) {
Serial.println("Pakan Mau Habis!");
}
else if (proximity > 200) {
Serial.println("Pakan Habis!");
}
//Coding RTC
DateTime now = rtc.now();
int tahun = now.year();
int bulan = now.month();
int tanggal = now.day();
int jam = now.hour();
int menit = now.minute();
int detik = now.second();
//Koding LCD---------------------------
lcd.setCursor(3, 0);
lcd.print(String() + tanggal + "-" + bulan + "-" + tahun);
lcd.setCursor(4, 1);
lcd.print(String() + jam + ":" + menit + ":" + detik + " ");
Serial.println(String() + "Tanggal: " + tanggal + "-" + bulan + "-" + tahun);
Serial.println(String() + "Waktu: " + jam + ":" + menit + ":" + detik);
Serial.println();
//Jadwal Kasih Pakan pagi
if ((jam == 20) && (menit == 26) && (detik == 1)) {
kasihpakanpagi();
}
//Jadwal Kasih Pakan siang
if ((jam == 20) && (menit == 26) && (detik == 30)) {
kasihpakansiang();
}
//Jadwal Kasih Pakan malam
if ((jam == 23) && (menit == 52) && (detik == 40)) {
kasihpakanmalam();
}
}
void kasihpakanpagi() {
lcd.clear();
lcd.print("PAKAN PAGI...");
mekanik.write(90);
delay(3000);
mekanik.write(0);
lcd.clear();
}
void kasihpakansiang() {
lcd.clear();
lcd.print("PAKAN SIANG..");
mekanik.write(90);
delay(3000);
mekanik.write(0);
lcd.clear();
}
void kasihpakanmalam() {
lcd.clear();
lcd.print("PAKAN MALAM..");
mekanik.write(90);
delay(3000);
mekanik.write(0);
lcd.clear();
}