#define LED 25
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif

#include "ThingsBoard.h"
#include <Wire.h>
#include "ESP32Servo.h"             //Sertakan library Servo
#include <HCSR04.h>                 //Library HCSR04
#include "RTCDS1307.h"
#include "RTClib.h"

#define CURRENT_FIRMWARE_TITLE    "TEST"
#define CURRENT_FIRMWARE_VERSION  "1.0.0"

#define WIFI_SSID           "Wokwi-GUEST"
#define WIFI_PASSWORD       ""

#define TOKEN               "o8aIQVAl3sscqKOpIY0B"
#define THINGSBOARD_SERVER  "thingsboard.cloud"

// Baud rate for debug serial
#define SERIAL_DEBUG_BAUD   115200

RTC_DS1307 rtc;

Servo myservo; 
//variabel untuk perhitungan sudut putar
String waktu;
int sudut;
const int trigPin = 5;
const int echoPin = 18;

float TinggiSensor = 300;           //Tinggi pemasangan sensor
float TingkatPakan = 0;            //Tingkat Pakan

unsigned long TSekarang;
unsigned long TAkhir;

// 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");
  }
}

void setup() {
  Serial.begin(SERIAL_DEBUG_BAUD); // Starts the serial communication
  Serial.println();
  InitWiFi();

#ifndef ESP32
  while (!Serial); // wait for serial port to connect. Needed for native USB
#endif

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

  myservo.attach(13);  // servo terhubung pin 13
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(LED, OUTPUT);
}

void loop() {
  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...");
  
  DateTime time = rtc.now();
  
  char buf1[] = "hh:mm";
  waktu = Serial.println(time.toString(buf1));
  delay(500);

  if(waktu == "08:00"){
    digitalWrite(LED, HIGH);
    delay(5000);
    digitalWrite(LED, LOW);
  }
  else if(waktu == "17:00"){
    digitalWrite(LED, HIGH);
    delay(5000);
    digitalWrite(LED, LOW);
  }

 //membaca sinyal analog input di Analog
  sudut = analogRead(34);      
  //konversi hasil analog (0-1023) menjadi hasil sudut (0-180)      
  sudut = map(sudut, 0, 255.75, 0, 180); 
  //set posisi sudut motor servo    
  myservo.write(sudut);                  
  delay(100);

  //membaca jumlah Pakan
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  int duration = pulseIn(echoPin, HIGH);
  float distance = duration * 0.034 / 2;

  TSekarang = millis();
  if(TSekarang - TAkhir > 1000){              //Baca sensor setiap 1 detik
  TingkatPakan = TinggiSensor - distance;   //Rumus mencari tinggi pakan

  if(TingkatPakan < 0){
    TingkatPakan = 0;
  }
  else if(TingkatPakan > 300){
    TingkatPakan = 300;
  }

  TingkatPakan = map(TingkatPakan, 0, 300, 0, 100);  //Ubah ke persen(%)
  TAkhir = TSekarang;
  }

  Serial.print("Ketersediaan Makanan (%): ");
  Serial.println(TingkatPakan);
  tb.sendTelemetryFloat("Ketersediaan Makanan (%)", TingkatPakan);
  tb.loop();

  tb.loop();
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
servo1:GND
servo1:V+
servo1:PWM
pot1:GND
pot1:SIG
pot1:VCC
ultrasonic1:VCC
ultrasonic1:TRIG
ultrasonic1:ECHO
ultrasonic1:GND
GND5VSDASCLSQWRTCDS1307+
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW
led1:A
led1:C
r1:1
r1:2