#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif
#include <esp_wifi.h>
#include "ThingsBoard.h"
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
Servo myservo;
int pos = 0;
int val = 0; //asumsi mulai pemberian pakan pagi 0 = pagi, 1 = siang, dan 2 =sore
int pagi = 12;
int siang = 14;
int sore = 27;
int habis = 13;
int buzzer = 26;
int indikator_pagi;
int indikator_siang;
int indikator_sore;
int indikator_habis;
#define ECHO_PIN 2
#define TRIG_PIN 4
//#define volume 276 cm3 = 276 Liter
#define jari_2 30 //cm
#define tinggi 100 //cm
LiquidCrystal_I2C lcd(0x27,20,4);
unsigned long waktu_sebelum;
unsigned long waktu_sekarang;
unsigned long beri_pakan = 6000; // 1 jam = 1 detik = 1000 milidetik;
float volume,selisih;
int count = 0;
#define CURRENT_FIRMWARE_TITLE "TEST"
#define CURRENT_FIRMWARE_VERSION "1.0.0"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// See https://thingsboard.io/docs/getting-started-guides/helloworld/
// to understand how to obtain an access token
//#define TOKEN "kamar1"
// #define TOKEN "kamar2"
#define TOKEN "project_kelompok_4_IOT4-15"
#define THINGSBOARD_SERVER "thingsboard.cloud"
// Baud rate for debug serial
#define SERIAL_DEBUG_BAUD 115200
// Initialize ThingsBoard client
WiFiClient espClient;
// Initialize ThingsBoard instance
ThingsBoard tb(espClient);
// the Wifi radio's status
int status = WL_IDLE_STATUS;
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");
}
}
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 mesin()
{
myservo.write(90);
delay(1000);
myservo.write(0);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
//InitWiFi();
lcd.init();
lcd.backlight();
lcd.setCursor(1,0);
lcd.print("Project Kelompok 4");
lcd.setCursor(5,1);
lcd.print("Use Case");
lcd.setCursor(0,2);
lcd.print("Pemberian Pakan Ikan");
lcd.setCursor(2,3);
lcd.print("Secara Otomatis");
delay(3000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Muhammad Riyadi");
lcd.setCursor(4,1);
lcd.print("Boby Sutanto");
lcd.setCursor(0,2);
lcd.print("Firman Adi Rifansyah");
lcd.setCursor(5,3);
lcd.print("M. Fadhli");
delay(3000);
lcd.clear();
myservo.attach(15);
delay(200);
myservo.write(0);
pinMode(habis, OUTPUT); //Merah, pakan habis
pinMode(pagi, OUTPUT); //Hijau, makan pagi
pinMode(siang, OUTPUT); //Biru, makan siang
pinMode(sore, OUTPUT); //Kuning, makan sore
pinMode(buzzer, OUTPUT); //BUzzer, SOS pakan habis
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
indikator_pagi = 0;
indikator_siang = 0;
indikator_sore = 0;
indikator_habis = 0;
}
void loop()
{
// put your main code here, to run repeatedly:
//delay(10); // this speeds up the simulation
waktu_sekarang = millis();
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
selisih = constrain ((tinggi - distance), 0,tinggi);
volume = 3.14*pow(jari_2,2)*selisih;
int Volume = volume/1000; // Liter
Serial.print("Tinggi Pakan :");
Serial.print(selisih + (String) " cm");
Serial.print(" | Volume Pakan : ");
Serial.println(Volume + (String) " Liter");
if(Volume >= 50 & val == 0)
{
waktu_sekarang = waktu_sebelum;
mesin();
count++;
val = 1; //pagi
digitalWrite(habis, LOW);
digitalWrite(pagi, HIGH);
digitalWrite(siang, LOW);
digitalWrite(sore, LOW);
indikator_pagi = 1;
indikator_siang = 0;
indikator_sore = 0;
indikator_habis = 0;
lcd.setCursor(0,0);
lcd.print("Pemberian Pakan Ikan");
lcd.setCursor(5,1);
lcd.print("PAGI HARI");
lcd.setCursor(2,2);
lcd.print("Jumlah = "+String(count)+" kali");
delay(6000); //delay 6 detik diasumsikan 6 jam
lcd.clear();
}
else if(Volume >= 50 & val == 1 & (waktu_sekarang - waktu_sebelum >=beri_pakan))
{
readDistanceCM();
waktu_sekarang = waktu_sebelum;
volume = 3.14 * pow(jari_2,2)*selisih;
mesin();
count++;
val = 2; //siang
digitalWrite(habis, LOW);
digitalWrite(pagi, LOW);
digitalWrite(siang, HIGH);
digitalWrite(sore, LOW);
indikator_pagi = 0;
indikator_siang = 1;
indikator_sore = 0;
indikator_habis = 0;
lcd.setCursor(0,0);
lcd.print("Pemberian Pakan Ikan");
lcd.setCursor(5,1);
lcd.print("SIANG HARI");
lcd.setCursor(2,2);
lcd.print("Jumlah = "+String(count)+" kali");
delay(6000); //delay 6 detik diasumsikan 6 jam
lcd.clear();
}
else if(Volume >= 50 & val == 2 & (waktu_sekarang - waktu_sebelum >=beri_pakan))
{
readDistanceCM();
waktu_sekarang = waktu_sebelum;
float volume2 = 3.14 * pow(jari_2,2)*selisih;
mesin();
count++;
val = 0; //sore
digitalWrite(habis, LOW);
digitalWrite(pagi, LOW);
digitalWrite(siang, LOW);
digitalWrite(sore, HIGH);
indikator_pagi = 0;
indikator_siang = 0;
indikator_sore = 1;
indikator_habis = 0;
lcd.setCursor(0,0);
lcd.print("Pemberian Pakan Ikan");
lcd.setCursor(5,1);
lcd.print("SORE HARI");
lcd.setCursor(2,2);
lcd.print("Jumlah = "+String(count)+" kali");
digitalWrite(33, HIGH);
delay(12000); //delay 12 detik diasumsikan 12 jam
lcd.clear();
}
else if (Volume <= 50 & (waktu_sekarang - waktu_sebelum >=beri_pakan))
{
digitalWrite(habis, HIGH);
digitalWrite(pagi, LOW);
digitalWrite(siang, LOW);
digitalWrite(sore, LOW);
indikator_pagi = 0;
indikator_siang = 0;
indikator_sore = 0;
indikator_habis = 1;
tone(buzzer,800);
delay(200);
noTone(buzzer);
lcd.setCursor(2,1);
lcd.print("PAKAN MAU HABIS");
Serial.println("!!!Pakan Mau Habis!!!");
delay(1000);
lcd.clear();
}
else
{
digitalWrite(habis, LOW);
digitalWrite(pagi, LOW);
digitalWrite(siang, LOW);
digitalWrite(sore, LOW);
}
delay(1000);
/*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;
}
}
Serial.println("Sending data to thingsboard.cloud ...");*/
// Uploads new telemetry to ThingsBoard using MQTT.
// See https://thingsboard.io/docs/reference/mqtt-api/#telemetry-upload-api
// for more details
tb.sendTelemetryInt("Volume", Volume);
tb.sendTelemetryFloat("Tinggi", selisih);
tb.sendTelemetryInt("Jumlah", count);
tb.sendTelemetryInt("Pagi", indikator_pagi);
tb.sendTelemetryInt("Siang", indikator_siang);
tb.sendTelemetryInt("Sore", indikator_sore);
tb.sendTelemetryInt("Habis", indikator_habis);
tb.loop();
}