// === IoT Smart Coffee Heater with ThinkBoard via MQTT (Access Token) ===
// Komponen: ESP32 + DS18B20 + IR Sensor + LED + MQTT ke ThinkBoard
#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// ===================== KONFIGURASI =====================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "http://thingsboard.cloud/api/v1/m9yucko8xuvib6fulc6y/";
//const int mqttPort = 1883;
const char* accessToken = "m9yucko8xuvib6fulc6y"; // Ganti dengan Access Token device ThinkBoard
const char* mqttClientId = "coffee-heater-esp32";
#define ONE_WIRE_BUS 4 // DS18B20 pada pin D4
#define IR_SENSOR_PIN 2 // IR Sensor pada pin D2
#define HEATER_PIN 5 // LED sebagai simbol pemanas
// ===================== OBJEK =====================
WiFiClient espClient;
PubSubClient client(espClient);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float currentTemp;
bool cupLifted;
bool manualHeaterOn = false;
// ===================== CALLBACK MQTT =====================
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (String(topic) == "v1/devices/me/rpc/request/1") {
if (message.indexOf("on") > 0) {
manualHeaterOn = true;
} else if (message.indexOf("off") > 0) {
manualHeaterOn = false;
}
}
}
// ===================== WIFI & MQTT =====================
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Menghubungkan ke MQTT...");
if (client.connect(mqttClientId, accessToken, NULL)) {
Serial.println("Terhubung!");
client.subscribe("v1/devices/me/rpc/request/+", 1);
} else {
Serial.print("Gagal, rc=");
Serial.print(client.state());
delay(2000);
}
}
}
// ===================== SETUP =====================
void setup() {
Serial.begin(115200);
sensors.begin();
pinMode(IR_SENSOR_PIN, INPUT);
pinMode(HEATER_PIN, OUTPUT);
digitalWrite(HEATER_PIN, LOW);
WiFi.begin(ssid, password);
Serial.print("Menghubungkan ke WiFi");
unsigned long startAttemptTime = millis();
while (WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < 10000) {
Serial.print(".");
delay(500);
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("❌ Gagal konek ke WiFi. Periksa SSID/Password atau sinyal.");
} else {
Serial.println("\n✅ WiFi Connected!");
Serial.println(WiFi.localIP());
}
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
}
// ===================== LOOP =====================
void loop() {
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
sensors.requestTemperatures();
currentTemp = sensors.getTempCByIndex(0);
cupLifted = digitalRead(IR_SENSOR_PIN);
Serial.printf("Suhu: %.2f C | Cangkir: %s\n", currentTemp, cupLifted ? "Diangkat" : "Diam");
// Logika pemanas: otomatis jika <50 dan cangkir tidak diangkat, atau manual diaktifkan
bool heaterStatus = false;
if ((currentTemp < 50 && !cupLifted) || manualHeaterOn) {
digitalWrite(HEATER_PIN, HIGH);
heaterStatus = true;
} else {
digitalWrite(HEATER_PIN, LOW);
}
// Kirim data ke ThinkBoard MQTT
String payload = "{";
payload += "\"temperature\":" + String(currentTemp) + ",";
payload += "\"cupLifted\":" + String(cupLifted ? "true" : "false") + ",";
payload += "\"heaterOn\":" + String(heaterStatus ? "true" : "false");
payload += "}";
client.publish("v1/devices/me/telemetry", payload.c_str());
delay(5000);
}Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1
Loading
ds18b20
ds18b20