#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <string>
#include <NewPing.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include <RTClib.h>
//#include <ThingsBoard.h>
RTC_DS1307 rtc;
// WiFi configuration
#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TOKEN "y3OsZm5hpk3MzcuRVN0h" // Ganti dengan token akses Anda
char thingsboardServer[] = "thingsboard.cloud";
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient); // Menggunakan PubSubClient sebagai MQTT client
// Ultrasonic sensor configuration
const int triggerPin = 33;
const int echoPin = 25;
NewPing sonar(triggerPin, echoPin); // Deklarasi objek sonar dengan triggerPin dan echoPin
// Servo configuration
#include <ESP32Servo.h>
const int servoPin = 5;
Servo mekanik;
// LCD configuration
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
Serial.println("Menghubungkan ke WiFi...");
WiFi.begin(WIFI_AP, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Berhasil terhubung ke WiFi!");
// Inisialisasi koneksi MQTT
mqttClient.setServer(thingsboardServer, 1883);
// Tunggu hingga koneksi MQTT terhubung
while (!mqttClient.connected()) {
Serial.println("Terhubung ke ThingsBoard MQTT...");
if (mqttClient.connect("ESP32Client", TOKEN, NULL)) {
Serial.println("Terhubung!");
} else {
Serial.print("Gagal terhubung, kode kesalahan: ");
Serial.println(mqttClient.state());
delay(2000);
}
}
// Initialize servo
mekanik.attach(servoPin);
mekanik.write(0);
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.clear();
// Initialize RTC
Wire.begin();
if (!rtc.begin()) {
Serial.println("RTC tidak terhubung");
while (1);
}
lcd.clear();
}
void loop() {
unsigned int proximity = sonar.ping_cm();
delay(1000);
Serial.println("Ketinggian Pakan: " + String(proximity) + " cm");
if (proximity > 150 && proximity <= 200) {
Serial.println("Pakan Mau Habis!");
} else if (proximity > 200) { //
Serial.println("Pakan Habis!");
}
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();
lcd.setCursor(3, 0);
lcd.print(String(tanggal) + "-" + bulan + "-" + tahun);
lcd.setCursor(4, 1);
lcd.print(String(jam) + ":" + menit + ":" + detik + " ");
Serial.println("Tanggal: " + String(tanggal) + "-" + bulan + "-" + tahun);
Serial.println("Waktu: " + String(jam) + ":" + menit + ":" + detik);
Serial.println();
checkFeedingSchedule(jam, menit, detik);
// Kirim data telemetri ke ThingsBoard
sendToThingsBoard(proximity, tanggal, bulan, tahun, jam, menit, detik);
}
void checkFeedingSchedule(int jam, int menit, int detik) {
// Pagi
if (jam == 11 && menit == 50 && detik == 1) {
feedMorning();
}
// Siang
else if (jam == 11 && menit == 55 && detik == 1) {
feedNoon();
}
// Malam
else if (jam == 12 && menit == 10 && detik == 1) {
feedNight();
}
}
void feedMorning() {
lcd.clear();
lcd.print("PAKAN PAGI...");
mekanik.write(90);
delay(3000);
mekanik.write(0);
lcd.clear();
}
void feedNoon() {
lcd.clear();
lcd.print("PAKAN SIANG..");
mekanik.write(90);
delay(3000);
mekanik.write(0);
lcd.clear();
}
void feedNight() {
lcd.clear();
lcd.print("PAKAN MALAM..");
mekanik.write(90);
delay(3000);
mekanik.write(0);
lcd.clear();
}
void sendToThingsBoard(unsigned int proximity, int tanggal, int bulan, int tahun, int jam, int menit, int detik) {
StaticJsonDocument<200> jsonDoc;
jsonDoc["proximity"] = proximity;
jsonDoc["tanggal"] = tanggal;
jsonDoc["bulan"] = bulan;
jsonDoc["tahun"] = tahun;
jsonDoc["jam"] = jam;
jsonDoc["menit"] = menit;
jsonDoc["detik"] = detik;
char buffer[512];
size_t n = serializeJson(jsonDoc, buffer);
buffer[n] = '\0';
mqttClient.publish("v1/devices/me/telemetry", buffer);
}
/*Judul Project : Smart Fish Feeder: Solusi Otomatisasi Pakan Ikan Berbasis ESP32 dan ThingsBoard
Deskripsi Project : Projek ini adalah sebuah sistem otomatisasi untuk memberi makan ikan dengan menggunakan mikrokontroler ESP32.
Sistem ini memiliki beberapa fitur utama, yaitu mengukur ketinggian pakan menggunakan sensor ultrasonik,
mengendalikan servo untuk membuka tutup mekanisme pemberian pakan,
menampilkan informasi waktu dan status pakan di LCD, dan mengirim data telemetri ke platform ThingsBoard melalui protokol MQTT.
Projek ini cocok untuk pemeliharaan ikan yang memerlukan pemberian pakan otomatis dan pemantauan jarak jauh menggunakan platform IoT.*/