Temperature Controlling fuzzy analyze

parent 27d736fa
......@@ -6,16 +6,14 @@
//-----------------pin definitions and variables related to temperature-----------------------
#define DHT1_PIN 7 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define PELTIER_PIN 6 //peltier output
#define AIR_COOLER_PIN 6 //air cooler output
int tempSetPoint;
float peltierModuleTemp, deltaSetTemp, pwmValueP,
pVeryCold, pCold, pNormal, pHot, pVeryHot, //fuzzy member for peltier and set temperature delta
pVoltageVeryLow, pVoltageLow, pVoltageNormal, pVoltageHigh, pVoltageVeryHigh, //fuzzy member for peltier voltage output
ruleP1, ruleP2a, ruleP2b, ruleP3a, ruleP3b, ruleP4a, ruleP4b, ruleP5, //fuzzy rules for peltier setting
pwmP, //for fuzzification
outputPeltier; //output rules
String outputFuzzyP;
float tempRead, deltaSetTemp, pwmValueAirCooler,
tempVeryCold, tempCold, tempNormal, tempHot, tempVeryHot, //fuzzy member for delta temperature
tempRule1, tempRule2a, tempRule2b, tempRule3a, tempRule3b, tempRule4a, tempRule4b, tempRule5, //fuzzy rules for air cooler setting
outputAirCooler; //output rules
String outputFuzzyAirCooler;
//-----------------pin definitions and variables related to humidity--------------------------
#define HUMIDIFIER_PIN 8
......@@ -34,11 +32,11 @@ float lightRead;
#define FAN_PIN 3
int airQualitySetPoint;
float airQualityRead, deltaSetAirQ, pwmValueF,
aVeryGood, aGood, aAverage, aBad, aVeryBad, //fuzzy member for read and set air quality difference
ruleF1, ruleF2a, ruleF2b, ruleF3a, ruleF3b, ruleF4a, ruleF4b, ruleF5, //fuzzy rules for fan setting
float airQualityRead, deltaSetAirQuality, pwmValueFan,
airQualityVeryGood, airQualityGood, airQualityAverage, airQualityBad, airQualityVeryBad, //fuzzy member for read and set air quality difference
airQualityRule1, airQualityRule2a, airQualityRule2b, airQualityRule3a, airQualityRule3b, airQualityRule4a, airQualityRule4b, airQualityRule5, //fuzzy rules for fan setting
outputFan; //output fan rule
String outputFuzzyF;
String outputFuzzyFan;
//Intializations
DHT dht1(DHT1_PIN, DHTTYPE); // Initialize DHT sensor for normal 16mhz Arduino
......@@ -47,10 +45,10 @@ BH1750 GY30;
void setup() {
Serial.begin(9600);
dht1.begin();
Wire.begin();
GY30.begin();
//Wire.begin();
//GY30.begin();
pinMode(PELTIER_PIN, OUTPUT);
pinMode(AIR_COOLER_PIN, OUTPUT);
pinMode(HUMIDIFIER_PIN, OUTPUT);
pinMode(LIGHT_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
......@@ -61,13 +59,13 @@ void setup() {
void loop() {
//temperature functions
temp_set(); //set required temperature for strawberry
temp_readSensor(); //function for reading temperature from sensor
temp_fuzzification();
temp_fuzzy_rule();
temp_defuzzification();
temp_output();
temp_fuzzy_output();
//temp_set(); //set required temperature for strawberry
//temp_readSensor(); //function for reading temperature from sensor
//temp_fuzzification();
//temp_fuzzy_rule();
//temp_defuzzification();
//temp_output();
//temp_fuzzy_output();
//humidity functions
//hum_set();
......@@ -98,22 +96,27 @@ void temp_set(){
}
void temp_readSensor(){
//peltierModuleTemp = dht1.readTemperature(); //read peltier module temperature temperature sensor
//peltierModuleTemp = 23;
deltaSetTemp = abs(peltierModuleTemp-tempSetPoint); //find the temperature differece between peltier module and the set temperature
//tempRead = dht1.readTemperature(); //read temperature from temperature sensor
tempRead = 20;
if(tempRead > tempSetPoint){
deltaSetTemp = abs(tempRead-tempSetPoint); //find the temperature differece between sensor input and the set temperature
}else{
deltaSetTemp = 0;
}
Serial.print("Temperature: ");
Serial.println(peltierModuleTemp);
Serial.println(tempRead);
Serial.print("Difference: ");
Serial.println(deltaSetTemp);
}
void temp_fuzzification(){
deltaSetTempVeryCold();
deltaSetTempCold();
deltaSetTempNormal();
deltaSetTempHot();
deltaSetTempVeryHot();
deltaTempVeryCold();
deltaTempCold();
deltaTempNormal();
deltaTempHot();
deltaTempVeryHot();
/* pwmVoltageVeryLow();
pwmVoltageLow();
......@@ -122,176 +125,115 @@ void temp_fuzzification(){
pwmVoltageVeryHigh();*/
}
unsigned char deltaSetTempVeryCold(){
unsigned char deltaTempVeryCold(){
if(deltaSetTemp <= 1){
pVeryCold = 1;
tempVeryCold = 1;
}else if(deltaSetTemp >= 1 && deltaSetTemp <= 2){
pVeryCold = (2 - deltaSetTemp)/1;
tempVeryCold = (2 - deltaSetTemp)/1;
}else if(deltaSetTemp >= 2){
pVeryCold = 0;
tempVeryCold = 0;
}
Serial.print("Delta Very Cold: ");
Serial.println(pVeryCold);
return pVeryCold;
Serial.println(tempVeryCold);
return tempVeryCold;
}
unsigned char deltaSetTempCold(){
unsigned char deltaTempCold(){
if(deltaSetTemp <= 1){
pCold = 0;
tempCold = 0;
}else if(deltaSetTemp >= 1 && deltaSetTemp <= 2){
pCold = (deltaSetTemp - 1)/1;
tempCold = (deltaSetTemp - 1)/1;
}else if(deltaSetTemp >= 2 && deltaSetTemp <= 3){
pCold = (3 - deltaSetTemp)/1;
tempCold = (3 - deltaSetTemp)/1;
}else if(deltaSetTemp >= 3){
pCold = 0;
tempCold = 0;
}
Serial.print("Delta Cold: ");
Serial.println(pCold);
return pCold;
Serial.println(tempCold);
return tempCold;
}
unsigned char deltaSetTempNormal(){
unsigned char deltaTempNormal(){
if(deltaSetTemp <= 2){
pNormal = 0;
tempNormal = 0;
}else if(deltaSetTemp >= 2 && deltaSetTemp <= 3){
pNormal = (deltaSetTemp - 2)/1;
tempNormal = (deltaSetTemp - 2)/1;
}else if(deltaSetTemp >=3 && deltaSetTemp <= 4){
pNormal = (4 - deltaSetTemp)/1;
tempNormal = (4 - deltaSetTemp)/1;
}else if(deltaSetTemp >= 4){
pNormal = 0;
tempNormal = 0;
}
Serial.print("Delta Normal: ");
Serial.println(pNormal);
return pNormal;
Serial.println(tempNormal);
return tempNormal;
}
unsigned char deltaSetTempHot(){
unsigned char deltaTempHot(){
if(deltaSetTemp <= 3){
pHot = 0;
tempHot = 0;
}else if(deltaSetTemp >= 3 && deltaSetTemp <= 4){
pHot = (deltaSetTemp - 3)/1;
tempHot = (deltaSetTemp - 3)/1;
}else if(deltaSetTemp >=4 && deltaSetTemp <= 5){
pHot = (5 - deltaSetTemp)/1;
tempHot = (5 - deltaSetTemp)/1;
}else if(deltaSetTemp >= 5){
pHot = 0;
tempHot = 0;
}
Serial.print("Delta Hot: ");
Serial.println(pHot);
return pHot;
Serial.println(tempHot);
return tempHot;
}
unsigned char deltaSetTempVeryHot(){
unsigned char deltaTempVeryHot(){
if(deltaSetTemp <= 4){
pVeryHot = 0;
tempVeryHot = 0;
}else if(deltaSetTemp >=4 && deltaSetTemp <= 5){
pVeryHot = (deltaSetTemp - 4)/1;
tempVeryHot = (deltaSetTemp - 4)/1;
}else if(deltaSetTemp >= 5){
pVeryHot = 1;
tempVeryHot = 1;
}
Serial.print("Delta Very Hot: ");
Serial.println(pVeryHot);
return pVeryHot;
}
unsigned char pwmVoltageVeryLow(){
if(pwmP <= 20){
pVoltageVeryLow = 1;
}else if(pwmP >= 20 && pwmP <= 40){
pVoltageVeryLow = (40 - pwmP) / 20;
}else if(pwmP >= 40){
pVoltageVeryLow = 0;
}
return pVoltageVeryLow;
}
unsigned char pwmVoltageLow(){
if(pwmP <= 20){
pVoltageLow =0;
}else if(pwmP >= 20 && pwmP <= 40){
pVoltageLow = (pwmP - 20) / 20;
}else if(pwmP >= 40 && pwmP <= 60){
pVoltageLow = (60 - pwmP) / 20;
}else if(pwmP >= 60){
pVoltageLow = 0;
}
return pVoltageLow;
}
unsigned char pwmVoltageNormal(){
if(pwmP <= 40){
pVoltageNormal = 0;
}else if(pwmP >= 40 && pwmP <= 60){
pVoltageNormal = (pwmP - 40) / 20;
}else if(pwmP >=60 && pwmP <= 80){
pVoltageNormal = (80 - pwmP) / 20;
}else if(pwmP >= 80){
pVoltageNormal = 0;
}
return pVoltageNormal;
}
unsigned char pwmVoltageHigh(){
if(pwmP <= 60){
pVoltageHigh = 0;
}else if(pwmP >=60 && pwmP <= 80){
pVoltageHigh = (pwmP - 60) / 20;
}else if(pwmP >= 80 && pwmP <= 100){
pVoltageHigh = (100 - pwmP) / 20;
}else if(pwmP >= 100){
pVoltageHigh = 0;
}
return pVoltageHigh;
}
unsigned char pwmVoltageVeryHigh(){
if(pwmP <= 80){
pVoltageVeryHigh = 0;
}else if(pwmP >= 80 && pwmP <= 100){
pVoltageVeryHigh = (pwmP - 80) / 20;
}else if(pwmP >= 100){
pVoltageVeryHigh = 1;
}
return pVoltageVeryHigh;
Serial.println(tempVeryHot);
return tempVeryHot;
}
void temp_fuzzy_rule(){
ruleP1 = 40 - (pVeryCold * 20);
ruleP2a = 20 + (pCold * 20);
ruleP2b = 60 - (pCold * 20);
ruleP3a = 40 + (pNormal * 20);
ruleP3b = 80 - (pNormal * 20);
ruleP4a = 60 + (pHot * 20);
ruleP4b = 100 - (pHot * 20);
ruleP5 = 80 + (pVeryHot * 20);
tempRule1 = 40 - (tempVeryCold * 20);
tempRule2a = 20 + (tempCold * 20);
tempRule2b = 60 - (tempCold * 20);
tempRule3a = 40 + (tempNormal * 20);
tempRule3b = 80 - (tempNormal * 20);
tempRule4a = 60 + (tempHot * 20);
tempRule4b = 100 - (tempHot * 20);
tempRule5 = 80 + (tempVeryHot * 20);
}
void temp_defuzzification(){
outputPeltier = ((ruleP1 * pVeryCold) + (ruleP2a * pCold) + (ruleP2b * pCold) + (ruleP3a * pNormal) + (ruleP3b * pNormal) + (ruleP4a * pHot) + (ruleP4b * pHot) + (ruleP5 * pVeryHot)) / (pVeryCold + pCold + pCold + pNormal + pNormal + pHot + pHot + pVeryHot);
Serial.print("Peltier Output Duty: ");
Serial.println(outputPeltier);
outputAirCooler = ((tempRule1 * tempVeryCold) + (tempRule2a * tempCold) + (tempRule2b * tempCold) + (tempRule3a * tempNormal) + (tempRule3b * tempNormal) + (tempRule4a * tempHot) + (tempRule4b * tempHot) + (tempRule5 * tempVeryHot)) / (tempVeryCold + tempCold + tempCold + tempNormal + tempNormal + tempHot + tempHot + tempVeryHot);
Serial.print("Air Cooler Output Duty: ");
Serial.println(outputAirCooler);
}
void temp_output(){
pwmValueP = map(outputPeltier, 0, 100, 0, 255);
Serial.print("Peltier Output PWM: ");
Serial.println(pwmValueP);
analogWrite(PELTIER_PIN, pwmValueP);
pwmValueAirCooler = map(outputAirCooler, 0, 100, 0, 255);
Serial.print("Air Cooler Output PWM: ");
Serial.println(pwmValueAirCooler);
analogWrite(AIR_COOLER_PIN, pwmValueAirCooler);
}
void temp_fuzzy_output(){
if(outputPeltier <= 20){
outputFuzzyP = "Very Low";
}else if(outputPeltier >=20 && outputPeltier <= 40){
outputFuzzyP = "Low";
}else if(outputPeltier >=40 && outputPeltier <= 60){
outputFuzzyP = "Normal";
}else if(outputPeltier >=60 && outputPeltier <= 80){
outputFuzzyP = "High";
} else if (outputPeltier >=80 && outputPeltier <= 100){
outputFuzzyP = "Very High";
if(outputAirCooler <= 20){
outputFuzzyAirCooler = "Very Low";
}else if(outputAirCooler >= 20 && outputAirCooler <= 40){
outputFuzzyAirCooler = "Low";
}else if(outputAirCooler >= 40 && outputAirCooler <= 60){
outputFuzzyAirCooler = "Normal";
}else if(outputAirCooler >= 60 && outputAirCooler <= 80){
outputFuzzyAirCooler = "High";
} else if (outputAirCooler >= 80 && outputAirCooler <= 100){
outputFuzzyAirCooler = "Very High";
}
Serial.print("Fuzzy Output Peltier: ");
Serial.println(outputFuzzyP);
Serial.print("Fuzzy Output Air Cooler: ");
Serial.println(outputFuzzyAirCooler);
}
//--------------humidity-------------------
......@@ -331,6 +273,13 @@ void air_quality_set(){
void air_quality_readSensor(){
airQualityRead = analogRead(MQ_PIN); //read air quality from MQT-135 sensor
//airQualityRead = 50;
if(airQualityRead > airQualitySetPoint){
deltaSetTemp = abs(tempRead-tempSetPoint); //find the temperature differece between sensor input and the set temperature
}else{
deltaSetTemp = 0;
}
deltaSetAirQ = airQualityRead-airQualitySetPoint; //find the air quality differece between read air quality and set air quality
//deltaSetAirQ = 10;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment