//========================================
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include "time.h"
//==============================================
#include <ESP32Servo.h>
#include <WiFi.h>
#include "ThingsBoard.h"
//=============================================
#define CURRENT_FIRMWARE_TITLE "TEST"
#define CURRENT_FIRMWARE_VERSION "1.0.0"
#define SSID "Wokwi-GUEST"
#define PASS ""
//=================token_wokwi dan Server Address =========
#define TOKEN "JHjffpzLjU2WtywmrQP6"
#define THINGSBOARD_SERVER "cloud.thingsboard.io"
//=============inisialisasi jam, menit, dan detik ============
#define jam now.hour()
#define menit now.minute()
#define detik now.second()
//=============================================
#define SERIAL_DEBUG_BAUD 115200
//=============================================
#define TMBL 5
//=============================================
WiFiClient client;
ThingsBoard tb(client);
int status = WL_IDLE_STATUS;
//================================================
void reconnect(){
status = WiFi.status();
if(status!=WL_CONNECTED){
WiFi.begin(SSID, PASS);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println(".");
}
Serial.println("Connected to AP");
}
}
//==========================================
//=============================================
Servo myservo;
//====================LCD_I2C=====================
//================================================
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//==============================================
char buff[9];
//===================ULTRASONIC=====================
#define ECHO_PIN 12
#define TRIG_PIN 13
//====================buzzer=======================
#define pinBuzzer 19
//=====Ultrasonic===============================
//===================baca_jarak=======================
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() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Use Case Project Pakan Ikan Lele Otomatis IOT20 dtspro batch3");
//================================
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__)));}
//======================activasi LCD=================================
lcd.init();
lcd.backlight();
lcd.clear ();
//=========set input output echo dan trig pin Ultrasonic=============
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
//=========================
pinMode(pinBuzzer, OUTPUT);
//============pin servo ============
myservo.attach(23);
//=============set up tombol sebagai input ============
pinMode(TMBL, INPUT);
}
void loop() {
//=================================================
if(WiFi.status() != WL_CONNECTED){
reconnect();
}
if(!tb.connected()) {
Serial.println("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;
}
}
//=================================================
// put your main code here, to run repeatedly:
delay(10); // this speeds up the simulation
float distance = readDistanceCM();
//===========convert jarak ke level ===============
float level = distance * 0.25;
tb.sendTelemetryFloat("Level", level);
// tb.sendTelemetryFloat("jarak", distance);
//Serial.print (distance);
//=============akses data RTC ===================
DateTime now = rtc.now();
tb.sendTelemetryFloat("jam", jam);
tb.sendTelemetryFloat("menit", menit);
tb.sendTelemetryFloat("detik", detik);
noTone(pinBuzzer);
//========================================
lcd.setCursor(1,1);
lcd.print("PKL:");
lcd.setCursor(6, 1);
lcd.print(now.hour(),DEC);
lcd.setCursor(8, 1);
lcd.print(":");
lcd.setCursor(9, 1);
lcd.print(now.minute(),DEC);
lcd.setCursor(11, 1);
lcd.print(":");
lcd.setCursor(12, 1);
lcd.print(now.second(),DEC);
//===========================================
lcd.setCursor(1,0);
lcd.print("Lvl Pkn:");
lcd.setCursor(9, 0);
lcd.print(level);
lcd.setCursor(14, 0);
lcd.print("%");
//===============Alarm level Pakan dan buzzer ON ==========
if (level < 25) {
lcd.setCursor(1,2);
lcd.print("Isi stok pakan");
myservo.write(0);
delay(15);
tone(pinBuzzer, 1000);
delay(200);}
//tb.sendTelemetryString("Isi Stock Pakan");
//==================beri pakan pada jam 9 pagi ===============
else if (level > 65 && jam > 9 && menit < 1){
lcd.setCursor(1,2);
lcd.print("Pakan diberikan");
myservo.write(90);
// tb.sendTelemetryString("Feeder ON");
// noTone(pinBuzzer);
}
//====================beri pakan pada jam 21 malam ============
else if (level > 65 && jam > 21 && menit < 1){
lcd.setCursor(1,2);
lcd.print("Pakan diberikan");
myservo.write(90);
//============================
// tb.sendTelemetryString("Feeder ON");
}
//=================== berikan pakan manual ====================
else if(digitalRead(TMBL)==HIGH && level >50){
lcd.setCursor(1,2);
lcd.print("Pakan diberikan");
myservo.write(90);
//tb.sendTelemetryString("Feeder ON");
}
else {
myservo.write(0);
lcd.setCursor(1,2);
lcd.print("Pakan Stop");
//tb.sendTelemetryString("Feeder off");
}
tb.loop();
}