ARDUINO Fuzzy Logic Controller Mamdani Untuk Monitoring Asap
ARDUINO Fuzzy Logic Controller Mamdani Untuk Monitoring Asap
Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat
untuk monitoring suhu dan asap / gas dengan menggunakan metode fuzzy logic control mamdani untuk
bisa menghasilkan putaran pada Fan AC yang optimal, alat ini menggunakan dua buah sensor yaitu
sensor suhu ds18b20 dan sensor gas / asap MQ-2 dengan outputnya untuk kendali kipas AC. jadi saat
kondisi panas dan ada asap kipas akan berputar cepat, jika kondisi dingin dan tidak ada asap maka kipas
akan berputar lambat atau OFF, begitu seterusnya tergantung pada Fuzzy Rule yang dibuat, untuk lebih
jelasnya berikut adalah skema dan programnya.
Link Referensi:
http://petro.tanrei.ca/fuzzylogic/fuzzy_negnevistky.html
a. Arduino Uno
b. Sensor Suhu DS18b20
d. Kipas Motor AC
e. Lcd 16x2
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define AC_LOAD 6 // connect pin 6 arduino to input terminal of driver motor
#include <OneWire.h>
#define on 1
#define off 0
OneWire ds(7);
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
float dingin, hangat, panas;
float sedikit, sedang, banyak;
float lb, sd, ke;
float hasillb, hasilsd, hasilke;
float Coglb, Cogsd, Cogke;
float Cogxlb, Cogxsd, Cogxke;
float Komlb, Komsd, Komke;
float Penlb, Pensd, Penke;
float Totalkom, Totalpen;
float Cog;
float lb1, lb2, lb3;
float sd1, sd2, sd3;
float ke1, ke2, ke3;
void setup()
{
Serial.begin(9600);
lcd.begin();
pinMode(AC_LOAD, OUTPUT); // Set AC Load pin as output (pin 6)
attachInterrupt(0, zero_cross_int, FALLING); // connect pin 2 arduino to output terminal of driver motor
if(output==on)
{
digitalWrite(AC_LOAD, LOW);
int dimtime = (70*dimming);
delayMicroseconds(dimtime); // Wait till firing the driver motor
digitalWrite(AC_LOAD, HIGH); // Fire the driver motor
}
else{digitalWrite(AC_LOAD, LOW);
} // Stop the driver motor
}
void loop()
{
output=on;
if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
h = 1.953125 *(analogRead(AOUTpin1));
lcd.setCursor (0,1);
lcd.print ("Gas=");
lcd.print (h,1);
lcd.print (" ");
//======================
// fuzzyfikasi suhu
//======================
if(T <= 25){
dingin = 1;
hangat = 0;
panas = 0;
}
else if(T >= 35){
panas = 1;
hangat = 0;
dingin = 0;
}
else if(T == 30){
hangat = 1;
dingin = 0;
panas = 0;
}
else if((T > 25)&&(T < 30)){
hangat = (T - 25)/5;
dingin = 1-(T - 25)/5;
panas = 0;
}
else if((T > 30)&&(T < 35)){
panas = (T - 30)/5;
hangat = 1-(T - 30)/5;
dingin = 0;
}
// Serial.print("panas= ");
// Serial.println(panas);
// Serial.print("hangat= ");
// Serial.println(hangat);
// Serial.print("dingin= ");
// Serial.println(dingin);
//===============================
// fuzzyfikasi gas
//===============================
if(h <= 150){
sedikit = 1;
sedang = 0;
banyak = 0;
}
else if(h >= 300){
banyak = 1;
sedang = 0;
sedikit = 0;
}
else if(h == 200){
banyak = 0;
sedang = 1;
sedikit = 0;
}
else if((h > 150)&&(h < 200)){
sedang = (h - 150)/50;
sedikit = 1-(h - 150)/50;
banyak = 0;
}
else if((h > 200)&&(h < 300)){
sedang = (h - 200)/100;
banyak = 1-(h - 200)/100;
sedikit = 0;
}
// Serial.print("Sedikit= ");
// Serial.println(sedikit);
// Serial.print("sedang= ");
// Serial.println(sedang);
// Serial.print("banyak= ");
// Serial.println(banyak);
//==================================
// fuzzy rule
//===================================
//============================================================================
if((T <= 25 )&&(h <= 150)){ //1A
if(dingin < sedikit){
lb = dingin;
}
else if(dingin > sedikit){
lb = sedikit;
}
else if(dingin == sedikit){
lb = sedikit;
}
hasillb = lb;
hasilsd = 0;
hasilke = 0;
}
//=========================================================================
else if((T <= 25 )&&(h > 150)&&(h < 200)){ //1AB
if(dingin < sedikit){
lb1 = dingin;
}
else if(dingin > sedikit){
lb1 = sedikit;
}
else if(dingin == sedikit){
lb1 = sedikit;
}
if(dingin < sedang){
lb2 = dingin;
}
else if(dingin > sedang){
lb2 = sedang;
}
else if(dingin == sedang){
lb2 = sedang ;
}
if(lb1 < lb2){
hasillb = lb2;
}
else if(lb1 > lb2){
hasillb = lb1;
}
else if(lb1 == lb2){
hasillb = lb1;
}
hasilsd = 0;
hasilke = 0;
}
//========================================================================
else if((T <= 25 )&&(h > 200)&&(h < 300)){ //1BC
if(dingin < sedang){
lb = dingin;
}
else if(dingin > sedang){
lb = sedang;
}
else if(dingin == sedang){
lb = sedang;
}
if(dingin < banyak){
sd = dingin;
}
else if(dingin > banyak){
sd = banyak;
}
else if(dingin == banyak){
sd = banyak;
}
hasillb = lb;
hasilsd = sd;
hasilke = 0;
}
//=======================================================================
else if((T <= 25 )&&(h >= 300)){ //1C
hasilsd = sd;
hasilke = 0;
}
//===============================================================================
else if((T > 25)&&(T < 30)&&(h > 200)&&(h < 300)){ //12BC
if (dingin < sedang){
lb = dingin;
}
else if(dingin > sedang){
lb = sedang;
}
else if(dingin == sedang){
lb = sedang;
}
hasillb = lb;
hasilke = ke;
}
//=======================================================================
//===============================================================
else if ((T == 30) && (h <= 150)){ //2A
if (hangat > sedikit){
lb = sedikit;
}
else if (hangat < sedikit){
lb = hangat;
}
else if (hangat == sedikit){
lb = hangat;
}
hasillb = lb;
hasilsd = 0;
hasilke = 0;
}
//============================================================
else if ((T == 30) && (h > 150) && (h < 200)){ //2AB
if (hangat < sedikit){
lb = hangat;
}
else if (hangat > sedikit){
lb = sedikit;
}
else if (hangat == sedikit){
lb = sedikit;
}
hasillb = lb;
hasilsd = sd;
hasilke = 0;
}
//===================================================================
else if ((T == 30) && (h > 200) && (h < 300)){ //2BC
if (hangat < sedang){
sd = hangat;
}
else if (hangat > sedang){
sd = sedang;
}
else if (hangat == sedang){
sd = sedang;
}
hasilsd = sd;
hasilke = ke;
hasillb = 0;
}
//=============================================================
else if ((T == 30) && (h >= 300)){ //2C
if (hangat < banyak){
ke = hangat;
}
else if (hangat > banyak){
ke = banyak;
}
else if (hangat == banyak){
ke = banyak;
}
hasilke = ke;
hasilsd = 0;
hasillb = 0;
//====================================================================
else if ((T > 30) && (T < 35) && (h <= 150)){ //23A
if (hangat < sedikit){
lb = hangat;
}
else if (hangat > sedikit){
lb = sedikit;
}
else if (hangat == sedikit){
lb = sedikit;
}
if (panas < sedikit){
sd = panas;
}
else if (panas > sedikit){
sd = sedikit;
}
else if (panas == sedikit){
sd = sedikit;
}
hasillb = lb;
hasilsd = sd;
hasilke = 0;
}
//=======================================================================
else if ((T > 30) && (T < 35) && (h > 150) && (h < 200)){ //23AB
if (hangat < sedikit){
lb = hangat;
}
else if (hangat > sedikit){
lb = sedikit;
}
else if (hangat == sedikit){
lb = sedikit;
}
hasilke = ke;
hasillb = lb;
}
//=========================================================================
else if ((T > 30) && (T < 35) && (h > 200) && (h < 300)){ //23BC
if (hangat < sedang){
sd = hangat;
}
else if (hangat > sedang){
sd = sedang;
}
else if (hangat == sedang){
sd = sedang;
}
hasilsd = sd;
hasillb = 0;
}
//===========================================================================
else if ((T > 30) && (T < 35) && (h >= 300)){ //23C
if (hangat < banyak){
ke1 = hangat;
}
else if (hangat > banyak){
ke1 = banyak;
}
else if (hangat == banyak){
ke1 = banyak;
}
hasilsd = 0;
hasillb = 0;
}
//===========================================================================
hasilsd = sd;
hasillb = 0;
hasilke = 0;
}
//============================================================================
else if ((T >= 35) && (h > 150) && (h < 200)){ //3AB
if (panas < sedikit){
sd = panas;
}
else if (panas > sedikit){
sd = sedikit;
}
else if (panas == sedikit){
sd = sedikit;
}
hasilsd = sd;
hasilke = ke;
hasillb = 0;
}
//======================================================================
else if ((T >= 35) && (h > 200) && (h < 300)){ //3BC
if (panas < sedang){
ke1 = panas;
}
else if (panas > sedang){
ke1 = sedang;
}
else if (panas == sedang){
ke1 = sedang;
}
hasillb = 0;
hasilsd = 0;
}
//=========================================================================
hasilke = ke;
hasilsd = 0;
hasillb = 0;
}
//======================================================================
hasillb = lb;
hasilsd = 0;
hasilke = 0;
}
//===================================================================
else if ((T > 25) && (T < 30) && (h == 200)){ //12B
if (dingin < sedang){
lb = dingin;
}
else if (dingin > sedang){
lb = sedang;
}
else if (dingin == sedang){
lb = sedang;
}
if (hangat < sedang){
sd = hangat;
}
else if (hangat > sedang){
sd = sedang;
}
else if (hangat == sedang){
sd = sedang;
}
hasillb = lb;
hasilsd = sd;
hasilke = 0;
}
//==========================================================
hasilsd = sd;
hasillb = 0;
hasilke = 0;
}
//================================================================
else if ((T > 30) && (T < 35) && (h == 200)){ //23B
if (hangat < sedang){
sd = hangat;
}
else if (hangat > sedang){
sd = sedang;
}
else if (hangat == sedang){
sd = sedang;
}
//================================================================
hasilke = ke;
hasilsd = 0;
hasillb = 0;
//==================================================
// Defuzzifikasi
//==================================================
//0-10-20-30
Coglb = 60;
Cogxlb = 4;
//40-50-60-70
Cogsd = 220;
Cogxsd = 4;
//80-90-100-110-120
Cogke = 500;
Cogxke = 5;
/*
//0-10-20-30-40-50
Coglb = 150;
Cogxlb = 6;
//60-70-80-90-100-110-120
Cogsd = 630;
Cogxsd = 7;
//130-140-150-160-170-180-190-200
Cogke = 1320;
Cogxke = 8;
*/
//Komlb = Coglb * hasillb;
//Komsd = Cogsd * hasilsd;
//Komke = Cogke * hasilke;