Selasa, 17 Desember 2019

Fuzzy Arduino UNO


float pompvA1=1;//speedMax
float pompvA2=0;//speedMin
float vA1=42;//suhumax
float vA2=20;//suhumin
float vB1=115;//lembabmax
float vB2=70;//lembabmin

float uji1=35;//suhuUji
float uji2=80;//lembabUji

int a=2;
int v=3;
int arA[] = {0, 1, 2};
int arV[] = {0, 1, 2}; 
float arP[] = {0, 0, 0}; 
//$arV[0]="Tinggi";
//$arV[1]="Sedang";
//$arV[2]="Rendah";
float arN[]={0,0};
float arMin[]={0,0};
float arMax[]={0,0};
float arM[]={0.0,0.0};

void setup() {
 
  arN[0]=uji1;
  arN[1]=uji2;
 
  arMin[0]=vA1;
  arMin[1]=vB1;
 
  arMax[0]=vA2;
  arMax[1]=vB2;

}

void loop() {
  for(int i=0;i<a;i++){
    cetak("Kategori: "+String(arA[i])+" (:Tinggi Sedang Rendah)");
     for(int j=0;j<v;j++){
           String proses="?";
           float hproses=0;
             if(arV[j]==0){proses=getTinggiS(arN[i],arMax[i],arMin[i]);hproses=getTinggi(arN[i],arMax[i],arMin[i]);}
             else if(arV[j]==1){proses=getSedangS(arN[i],arMax[i],arMin[i]);hproses=getSedang(arN[i],arMax[i],arMin[i]);}
             else if(arV[j]==2){proses=getRendahS(arN[i],arMax[i],arMin[i]);hproses=getRendah(arN[i],arMax[i],arMin[i]);}

            arP[j]=hproses;
            String gab="LVL-"+String(arA[i])+" "+String(arV[j])+" =>Uji "+String(arN[i])+"#"+String(proses) +"="+hproses;
            cetak(gab);
           
         
        }//j
        arM[i]=getMin(arP);
        cetak("Nilai Minimum ="+String(arM[i])+" ");   
    }//i




float MIN=getMin(arM);
float MAX=getMax(arM);
float sel=pompvA1 - pompvA2;
float vA1 = ( pompvA2 + ( MIN * ( sel )));
float vA2 = ( pompvA2 + ( MAX * ( sel )));

float up=vA1*vA1;
float M1= MIN/(pow(2,up));

    float MA=(vA2*vA2*vA2)/(3*sel);
    float MB=(vA2*vA2)*(sel)/(2*(sel));
    float MC =MA-MB;
   
    float MD=(vA1*vA1*vA1)/(3*sel);
    float ME=((vA1*vA1)*sel) / (2*sel);
    float MF = MD-ME;
   
float M2 = MC-MF;
float M3 = (MAX/2*(pompvA1*pompvA1)) - (MAX/2*(vA2*vA2));   

float L1 = MIN* vA1;

      float LA=((vA2*vA2)/(2*sel));
      float LB=sel / (sel*vA2);
      float LC=LA-LB;
     
      float LD=(vA1*vA1) / (2*sel);
      float LE=sel/(sel*vA1);
      float LF=LD-LE;
     
float L2=LC-LF;
float L3=(MAX*pompvA1) - (MAX*vA2);

float Z1= M1+M2+M3;
float Z2=L1+L2+L3;
float Z3=Z1/Z2;



cetak("Nilai keanggotaan Terendah="+String(MIN));
cetak("Nilai keanggotaan Tertinggi="+String(MAX));

cetak("Nilai vA1="+String(vA1));
cetak("Nilai vA2="+String(vA2));
cetak("Nilai Momen1="+String(M1));
cetak("Nilai Momen2="+String(M2));
cetak("Nilai Momen3="+String(M3));

cetak("Nilai L1-L2-L3="+String(L1)+"#"+String(L2)+"#"+String(L3)+"#");
cetak("Nilai Z1="+String(Z1));
cetak("Nilai Z3="+String(Z3));
}//loop

       

float getRendah(float vx,float vmax,float vmin){
  float vr=(vmax-vx)/(vmax-vmin);
  if(vx<=vmin){vr=1;}
  else if(vx>=vmax){vr=0;}
  return vr;
}
float getSedang(float vx,float vmax,float vmin){
  float avg=(vmax-vmin)-vmin;
  float vmax2=(vmax+(vmax-avg));
 
  float vr=(vx-avg)/(vmax-avg);
  if(vx<=avg || vx>=vmax2){vr=0;}
  else if(vx>=vmax && vx<=vmax2){vr=(vmax2-vx)/(vmax2-vmax);}
  return vr;
}
float getTinggi(float vx,float vmax,float vmin){
  float vr=(vx-vmax)/(vmax-vmin);
  if(vx<=vmax){vr=0;}
  else if(vx>=(vmax+(vmax-vmin))){vr=1;}
  return vr;
}



String getRendahS(float vx,float vmax,float vmin){
 String vr="(vmax-vx)/(vmax-vmin)";
  if(vx<=vmin){vr="karena vx<=vmin maka v=1";}
  else if(vx>=vmax){vr="karena vx>=vmax maka v=0";}
  return vr;
}
String getSedangS(float vx,float vmax,float vmin){
  float avg=(vmax-vmin)-vmin;
  float vmax2=(vmax+(vmax-avg));
 
  String vr="(vx-avg)/(vmax-avg)";
  if(vx<=avg || vx>=vmax2){vr="karena vx<=avg || vx>=vmax2 maka v=0";}
  else if(vx>=vmax && vx<=vmax2){vr="karena vx>=vmax && vx<=vmax2 maka v=(vmax2-vx)/(vmax2-vmax)";}
  return vr;
}
String getTinggiS(float vx,float vmax,float vmin){
  String vr="(vx-vmax)/(vmax-vmin)";
  if(vx<=vmax){vr="karena vx<=vmax maka v=0";}
  else if(vx>=(vmax+(vmax-vmin))){vr="karena vx>=(vmax+(vmax-vmin)) maka v=1";}
  return vr;
}


void cetak(String var){
  Serial.println(var);
  }
 
int getMin(float* myArray){
int jd=3;//myArray.length();
int minIndex = 0;
 int var= myArray[minIndex];
 for (int i=1; i<jd; i++){
   if (var>myArray[i]){
     minIndex = i;
     var = myArray[i];
   }
 }
 return minIndex;
}
int getMax(float* myArray){
int jd=3;//myArray.length();
int minIndex = 0;
 int var = myArray[minIndex];
 for (int i=1; i<jd; i++){
   if (var<myArray[i]){
     minIndex = i;
     var = myArray[i];
   }
 }
 return minIndex;
}