#include <Wire.h>
#include <ESP32Servo.h>
#include "RTClib.h"
// library external connection
#include <WiFi.h> //apabila menggunakan board ESP32 maka menggunakan library WiFi.h
#include "ThingsBoard.h"
#define WIFI_SSID "Wokwi-GUEST" //deklarasi ssid wifi yang digunakan, disesuiakan dengan wifi yang digunakan
#define WIFI_PASSWORD "" //deklarasi password wifi yang digunakan
// See https://thingsboard.io/docs/getting-started-guides/helloworld/
// to understand how to obtain an access token
#define TOKEN "NmqrH7fuGFiav2nR5Ubp" //deklarasi token device yang digunakan untuk menguhubungkan esp32 dengan device pada thingsboard, tokennya disesuaikan dengan device yang digunakan bisa di cek langsung ketika membuka device pada thingsboard
#define THINGSBOARD_SERVER "thingsboard.cloud" //alamat server dari thingsboard, jika menggunakan server probadi alamatnya bisa disesuaikan, apabila menggunakan server yang disediakan thingsboard alamatnya adalah thingsboar.cloud
// Deklarasi Thingsboard client dan mengubah perintah WiFiClient menjadi espClient
WiFiClient espClient;
// Deklarasi untuk mengubah perintah Thingsboard menjadi tb dan memasukkan perintah WiFiClient yang sudah diubah menjadi espClient ke dalam library Thingsboard
ThingsBoard tb(espClient);
int status = WL_IDLE_STATUS; //deklarasi status wifi yang dimasukkan dalam variabel status
RTC_DS3231 rtc;
DateTime now;
DateTime log_start_program;
DateTime next_schedule;
float distance_feed=1000;
int durasi_pemberian_pakan=3; // menit
#define ECHO_PIN 21
#define TRIG_PIN 19
#define pinBuzzer 27
Servo myservo;
int potpin = 0;
int val;
const int I2C_ADDRESS = 0x68;
// external connection
void connect() //void mengoneksikan esp dengan wifi pertama kali
{
Serial.println("Connecting to AP ...");
// attempt to connect to WiFi network
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
void reconnect() { //peintah recconect wifi apabila esp terputus dengan jaringan wifinya
// Loop until we're reconnected
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
}
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void setup(){
Wire.begin(12, 13);
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
// rtc.adjust(DateTime(__DATE__, __TIME__));
log_start_program = rtc.now();
// next_schedule = log_start_program.AddMinutes(3)
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(115200);
pinMode(pinBuzzer, OUTPUT);
myservo.attach(15);
connect(); //memanggil void connect untuk mengoneksikan esp32 dengan jaringan wifi
}
bool isRecord(){
// return now.hour()==6||now.hour()==12||now.hour()==18||now.hour()==24;
return ((now.minute()%20)==0)||(now.minute()==39);
}
void loop(){
// ==============
if (WiFi.status() != WL_CONNECTED) { //perintah untuk reconnect apabila esp32 disconnect dengan wifi
reconnect();
}
if (!tb.connected()) { //perintah untuk koneksi ke server thingsboard/device thingsboard
// Connect to the ThingsBoard
Serial.print("Connecting to: ");
Serial.print(THINGSBOARD_SERVER);
Serial.print(" with token ");
Serial.println(TOKEN);
if (!tb.connect(THINGSBOARD_SERVER, TOKEN)) {
Serial.println("Failed to connect");
return;
}
}
// ==========================
now = rtc.now();
printTimeRtc();
distance_feed = readDistanceCM();
Serial.print("Ketinggian pakan: ");
Serial.print(readDistanceCM());
Serial.println(" cm.");
Serial.println(isRecord());
if(isRecord()){
tb.sendTelemetryInt("jarak_pakan", distance_feed);
tb.sendTelemetryInt("jumlah_pengecekan", now.hour());
}
emptyFeederHandler();
feedTheOurFish();
tb.loop();
delay(1000);
}
void printTimeRtc() {
char buffer[3];
Serial.print("Waktu Saat ini: ");
Serial.print(now.hour());
Serial.print(":");
sprintf(buffer, "%02d", now.minute());
Serial.print(buffer);
Serial.print(":");
sprintf(buffer, "%02d", now.second());
Serial.println(buffer);
}
void getSchedule() {
char buffer[3];
Serial.print("Jadwal Pemberian Pakan Selanjutnya: ");
Serial.print(next_schedule.hour());
Serial.print(":");
sprintf(buffer, "%02d", next_schedule.minute());
Serial.print(buffer);
Serial.print(":");
sprintf(buffer, "%02d", next_schedule.second());
Serial.println(buffer);
}
void feedTheOurFish(){
if((now.hour() == 12 && now.minute() == 39 ) || (now.hour() == 14 && now.minute() == 25 )){
// if(now.hour() == next_schedule.hour() && now.minute() == next_schedule.minute() && now.second() == (next_schedule.second()+4)){
myservo.write(90);
// tb.sendTelemetryInt("jarak", );
// tb.sendTelemetryFloat("kelembaban", data.humidity);//perintah kirim data humidity ke thingsboard dengan menggunakan tipe data float, key yang digunakan adalah kelembaban data yang dikirimkan adalah data.humidity
tone(pinBuzzer, 500);
delay(3000);
// next_schedule = log_start_program.AddMinutes(3)
} else{
myservo.write(0);
noTone(pinBuzzer);
}
}
void emptyFeederHandler(){
if(distance_feed <= 50){
Serial.println("Pakan ikan hampir habis!!, silahkan lakukan pengisian pakan");
// myservo.write(90);
// tb.sendTelemetryInt("jarak", distance_feed);
delay(15);
tone(pinBuzzer, 1000);
delay(200);
tone(pinBuzzer, 500);
delay(200);
}
else{
// Serial.print("pakan masih ada");
// myservo.write(0);
noTone(pinBuzzer);
}
}