Go Down

Topic: eFLL(Embedded Fuzzy Logic Library) (Read 71 times) previous topic - next topic

coutinhorony

Estou utilizando um sensor de temperatura e a biblioteca eFLL de logica fuzzy. Aparentemente não há nenhum erro mas o desfuzzify está retornando "0". Segue o codigo para que alguem posso me ajudar a encontrar o erro. De acordo com o metodo isFireRule(); a regra 4 e 5 estão sendo ativadas.

// Importando biblioteca Fuzzy(eFLL)
#include <Fuzzy.h>
#include <FuzzyComposition.h>
#include <FuzzyInput.h>
#include <FuzzyIO.h>
#include <FuzzyOutput.h>
#include <FuzzyRule.h>
#include <FuzzyRuleAntecedent.h>
#include <FuzzyRuleConsequent.h>
#include <FuzzySet.h>

//Importando blibioteca do display de lcd
#include <LiquidCrystal.h>

//definido pino de saida para o display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//definindo pino de antrada analógio do sensor de temperatura(LM35)
const int LM35 = A0;

// definindo variável inteira para armazenar a temperatura
float temp = 0;

// definindo variável inteira para armezar o valor recebidon pelo LM35
int ADClido = 0;

int saida = 8;

int ledpin = saida;
//instanciando objeto Fuzzy
Fuzzy* fuzzy = new Fuzzy();

void setup() {
 
  pinMode(ledpin, OUTPUT);

  //iniciando conexão entre o pc e o arduino
  Serial.begin(9600);

  //iniciando o display de lcd e definindo(c,l)
  lcd.begin(16, 2);

  //define voltagem 1.1V para a saida analogica
  analogReference(INTERNAL);

  // Criando FuzzyInput temperatura com ID = 1
  FuzzyInput* temperatura = new FuzzyInput(1);

  // Criando FuzzySet

  FuzzySet* muitoFrio = new FuzzySet(0, 0, 0, 15); //temperatura muito frio
  temperatura->addFuzzySet(muitoFrio);//adicionando muitoFrio em temperatura

  FuzzySet* frio = new FuzzySet(15, 20, 20, 25); //temperatura frio
  temperatura->addFuzzySet(frio);//adicionando frio em temperatura

  FuzzySet* conforto = new FuzzySet(20, 25, 25, 30); //temperatura conforto
  temperatura->addFuzzySet(conforto);//adicionando conforto em temperatura

  FuzzySet* quente = new FuzzySet(25, 30, 30, 35); //temperatura quente
  temperatura->addFuzzySet(quente);//adicionando quente em temperatura

  FuzzySet* muitoQuente = new FuzzySet(30, 35, 40, 45); //temperatura muito quente
  temperatura->addFuzzySet(muitoQuente);//adicionando muitoQuente em temperatura
 
  fuzzy->addFuzzyInput(temperatura); // adicionando o fuzzy input no objeto fuzzy
 
  //Criando FuzzyOutput com ID =1 painel, responsável por acender os LEDs
  FuzzyOutput* painel = new FuzzyOutput(1);
 
  FuzzySet* LMF = new FuzzySet(6,6,6,6); //Led muito frio
  temperatura->addFuzzySet(LMF);//adicionando led muito frio em painel
 
  FuzzySet* LF = new FuzzySet(7,7,7,7); //Led frio
  temperatura->addFuzzySet(LF);//adicionando led frio em painel
 
  FuzzySet* LC = new FuzzySet(8,8,8,8); //Led conforto
  temperatura->addFuzzySet(conforto);//adicionando led conforto em painel
 
  FuzzySet* LQ = new FuzzySet(9,9,9,9); //Led quente
  temperatura->addFuzzySet(LQ);//adicionando led quente em painel
 
  FuzzySet* LMQ = new FuzzySet(10,10,10,10); //Led muito quente
  temperatura->addFuzzySet(muitoFrio);//adicionando led muito quente em painel
 
  fuzzy->addFuzzyOutput(painel); // adicionando fuzzy output no objeto fuzzy
 
  // criando regras fuzzy
 
  // Regra 1(Se temperatura = muito frio painel = LMF
  FuzzyRuleAntecedent* ifTemperaturaMuitoFrio = new FuzzyRuleAntecedent();// instanciando um antecedente para a expressão
  ifTemperaturaMuitoFrio->joinSingle(muitoFrio);//adicionando o FuzzySet correpondente ao objeto Antecedente
  FuzzyRuleConsequent* thenPainelLMF = new FuzzyRuleConsequent();// instanciando um consequente para a expressão
  thenPainelLMF->addOutput(LMF);//adicionando o FuzzySet correspondente ao objeto consequente
    //Instanciando um objeto FuzzyRule
  FuzzyRule* fuzzyRule01 = new FuzzyRule(1, ifTemperaturaMuitoFrio, thenPainelLMF); // ID, antencedente e consequente da expressão
    //adicionando o FuzzyRule ao objeto Fuzzy
  fuzzy->addFuzzyRule(fuzzyRule01);
 
  // Regra 2(Se temperatura = frio painel = LF
  FuzzyRuleAntecedent* ifTemperaturaFrio = new FuzzyRuleAntecedent();// instanciando um antecedente para a expressão
  ifTemperaturaFrio->joinSingle(frio);//adicionando o FuzzySet correpondente ao objeto Antecedente
  FuzzyRuleConsequent* thenPainelLF = new FuzzyRuleConsequent();// instanciando um consequente para a expressão
  thenPainelLF->addOutput(LF);//adicionando o FuzzySet correspondente ao objeto consequente
    //Instanciando um objeto FuzzyRule
  FuzzyRule* fuzzyRule02 = new FuzzyRule(2, ifTemperaturaFrio, thenPainelLF); // ID, antencedente e consequente da expressão
    //adicionando o FuzzyRule ao objeto Fuzzy
  fuzzy->addFuzzyRule(fuzzyRule02);
 
  // Regra 3(Se temperatura = conforto painel = LC
  FuzzyRuleAntecedent* ifTemperaturaConforto = new FuzzyRuleAntecedent();// instanciando um antecedente para a expressão
  ifTemperaturaConforto->joinSingle(conforto);//adicionando o FuzzySet correpondente ao objeto Antecedente
  FuzzyRuleConsequent* thenPainelLC = new FuzzyRuleConsequent();// instanciando um consequente para a expressão
  thenPainelLC->addOutput(LC);//adicionando o FuzzySet correspondente ao objeto consequente
    //Instanciando um objeto FuzzyRule
  FuzzyRule* fuzzyRule03 = new FuzzyRule(3, ifTemperaturaConforto, thenPainelLC); // ID, antencedente e consequente da expressão
    //adicionando o FuzzyRule ao objeto Fuzzy
  fuzzy->addFuzzyRule(fuzzyRule03);
 
  // Regra 4(Se temperatura = quente painel = LQ
  FuzzyRuleAntecedent* ifTemperaturaQuente = new FuzzyRuleAntecedent();// instanciando um antecedente para a expressão
  ifTemperaturaQuente->joinSingle(quente);//adicionando o FuzzySet correpondente ao objeto Antecedente
  FuzzyRuleConsequent* thenPainelLQ = new FuzzyRuleConsequent();// instanciando um consequente para a expressão
  thenPainelLQ->addOutput(LQ);//adicionando o FuzzySet correspondente ao objeto consequente
    //Instanciando um objeto FuzzyRule
  FuzzyRule* fuzzyRule04 = new FuzzyRule(4, ifTemperaturaQuente, thenPainelLQ); // ID, antencedente e consequente da expressão
    //adicionando o FuzzyRule ao objeto Fuzzy
  fuzzy->addFuzzyRule(fuzzyRule04);
 
  // Regra 5(Se temperatura = muito quente painel = LMQ
  FuzzyRuleAntecedent* ifTemperaturaMuitoQuente = new FuzzyRuleAntecedent();// instanciando um antecedente para a expressão
  ifTemperaturaMuitoQuente->joinSingle(muitoQuente);//adicionando o FuzzySet correpondente ao objeto Antecedente
  FuzzyRuleConsequent* thenPainelLMQ = new FuzzyRuleConsequent();// instanciando um consequente para a expressão
  thenPainelLMF->addOutput(LMQ);//adicionando o FuzzySet correspondente ao objeto consequente
    //Instanciando um objeto FuzzyRule
  FuzzyRule* fuzzyRule05 = new FuzzyRule(5, ifTemperaturaMuitoQuente, thenPainelLMQ); // ID, antencedente e consequente da expressão
    //adicionando o FuzzyRule ao objeto Fuzzy
  fuzzy->addFuzzyRule(fuzzyRule05);
   
}


void loop() {
  lcd.clear();
  //lendo LM35
  ADClido = analogRead(LM35);
  //Convertendo voltagem em temperatura
  temp = ADClido * 0.1075268817204301;
  // definindo os falores de entrada para o objeto fuzzy
  fuzzy->setInput(1,temp);
  // executando a fuzzificação
  fuzzy->fuzzify();
  // efetuando a desfuzzificação, output recebendo o resultado do fuzzy com ID = 1
  saida = fuzzy->defuzzify(1);
  //acendendo led referente ao resultado da desfuzzificação
  digitalWrite(ledpin,HIGH);
   //imprimindo texto no monitor serial
  Serial.print("Temperatura = ");
  Serial.print(temp);
  Serial.println(" *C");
  Serial.println(saida);
  //definido ponto incial no display
  lcd.setCursor(0, 0);
  // imprimindo texto no display 
  lcd.print("Temp = ");
  lcd.print(temp);
  lcd.print(" *C");
  bool wasTheRulle1Fired = fuzzy->isFiredRule(1);
  bool wasTheRulle2Fired = fuzzy->isFiredRule(2);
  bool wasTheRulle3Fired = fuzzy->isFiredRule(3);
  bool wasTheRulle4Fired = fuzzy->isFiredRule(4);
  bool wasTheRulle5Fired = fuzzy->isFiredRule(5);
  Serial.println(wasTheRulle1Fired);
  Serial.println(wasTheRulle2Fired);
  Serial.println(wasTheRulle3Fired);
  Serial.println(wasTheRulle4Fired);
  Serial.println(wasTheRulle5Fired);
   //pausa
  delay(5000);
}

 

Go Up