247 lines
9.0 KiB
Plaintext
247 lines
9.0 KiB
Plaintext
#include <DHT.h>
|
|
#include <ThingerESP8266.h>
|
|
#include <ESP8266WiFi.h>
|
|
|
|
#define DHTPIN D5 // Pin data sensor DHT11 terhubung ke pin D5
|
|
#define DHTTYPE DHT11 // Tipe sensor DHT11
|
|
#define USERNAME "krisnance" // Username Thinger.io
|
|
#define DEVICE_ID "esp82" // Device ID
|
|
#define DEVICE_CREDENTIAL "OfI-n+i2y$$i34y9" // Device Credential
|
|
#define SSID "itsyourboiman" // Nama WiFi
|
|
#define SSID_PASSWORD "pelerquda" // Password WiFi
|
|
#define BUCKET_ID "database" // ID Data Bucket
|
|
|
|
const long interval = 5000; // Waktu maksimum untuk terhubung ke WiFi (dalam milidetik)
|
|
unsigned long previousMillis = 0;
|
|
const int mq2Pin = A0; // Pin A0 digunakan untuk membaca data analog dari sensor MQ-2
|
|
const int buzzerPin = D0; // Pin D0 digunakan untuk mengendalikan buzzer
|
|
const int relayPin1 = D1; // Pin D1 digunakan untuk mengendalikan relay 1 (Fan)
|
|
const int relayPin2 = D2; // Pin D2 digunakan untuk mengendalikan relay 2
|
|
const int relayPin4 = D4; // Pin D4 digunakan untuk mengendalikan relay 4 (Lampu)
|
|
|
|
DHT dht(DHTPIN, DHTTYPE);
|
|
ThingerESP8266 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);
|
|
|
|
unsigned long lastNotificationTime1 = 0;
|
|
const unsigned long notificationInterval = 60000;
|
|
unsigned long lastBuzzerMillis = 0;
|
|
const unsigned long buzzerOnTime = 500;
|
|
const unsigned long buzzerOffTime = 500;
|
|
unsigned long buzzerStartTime = 0;
|
|
int buzzerState = LOW;
|
|
bool smokeDetected = false;
|
|
bool manualFanControl = false;
|
|
bool manualLampControl = false;
|
|
bool manualBuzzerControl = false;
|
|
bool modeOtomatis = true;
|
|
|
|
float Ro = 10; // Nilai awal Ro, akan diupdate setelah kalibrasi
|
|
const float RL = 10.0; // Nilai resistor load dalam kilo ohm
|
|
const float Vcc = 5.0; // Tegangan suplai
|
|
|
|
void setup() {
|
|
Serial.begin(9600); // Inisialisasi komunikasi serial dengan kecepatan 9600 bps
|
|
|
|
thing.add_wifi(SSID, SSID_PASSWORD);
|
|
|
|
Serial.print("Connecting to ");
|
|
Serial.println(SSID);
|
|
WiFi.begin(SSID, SSID_PASSWORD);
|
|
while (WiFi.status() != WL_CONNECTED && millis() - previousMillis < interval) {
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
Serial.println("");
|
|
Serial.println("WiFi connected.");
|
|
|
|
pinMode(buzzerPin, OUTPUT); // Mengatur pin buzzer sebagai output
|
|
pinMode(relayPin1, OUTPUT); // Mengatur pin relay 1 sebagai output
|
|
pinMode(relayPin2, OUTPUT); // Mengatur pin relay 2 sebagai output
|
|
pinMode(relayPin4, OUTPUT); // Mengatur pin relay 4 sebagai output
|
|
dht.begin(); // Inisialisasi sensor DHT
|
|
|
|
// Kalibrasi sensor MQ2 dan dapatkan nilai Ro
|
|
Ro = calibrateSensor();
|
|
Serial.print("Nilai Ro: ");
|
|
Serial.println(Ro);
|
|
|
|
// Resource untuk membaca data sensor
|
|
thing["sensorData"] >> [](pson& out) {
|
|
float humidity = dht.readHumidity();
|
|
float temperature = dht.readTemperature();
|
|
int sensorValue = analogRead(mq2Pin);
|
|
bool fanStatus = digitalRead(relayPin1) == LOW; // LOW berarti relay aktif
|
|
bool lampStatus = digitalRead(relayPin4) == LOW; // LOW berarti relay aktif
|
|
|
|
out["Suhu"] = temperature;
|
|
out["Kelembapan"] = humidity;
|
|
out["Asap"] = sensorValue;
|
|
out["Fan"] = fanStatus;
|
|
out["Lampu"] = lampStatus;
|
|
};
|
|
|
|
// Resource untuk mengendalikan Fan
|
|
thing["Fan"] << [](pson& in) {
|
|
if (in.is_empty()) {
|
|
in = digitalRead(relayPin1) == LOW; // Mengirim status Fan saat ini
|
|
} else {
|
|
manualFanControl = true;
|
|
modeOtomatis = false;
|
|
digitalWrite(relayPin1, in ? LOW : HIGH); // Mengatur status Fan
|
|
digitalWrite(relayPin2, in ? LOW : HIGH); // Mengatur status Fan
|
|
Serial.print("Fan manual control set to: ");
|
|
Serial.println(in ? "ON" : "OFF");
|
|
}
|
|
};
|
|
|
|
// Resource untuk mengendalikan Lampu
|
|
thing["Lampu"] << [](pson& in) {
|
|
if (in.is_empty()) {
|
|
in = digitalRead(relayPin4) == LOW; // Mengirim status Lampu saat ini
|
|
} else {
|
|
manualLampControl = true;
|
|
modeOtomatis = false;
|
|
digitalWrite(relayPin4, in ? LOW : HIGH); // Mengatur status Lampu
|
|
Serial.print("Lampu manual control set to: ");
|
|
Serial.println(in ? "ON" : "OFF");
|
|
}
|
|
};
|
|
|
|
// Resource untuk mengendalikan Buzzer
|
|
thing["Buzzer"] << [](pson& in) {
|
|
if (in.is_empty()) {
|
|
in = manualBuzzerControl; // Mengirim status Buzzer saat ini
|
|
} else {
|
|
manualBuzzerControl = in;
|
|
if (manualBuzzerControl) {
|
|
buzzerStartTime = millis();
|
|
digitalWrite(buzzerPin, HIGH);
|
|
Serial.println("Buzzer diaktifkan secara manual selama 5 detik");
|
|
} else {
|
|
digitalWrite(buzzerPin, LOW);
|
|
Serial.println("Buzzer dimatikan secara manual");
|
|
}
|
|
}
|
|
};
|
|
|
|
// Resource untuk mengendalikan mode otomatis
|
|
thing["ModeOtomatis"] << [](pson& in) {
|
|
if (in.is_empty()) {
|
|
in = modeOtomatis; // Mengirim status Mode Otomatis saat ini
|
|
} else {
|
|
modeOtomatis = in;
|
|
manualFanControl = !modeOtomatis;
|
|
manualLampControl = !modeOtomatis;
|
|
Serial.print("Mode Otomatis ");
|
|
Serial.println(modeOtomatis ? "diaktifkan" : "dimatikan");
|
|
}
|
|
};
|
|
|
|
// Resource untuk mendapatkan status mode otomatis
|
|
thing["getModeOtomatis"] >> [](pson& out) {
|
|
out["modeOtomatis"] = modeOtomatis;
|
|
};
|
|
}
|
|
|
|
void loop() {
|
|
unsigned long currentTime = millis();
|
|
thing.handle();
|
|
int sensorValue = analogRead(mq2Pin); // Membaca nilai analog dari sensor MQ-2
|
|
|
|
// Baca suhu dan kelembapan dari sensor DHT11
|
|
float humidity = dht.readHumidity();
|
|
float temperature = dht.readTemperature();
|
|
|
|
if (isnan(humidity) || isnan(temperature)) {
|
|
Serial.println("Gagal membaca dari sensor DHT11!");
|
|
return;
|
|
}
|
|
|
|
Serial.print("Suhu: ");
|
|
Serial.print(temperature);
|
|
Serial.print(" C, Kelembapan: ");
|
|
Serial.print(humidity);
|
|
Serial.println("%");
|
|
|
|
if (modeOtomatis) {
|
|
// Aksi ketika suhu di atas 30 derajat Celsius
|
|
if (temperature > 30) {
|
|
digitalWrite(relayPin1, LOW); // Menyalakan relay 1 (Fan)
|
|
digitalWrite(relayPin2, LOW); // Menyalakan relay 2 (Fan)
|
|
Serial.println("Suhu di atas 30 C, Relay 1 dan Relay 2 (Fan) dinyalakan");
|
|
} else {
|
|
digitalWrite(relayPin1, HIGH); // Matikan relay 1 (Fan)
|
|
digitalWrite(relayPin2, HIGH); // Matikan relay 2 (Fan)
|
|
}
|
|
|
|
// Aksi ketika kelembapan di bawah 70%
|
|
if (humidity < 70) {
|
|
digitalWrite(relayPin4, LOW); // Menyalakan relay 4 (Lampu)
|
|
Serial.println("Kelembapan di bawah 70%, Relay 4 (Lampu) dinyalakan");
|
|
} else {
|
|
digitalWrite(relayPin4, HIGH); // Matikan relay 4 (Lampu)
|
|
}
|
|
}
|
|
|
|
// Ambang batas untuk mendeteksi asap
|
|
int smokeThreshold = 400;
|
|
if (sensorValue >= smokeThreshold) {
|
|
Serial.println("Asap Terdeteksi!");
|
|
smokeDetected = true;
|
|
|
|
// Logika untuk menyalakan buzzer
|
|
if (currentTime - lastBuzzerMillis >= (buzzerState == HIGH ? buzzerOnTime : buzzerOffTime)) {
|
|
buzzerState = !buzzerState;
|
|
digitalWrite(buzzerPin, buzzerState);
|
|
lastBuzzerMillis = currentTime;
|
|
}
|
|
|
|
// Mengirim Notifikasi Telegram dengan interval 1 menit
|
|
if (lastNotificationTime1 == 0 || currentTime - lastNotificationTime1 >= notificationInterval) {
|
|
thing.call_endpoint("telegram_bot");
|
|
lastNotificationTime1 = currentTime;
|
|
}
|
|
} else {
|
|
smokeDetected = false;
|
|
digitalWrite(buzzerPin, LOW); // Pastikan buzzer mati jika tidak ada asap
|
|
}
|
|
|
|
// Matikan buzzer setelah 5 detik jika diaktifkan secara manual
|
|
if (manualBuzzerControl && (currentTime - buzzerStartTime >= 5000)) {
|
|
manualBuzzerControl = false;
|
|
digitalWrite(buzzerPin, LOW);
|
|
Serial.println("Buzzer dimatikan setelah 5 detik");
|
|
}
|
|
|
|
// Kirim data ke Data Bucket
|
|
pson data;
|
|
data["Suhu"] = temperature;
|
|
data["Kelembapan"] = humidity;
|
|
data["Asap"] = sensorValue;
|
|
data["Fan"] = digitalRead(relayPin1) == LOW; // LOW berarti relay aktif
|
|
data["Lampu"] = digitalRead(relayPin4) == LOW; // LOW berarti relay aktif
|
|
|
|
thing.write_bucket(BUCKET_ID, data);
|
|
|
|
delay(1000); // Delay sebelum pembacaan berikutnya
|
|
}
|
|
|
|
// Fungsi untuk kalibrasi sensor MQ2 dan mendapatkan nilai Ro
|
|
float calibrateSensor() {
|
|
float val = 0;
|
|
for (int i = 0; i < 100; i++) {
|
|
val += getSensorResistance();
|
|
delay(50);
|
|
}
|
|
val = val / 100; // Rata-rata dari 100 pengukuran
|
|
return val / 9.83; // 9.83 adalah Rs/Ro di udara bersih (untuk asap)
|
|
}
|
|
|
|
// Fungsi untuk mendapatkan nilai resistansi sensor MQ2
|
|
float getSensorResistance() {
|
|
int analogValue = analogRead(mq2Pin); // Baca nilai analog
|
|
float voltage = (analogValue / 1023.0) * Vcc; // Hitung tegangan
|
|
float Rs = (Vcc - voltage) * RL / voltage; // Hitung Rs
|
|
return Rs;
|
|
}
|