223 lines
6.3 KiB
C++
223 lines
6.3 KiB
C++
#define BLYNK_AUTH_TOKEN "VC1vughjM7vsF50JrZ52btxtE35SmEdU"
|
|
#define BLYNK_TEMPLATE_ID "TMPL6nUJWUBf2"
|
|
#define BLYNK_TEMPLATE_NAME "Pemantauan Kandang"
|
|
|
|
#include <ESP8266WiFi.h> // Library untuk koneksi WiFi
|
|
#include <Wire.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
#include "DHTesp.h"
|
|
#include <BlynkSimpleEsp8266.h>
|
|
|
|
#define DHTPIN 2 // Pin data DHT11 terhubung ke pin GPIO2 (D4) pada ESP8266
|
|
#define DHTTYPE DHTesp::DHT11 // Tipe sensor DHT11
|
|
|
|
DHTesp dht;
|
|
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD: 0x27, Jumlah kolom: 16, Jumlah baris: 2
|
|
|
|
const int Sensor = A0;
|
|
const int BuzzerPin = 14; // Pin GPIO untuk mengendalikan buzzer
|
|
const int RelayPin = 12; // Pin GPIO untuk mengendalikan relay
|
|
const int RelayPinKipas = 13; // Pin GPIO untuk mengendalikan relay kipas
|
|
float voltage = 5.0; // Tegangan referensi ADC (Volt)
|
|
float ppmThreshold = 20; // Ambang batas ppm
|
|
float temperatureThreshold = 30; // Ambang batas suhu
|
|
|
|
// Pengaturan WiFi
|
|
char ssid[] = "Izza";
|
|
char password[] = "izzaismi123";
|
|
|
|
// Token Blynk
|
|
char auth[] = BLYNK_AUTH_TOKEN;
|
|
|
|
bool manualOffBuzzer = false; // Status manual off untuk buzzer
|
|
bool manualOffRelay = false; // Status manual off untuk relay
|
|
bool manualOffRelayKipas = false; // Status manual off untuk relay kipas
|
|
bool manualControlKipas = false; // Kontrol manual dari Blynk untuk kipas
|
|
bool manualControlRelay = false; // Kontrol manual dari Blynk untuk relay
|
|
|
|
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
Serial.println("Sistem Monitor Udara Mulai...");
|
|
|
|
lcd.init(); // Inisialisasi LCD
|
|
lcd.backlight(); // Nyalakan backlight LCD
|
|
|
|
pinMode(A0, INPUT);
|
|
pinMode(BuzzerPin, OUTPUT); // Atur pin buzzer sebagai output
|
|
pinMode(RelayPin, OUTPUT); // Atur pin relay sebagai output
|
|
pinMode(RelayPinKipas, OUTPUT); // Atur pin relay kipas sebagai output
|
|
|
|
dht.setup(DHTPIN, DHTTYPE);
|
|
// Menghubungkan ke jaringan WiFi
|
|
Serial.println("Menghubungkan ke WiFi...");
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Menghubungkan");
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("ke WiFi...");
|
|
|
|
WiFi.begin(ssid, password);
|
|
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
delay(1000);
|
|
Serial.println("Mencoba terhubung ke WiFi...");
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Mencoba");
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("terhubung...");
|
|
}
|
|
|
|
Serial.println("Terhubung ke WiFi!");
|
|
lcd.clear();
|
|
lcd.setCursor(0, 0);
|
|
lcd.print("Terhubung ke");
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("WiFi!");
|
|
|
|
// Inisialisasi koneksi Blynk
|
|
Blynk.begin(auth, ssid, password, "blynk.cloud", 80);
|
|
|
|
|
|
// Tambahkan penundaan untuk memberikan waktu sensor DHT untuk inisialisasi
|
|
delay(5000); // 5 detik
|
|
}
|
|
|
|
void loop() {
|
|
Blynk.run();
|
|
|
|
delay(dht.getMinimumSamplingPeriod());
|
|
|
|
float temperature = dht.getTemperature();
|
|
|
|
// Coba membaca lagi jika pembacaan awal gagal
|
|
if (isnan(temperature)) {
|
|
Serial.println("Failed to read from DHT sensor, retrying...");
|
|
delay(2000); // Tambahkan penundaan sebelum mencoba membaca lagi
|
|
temperature = dht.getTemperature();
|
|
}
|
|
|
|
if (isnan(temperature)) {
|
|
Serial.println("Failed to read from DHT sensor!");
|
|
lcd.clear();
|
|
lcd.setCursor(0,0);
|
|
lcd.print("Failed to read");
|
|
lcd.setCursor(0,1);
|
|
lcd.print("from DHT sensor!");
|
|
return;
|
|
}
|
|
|
|
Blynk.virtualWrite(V0, temperature);
|
|
|
|
lcd.clear();
|
|
lcd.setCursor(0,0);
|
|
lcd.print("Suhu: ");
|
|
lcd.print(temperature);
|
|
lcd.print("C");
|
|
|
|
if (temperature > temperatureThreshold && !manualControlKipas) {
|
|
//Blynk.email
|
|
Blynk.logEvent("notifikasi","Suhu di atas 30 Derajat Celcius");
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("Status: Panas");
|
|
if (!manualOffRelayKipas) {
|
|
digitalWrite(RelayPinKipas, HIGH); // Nyalakan kipas
|
|
}
|
|
} else {
|
|
lcd.setCursor(0, 1);
|
|
lcd.print("Status: Normal");
|
|
if (!manualControlKipas) {
|
|
digitalWrite(RelayPinKipas, LOW); // Matikan kipas
|
|
}
|
|
}
|
|
|
|
delay(2000);
|
|
|
|
int dataSensor = analogRead(Sensor);
|
|
float voltageValue = (dataSensor * voltage) / 1023.0; // Mengonversi nilai sensor menjadi tegangan (Volt)
|
|
|
|
// Menghitung konsentrasi partikulat dalam ppm
|
|
float ppmValue = voltageValue * 10.0; // Mengonversi tegangan menjadi mV
|
|
// Disesuaikan dengan karakteristik sensor Anda (memerlukan kalibrasi)
|
|
|
|
Blynk.virtualWrite(V2, ppmValue);
|
|
|
|
lcd.clear(); // Membersihkan layar untuk tampilan selanjutnya
|
|
lcd.setCursor(0, 0); // Posisi kursor LCD di baris 1 kolom 1
|
|
lcd.print("PPM: ");
|
|
lcd.print(ppmValue); // Tampilkan nilai ppm
|
|
|
|
// Memeriksa jika konsentrasi melebihi ambang batas
|
|
lcd.setCursor(0, 1); // Posisi kursor LCD di baris 2 kolom 1
|
|
if (ppmValue > ppmThreshold && !manualControlRelay) {
|
|
//Blynk.email
|
|
Blynk.logEvent("notifikasi","Gas Amonia di atas 20 ppm");
|
|
lcd.print("Udara:Tidak Baik");
|
|
if (!manualOffRelay) {
|
|
digitalWrite(RelayPin, HIGH); // Nyalakan relay
|
|
}
|
|
if (!manualOffBuzzer) {
|
|
controlBuzzer(true); // Panggil fungsi untuk mengontrol buzzer (aktifkan)
|
|
}
|
|
} else {
|
|
lcd.print("Udara:Baik");
|
|
if (!manualControlRelay) {
|
|
digitalWrite(RelayPin, LOW); // Matikan relay
|
|
}
|
|
controlBuzzer(false); // Panggil fungsi untuk mengontrol buzzer (matikan)
|
|
}
|
|
|
|
delay(2000);
|
|
}
|
|
|
|
void controlBuzzer(bool state) {
|
|
if (state) {
|
|
tone(BuzzerPin, 2000); // Menghasilkan bunyi buzzer pada frekuensi 2000Hz
|
|
} else {
|
|
noTone(BuzzerPin); // Pastikan bunyi buzzer dimatikan sepenuhnya
|
|
}
|
|
}
|
|
|
|
// Fungsi untuk mematikan buzzer secara manual
|
|
void manualOffBuzzerFunction() {
|
|
manualOffBuzzer = true;
|
|
controlBuzzer(false);
|
|
}
|
|
|
|
// Fungsi untuk mematikan relay secara manual
|
|
void manualOffRelayFunction() {
|
|
manualOffRelay = true;
|
|
digitalWrite(RelayPin, LOW);
|
|
}
|
|
|
|
// Fungsi untuk mematikan relay kipas secara manual
|
|
void manualOffRelayKipasFunction() {
|
|
manualOffRelayKipas = true;
|
|
digitalWrite(RelayPinKipas, LOW);
|
|
}
|
|
|
|
// Fungsi untuk menghidupkan kembali relay dan buzzer secara manual
|
|
void manualOnFunctions() {
|
|
manualOffBuzzer = false;
|
|
manualOffRelay = false;
|
|
manualOffRelayKipas = false;
|
|
}
|
|
|
|
// Blynk virtual write functions
|
|
BLYNK_WRITE(V1) {
|
|
manualControlKipas = param.asInt();
|
|
if (manualControlKipas) {
|
|
digitalWrite(RelayPinKipas, LOW); // Matikan kipas jika kontrol manual aktif
|
|
}
|
|
}
|
|
|
|
BLYNK_WRITE(V3) {
|
|
manualControlRelay = param.asInt();
|
|
if (manualControlRelay) {
|
|
digitalWrite(RelayPin, LOW); // Matikan relay jika kontrol manual aktif
|
|
}
|
|
}
|
|
|