#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>
#include <LiquidCrystal_I2C.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Switch on the LED if an 1 was received as first character
if ((char)payload[0] == '1') {
digitalWrite(2, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is active low on the ESP-01)
} else {
digitalWrite(2, HIGH); // Turn the LED off by making the voltage HIGH
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
// Once connected, publish an announcement...
client.publish("iotfrontier/mqtt", "iotfrontier");
// ... and resubscribe
client.subscribe("iotfrontier/mqtt");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define BUZZER_PIN 18
const int potentiometerPin = 35;
const int DHT_PIN = 15;
DHTesp dht;
double ZAman(double a_predikat) {
double rendah = 40;
double tinggi = 80;
double ZAman = tinggi - a_predikat * (tinggi - rendah);
return ZAman;
}
double ZKebakaran(double a_predikat) {
double rendah = 40;
double tinggi = 80;
double ZKebakaran = a_predikat * (tinggi - rendah) + rendah;
return ZKebakaran;
}
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
setup_wifi();
client.setServer(mqttServer, 1883);
client.setCallback(callback);
dht.setup(DHT_PIN, DHTesp::DHT22);
delay(dht.getMinimumSamplingPeriod());
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// digitalWrite(BUZZER_PIN, HIGH);
// digitalWrite(BUZZER_PIN, LOW);
/////////////////////////////////////////////////////////
///////////////////////////Suhu//////////////////////////
/////////////////////////////////////////////////////////
// Input nilai suhu dari sensor DHT
double suhuValue = dht.getTemperature(); // Menggunakan variabel suhuValue
double aman = 16; // Batas bawah suhu
double api = 50; // Batas atas suhu
// Memetakan nilai suhuValue dari rentang (batas bawah) ke (batas atas) ke rentang baru (misalnya, 0 hingga 100)
double x = map(suhuValue, aman, api, 16, 50);
Serial.println("==========Suhu==========");
Serial.println("Nilai X (suhu): " + String(x, 0));
// Fuzzifikasi
double Suhu_Rendah;
if (x >= api) {
Suhu_Rendah = 0;
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 0));
} else if (aman < x && x < api) {
Suhu_Rendah = (api - x) / (api - aman);
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 4));
} else if (x <= aman) {
Suhu_Rendah = 1;
Serial.println("μSuhu_Rendah [X]: " + String(Suhu_Rendah, 0));
}
double Suhu_Tinggi;
if (x <= aman) {
Suhu_Tinggi = 0;
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 0));
} else if (aman < x && x < api) {
Suhu_Tinggi = (x - aman) / (api - aman);
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 4));
} else if (x >= api) {
Suhu_Tinggi = 1;
Serial.println("μSuhu_Tinggi [X]: " + String(Suhu_Tinggi, 0));
}
/////////////////////////////////////////////////////////
////////////////////////////Gas//////////////////////////
/////////////////////////////////////////////////////////
// Gas
// Input nilai Gas dari sensor potensiometer
double potValue = analogRead(potentiometerPin);
double y = map(potValue, 100, 4095, 0, 600);
double normal = 100;
double kebakaran = 500;
Serial.println("============Gas============");
Serial.println("Nilai Y (Gas): " + String(y, 0) + " C");
double Gas_Rendah;
if (y >= kebakaran) {
Gas_Rendah = 0;
Serial.println("μGas_Rendah [Y]: " + String(Gas_Rendah, 0));
} else if (normal < y && y < kebakaran) {
Gas_Rendah = (kebakaran - y) / (kebakaran - normal);
Serial.println("μGas_Rendah [Y]: " + String(Gas_Rendah, 4));
} else if (y <= normal) {
Gas_Rendah = 1;
Serial.println("μGas_Rendah [Y]: " + String(Gas_Rendah, 0));
}
double Gas_Tinggi;
if (y <= normal) {
Gas_Tinggi = 0;
Serial.println("μGas_Tinggi [Y]: " + String(Gas_Tinggi, 0));
} else if (y > normal && y < kebakaran) {
Gas_Tinggi = (y - normal) / (kebakaran - normal);
Serial.println("μGas_Tinggi [Y]: " + String(Gas_Tinggi, 4));
} else if (y >= kebakaran) {
Gas_Tinggi = 1;
Serial.println("μGas_Tinggi [Y]: " + String(Gas_Tinggi, 0));
}
///////////////////////////////////////////////////////
///////////////////////Inferensi///////////////////////
///////////////////////////////////////////////////////
Serial.println("===========Inferensi=========");
// [R1] aman & Normal = AMAN
double a_predikat1 = min(Suhu_Rendah, Gas_Rendah);
Serial.println("a_predikat 1: " + String(a_predikat1, 4));
double Z1 = ZAman(a_predikat1);
Serial.println("z1: " + String(Z1, 0));
// [R2] api & Normal = KEBAKARAN
double a_predikat2 = min(Suhu_Tinggi, Gas_Rendah);
Serial.println("a_predikat 3: " + String(a_predikat2, 4));
double Z2 = ZKebakaran(a_predikat2);
Serial.println("z3: " + String(Z2, 0));
// [R3] aman & Kebakaran = AMAN
double a_predikat3 = min(Suhu_Rendah, Gas_Tinggi);
Serial.println("a_predikat 2: " + String(a_predikat3, 4));
double Z3 = ZAman(a_predikat3);
Serial.println("z2: " + String(Z3, 0));
// [R4] api & Kebakaran = KEBAKARAN
double a_predikat4 = min(Suhu_Tinggi, Gas_Tinggi);
Serial.println("a_predikat 4: " + String(a_predikat4, 4));
double Z4 = ZKebakaran(a_predikat4);
Serial.println("z4: " + String(Z4, 0));
///////////////////////////////////////////////////////
/////////////////////Defuzifikasi//////////////////////
///////////////////////////////////////////////////////
Serial.println("=========Defuzifikasi========");
double z = (a_predikat1 * Z1 + a_predikat2 * Z2 + a_predikat3 * Z3 + a_predikat4 * Z4) /
(a_predikat1 + a_predikat2 + a_predikat3 + a_predikat4);
Serial.println("Hasil nilai Z: " + String(z, 3));
lcd.clear();
lcd.setCursor(0, 0);
lcd.setCursor(0, 1);
if (z <= 45) {
lcd.print("AMAN");
noTone(BUZZER_PIN);
client.publish("iotfrontier/buzzer", "false");
} else {
lcd.print("KEBAKARAN");
tone(BUZZER_PIN, 200);
client.publish("iotfrontier/buzzer", "true");
}
delay(1000);
Serial.println("Hasil nilai Z: " + String(z, 3));
lcd.setCursor(0, 0);
lcd.print("DERAJAT RUANGAN:");
lcd.setCursor(0, 1);
lcd.print(z, 4);
lcd.print(" C");
delay(1000);
client.publish("iotfrontier/suhuValue", String(suhuValue).c_str());
client.publish("iotfrontier/y", String(y).c_str());
client.publish("iotfrontier/z", String(z).c_str());
}