Minggu, 25 Juli 2021

Hitung Fuzzy Manual Menggunakan Arduino

  


Dimensi Rule =4x2

0 1  =>0

0 0  =>0

1 1  =>1

1 0  =>1

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Baca Sensor Loop

Turun2: (5000.00-4000.00)/(5000.00-1000.00) = 0.25

Naik1: (4000.00-1000.00)/(5000.00-1000.00) =0.75

Turun2: (600.00-300.00)/(600.00-100.00) = 0.60

Naik1: (300.00-100.00)/(600.00-100.00) =0.40

1. Alpha1 Rule 0 + 1 => 0 (Turun) =Min(0.25,0.40)=>0.25

Turun1 =7000.00 - (0.25 * (7000.00-2000.00) = 5750.00

   #Predikat1 5750.00

2. Alpha2 Rule 0 + 0 => 0 (Turun) =Min(0.25,0.60)=>0.25

Turun1 =7000.00 - (0.25 * (7000.00-2000.00) = 5750.00

   #Predikat2 5750.00

3. Alpha3 Rule 1 + 1 => 1 (Naik) =Min(0.75,0.40)=>0.40

Naik1 = (0.40 *(7000.00-2000.00)) + 2000.00 = 4000.00

   #Predikat3 4000.00

4. Alpha4 Rule 1 + 0 => 1 (Naik) =Min(0.75,0.60)=>0.60

Naik1 = (0.60 *(7000.00-2000.00)) + 2000.00 = 5000.00

   #Predikat4 5000.00

Data Pembilang Fuzzy: 

(0.25 * 5750.00) + (0.25 * 5750.00) + (0.40 * 4000.00) + (0.60 * 5000.00) = 7475.00 =7475.00

Dibagi Penyebut Alpha: 

0.25 + 0.25 + 0.40 + 0.60 =1.50

HASIL DEFUZZYFIKASI: 4983.33

---------------------------------------------------------------

--------HITUNG ULANG BACA SENSOR-----------

---------------------------------------------------------------



Sebagai Berikut Engine Utamanya:

float cekMin(float dV1,float dV2){

    float hslMin=dV1;

    if(dV2<dV1){hslMin=dV2;}

  return hslMin;

}

float getFuzzy(String lvl,float Vz,float Vmx,float Vmn){

float fuzzy=-1; 

String gab="";

  if(lvl=="Turun"){

      if (Vz<=Vmn){fuzzy=1;gab="Turun1: "+String(fuzzy);}

      else if (Vz<=Vmx){

        fuzzy=(Vmx-Vz)/(Vmx-Vmn);

        gab="Turun2: ("+String(Vmx)+"-"+String(Vz)+")/(" +String(Vmx)+"-"+String(Vmn)+") = "+String(fuzzy);

      }

      else if (Vz>=Vmx){fuzzy=0;gab="Turun3: "+String(fuzzy);}

  }//lvl

  else if(lvl=="Naik"){

      if (Vz<=Vmn){fuzzy=0;gab="Naik1: "+String(fuzzy);}

      else if (Vz<=Vmx){

        fuzzy=(Vz-Vmn)/(Vmx-Vmn);

        gab="Naik1: ("+String(Vz)+"-"+String(Vmn)+")/("+String(Vmx)+"-"+String(Vmn)+") =" +String(fuzzy);

      }

      else if (Vz>=Vmx){fuzzy=1;gab="Naik3: "+String(fuzzy);}

  }//lvl

  cetak (gab);

return fuzzy;

 }//float


float getPredikat(String lvl,float Vz,float Vmx,float Vmn){

float predikat=-1; 

String gab="";

  if(lvl=="Turun"){

      if (Vz<=Vmn){predikat=Vmx - (Vz * (Vmx-Vmn));gab="Turun1 ="+String(Vmx)+" - ("+String(Vz)+" * ("+String(Vmx)+"-"+String(Vmn)+") = "+String(predikat);}

      else if (Vz<=Vmx){predikat=Vmx - (Vz * (Vmx-Vmn));gab="Turun2 ="+String(Vmx)+" - ("+String(Vz)+" * ("+String(Vmx)+"-"+String(Vmn)+") = "+String(predikat);}

      else if (Vz>=Vmx){predikat=Vmx - (Vz * (Vmx-Vmn));gab="Turun3 ="+String(Vmx)+" - ("+String(Vz)+" * ("+String(Vmx)+"-"+String(Vmn)+") = "+String(predikat);}

  }//lvl

  else if(lvl=="Naik"){

      if (Vz<=Vmn){predikat=(Vz *(Vmx-Vmn)) + Vmn;gab="Naik1 = ("+String(Vz)+" *("+String(Vmx)+"-"+String(Vmn)+")) + "+String(Vmn)+" = "+String(predikat);}

      else if (Vz<=Vmx){predikat=(Vz *(Vmx-Vmn)) + Vmn;gab="Naik2 = ("+String(Vz)+" *("+String(Vmx)+"-"+String(Vmn)+")) + "+String(Vmn)+" = "+String(predikat);}

      else if (Vz>=Vmx){predikat=(Vz *(Vmx-Vmn)) + Vmn;gab="Naik3 = ("+String(Vz)+" *("+String(Vmx)+"-"+String(Vmn)+")) + "+String(Vmn)+" = "+String(predikat);}

  }//lvl

cetak (gab);  

return predikat;

 }//float



Senin, 12 Juli 2021

Arduino Code Naive Bayes LP2mARAY

 String inputString = "";

bool stringComplete = false;


#define MR 6

#define MC 3

#define JS 2



 


void printArray ( const int [][ MC ] );

float arIn[ MR][ MC] = {{1, 1,0},{ 2, 1,0},{3, 1,1},{1, 2,0},{2, 2,0},{3, 2,1}};

 

int jON=0;

int jOFF=0;



//int NB(int sensor,int kolom) {

int * NB(int sensor,int kolom) {

jON=0;

jOFF=0;  

int jONkolom=0;

int jOFFkolom=0;

   for (int i = 0; i < MR; i++) {

      if(arIn[i][2]==1){jON++;}

      else if(arIn[i][2]==0){jOFF++;}

          //--------------------------

           if(arIn[i][kolom]==sensor && arIn[i][2]==1){jONkolom++;}

          else if(arIn[i][kolom]==sensor && arIn[i][2]==0){jOFFkolom++;}

   }//i

  int arout[JS];

  arout[0]=jOFFkolom;

  arout[1]=jONkolom;

  return arout;

}



void setup() {

  Serial.begin(115200);

    

}//setup


String s(long var){

  return String(var);

 }

  

void loop() {

  if (stringComplete) {

    Serial.println(inputString);

    inputString = "";

    stringComplete = false;

  } 


cetak("Baca Sensor Loop");

//POMPA= OFF=0, ON=1

//1 Basah <=300

//2 Lembab  >301

//3 Kering  <=701

long sensor1=300;

  int sen1=3;

  if(sensor1<=300){sen1=1;}

  else if(sensor1<701){sen1=2;}


//1  Dingin  <=25 C

//2 Panas >25

long sensor2=25;

  int sen2=2;

  if(sensor2<25){sen1=1;}

//============================================

    int io1=0;

    int io2=1;

      //int arx[JS];

      int *arx=NB(sen1,io1);

        //int ary[JS];

        int *ary=NB(sen2,io2); 

    cetak("Jika Sensor1: "+s(sensor1)+" ["+s(sen1)+"] dan Sensor2:"+s(sensor2)+" ["+s(sen2)+"]");

    cetak("Jumlah ON:"+s(jON)+" |Jumlah OFF:"+s(jOFF));

    cetak("Jumlah :"+s(sen1)+"-ON="+s(arx[0]));

    cetak("Jumlah :"+s(sen1)+"-OFF="+s(arx[1]));

    cetak("Jumlah :"+s(sen2)+"-ON="+s(ary[0]));

    cetak("Jumlah :"+s(sen2)+"-OFF="+s(ary[1]));

    int total=jON+jOFF;

    float probON=(jON/total) * (arx[0]/jON) * (ary[0]/jON);

    float probOFF=(jOFF/total) * (arx[1]/jOFF) * (ary[1]/jOFF);

    cetak("Probablitias ON:  ("+s(jON)+"/"+s(total)+") * ("+s(arx[0])+"/"+s(jON)+") * ("+s(ary[0])+"/"+s(jON)+")");

    cetak("Probablitias OFF: ("+s(jOFF)+"/"+s(total)+") * ("+s(arx[1])+"/"+s(jOFF)+") * ("+s(ary[1])+"/"+s(jOFF)+")");

    String dom="ON";

    int hasil=1;

    if(probOFF > probON){

      dom="OFF";hasil=0;

      cetak("Karena Probablitias OFF Lebih tinggi "+s(probOFF)+" >"+s(probON)+" => Sistem akan:"+dom);

      }    

    else{

      dom="ON";hasil=1;

      cetak("Karena Probablitias ON Lebih tinggi "+s(probON)+" >"+s(probOFF)+" => Sistem akan:"+dom);

      }

  //============================================    

  delay(5000);

}



void cetak(String lap) {

  Serial.println(lap);

}

void serialEvent() {

  while (Serial.available()) {

    char inChar = (char)Serial.read();

    inputString += inChar;

    if (inChar == '\n') {

      stringComplete = true;

    }

  }

}


void printArray( float a[][ MC ] ) {

  for ( int i = 0; i < MR; ++i ) {

    for ( int j = 0; j < MC; ++j )

      Serial.print (String(a[ i ][ j ]) + " " );

    Serial.print ("\n" ) ;

  }

}



//=======================================================









REFF ARRAY FUNGSI:
int *array(int nbelt) {   int *toret=0L, *ptr;  // we must get 2 pointers   toret = (int *) malloc (nbelt*sizeof(int));  // try to allocate memory   if (toret)    // toret != null so memory allocation success   {       ptr = toret;    // ptr is pointing to toret       for (int i=0; i<nbelt; i++)           *ptr++ = 2*i;                  // assign a value to ptr and move the pointer       return toret;                    // return the pointer for address allocation   }   else                                  // memory allocation failed, return 0L        return 0L; } void setup(void) {    int *p=0L;    p = array(10);            // Function returning an array of 10 int   if (p)                          // we have a result (p != OL)   {     for (int i=0; i<10; i++)     {       Seria.println(*(p+i), DEC);    // print each elements       free(p);                          // don't forget to free Ram !   } } void loop(void) { }