Kendali Suhu DHT22 Motor Servo FUZZY LOGIC MAMDANI EFLL ARDUINO
Pada kesempatan kali ini saya akan membahas mengenai bagaimana cara membuat sebuah alat untuk mengendalikan suhu dengan motor servo menggunakan metode fuzzy logic mamdani EFLL dengan Arduino. jadi suhunya dijaga pada suhu tertentu dengan menggunakan Fuzzy Logic, untuk lebih jelasnya berikut adalah kompone dan kodingnya.
a. Komponen dan Skema
b. Program Arduino IDE
#include <Fuzzy.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Servo.h>
#define ONE_WIRE_BUS 7
#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT22
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Servo myservo1;
float t;
float suhu;
float setpoint = 35.0;
float error;
float errorx;
float delerror;
float output1;
Fuzzy *fuzzy = new Fuzzy();
// FuzzyInput
FuzzySet *ernb = new FuzzySet(-1.8, -1.8, -0.8, -0.8);
FuzzySet *erns = new FuzzySet(-1.8, -0.8, -0.8, 0);
FuzzySet *erz = new FuzzySet(-0.8, 0, 0, 0.8);
FuzzySet *erps = new FuzzySet(0, 0.8, 0.8, 1.8);
FuzzySet *erpb = new FuzzySet(0.8, 0.8, 1.8, 1.8);
// FuzzyInput
FuzzySet *dernb = new FuzzySet(-0.18, -0.18, -0.08, -0.08);
FuzzySet *derns = new FuzzySet(-0.18, -0.08, -0.08, 0);
FuzzySet *derz = new FuzzySet(-0.08, 0, 0, 0.08);
FuzzySet *derps = new FuzzySet(0, 0.08, 0.08, 0.18);
FuzzySet *derpb = new FuzzySet(0.08, 0.08, 0.18, 0.18);
// FuzzyOutput
FuzzySet *p = new FuzzySet(4, 5, 5, 6);
FuzzySet *sp = new FuzzySet(19, 20, 20, 21);
FuzzySet *n = new FuzzySet(74, 75, 75, 76);
FuzzySet *sd = new FuzzySet(109, 110, 110, 111);
FuzzySet *d = new FuzzySet(124, 125, 125, 126);
void setup()
{
lcd.begin();
lcd.clear();
lcd.noCursor();
myservo1.attach(9);
myservo1.write(70);
Serial.begin(9600);
dht.begin();
// FuzzyInput error
FuzzyInput *errorsys = new FuzzyInput(1);
errorsys->addFuzzySet(ernb);
errorsys->addFuzzySet(erns);
errorsys->addFuzzySet(erz);
errorsys->addFuzzySet(erps);
errorsys->addFuzzySet(erpb);
fuzzy->addFuzzyInput(errorsys);
// FuzzyInput delta error
FuzzyInput *deltaerror = new FuzzyInput(2);
deltaerror->addFuzzySet(dernb);
deltaerror->addFuzzySet(derns);
deltaerror->addFuzzySet(derz);
deltaerror->addFuzzySet(derps);
deltaerror->addFuzzySet(derpb);
fuzzy->addFuzzyInput(deltaerror);
// FuzzyOutput pwm
FuzzyOutput *pwmout = new FuzzyOutput(1);
pwmout->addFuzzySet(p);
pwmout->addFuzzySet(sp);
pwmout->addFuzzySet(n);
pwmout->addFuzzySet(sd);
pwmout->addFuzzySet(d);
fuzzy->addFuzzyOutput(pwmout);
// Building FuzzyRule 1
FuzzyRuleAntecedent *iferrorsysErnbAnddeltaerrorDernb = new FuzzyRuleAntecedent();
iferrorsysErnbAnddeltaerrorDernb->joinWithAND(ernb, dernb);
FuzzyRuleConsequent *thenPwmoutP= new FuzzyRuleConsequent();
thenPwmoutP->addOutput(p);
FuzzyRule *fuzzyRule1 = new FuzzyRule(1, iferrorsysErnbAnddeltaerrorDernb, thenPwmoutP);
fuzzy->addFuzzyRule(fuzzyRule1);
// Building FuzzyRule 2
FuzzyRuleAntecedent *iferrorsysErnbAnddeltaerrorDerns = new FuzzyRuleAntecedent();
iferrorsysErnbAnddeltaerrorDerns->joinWithAND(ernb, derns);
//FuzzyRuleConsequent *thenPwmoutP= new FuzzyRuleConsequent();
thenPwmoutP->addOutput(p);
FuzzyRule *fuzzyRule2 = new FuzzyRule(2, iferrorsysErnbAnddeltaerrorDerns, thenPwmoutP);
fuzzy->addFuzzyRule(fuzzyRule2);
// Building FuzzyRule 3
FuzzyRuleAntecedent *iferrorsysErnbAnddeltaerrorDerz = new FuzzyRuleAntecedent();
iferrorsysErnbAnddeltaerrorDerz->joinWithAND(ernb, derz);
//FuzzyRuleConsequent *thenPwmoutP= new FuzzyRuleConsequent();
thenPwmoutP->addOutput(p);
FuzzyRule *fuzzyRule3 = new FuzzyRule(3, iferrorsysErnbAnddeltaerrorDerz, thenPwmoutP);
fuzzy->addFuzzyRule(fuzzyRule3);
// Building FuzzyRule 4
FuzzyRuleAntecedent *iferrorsysErnbAnddeltaerrorDerps = new FuzzyRuleAntecedent();
iferrorsysErnbAnddeltaerrorDerps->joinWithAND(ernb, derps);
FuzzyRuleConsequent *thenPwmoutSp= new FuzzyRuleConsequent();
thenPwmoutSp->addOutput(sp);
FuzzyRule *fuzzyRule4 = new FuzzyRule(4, iferrorsysErnbAnddeltaerrorDerps, thenPwmoutSp);
fuzzy->addFuzzyRule(fuzzyRule4);
// Building FuzzyRule 5
FuzzyRuleAntecedent *iferrorsysErnbAnddeltaerrorDerpb = new FuzzyRuleAntecedent();
iferrorsysErnbAnddeltaerrorDerpb->joinWithAND(ernb, derpb);
FuzzyRuleConsequent *thenPwmoutN= new FuzzyRuleConsequent();
thenPwmoutN->addOutput(n);
FuzzyRule *fuzzyRule5 = new FuzzyRule(5, iferrorsysErnbAnddeltaerrorDerpb, thenPwmoutN);
fuzzy->addFuzzyRule(fuzzyRule5);
// Building FuzzyRule 6
FuzzyRuleAntecedent *iferrorsysErnsAnddeltaerrorDernb = new FuzzyRuleAntecedent();
iferrorsysErnsAnddeltaerrorDernb->joinWithAND(erns, dernb);
//FuzzyRuleConsequent *thenPwmoutP= new FuzzyRuleConsequent();
thenPwmoutP->addOutput(p);
FuzzyRule *fuzzyRule6 = new FuzzyRule(6, iferrorsysErnsAnddeltaerrorDernb, thenPwmoutP);
fuzzy->addFuzzyRule(fuzzyRule6);
// Building FuzzyRule 7
FuzzyRuleAntecedent *iferrorsysErnsAnddeltaerrorDerns = new FuzzyRuleAntecedent();
iferrorsysErnsAnddeltaerrorDerns->joinWithAND(erns, derns);
//FuzzyRuleConsequent *thenPwmoutP= new FuzzyRuleConsequent();
thenPwmoutP->addOutput(p);
FuzzyRule *fuzzyRule7 = new FuzzyRule(7, iferrorsysErnsAnddeltaerrorDerns, thenPwmoutP);
fuzzy->addFuzzyRule(fuzzyRule7);
// Building FuzzyRule 8
FuzzyRuleAntecedent *iferrorsysErnsAnddeltaerrorDerz = new FuzzyRuleAntecedent();
iferrorsysErnsAnddeltaerrorDerz->joinWithAND(erns, derz);
//FuzzyRuleConsequent *thenPwmoutSp= new FuzzyRuleConsequent();
thenPwmoutSp->addOutput(sp);
FuzzyRule *fuzzyRule8 = new FuzzyRule(8, iferrorsysErnsAnddeltaerrorDerz, thenPwmoutSp);
fuzzy->addFuzzyRule(fuzzyRule8);
// Building FuzzyRule 9
FuzzyRuleAntecedent *iferrorsysErnsAnddeltaerrorDerps = new FuzzyRuleAntecedent();
iferrorsysErnsAnddeltaerrorDerps->joinWithAND(erns, derps);
//FuzzyRuleConsequent *thenPwmoutN= new FuzzyRuleConsequent();
thenPwmoutN->addOutput(n);
FuzzyRule *fuzzyRule9 = new FuzzyRule(9, iferrorsysErnsAnddeltaerrorDerps, thenPwmoutN);
fuzzy->addFuzzyRule(fuzzyRule9);
// Building FuzzyRule 10
FuzzyRuleAntecedent *iferrorsysErnsAnddeltaerrorDerpb = new FuzzyRuleAntecedent();
iferrorsysErnsAnddeltaerrorDerpb->joinWithAND(erns, derpb);
FuzzyRuleConsequent *thenPwmoutSd= new FuzzyRuleConsequent();
thenPwmoutSd->addOutput(sd);
FuzzyRule *fuzzyRule10 = new FuzzyRule(10, iferrorsysErnsAnddeltaerrorDerpb, thenPwmoutSd);
fuzzy->addFuzzyRule(fuzzyRule10);
// Building FuzzyRule 11
FuzzyRuleAntecedent *iferrorsysErzAnddeltaerrorDernb = new FuzzyRuleAntecedent();
iferrorsysErzAnddeltaerrorDernb->joinWithAND(erz, dernb);
//FuzzyRuleConsequent *thenPwmoutP= new FuzzyRuleConsequent();
thenPwmoutP->addOutput(p);
FuzzyRule *fuzzyRule11 = new FuzzyRule(11, iferrorsysErzAnddeltaerrorDernb, thenPwmoutP);
fuzzy->addFuzzyRule(fuzzyRule11);
// Building FuzzyRule 12
FuzzyRuleAntecedent *iferrorsysErzAnddeltaerrorDerns = new FuzzyRuleAntecedent();
iferrorsysErzAnddeltaerrorDerns->joinWithAND(erz, derns);
//FuzzyRuleConsequent *thenPwmoutSp= new FuzzyRuleConsequent();
thenPwmoutSp->addOutput(sp);
FuzzyRule *fuzzyRule12 = new FuzzyRule(12, iferrorsysErzAnddeltaerrorDerns, thenPwmoutSp);
fuzzy->addFuzzyRule(fuzzyRule12);
// Building FuzzyRule 13
FuzzyRuleAntecedent *iferrorsysErzAnddeltaerrorDerz = new FuzzyRuleAntecedent();
iferrorsysErzAnddeltaerrorDerz->joinWithAND(erz, derz);
//FuzzyRuleConsequent *thenPwmoutN= new FuzzyRuleConsequent();
thenPwmoutN->addOutput(n);
FuzzyRule *fuzzyRule13 = new FuzzyRule(13, iferrorsysErzAnddeltaerrorDerz, thenPwmoutSp);
fuzzy->addFuzzyRule(fuzzyRule13);
// Building FuzzyRule 14
FuzzyRuleAntecedent *iferrorsysErzAnddeltaerrorDerps = new FuzzyRuleAntecedent();
iferrorsysErzAnddeltaerrorDerps->joinWithAND(erz, derps);
//FuzzyRuleConsequent *thenPwmoutSD= new FuzzyRuleConsequent();
thenPwmoutSd->addOutput(sd);
FuzzyRule *fuzzyRule14 = new FuzzyRule(14, iferrorsysErzAnddeltaerrorDerps, thenPwmoutSd);
fuzzy->addFuzzyRule(fuzzyRule14);
// Building FuzzyRule 15
FuzzyRuleAntecedent *iferrorsysErzAnddeltaerrorDerpb = new FuzzyRuleAntecedent();
iferrorsysErzAnddeltaerrorDerpb->joinWithAND(erz, derpb);
FuzzyRuleConsequent *thenPwmoutD= new FuzzyRuleConsequent();
thenPwmoutD->addOutput(d);
FuzzyRule *fuzzyRule15 = new FuzzyRule(15, iferrorsysErzAnddeltaerrorDerpb, thenPwmoutD);
fuzzy->addFuzzyRule(fuzzyRule15);
// Building FuzzyRule 16
FuzzyRuleAntecedent *iferrorsysErpsAnddeltaerrorDernb = new FuzzyRuleAntecedent();
iferrorsysErpsAnddeltaerrorDernb->joinWithAND(erps, dernb);
thenPwmoutSp->addOutput(sp);
FuzzyRule *fuzzyRule16 = new FuzzyRule(16, iferrorsysErpsAnddeltaerrorDernb, thenPwmoutSp);
fuzzy->addFuzzyRule(fuzzyRule16);
// Building FuzzyRule 17
FuzzyRuleAntecedent *iferrorsysErpsAnddeltaerrorDerns = new FuzzyRuleAntecedent();
iferrorsysErpsAnddeltaerrorDerns->joinWithAND(erps, derns);
thenPwmoutN->addOutput(n);
FuzzyRule *fuzzyRule17 = new FuzzyRule(17, iferrorsysErpsAnddeltaerrorDerns, thenPwmoutN);
fuzzy->addFuzzyRule(fuzzyRule17);
// Building FuzzyRule 18
FuzzyRuleAntecedent *iferrorsysErpsAnddeltaerrorDerz = new FuzzyRuleAntecedent();
iferrorsysErpsAnddeltaerrorDerz->joinWithAND(erps, derz);
thenPwmoutSd->addOutput(sd);
FuzzyRule *fuzzyRule18 = new FuzzyRule(18, iferrorsysErpsAnddeltaerrorDerz, thenPwmoutSd);
fuzzy->addFuzzyRule(fuzzyRule18);
// Building FuzzyRule 19
FuzzyRuleAntecedent *iferrorsysErpsAnddeltaerrorDerps = new FuzzyRuleAntecedent();
iferrorsysErpsAnddeltaerrorDerps->joinWithAND(erps, derps);
thenPwmoutD->addOutput(d);
FuzzyRule *fuzzyRule19 = new FuzzyRule(19, iferrorsysErpsAnddeltaerrorDerps, thenPwmoutD);
fuzzy->addFuzzyRule(fuzzyRule19);
// Building FuzzyRule 20
FuzzyRuleAntecedent *iferrorsysErpsAnddeltaerrorDerpb = new FuzzyRuleAntecedent();
iferrorsysErpsAnddeltaerrorDerpb->joinWithAND(erps, derpb);
thenPwmoutD->addOutput(d);
FuzzyRule *fuzzyRule20 = new FuzzyRule(20, iferrorsysErzAnddeltaerrorDerpb, thenPwmoutD);
fuzzy->addFuzzyRule(fuzzyRule20);
// Building FuzzyRule 21
FuzzyRuleAntecedent *iferrorsysErpbAnddeltaerrorDernb = new FuzzyRuleAntecedent();
iferrorsysErpbAnddeltaerrorDernb->joinWithAND(erpb, dernb);
thenPwmoutN->addOutput(n);
FuzzyRule *fuzzyRule21 = new FuzzyRule(21, iferrorsysErpbAnddeltaerrorDernb, thenPwmoutN);
fuzzy->addFuzzyRule(fuzzyRule21);
// Building FuzzyRule 22
FuzzyRuleAntecedent *iferrorsysErpbAnddeltaerrorDerns = new FuzzyRuleAntecedent();
iferrorsysErpbAnddeltaerrorDerns->joinWithAND(erpb, derns);
thenPwmoutSd->addOutput(sd);
FuzzyRule *fuzzyRule22= new FuzzyRule(22, iferrorsysErpbAnddeltaerrorDerns, thenPwmoutSd);
fuzzy->addFuzzyRule(fuzzyRule22);
// Building FuzzyRule 23
FuzzyRuleAntecedent *iferrorsysErpbAnddeltaerrorDerz = new FuzzyRuleAntecedent();
iferrorsysErpbAnddeltaerrorDerz->joinWithAND(erpb, derz);
thenPwmoutD->addOutput(d);
FuzzyRule *fuzzyRule23 = new FuzzyRule(23, iferrorsysErpbAnddeltaerrorDerz, thenPwmoutD);
fuzzy->addFuzzyRule(fuzzyRule23);
// Building FuzzyRule 24
FuzzyRuleAntecedent *iferrorsysErpbAnddeltaerrorDerps = new FuzzyRuleAntecedent();
iferrorsysErpbAnddeltaerrorDerps->joinWithAND(erpb, derps);
thenPwmoutD->addOutput(d);
FuzzyRule *fuzzyRule24 = new FuzzyRule(24, iferrorsysErpbAnddeltaerrorDerps, thenPwmoutD);
fuzzy->addFuzzyRule(fuzzyRule24);
// Building FuzzyRule 25
FuzzyRuleAntecedent *iferrorsysErpbAnddeltaerrorDerpb = new FuzzyRuleAntecedent();
iferrorsysErpbAnddeltaerrorDerpb->joinWithAND(erpb, derpb);
thenPwmoutD->addOutput(d);
FuzzyRule *fuzzyRule25 = new FuzzyRule(25, iferrorsysErzAnddeltaerrorDerpb, thenPwmoutD);
fuzzy->addFuzzyRule(fuzzyRule25);
}
void loop()
{
t = dht.readTemperature();
sensors.requestTemperatures();
suhu = sensors.getTempCByIndex(0);
error = setpoint - t;
delerror = error - errorx;
lcd.setCursor(0,0);
lcd.print("D/S= ");
lcd.print(t,1);
lcd.print("/");
lcd.print(suhu,1);
lcd.print(" ");
// Serial.print("Suhu DHT22: ");
// Serial.print(t);
// Serial.print("|| Suhu DS: ");
// Serial.println(suhu);
fuzzy->setInput(1, error);
fuzzy->setInput(2, delerror);
fuzzy->fuzzify();
/*
Serial.print("errorsys: NB-> ");
Serial.print(ernb->getPertinence());
Serial.print(", NS-> ");
Serial.print(erns->getPertinence());
Serial.print(", Z-> ");
Serial.print(erz->getPertinence());
Serial.print(", PS-> ");
Serial.print(erps->getPertinence());
Serial.print(", PB-> ");
Serial.println(erpb->getPertinence());
Serial.print("DELTA error: NB-> ");
Serial.print(dernb->getPertinence());
Serial.print(", NS-> ");
Serial.print(derns->getPertinence());
Serial.print(", Z-> ");
Serial.print(derz->getPertinence());
Serial.print(", PS-> ");
Serial.print(derps->getPertinence());
Serial.print(", PB-> ");
Serial.println(derpb->getPertinence());
*/
output1 = fuzzy->defuzzify(1);
/*
Serial.print("Output: ");
Serial.print("PWMOUT: P-> ");
Serial.print(p->getPertinence());
Serial.print(", SP-> ");
Serial.print(sp->getPertinence());
Serial.print(", N-> ");
Serial.print(n->getPertinence());
Serial.print(", SD-> ");
Serial.print(sd->getPertinence());
Serial.print(", D-> ");
Serial.println(d->getPertinence());
Serial.print("OUTPUT: ");
Serial.println(output1);
*/
lcd.setCursor(0,1);
lcd.print("OUT: ");
lcd.print(output1);
lcd.print(" ");
if(output1 == 0){
lcd.setCursor(13,1);
lcd.print("ON ");
myservo1.write(150);
}
if((output1 > 40)&&(output1 < 200)){
lcd.setCursor(13,1);
lcd.print("ON ");
myservo1.write(150);
}
if((output1 > 10)&&(output1 < 40)){
lcd.setCursor(13,1);
lcd.print("OFF");
myservo1.write(70);
}
errorx = error;
delay(1000);
kirimdata();
}
void kirimdata(){
Serial.print("*");
Serial.print(t * 100.0);
Serial.print(",");
Serial.print(suhu * 100.0);
Serial.print(",");
Serial.print(error * 100.0);
Serial.print(",");
Serial.print(delerror * 100.0);
Serial.println("#");
}
c. Program ESP8266
#include <SPI.h>
#include <ESP8266WiFi.h>
int temp;
int x = 5;
int y;
int value1;
int value2;
int value3;
int value4;
float t;
float suhu;
float error;
float delerror;
int datain1;
int datain2;
int datain3;
int datain4;
String dataIn;
String dt[10];
int i;
boolean parsing = false;
String apiKey = "C2D7BHSMIAEHSZXX"; // Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";
const char *ssid = "hotspothpku"; // replace with your wifi ssid and wpa2 key
const char *pass = "123456789";
const char* server = "api.thingspeak.com";
WiFiClient client;
void setup()
{
dataIn="";
Serial.begin(9600);
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void loop()
{
while(Serial.available()>0) {
// dataIn="";
char inChar = (char)Serial.read();
dataIn += inChar;
if (inChar == '\n') {
parsing = true;
}
}
if(parsing){
parsingData();
if (client.connect(server,80)) // "184.106.153.149" or api.thingspeak.com
{
String postStr = apiKey;
postStr +="&field1=";
postStr += String(t);
postStr += "\r\n\r\n";
client.print(String("GET ") + resource + apiKey + "&field1=" + t + "&field2=" + suhu + "&field3=" + error + "&field4=" + delerror + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
Serial.print("t: ");
Serial.print(t);
Serial.print(" suhu: ");
Serial.print(suhu);
Serial.println(". Send to Thingspeak.");
}
client.stop();
//Serial.println("Waiting...");
delay(10000);
}
}
void parsingData(){
int j=0;
//kirim data yang telah diterima sebelumnya
//Serial.print("data masuk : ");
//Serial.print(dataIn);
//Serial.print("\n");
//inisialisasi variabel, (reset isi variabel)
dt[j]="";
//proses parsing data
for(i=1;i<dataIn.length();i++){
//pengecekan tiap karakter dengan karakter (#) dan (,)
if ((dataIn[i] == '#') || (dataIn[i] == ','))
{
//increment variabel j, digunakan untuk merubah index array penampung
j++;
dt[j]=""; //inisialisasi variabel array dt[j]
}
else
{
//proses tampung data saat pengecekan karakter selesai.
dt[j] = dt[j] + dataIn[i];
}
}
datain1 = dt[0].toInt();
datain2 = dt[1].toInt();
datain3 = dt[2].toInt();
datain4 = dt[3].toInt();
//kirim data hasil parsing
Serial.print("data 1 : ");
Serial.print(datain1);
Serial.print("\n");
Serial.print("data 2 : ");
Serial.print(datain2);
Serial.print("\n");
Serial.print("data 3 : ");
Serial.print(datain3);
Serial.print("data 4 : ");
Serial.print(datain4);
t = datain1 / 100.0;
suhu = datain2 / 100.0;
error = datain3 / 100.0;
delerror = datain4 / 100.0;
}
d. VIDEO HASILNYA
No comments:
Post a Comment