#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <string>
#include <NewPing.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
// WiFi configuration
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 = 11099;
char mqttTopic[] = "PIO";
WiFiClient espClient;
PubSubClient client(espClient);
// Ultrasonic sensor configuration
const int triggerPin = 33;
const int echoPin = 32;
NewPing sonar(triggerPin, echoPin);
int food;
// 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);
}
// Delay kirim data
unsigned long lastPublishTime = 0;
const unsigned long publishInterval = 3000; // Set the desired interval in milliseconds
void loop() {
client.loop();
food = 0;
// 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);
// Display proximity in the Wokwi console
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!");
}
// RTC disini
// 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 == 7) && (menit == 0) && (detik == 0)) {
kasihpakanpagi();
food = 1;
Serial.println("Food status: " + String(food));
delay(10000);
}
// Jadwal Kasih Pakan siang
if ((jam == 13) && (menit == 0) && (detik == 0)) {
kasihpakansiang();
food = 1;
Serial.println("Food status: " + String(food));
delay(10000);
}
// Jadwal Kasih Pakan malam
if ((jam == 19) && (menit == 0) && (detik == 0)) {
kasihpakanmalam();
food = 1;
Serial.println("Food status: " + String(food));
delay(10000);
}
// RTC selesai
// Sent Data
unsigned long currentTime = millis();
if (currentTime - lastPublishTime >= publishInterval) {
lastPublishTime = currentTime;
StaticJsonDocument<300> doc;
doc["proximity"] = proximity;
doc["food"] = food;
doc["tahun"] = tahun;
doc["bulan"] = bulan;
doc["tanggal"] = tanggal;
doc["jam"] = jam;
doc["menit"] = menit;
doc["detik"] = detik;
String out;
serializeJson(doc, out);
char json[out.length() + 1];
out.toCharArray(json, out.length() + 1);
// publish data
client.publish(mqttTopic, out.c_str());
client.publish(mqttTopic, "######");
}
}
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();
}