#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif
#include "ThingsBoard.h"
#include <PubSubClient.h>
#define TRIG 4
#define ECHO 5
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27,20,4);
const int DHT_PIN = 15;
DHTesp dhtSensor;
Servo myservo;
float JARAK;
const char *ssid = "Wokwi-GUEST";
const char *password = "";
#define CLIENTID "0b5d9620-55ce-11ed-bb6e-8f34ea6bbc86"
#define TOKEN "7nWK08Rk99vqnMJkkyrI"
const char* mqtt_server = "thingsboard.cloud";
WiFiClient wifiClient;
PubSubClient client(wifiClient);
int status = WL_IDLE_STATUS;
int n;
//==============================>Setup
void setup(){
Serial.begin(115200);
pinMode(2,INPUT);
pinMode(14,OUTPUT);
pinMode(13,OUTPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
//==============================>Servo
myservo.attach(12);
myservo.write(0);
//==============================>Counter
n=0;
//==============================>DHT
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
//==============================>LCD Setup
lcd.init();
lcd.backlight();
//==============================>Connecting
initwifi();
delay(10);
//==============================>RTC Setup
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
//==============================>Tampilan RTC, DHT
void monitoring(){
DateTime now = rtc.now();
char buf1[] = "hh:mm:ss";
lcd.setCursor(0,0);
lcd.print(now.toString(buf1));
TempAndHumidity data = dhtSensor.getTempAndHumidity();
lcd.setCursor(14,0);
lcd.print("T:" + String(data.temperature, 0));
lcd.setCursor(19,0);
lcd.print("C");
lcd.setCursor(14,1);
lcd.print("H:" + String(data.humidity, 0));
lcd.setCursor(19,1);
lcd.print("%");
}
//==============================>Rumus Pengukuran Jarak
void ultra(){
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
int duration = pulseIn(ECHO, HIGH);
JARAK = duration * 0.034 / 2;
}
//==============================>if else sisa pakan (Kirim Ke Thingsboard)
void sisa(){
ultra();
if (JARAK <15){
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("PAKAN BANYAK");
String payload2 = "{";
payload2 += "\"SISA PAKAN\":";
payload2 += "BANYAK";
payload2 += "}";
char attributes2[1000];
payload2.toCharArray( attributes2, 1000 );
client.publish( "v1/devices/me/attributes",attributes2);
Serial.println( attributes2 );
}
else if (JARAK>=16 && JARAK <=27){
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("PAKAN SETENGAH");
String payload2 = "{";
payload2 += "\"SISA PAKAN\":";
payload2 += "SETENGAH";
payload2 += "}";
char attributes2[1000];
payload2.toCharArray( attributes2, 1000 );
client.publish( "v1/devices/me/attributes",attributes2);
Serial.println( attributes2 );
}
else if (JARAK>=28){
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("PAKAN SEDIKIT");
String payload2 = "{";
payload2 += "\"SISA PAKAN\":";
payload2 += "SEDIKIT";
payload2 += "}";
char attributes2[1000];
payload2.toCharArray( attributes2, 1000 );
client.publish( "v1/devices/me/attributes",attributes2);
Serial.println( attributes2 );
}
}
//==============================>Clear LCD (DHT)
void cleardht(){
lcd.setCursor(16,0);
lcd.print(" ");
lcd.setCursor(16,1);
lcd.print(" ");
}
//==============================>Clear Pesan Pemberian Pakan
void clearpesan(){
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(" ");
}
//==============================>if else Pemberian Pakan & Pesannya (Kirim Ke Thingsboard)
void pesan(){
DateTime now = rtc.now();
char buf1[] = "hh:mm:ss";
if (digitalRead(2) == HIGH )
{
myservo.write(90);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
myservo.write(0);
lcd.setCursor(0,2);
lcd.print("PAKAN LANGSUNG");
lcd.setCursor(0,3);
lcd.print("TELAH DIBERIKAN");
String payload = "{";
payload += "\"PEMBERIAN PAKAN\":";
payload += "LANGSUNG.OK";
payload += "}";
char attributes[1000];
payload.toCharArray( attributes, 1000 );
client.publish( "v1/devices/me/attributes",attributes);
client.publish( "v1/devices/me/telemetry",attributes);
Serial.println( attributes );
}
else if ((now.hour())==07 && (now.minute())==00 && n==0)
{
myservo.write(90);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
myservo.write(0);
lcd.setCursor(0,2);
lcd.print("PAKAN PAGI");
lcd.setCursor(0,3);
lcd.print("TELAH DIBERIKAN");
String payload = "{";
payload += "\"PEMBERIAN PAKAN\":";
payload += "PAGI.OK";
payload += "}";
char attributes[1000];
payload.toCharArray( attributes, 1000 );
client.publish( "v1/devices/me/attributes",attributes);
client.publish( "v1/devices/me/telemetry",attributes);
Serial.println( attributes );
delay(100);
n=n+1;
}
else if ((now.hour())==13 && (now.minute())==00 && n==1)
{
myservo.write(90);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
myservo.write(0);
lcd.setCursor(0,2);
lcd.print("PAKAN SIANG");
lcd.setCursor(0,3);
lcd.print("TELAH DIBERIKAN");
String payload = "{";
payload += "\"PEMBERIAN PAKAN\":";
payload += "SIANG.OK";
payload += "}";
char attributes[1000];
payload.toCharArray( attributes, 1000 );
client.publish( "v1/devices/me/attributes",attributes);
client.publish( "v1/devices/me/telemetry",attributes);
Serial.println( attributes );
delay(100);
n=n+1;
}
else if ((now.hour())==18 && (now.minute())==00 && n==2)
{
myservo.write(90);
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
myservo.write(0);
lcd.setCursor(0,2);
lcd.print("PAKAN SORE");
lcd.setCursor(0,3);
lcd.print("TELAH DIBERIKAN");
String payload = "{";
payload += "\"PEMBERIAN PAKAN\":";
payload += "SORE.OK";
payload += "}";
char attributes[1000];
payload.toCharArray( attributes, 1000 );
client.publish( "v1/devices/me/attributes",attributes);
client.publish( "v1/devices/me/telemetry",attributes);
Serial.println( attributes );
delay(100);
n=0;
}
}
//==============================>Loop Kode
void loop(){
if ( !client.connected() ){
reconnect();
}
monitoring();
pesan();
sisa();
getData();
delay(1000);
cleardht();
clearpesan();
}
//==============================>Pengiriman Data DHT ke Thingsboard
void getData(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
String payload3 = "{";
payload3 += "\"Temperature\":";
payload3 += data.temperature;
payload3 += ",";
payload3 += "\"Kelembaban\":";
payload3 += data.humidity;
payload3 += "}";
char attributes3[1000];
payload3.toCharArray( attributes3, 1000 );
client.publish( "v1/devices/me/telemetry",attributes3);
Serial.println( attributes3 );
}
//==============================>Connecting Thingsboard
void initwifi(){
Serial.print(" Connect to : ");
lcd.setCursor(4,1);
lcd.print("Connecting....");
Serial.println(ssid);
WiFi.begin(ssid, password);
//WiFi.config(IP, NETWORK, NETMASK, DNS);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print("...");
}
Serial.print("\n");
Serial.print("IP address : ");
Serial.print(WiFi.localIP());
Serial.print("\n");
Serial.print("Connect to : ");
Serial.println(ssid);
client.setServer( mqtt_server, 1883);
lcd.clear();
}
//==============================>Reconnecting Thingsboard
void reconnect(){
// Loop until we're reconnected
while (!client.connected()) {
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
Serial.print("Connecting to ThingsBoard node ...");
// Attempt to connect (clientId, username, password)
if ( client.connect(CLIENTID, TOKEN, "") ) {
Serial.println( "[DONE]" );
} else {
Serial.print( "[FAILED] [ rc = " );
Serial.println( " : retrying in 5 seconds]" );
delay( 500 );
}
}
}