#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
RTC_DS1307 rtc;
int tahun;
byte bulan, hari, jam, menit, detik;
char tanggal[20] = "yyyy/mm/dd hh:mm:ss";
#include <ESP32Servo.h>
Servo servoMotor;
// const int pin_ledBiru = 33;
#define pin_ledBiru 33
#define pin_ledHijau 25
#define pin_ledKuning 26
#define pin_ledMerah 27
#define trigPin 17
#define echoPin 16
#define servo_pin 15
//#define pin_buzz 13
const char* ssid = "Wokwi-GUEST";
const char* password = "";
#define BOTtoken "xxxxx"
#define CHAT_ID "xxxxx"
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
int16_t x,y;
uint16_t width, height;
byte panjang, lebar;
float jarak = 0;
void indikator() {
digitalWrite(trigPin, LOW);
delay(10);
digitalWrite(trigPin, HIGH);
delay(10);
digitalWrite(trigPin, LOW);
int durasi = pulseIn(echoPin, HIGH);
jarak = durasi * 0.034 / 2 + 1;
oled.setTextSize(1);
oled.setCursor(0,15);
oled.print("Jarak: ");
oled.print(jarak);
oled.print(" cm");
oled.display();
}
void tampilkanPesanLCD() {
if (jarak > 400){
digitalWrite(pin_ledBiru, HIGH);
servoMotor.write(0);
oled.setTextSize(1);
oled.setCursor(0,25);
oled.print("Status: ");
oled.print("Normal");
oled.display();
}
else if (jarak >= 200 && jarak <= 400){
digitalWrite(pin_ledHijau, HIGH);
servoMotor.write(0);
oled.setTextSize(1);
oled.setCursor(0,25);
oled.print("Status: ");
oled.print("Waspada");
oled.display();
}
else if (jarak < 200 && jarak >= 100){
digitalWrite(pin_ledKuning, HIGH);
servoMotor.write(45);
oled.setTextSize(1);
oled.setCursor(0,25);
oled.print("Status: ");
oled.print("Siaga");
oled.display();
bot.sendMessage(CHAT_ID, "Status Debit Sungai: Siaga");
bot.sendMessage(CHAT_ID, "Waktu: " + String(tanggal));
}
else if (jarak < 100){
digitalWrite(pin_ledMerah, HIGH);
servoMotor.write(90);
oled.setTextSize(1);
oled.setCursor(0,25);
oled.print("Status: ");
oled.print("Bahaya");
oled.display();
bot.sendMessage(CHAT_ID, "Status Debit Sungai: Bahaya");
bot.sendMessage(CHAT_ID, "Waktu: " + String(tanggal));
}
}
void waktu (){
DateTime nows = rtc.now();
jam = nows.hour(); menit = nows.minute(); detik = nows.second();
bulan = nows.month(); tahun = nows.year(); hari = nows.dayOfTheWeek();
sprintf(tanggal, "%4d/%02d/%02d %02d:%02d:%02d", tahun, bulan, hari, jam, menit, detik);
Serial.println(tanggal);
oled.setTextSize(1);
oled.setCursor(0,45);
oled.print("Tanggal");
oled.display();
oled.setTextSize(1);
oled.setCursor(0,55);
oled.print(tanggal);
oled.display();
delay(500);
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// initialize OLED display with address 0x3C for 128x64
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true);
}
oled.setTextSize(1);
oled.getTextBounds("MONITORING", 0,0, &x, &y, &width, &height);
panjang = (SCREEN_WIDTH-width)/2;
oled.setCursor(panjang,10);
oled.print("MONITORING");
oled.display();
oled.getTextBounds("DEBIT AIR", 0,0, &x, &y, &width, &height);
panjang = (SCREEN_WIDTH-width)/2;
oled.setCursor(panjang,30);
oled.print("DEBIT AIR");
oled.display();
delay(1000);
oled.clearDisplay();
//CHECK RTC
if (!rtc.begin() || ! rtc.isrunning()) { //jika rtc tidak memulai
Serial.println("RTC Tidak Ditemukan"); //mencetak teks
Serial.flush();
oled.getTextBounds("RTC Error!!!", 0,0, &x, &y, &width, &height);
panjang = (SCREEN_WIDTH-width)/2;
oled.setCursor(panjang,10);
oled.print("RTC Error!!!");
oled.display();
while (1)
delay(10);
}
else {
oled.getTextBounds("RTC OK!!!", 0,0, &x, &y, &width, &height);
panjang = (SCREEN_WIDTH-width)/2;
oled.setCursor(panjang,10);
oled.print("RTC OK!!!");
oled.display();
}
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// pinMode(servo);
servoMotor.attach(servo_pin);
servoMotor.write(servo_pin);
servoMotor.write(0);
// SETUP LED
pinMode(pin_ledBiru, OUTPUT);
pinMode(pin_ledHijau, OUTPUT);
pinMode(pin_ledKuning, OUTPUT);
pinMode(pin_ledMerah, OUTPUT);
delay(1000);
oled.clearDisplay();
}
void loop()
{
digitalWrite(pin_ledHijau, LOW);
digitalWrite(pin_ledKuning, LOW);
digitalWrite(pin_ledMerah, LOW);
oled.setTextSize(1);
oled.setCursor(0,0);
oled.print("Monitoring ");
oled.print("Debit Air");
oled.display();
tampilkanPesanLCD();
indikator();
waktu();
delay(1000);
}