#include <ESP32Servo.h>
#include <Arduino.h>
#include <WiFi.h>
#include "SinricPro.h"
#include "SinricProSwitch.h"
#include <WiFiClientSecure.h>
#include <WiFiMulti.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#include <ESP32Time.h>
//#include <esp_deep_sleep.h> // Include the ESP32 deep sleep library
#define BOTtoken "YOUR_BOT_TOKEN"
#define CHAT_ID "YOUR_CHAT_ID"
#define APP_KEY "YOUR_APP_KEY"
#define APP_SECRET "YOUR_APP_SECRET"
#define SWITCH_ID "YOUR_SWITCH_ID"
#define BAUD_RATE 115200
#define PIN_RELAY 16
#define DEEP_SLEEP_PIN 2 // GPIO pin to trigger deep sleep remotely
#define DEEP_SLEEP_DELAY 5000 // Deep sleep delay in milliseconds
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
const long gmtOffset_sec = 7 * 3600;
const int daylightOffset_sec = 0;
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;
const int trigPin = 12;
const int echoPin = 14;
#define ECHO_PIN1 32
#define TRIG_PIN1 33
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
long duration;
float distanceCm;
float distanceInch;
float dist_remnant;
int distance = 0;
int count = 0;
int potpin = 0;
int val;
ESP32Time rtc;
bool RelayState = LOW;
float readDistanceCM()
{
digitalWrite(TRIG_PIN1, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN1, LOW);
int duration1 = pulseIn(ECHO_PIN1, HIGH);
return duration1 * 0.034 / 2;
}
WiFiMulti wifiMulti;
Servo servoObject;
bool myPowerState = false;
bool onPowerState(const String &deviceId, bool &state)
{
Serial.printf("Device %s turned %s (via SinricPro) \r\n", deviceId.c_str(), state ? "on" : "off");
myPowerState = state;
if (myPowerState == HIGH)
{
servoObject.write(45);
delay(1000);
servoObject.write(0);
delay(100);
}
else
servoObject.write(0);
delay(100);
return true;
}
void deepSleep()
{
Serial.println("Going into deep sleep...");
esp_deep_sleep_enable_ext0_wakeup(DEEP_SLEEP_PIN, HIGH); // Configure the external wake-up pin
esp_deep_sleep_start(); // Enter deep sleep
}
void setupSinricPro()
{
SinricProSwitch &mySwitch = SinricPro[SWITCH_ID];
mySwitch.onPowerState(onPowerState);
SinricPro.onConnected([]() {
Serial.printf("Connected ke SinricPro\r\n");
});
SinricPro.onDisconnected([]() {
Serial.printf("Disconnected ke SinricPro\r\n");
});
SinricPro.begin(APP_KEY, APP_SECRET);
}
void printLocalTime()
{
struct tm timeinfo;
if (!getLocalTime(&timeinfo))
{
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
void setup()
{
pinMode(PIN_RELAY, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(TRIG_PIN1, OUTPUT);
pinMode(ECHO_PIN1, INPUT);
pinMode(26, OUTPUT);
pinMode(DEEP_SLEEP_PIN, INPUT_PULLUP); // Set up the GPIO pin for deep sleep with a pull-up resistor
servoObject.attach(26);
WiFi.mode(WIFI_STA);
Serial.begin(BAUD_RATE);
wifiMulti.addAP("Redmi", "sup3rman1");
wifiMulti.addAP("TP-LINK", "sup3rman.");
wifiMulti.addAP("POWERBANK", "sup3rman");
wifiMulti.addAP("BOLT2.4G", "sup3rman");
wifiMulti.addAP("Wokwi-GUEST", "");
bot.sendMessage(CHAT_ID, "Bot started up", "");
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
ESP32Time rtc(3600);
setupSinricPro();
}
void handleNewMessages(int numNewMessages)
{
for (int i = 0; i < numNewMessages; i++)
{
String chat_id = String(bot.messages[i].chat_id);
if (chat_id != CHAT_ID)
{
bot.sendMessage(chat_id, "Unauthorized user", "");
continue;
}
String text = bot.messages[i].text;
String from_name = bot.messages[i].from_name;
if (text == "/start")
{
String welcome = "Welcome, " + from_name + ".\n";
welcome += "MENU KLIK AKSI \n\n";
welcome += "/TUANG_PAKAN \n";
welcome += "/CEK_KONEKSI \n";
welcome += "/CEK_STATUS_PAKAN \n";
welcome += "/RELAY_ON \n";
welcome += "/RELAY_OFF \n";
welcome += "/CEK_STATUS_RELAY \n";
welcome += "/DEEP_SLEEP \n"; // Add the new command for deep sleep
bot.sendMessage(chat_id, welcome, "");
}
if (text == "/TUANG_PAKAN")
{
bot.sendMessage(chat_id, "tuang pakan ", "");
servoObject.write(45);
delay(1000);
servoObject.write(0);
}
if (text == "/CEK_KONEKSI")
{
bot.sendMessage(CHAT_ID, "wifi koneksi " + String(WiFi.SSID()), "");
}
if (text == "/CEK_STATUS_PAKAN")
{
bot.sendMessage(CHAT_ID, "sisa pakan:" + String(dist_remnant) + " cm \n", "");
bot.sendMessage(CHAT_ID, "jarak sensor pakan: " + String(distanceCm) + " cm \n", "");
}
if (text == "/RELAY_ON")
{
bot.sendMessage(chat_id, "RELAY ON", "");
digitalWrite(PIN_RELAY, RelayState);
RelayState = HIGH;
}
if (text == "/RELAY_OFF")
{
bot.sendMessage(chat_id, "RELAY OFF", "");
digitalWrite(PIN_RELAY, RelayState);
RelayState = LOW;
}
if (text == "/CEK_STATUS_RELAY")
{
if (digitalRead(PIN_RELAY))
{
bot.sendMessage(chat_id, "STATUS_ON", "");
}
else
{
bot.sendMessage(chat_id, "STATUS_OFF", "");
}
}
if (text == "/DEEP_SLEEP") // Handle the new command for deep sleep
{
bot.sendMessage(chat_id, "Initiating deep sleep...", "");
delay(1000); // Optional delay for the message to be sent
deepSleep();
}
}
}
void loop()
{
SinricPro.handle();
printLocalTime();
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * SOUND_SPEED / 2;
dist_remnant = 26 - distanceCm;
if (distanceCm >= 26)
{
bot.sendMessage(CHAT_ID, "cek Makanan Habis:" + String(dist_remnant) + " cm \n", "");
bot.sendMessage(CHAT_ID, "jarak pakan:" + String(distanceCm) + " cm \n", "");
}
else
{
Serial.println("Makanan Masih Ada!");
}
float distance = readDistanceCM();
if (distance <= 13 && distance > 1)
{
servoObject.write(35);
delay(1000);
servoObject.write(0);
bot.sendMessage(CHAT_ID, "detek kucing,servo pakan gerak" + String(readDistanceCM()) + " cm \n", "");
}
if (distance == 0)
{
bot.sendMessage(CHAT_ID, "sensor detek tidak konek" + String(readDistanceCM()) + " cm \n", "");
servoObject.write(0);
}
else
{
servoObject.write(0);
}
if (wifiMulti.run() == WL_CONNECTED)
{
Serial.print("Connected with: ");
Serial.print(WiFi.SSID());
Serial.print(" ");
Serial.println(WiFi.RSSI());
}
else
{
Serial.println("WiFi not connected!");
bot.sendMessage(CHAT_ID, "wifi tidak koneksi " + String(WiFi.SSID()), "");
}
if (millis() > lastTimeBotRan + botRequestDelay)
{
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages)
{
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
lastTimeBotRan = millis();
}
}