Kontrol Suhu Kopi

This commit is contained in:
Krisnance 2024-08-16 13:31:09 +07:00
commit 40703851e3
1 changed files with 246 additions and 0 deletions

246
Kontrol_Suhu_Kopi Normal file
View File

@ -0,0 +1,246 @@
#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;
}