// Sistem kendali dan Monitoring Kandang ayam
//Pemanas Lampu 20 Watt, Sensor DHT22, Penghasil Uap air
//Exhaust Fan, Buzzer alaram
//HC-SR04 level air minum pada Tandon
//Jika suhu diatas 30 derajat Relay Pemanas OFF dan Relay EXhaust ON
//Jika suhu diatas 26 dan dibawah 30 maka Relay pemanas dan Exhaust OFF
//Jika kondisi kandang bahaya maka alaram bunyi
#include <WiFi.h>
#include <MQTT.h>
#include "DHT.h"
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
#define DHT22Pin 23
#define pemanas 25
#define exhaust 33
#define humidifier 22
#define alaram 27
#define pompa 26
DHT dht(DHT22Pin, DHT22);
const int trigPin = 16;
const int echoPin = 4;
long duration;
int distance, level;
float hum, temp;
unsigned long lastMillis = 0;
void connect(){
// Menghubungkan ke WiFi
Serial.print("Cek WiFi");
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("Sukses Terhubung ke WiFi");
// Menghubungkan ke Broker
// subcribe dengan QoS 1
}
void subscribeData(String &topic, String &data){
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Data: ");
Serial.println(data);
if(topic == "kandang/iot/alaram"){
// digitalWrite(alaram, data.toInt()); //control led 1
if(data.toInt()==1){
tone(alaram, 1000);
client.publish("kandang/iot/statusalaram",String("ON"), true, 1);
}else{
noTone(alaram);
client.publish("kandang/iot/statusalaram",String("OFF"), true, 1);
}
}
}
void deteksi_temp(){
hum = dht.readHumidity();
temp = dht.readTemperature();
Serial.print("Temperature : ");
Serial.print(temp);
Serial.print(" C ");
Serial.print("Humidity : ");
Serial.print(hum);
Serial.println(" % ");
if (temp>30) {
digitalWrite(exhaust, HIGH);
digitalWrite(pemanas, LOW);
}
else if ((temp>26) && (temp<=30)){
digitalWrite(exhaust, LOW);
digitalWrite(pemanas, LOW);
}
else if (temp<=26 ){
digitalWrite(exhaust, LOW);
digitalWrite(pemanas, HIGH);
}
if (hum>90) {
digitalWrite(humidifier, LOW);
}
else if (hum<70) {
digitalWrite(humidifier, HIGH);
}
}
void publish(){
client.publish("kandang/iot/dht/temp", String(temp), true, 1); //
client.publish("kandang/iot/dht/humi", String(hum), true, 1); // publish variabel humidity ke topic rumah/iot/humi dengan QoS 1
client.publish("kandang/iot/level/cm", String(level), true, 1);
client.publish("kandang/iot/alaram", String(alaram), true, 1);
if ((temp>30)||(hum<50)||(hum>95)||(level>100)||(level<20)){
client.publish("kandang/iot/statusalaram",String("ON"), true, 1);
}
else { client.publish("kandang/iot/statusalaram",String("OFF"), true, 1);
}
}
void ultrasonic() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
level=400-distance;
Serial.print("Level air: ");
Serial.print(level);
Serial.println("cm");
if (level>90) {
digitalWrite(pompa, LOW);}
else if (level<20) {
digitalWrite(pompa, HIGH);
}
}
void setup() {
pinMode(pemanas,OUTPUT);
pinMode(alaram,OUTPUT);
pinMode(exhaust,OUTPUT);
pinMode(humidifier,OUTPUT);
pinMode(pompa,OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
dht.begin();
digitalWrite(pompa, LOW);
digitalWrite(humidifier, LOW);
digitalWrite(pemanas, LOW);
noTone(alaram); // Stop sound...
Serial.begin(9600);
WiFi.begin(ssid, pass);
connect();
broconnect();
}
void broconnect(){
client.begin("broker.emqx.io",net);
client.onMessage(subscribeData);
Serial.print("Cek Broker");
while(!client.connect("")){ // Client ID boleh dikosongkan
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("Sukses Terhubung ke Server");
client.subscribe("kandang/iot/#", 1);
}
void loop() {
client.loop();
broconnect();//connect ulang ke broker
ultrasonic();
deteksi_temp();
Serial.print("Suhu= ");
Serial.println(temp);
Serial.print("Humidity= ");
Serial.println(hum);
Serial.print("Level air= ");
Serial.println(level);
delay(2000);
if ((temp>30)||(hum<50)||(hum>95)||(level>100)||(level<20)){
tone(alaram, 1000);// Send 1KHz sound signal
// delay(3000);
}
else {noTone(alaram); // Stop sound...
}
// publish a message roughly every second.
if (millis() - lastMillis > 2000) {
lastMillis = millis();
publish();
}
delay(10);
}