/*---------------------------------------------
PROJECT PAKAN IKAN
KELOMPOK 4
-----------------------------------------------*/
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#include "RTClib.h" // Untuk RTC
#endif
#include "ThingsBoard.h"
//definisi untuk servo
#include <ESP32Servo.h>
//denifi untuk Ultrasonic
#define ECHO_PIN 2
#define TRIG_PIN 15
#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 "PakanIkanKel4"
#define THINGSBOARD_SERVER "thingsboard.cloud"
//definisi Servo
Servo myservo;
// definisi RTC
RTC_DS3231 rtc; // Using DS3231 Real Time Clock
// 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;
int pos =0;
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 setup() {
// membaca servo
myservo.attach(26);
myservo.write(0);
//batas servo
// RTC
if (! rtc.begin()) {
Serial.println("Couldn't find RTC. Dead now.");
Serial.flush();
while (1) delay(10);
}
// Batas RTC
// initialize serial for debugging
Serial.begin(SERIAL_DEBUG_BAUD);
Serial.println();
InitWiFi();
//initialize untuk ultrasonic
pinMode(LED_BUILTIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
}
// untuk mengetahui jarak dari sensor ultrasonic
float readDistanceCM(){
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(4);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
// batas akhir HC-SR04
}
void loop() {
delay(1000);
// Membaca waktu saat ini RTC
DateTime now = rtc.now();
// batas waktu RTC
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("Kirim data...");
Serial.print("Jarak = ");
Serial.println(readDistanceCM());
float nilaijarak=readDistanceCM()-1.99;
float konvpersen ;
konvpersen = 100-nilaijarak;
tb.sendTelemetryFloat("Jarak",readDistanceCM());
tb.sendTelemetryFloat("Persen", konvpersen);
//konversi jarak tinggi tabung adalah 100 cm
Serial.print("Jam :");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
tb.sendTelemetryFloat("Jam",now.hour());
tb.sendTelemetryFloat("Menit",now.minute());
tb.sendTelemetryFloat("Detik",now.second());
//-----------------------------------------------
//KONDISI MENGENDALIKAN ULTRASONIC UNTUK MEMBACA KETINGGIAN
//------------------------------------------------
if(readDistanceCM()>98)
{
Serial.println("Pakan Ikan Kosong");
int status;
status = 5;
tb.sendTelemetryInt("Status",status);
}
else if(readDistanceCM()<=98)
{
Serial.println("Pakan Ikan Masih Tersedia");
//-----------------------------------------------
//KONDISI MENGENDALIKAN SERVO UNTUK PAKAN IKAN SESUAI RTC
//------------------------------------------------
// Waktu Memberikan Makan Pertama
if((now.hour() == 16) && (now.minute() == 18) && (now.second() == 00))
{
myservo.write(180);
delay(5000); // 9 Detik Lamanya Membuka pakan iklan
myservo.write(0);
Serial.println(" Pakan Ikan Waktu Pertama di Buka");
int status;
status = 1;
tb.sendTelemetryInt("Status",status);
}
// Waktu Memberikan Makan Kedua
else if((now.hour() == 19) && (now.minute() == 00) && (now.second() == 00))
{
Serial.println(" Pakan Ikan Waktu Kedua di Buka");
for(pos == 90; pos>=0; pos--)
{
myservo.write(pos);
delay(15);
}
// myservo.write(180);
delay(9000); // 9 Detik Lamanya Membuka pakan iklan
myservo.write(0);
int status;
status = 2;
tb.sendTelemetryInt("Status",status);
}
// Waktu Memberikan Makan Ketiga
else if((now.hour() == 18) && (now.minute() == 56) && (now.second() == 00))
{
Serial.println(" Pakan Ikan Waktu Ketiga di Buka");
myservo.write(180);
delay(9000); // 9 Detik Lamanya Membuka pakan iklan
myservo.write(0);
int status;
status = 3;
tb.sendTelemetryInt("Status",status);
}
Serial.println(" Pakan Ikan Posisi Siap");
int status;
status = 4;
tb.sendTelemetryInt("Status",status);
}
delay(100); // this speeds up the simulation
tb.loop();
// tb.loop();
}