#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
#define DHTPIN 4 // Pin GPIO4 untuk DHT22
#define DHTTYPE DHT22 // Menggunakan sensor DHT22
DHT dht(DHTPIN, DHTTYPE); // Inisialisasi sensor DHT22
// Konfigurasi pin untuk sensor Ultrasonic HC-SR04
#define TRIG_PIN 13 // Pin untuk Trigger (GPIO13)
#define ECHO_PIN 12 // Pin untuk Echo (GPIO12)
long duration; // Durasi waktu gelombang suara
int distance; // Jarak yang terukur
// Credentials untuk Wi-Fi dan Ubidots
const char* WIFI_SSID = "Wokwi-GUEST"; // SSID WiFi
const char* WIFI_PASS = ""; // Password WiFi
const char* UBIDOTS_TOKEN = "BBUS-K7Ff6cnIWqP5R9PoZ20HpQA7L8IdUg"; // Token API Ubidots
const char* DEVICE_LABEL = "esp32"; // Label device di Ubidots
unsigned long lastSendTime = 0; // Waktu terakhir data dikirim
const int PUBLISH_FREQUENCY = 1000; // Frekuensi pengiriman data (5 detik)
void setup() {
Serial.begin(115200); // Memulai komunikasi serial
WiFi.begin(WIFI_SSID, WIFI_PASS); // Koneksi ke Wi-Fi
// Tunggu hingga terhubung ke Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
dht.begin(); // Inisialisasi sensor DHT22
// Setup pin untuk sensor Ultrasonic HC-SR04
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// Membaca suhu dan kelembaban
float h = dht.readHumidity();
float t = dht.readTemperature();
// Mengecek apakah pembacaan sensor gagal
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor");
return;
}
// Mengukur jarak menggunakan sensor Ultrasonic HC-SR04
distance = measureDistance();
// Tampilkan nilai suhu, kelembaban, dan jarak di serial monitor
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C\t");
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Kirim data ke Ubidots setiap interval waktu yang ditentukan
if (millis() - lastSendTime > PUBLISH_FREQUENCY) {
sendDataToUbidots(t, h, distance);
lastSendTime = millis(); // Update waktu pengiriman terakhir
}
delay(1000); // Delay 5 detik sebelum pembacaan berikutnya
}
void sendDataToUbidots(float temperature, float humidity, int distance) {
HTTPClient http;
// Membuat URL untuk mengirim data ke Ubidots
String url = "http://industrial.api.ubidots.com/api/v1.6/devices/" + String(DEVICE_LABEL);
// Menambahkan headers
http.begin(url);
http.addHeader("Content-Type", "application/json");
http.addHeader("X-Auth-Token", UBIDOTS_TOKEN);
// Menyiapkan data JSON yang akan dikirim
String payload = "{\"" + String("suhu") + "\": " + String(temperature) + ", \"" + String("humidity") + "\": " + String(humidity) + ", \"" + String("distance") + "\": " + String(distance) + "}";
// Mengirim data ke Ubidots menggunakan HTTP POST
int httpCode = http.POST(payload);
// Mengecek apakah data berhasil dikirim
if (httpCode > 0) {
Serial.printf("Data sent, HTTP Response Code: %d\n", httpCode);
} else {
Serial.printf("Failed to send data, HTTP Response Code: %d\n", httpCode);
}
http.end(); // Menutup koneksi HTTP
}
// Fungsi untuk mengukur jarak menggunakan Ultrasonic HC-SR04
long measureDistance() {
// Mengirim pulse 10us ke trigger
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Menghitung durasi waktu yang diperlukan gelombang suara
duration = pulseIn(ECHO_PIN, HIGH);
// Menghitung jarak dalam cm (menggunakan kecepatan suara 343 m/s)
long distance = duration * 0.034 / 2;
return distance;
}