#include "esp_wifi.h"
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// ========== KONFIGURASI WIFI & THINGSBOARD ==========
const char* ssid = "Albi's"; // Ganti dengan SSID WiFi
const char* password = "albibilal"; // Ganti dengan password WiFi
const char* thingsboardServer = "mqtt.thingsboard.cloud";
const int thingsboardPort = 1883;
const char* accessToken = "bckqybxzgfa2emx40129"; // Ganti dengan Access Token device ThingsBoard
// ========== KONFIGURASI PIN ==========
#define ONE_WIRE_BUS 4 // DS18B20 di GPIO4
#define IR_SENSOR_PIN 13 // Sensor IR / tombol
#define HEATER_PIN 25 // Relay / heater simulasi
#define STATUS_LED 26 // LED indikator heater
// ========== INISIALISASI OBJEK ==========
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
WiFiClient wifiClient;
PubSubClient client(wifiClient);
bool heaterManual = false; // Jika true, dikontrol dari ThingsBoard
// ========== FUNGSI CALLBACK UNTUK RPC ==========
void mqttCallback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println("RPC Diterima: " + message);
if (message.indexOf("setHeater") != -1) {
if (message.indexOf("true") != -1) {
heaterManual = true;
digitalWrite(HEATER_PIN, HIGH);
digitalWrite(STATUS_LED, HIGH);
} else if (message.indexOf("false") != -1) {
heaterManual = false;
digitalWrite(HEATER_PIN, LOW);
digitalWrite(STATUS_LED, LOW);
}
}
}
// ========== FUNGSI KONEKSI KE MQTT ==========
void reconnect() {
while (!client.connected()) {
Serial.print("Menghubungkan ke ThingsBoard...");
if (client.connect("ESP32Client", accessToken, NULL)) {
Serial.println("Berhasil");
client.subscribe("v1/devices/me/rpc/request/+");
} else {
Serial.print("Gagal. Kode: ");
Serial.println(client.state());
delay(3000);
}
}
}
// ========== SETUP ==========
void setup() {
Serial.begin(115200);
pinMode(IR_SENSOR_PIN, INPUT_PULLUP);
pinMode(HEATER_PIN, OUTPUT);
pinMode(STATUS_LED, OUTPUT);
digitalWrite(HEATER_PIN, LOW);
digitalWrite(STATUS_LED, LOW);
sensors.begin();
WiFi.begin(ssid, password);
Serial.print("Menghubungkan ke WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nTerhubung ke WiFi!");
client.setServer(thingsboardServer, thingsboardPort);
client.setCallback(mqttCallback);
}
// ========== LOOP UTAMA ==========
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
sensors.requestTemperatures();
float suhu = sensors.getTempCByIndex(0);
bool sedangMinum = digitalRead(IR_SENSOR_PIN) == LOW;
bool heaterStatus = false;
if (!heaterManual) {
if (suhu < 55.0 && !sedangMinum) {
digitalWrite(HEATER_PIN, HIGH);
digitalWrite(STATUS_LED, HIGH);
heaterStatus = true;
} else {
digitalWrite(HEATER_PIN, LOW);
digitalWrite(STATUS_LED, LOW);
heaterStatus = false;
}
} else {
heaterStatus = true; // Mode manual, heater menyala
}
// Kirim data ke ThingsBoard
String payload = "{";
payload += "\"temperature\":" + String(suhu) + ",";
payload += "\"ir_detect\":" + String(sedangMinum ? "true" : "false") + ",";
payload += "\"heater_status\":" + String(heaterStatus ? "true" : "false");
payload += "}";
client.publish("v1/devices/me/telemetry", payload.c_str());
Serial.println("Data terkirim: " + payload);
delay(5000);
}