#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include "RTClib.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include "ThingsBoard.h"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define TOKEN "VAMOS"
#define THINGSBOARD_SERVER "thingsboard.cloud"
WiFiClient espClient;
ThingsBoard tb(espClient);
int status = WL_IDLE_STATUS;
int ledM = 26; // LED merah
int ledH = 27; // LED hijau
int makan = 14; // LED Pakan
#define PIN_TRIG 2 // Ultrasonic
#define PIN_ECHO 4 // Ultrasonic
#define buzzer 15 // Buzzer
#define pinRelay 12 // Relay Kincir Air
#define POT_PIN 36 //Dissolve Oksigen
Servo myservo;
#define servoPin 25 // servo
RTC_DS1307 rtc; // RTC
int jam,menit,detik;
LiquidCrystal_I2C lcd(0x27,20,4); // LCD 20x4
void setup() {
// initialize serial for debugging
Serial.begin(115200);
Serial.println();
pinMode(ledM, OUTPUT);
pinMode(ledH, OUTPUT);
pinMode(POT_PIN, INPUT); // Dissolve Oksigen METER SETUP
pinMode(makan, OUTPUT); // INDIKATOR MAKANAN HABIS
pinMode(pinRelay, OUTPUT); // RELAY DINAMO KINCIR
pinMode(buzzer, OUTPUT); // BUZZER
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
InitWiFi();
lcd.init();
lcd.backlight();
lcd.setCursor(0,0); lcd.print("===VANAME AERATOR===");
lcd.setCursor(7,1); lcd.print("SYSTEM");
if(! rtc.begin()){
lcd.setCursor(3,3); lcd.print(">RTC ERROR<");
}
else {
lcd.setCursor(6,3); lcd.print("<RTC ON>");
tone(buzzer, 2000, 500);
}
myservo.attach(servoPin);
rtc.adjust(DateTime(2022,10,25,5,59,41));
delay(2000);
lcd.clear();
}
void InitWiFi()
{
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() {
// 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");
}
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
reconnect();
}
if (!tb.connected()) {
// 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;
}
}
tb.sendTelemetryFloat("lat", -6.900830344163512);
tb.sendTelemetryFloat("long", 110.21068643577534);
digitalWrite(ledH, LOW);
digitalWrite(ledM, HIGH);
DateTime now = rtc.now();
jam = now.hour();
menit = now.minute();
detik = now.second();
char buf1[] = "hh:mm:ss";
Serial.println(now.toString(buf1));
pakan();
oksigen();
// ***** READ RTC AS AUTOMATIC FEEDING ***** //
if (jam== 6 && menit== 0 && detik>=0 && detik<=5 ){
Serial.print("MAKAN PAGI");
lcd.setCursor(5,0); lcd.print("MAKAN PAGI");
feeding();
tb.sendTelemetryString("MAKAN PAGI", "SUKSES");
}
else if (jam== 12 && menit== 0 && detik>=0 && detik<=5 ){
Serial.print("MAKAN SIANG");
lcd.setCursor(4,0); lcd.print("MAKAN SIANG");
feeding();
tb.sendTelemetryString("MAKAN SIANG", "SUKSES");
}
else if (jam== 18 && menit== 0 && detik>=0 && detik<=5 ){
Serial.print("MAKAN SORE");
lcd.setCursor(5,0); lcd.print("MAKAN SORE");
feeding();
tb.sendTelemetryString("MAKAN SORE", "SUKSES");
}
else if (jam== 23 && menit== 59 && detik>=0 && detik<=5 ){
Serial.print("MAKAN MALAM");
lcd.setCursor(4,0); lcd.print("MAKAN MALAM");
feeding();
tb.sendTelemetryString("MAKAN MALAM", "SUKSES");
}
delay(500);
lcd.clear();
Serial.println("Sending data to Thingsboard");
tb.loop();
}
void feeding()
{
Serial.println();
tone(buzzer, 2000, 500);
digitalWrite(ledH, HIGH);
digitalWrite(ledM, LOW);
myservo.write(180);
delay(3000);
myservo.write(90);
Serial.print("SUKSES");
Serial.println();
tone(buzzer, 2000, 500);
lcd.setCursor(7,1); lcd.print("SUKSES");
delay(5000);
}
void pakan()
{
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
float distance = duration * 0.0340051008 / 2;
int sisa = distance / 4;
Serial.print("Sisa Pakan: ");
Serial.print(sisa);
Serial.print("%");
Serial.println();
lcd.setCursor(2,2);
lcd.print("Sisa Pakan : ");
lcd.print(sisa);
lcd.print("%");
tb.sendTelemetryInt("AMAN", sisa);
if (distance <= 20) {
digitalWrite(makan, HIGH);
delay(500);
digitalWrite(makan,LOW);
tb.sendTelemetryInt("LOW", distance);
tb.sendTelemetryInt("LOW", 0); // WIDGET LAMPU
}
}
void oksigen()
{
// ***** READ POTENTIOMETER AS DO SENSOR ***** //
int potValue = analogRead(POT_PIN);
int oksimeter= map(potValue, 0, 4095, 0, 100);
Serial.print("Kadar Oksigen : ");
Serial.println(oksimeter);
tb.sendTelemetryInt("O2", oksimeter);
if (oksimeter <= 40) {
digitalWrite(pinRelay, HIGH);
Serial.println("Kincir Air hidup");
lcd.setCursor(3,3); lcd.print("<KINCIR HIDUP>");
tb.sendTelemetryInt("KINCIR", 1); // WIDGET POMPA KINCIR
}
else {
digitalWrite(pinRelay, LOW);
Serial.println("Kincir Air Mati");
lcd.setCursor(3,3); lcd.print("<KINCIR MATI>");
tb.sendTelemetryInt("KINCIR", 0); // WIDGET POMPA KINCIR
}
}