#include <WiFi.h> // Gunakan library WiFiS3 untuk Arduino R4 WiFi
#include <PubSubClient.h>
#include <DHT.h>
// Pin dan konfigurasi untuk sensor
#define DHTPIN 27 // Pin DHT22
#define DHTTYPE DHT22 // Tipe DHT22
DHT dht(DHTPIN, DHTTYPE);
#define LDR 34 // Pin LDR (Photoresistor) analog
const float RL10 = 50; // Resistansi referensi untuk LDR
#define TRIG_PIN 15 // Pin Trig untuk sensor ultrasonik
#define ECHO_PIN 18 // Pin Echo untuk sensor ultrasonik
// WiFi credentials
const char *ssid = "Wokwi-GUEST";
const char *password = "";
// ThingsBoard dan EMQX konfigurasi
#define TOKEN "kqjup0kvfjnfnz2gqdjp" // Access Token ThingsBoard
const char *mqtt_server_thingsboard = "thingsboard.cloud";
const char *mqtt_server_emqx = "broker.emqx.io";
const int mqtt_port_emqx = 1883; // Port EMQX MQTT broker
WiFiClient wifiClient;
PubSubClient clientThingsBoard(wifiClient);
PubSubClient clientEMQX(wifiClient); // Client untuk broker EMQX
unsigned long lastMillis = 0; // Waktu terakhir pengiriman data
void setup() {
Serial.begin(115200);
pinMode(LDR, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
dht.begin();
connectWiFi();
// Set server untuk ThingsBoard dan EMQX
clientThingsBoard.setServer(mqtt_server_thingsboard, 1883);
clientEMQX.setServer(mqtt_server_emqx, mqtt_port_emqx);
}
void loop() {
// Koneksi ulang jika terputus
if (!clientThingsBoard.connected()) {
reconnect(clientThingsBoard, TOKEN, "ThingsBoard");
}
if (!clientEMQX.connected()) {
reconnect(clientEMQX, "", "EMQX");
}
clientThingsBoard.loop();
clientEMQX.loop();
// Mengirim data setiap 5 detik
if (millis() - lastMillis > 5000) {
lastMillis = millis();
sendData();
}
}
// Fungsi untuk koneksi WiFi
void connectWiFi() {
Serial.print("Connecting to: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi. IP Address: ");
Serial.println(WiFi.localIP());
}
// Fungsi untuk mengirim data
void sendData() {
// Membaca suhu dan kelembapan dari DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return; // Jika pembacaan gagal, keluar dari fungsi
}
// Membaca intensitas cahaya dari LDR
int analogValue = analogRead(LDR);
float voltage = (analogValue / 4095.0) * 3.3; // Sesuaikan dengan resolusi ADC Arduino R4
float resistance = 2000 * voltage / (3.3 - voltage);
float lux = (RL10 * 1e3) / resistance;
// Mengukur jarak dengan sensor ultrasonik
float distance = getDistance();
// Mencetak data ke Serial Monitor (untuk debug)
Serial.printf("Lux: %.2f | Temp: %.2f | Humidity: %.2f | Distance: %.2f\n", lux, temperature, humidity, distance);
// Membuat payload untuk dikirim ke ThingsBoard dan EMQX
char attributes[150];
snprintf(attributes, sizeof(attributes), "{\"Lux\":%.2f,\"Temp\":%.2f,\"Hum\":%.2f,\"Dist\":%.2f}", lux, temperature, humidity, distance);
// Mengirim data ke ThingsBoard
if (clientThingsBoard.publish("v1/devices/me/telemetry", attributes)) {
Serial.println("Data sent to ThingsBoard.");
} else {
Serial.println("Failed to send data to ThingsBoard.");
}
// Mengirim data ke EMQX dengan topik "sensors/data"
if (clientEMQX.publish("sensors/data", attributes)) {
Serial.println("Data sent to EMQX.");
} else {
Serial.println("Failed to send data to EMQX.");
}
}
// Fungsi untuk mengukur jarak menggunakan sensor ultrasonik
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
float duration = pulseIn(ECHO_PIN, HIGH);
return (duration * 0.034) / 2; // Konversi ke cm
}
// Fungsi untuk koneksi ulang ke broker
void reconnect(PubSubClient &client, const char *token, const char *clientName) {
while (!client.connected()) {
Serial.printf("Connecting to MQTT %s...", clientName);
bool connected = false;
if (strcmp(clientName, "ThingsBoard") == 0) {
connected = client.connect("ArduinoR4ClientThingsBoard", token, NULL);
} else if (strcmp(clientName, "EMQX") == 0) {
connected = client.connect("ArduinoR4ClientEMQX");
}
if (connected) {
Serial.println(" [DONE]");
} else {
Serial.printf("[FAILED] [rc = %d] Retrying in 5 seconds...\n", client.state());
delay(5000);
}
}
}