#include <WiFi.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
#include <ESP32Servo.h> // Pustaka Servo
// Wi-Fi credentials
const char* ssid = "Wokwi-GUEST"; // Ganti dengan SSID Anda
const char* password = ""; // Ganti dengan password Wi-Fi Anda jika diperlukan
// Pin definition for ultrasonic sensor and servo
const int TRIGGER_PIN = 15;
const int ECHO_PIN = 2;
const int SERVO_PIN = 5; // Pin servo (misalnya GPIO 13)
// Firebase URL
String firebaseHost = "https://wifiscanfirebase-default-rtdb.firebaseio.com/sensorData.json"; // Ganti dengan URL Firebase Anda
WiFiClientSecure espClient; // Untuk koneksi HTTPS
HTTPClient http;
Servo myServo; // Objek servo
// Variabel untuk pengontrol waktu
unsigned long previousMillis = 0;
const long interval = 1000; // Interval waktu 1 detik (1000 milidetik)
int servoAngle = 360; // Sudut servo awal
void setup() {
// Initialize serial communication
Serial.begin(115200);
delay(10);
// Initialize Wi-Fi
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Once connected, display the IP address
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// Initialize ultrasonic sensor pins
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Initialize Servo motor
myServo.attach(SERVO_PIN);
// Disable SSL certificate validation (for testing purposes)
espClient.setInsecure();
}
void loop() {
// Cek apakah sudah 1 detik (1000 milidetik) berlalu
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// Simpan waktu terakhir servo bergerak
previousMillis = currentMillis;
// Gerakkan servo secara otomatis setiap detik
servoAngle -= 15; // Tambahkan sudut 5 derajat
if (servoAngle < 0) {
servoAngle = 360; // Kembali ke posisi 0 derajat jika lebih dari 180
}
myServo.write(servoAngle); // Gerakkan servo ke sudut yang dihitung
Serial.print("Servo Angle: ");
Serial.println(servoAngle); // Tampilkan sudut servo di serial monitor
}
// Set trigger pin to LOW for at least 2 microseconds
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
// Set trigger pin to HIGH for at least 10 microseconds
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Mengukur jarak dengan sensor ultrasonik
long duration = pulseIn(ECHO_PIN, HIGH);
// Menghitung jarak dalam sentimeter
int distance_cm = duration * 0.0343 / 2;
// Menampilkan data jarak di serial monitor
Serial.print("Distance: ");
Serial.print(distance_cm);
Serial.println(" cm");
// Mengirim data ke Firebase (sudut servo dan jarak)
sendToFirebase(servoAngle, distance_cm);
// Delay kecil untuk stabilitas
delay(100);
}
void sendToFirebase(int servoAngle, int distance) {
if (WiFi.status() == WL_CONNECTED) {
http.begin(espClient, firebaseHost); // Ganti dengan URL Firebase Anda
http.addHeader("Content-Type", "application/json");
// Membuat string JSON untuk mengirimkan sudut servo dan jarak
String jsonData = "{\"servoAngle\": " + String(servoAngle) + ", \"distance\": " + String(distance) + "}";
// Kirim request PUT ke Firebase
int httpResponseCode = http.PUT(jsonData);
// Debugging response code
Serial.print("HTTP Response Code: ");
Serial.println(httpResponseCode);
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("Response from Firebase: ");
Serial.println(response);
} else {
Serial.print("Error on sending PUT request: ");
Serial.println(httpResponseCode);
}
http.end(); // Tutup koneksi HTTP
} else {
Serial.println("WiFi not connected");
}
}