#include <WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PubSubClient.h>
// DS18B20
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Buzzer & Stepper
#define BUZZER_PIN 2
#define STEPPER_IN1 12
#define STEPPER_IN2 13
#define STEPPER_IN3 14
#define STEPPER_IN4 15
// WiFi & MQTT
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "dandyshaker262.cloud.shiftr.io";
const char* mqtt_user = "dandyshaker262";
const char* mqtt_pass = "auKlIMvIg0W59AXi";
WiFiClient espClient;
PubSubClient client(espClient);
float lastTemp = 0;
unsigned long lastSend = 0;
void setup() {
Serial.begin(115200);
sensors.begin();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(STEPPER_IN1, OUTPUT);
pinMode(STEPPER_IN2, OUTPUT);
pinMode(STEPPER_IN3, OUTPUT);
pinMode(STEPPER_IN4, OUTPUT);
connectWiFi();
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
Serial.println("Suhu: " + String(temp));
// Deteksi kebakaran
bool fire = (temp - lastTemp > 3.0) || temp > 60.0;
lastTemp = temp;
if (fire) {
triggerAlarm();
publishMQTT("fire/status", "ALERT");
}
// Kirim data setiap 60 detik
if (millis() - lastSend > 60000) {
publishMQTT("fire/temperature", String(temp).c_str());
if (!fire) publishMQTT("fire/status", "NORMAL");
lastSend = millis();
}
delay(1000);
}
void triggerAlarm() {
digitalWrite(BUZZER_PIN, HIGH);
runStepperMotor();
delay(10000);
digitalWrite(BUZZER_PIN, LOW);
}
void runStepperMotor() {
int steps[8][4] = {
{1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1,