#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <RTClib.h>
#include <ESP32Servo.h>
#include <PubSubClient.h>
#define PIN_TRIG 2
#define PIN_ECHO 4
#define LED_RED 32
#define LED_YELLOW 25
#define LED_GREEN 13
const char* ssid = "Wokwi-GUEST";
const char* password = "";
String token = "BBUS-SLh7Ee4Kr65S9F5FZWsLCxxvDaYaL8";
char mqttBroker[] = "stem.ubidots.com";
String DEVICE_LABEL = "esp32_ijal"; // Device Label
String ultraSonicLabel = "ultrasonic";
String servoLabel = "servo";
String ledRedLabel = "led_red";
String ledYellowLabel = "led_yellow";
String ledGreenLabel = "led_green";
const int servoPin = 18;
int led_red, led_yellow, led_green, gate, jarak;
RTC_DS1307 rtc;
Servo servo;
WiFiClient ubidots;
PubSubClient client(ubidots);
void wifiInit();
void sendData();
void callback(char* topic, byte* payload, unsigned int length);
void reconnect();
void setup() {
Serial.begin(115200);
wifiInit();
client.setServer(mqttBroker, 1883);
client.setCallback(callback);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
// Check if the RTC is connected properly
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// Check if the RTC lost power and if so, set the time
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(2024, 1, 1, 0, 0, 0)); // Set RTC ke waktu awal
}
servo.attach(servoPin, 500, 2400);
reconnect();
delay(1000);
}
void loop() {
if (!client.connected()) { // untuk koneksi ke ubidots nya
reconnect();
}
client.loop();
// Start a new measurement:
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
long duration = pulseIn(PIN_ECHO, HIGH, 30000); // Tambahkan timeout 30ms
float distance_cm = duration / 58.0;
float distance_in = duration / 148.0;
jarak = 406 - int(distance_cm);
Serial.print("Tinggi Air : ");
Serial.print(jarak);
Serial.println(" cm");
if(distance_cm < 150) {
servo.write(0);
gate = 0;
digitalWrite(LED_RED, HIGH);
led_red = 1;
digitalWrite(LED_YELLOW, LOW);
led_yellow = 0;
digitalWrite(LED_GREEN, LOW);
led_green = 0;
} else if(distance_cm < 250) {
servo.write(180);
gate = 180;
digitalWrite(LED_RED, LOW);
led_red = 0;
digitalWrite(LED_YELLOW, HIGH);
led_yellow = 1;
digitalWrite(LED_GREEN, LOW);
led_green = 0;
} else {
servo.write(180);
gate = 180;
digitalWrite(LED_RED, LOW);
led_red = 0;
digitalWrite(LED_YELLOW, LOW);
led_yellow = 0;
digitalWrite(LED_GREEN, HIGH);
led_green = 1;
}
DateTime now = rtc.now();
char buffer[20];
sprintf(buffer, "%04d/%02d/%02d %02d:%02d:%02d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
Serial.println(buffer);
sendData();
delay(1000);
}
void wifiInit() {
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Waiting for WiFi connection...");
}
Serial.println("WiFi connected");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void sendData() {
Serial.println("Sending data to Ubidots...");
if (client.connect("ESP32", token.c_str(), "")) { // untuk mengirimkan data yang sudah dikumpulkan ke ubidots
String payload = "{\"" + ultraSonicLabel + "\": " + jarak +
",\"" + servoLabel + "\": "+ gate +
",\"" + ledRedLabel + "\": "+ led_red +
",\"" + ledYellowLabel + "\": "+ led_yellow +
",\"" + ledGreenLabel + "\": "+ led_green +
"}";
client.publish((String("/v1.6/devices/") + DEVICE_LABEL).c_str(), payload.c_str());
Serial.println("Data sent!");
} else { // jika koneksi nya gagal, maka ...
Serial.println("Connection to server failed");
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
Serial.print("Message from Ubidots: ");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
}
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
if (client.connect("ESP32", token.c_str(), "")) {
Serial.println("Connected to MQTT broker");
} else {
Serial.print("Failed to connect, rc=");
Serial.print(client.state());
Serial.println(" try again in 2 seconds");
delay(2000);
}
}
}