// copy of https://wokwi.com/projects/352839193329390593
// Potentiometer is connected to GPIO 34 (Analog ADC1_CH6)
const int potPin1 = 34;
const int potPin2 = 35;
// variable for storing the potentiometer value
int tinggi = 0; // height
int berat = 0; // weight
double T;
double sangat_pendek, pendek, tinggi_sedang, Ttinggi, sangat_tinggi; // very_short, short, medium_height, tall, very_tall;
double sangat_ringan, ringan, biasa, Bberat, sangat_berat; // very_light, light, average, heavy, very_heavy;
double kesehatan, tidak_sehat, agak_sehat, sehat, sangat_sehat; // health, unhealthy, somewhat_healthy, healthy, very_healthy;
double Mn, Mn_RP, Nmin, Center_of_area;
double RP[25], small[25];
//untuk trapesium // for trapezoids
double MF(double u, int a, int b, int c, int d)
{ // __________
if (u <= a || d <= u) return 0; // before a or after d /. .\
else if (a <= u && u <= b) return (u - a)/(b - a); // on ab slope / . . \
else if (c <= u && u <= d) return (d - u)/(d - c); // on cd slope _____/ . . \______
else if (b <= u && u <= c) return 1; // on bc a b c d
}
void f_tinggi(void) // height
{
sangat_pendek = MF( tinggi, 0, 0, 115, 120); // Serial.print("sangat_pendek = "); Serial.println(sangat_pendek); // very_short
pendek = MF( tinggi, 115, 120, 140, 145); // Serial.print("pendek = " ); Serial.println(pendek ); // short
tinggi_sedang = MF( tinggi, 140, 145, 160, 165); // Serial.print("tinggi sedang = "); Serial.println(tinggi_sedang); // medium_height
Ttinggi = MF( tinggi, 160, 165, 180, 185); // Serial.print("tinggi = " ); Serial.println(Ttinggi ); // tall
sangat_tinggi = MF( tinggi, 180, 185, 200, 200); // Serial.print("sangat_tinggi = "); Serial.println(sangat_tinggi); // very_tall
}
void f_berat(void) // weight
{
sangat_ringan = MF( berat, 0, 0, 40, 45); // Serial.print("sangat_ringan = "); Serial.println(sangat_ringan); // very_light
ringan = MF( berat, 40, 45, 50, 55); // Serial.print("ringan = " ); Serial.println(ringan ); // light
biasa = MF( berat, 50, 55, 60, 65); // Serial.print("biasa = " ); Serial.println(biasa ); // average
Bberat = MF( berat, 60, 65, 80, 85); // Serial.print("berat = " ); Serial.println(Bberat ); // heavy
sangat_berat = MF( berat, 80, 85, 100, 100); // Serial.print("sangat_berat = " ); Serial.println(sangat_berat ); // very_heavy
}
// kesehatan, tidak_sehat, agak_sehat , sehat , sangat_sehat;
// health , unhealthy , somewhat_healthy, healthy, very_healthy;
void f_kesehatan(void) // health
{
tidak_sehat = MF( kesehatan, 0 , 0, 20, 40); // unhealthy
agak_sehat = MF( kesehatan, 0.2, 40, 40, 60); // somewhat_healthy
sehat = MF( kesehatan, 40 , 60, 60, 80); // healthy
sangat_sehat = MF( kesehatan, 60 , 80, 100, 100); // very_healthy
}
void MF_Out(void)
{
tidak_sehat = 30; // unhealthy
agak_sehat = 50; // somewhat_healthy
sehat = 80; // healthy
sangat_sehat = 100; // very_healthy
}
//Fungsi nilai terkecil // Smallest value function
double minimal(double inp1, double inp2)
{
if (inp1 > inp2) Nmin = inp2;
else Nmin = inp1;
return(Nmin);
}
// sangat_pendek, pendek, tinggi_sedang, Ttinggi, sangat_tinggi;
// very_short , short , medium_height, tall , very_tall ;
// sangat_ringan, ringan, biasa , Bberat, sangat_berat;
// very_light , light , average, heavy , very_heavy ;
//cari nilai terkecil Find the smallest value
void smallest(void)
{
small[ 0]= minimal(sangat_pendek , sangat_ringan); // very_short , very_light
small[ 1]= minimal(sangat_pendek , ringan ); // , light
small[ 2]= minimal(sangat_pendek , biasa ); // , average
small[ 3]= minimal(sangat_pendek , berat ); // , heavy
small[ 4]= minimal(sangat_pendek , sangat_berat ); // , very_heavy
small[ 5]= minimal(pendek , sangat_ringan); // short , very_light
small[ 6]= minimal(pendek , ringan ); // , light
small[ 7]= minimal(pendek , biasa ); // , average
small[ 8]= minimal(pendek , berat ); // , heavy
small[ 9]= minimal(pendek , sangat_berat ); // , very_heavy
small[10]= minimal(tinggi_sedang , sangat_ringan); // medium_height , very_light
small[11]= minimal(tinggi_sedang , ringan ); // , light
small[12]= minimal(tinggi_sedang , biasa ); // , average
small[13]= minimal(tinggi_sedang , berat ); // , heavy
small[14]= minimal(tinggi_sedang , sangat_berat ); // , very_heavy
small[15]= minimal(Ttinggi , sangat_ringan); // tall , very_light
small[16]= minimal(Ttinggi , ringan ); // , light
small[17]= minimal(Ttinggi , biasa ); // , average
small[18]= minimal(Ttinggi , berat ); // , heavy
small[19]= minimal(Ttinggi , sangat_berat ); // , very_heavy
small[20]= minimal(sangat_tinggi , sangat_ringan); // very_tall , very_light
small[21]= minimal(sangat_tinggi , ringan ); // , light
small[22]= minimal(sangat_tinggi , biasa ); // , average
small[23]= minimal(sangat_tinggi , berat ); // , heavy
small[24]= minimal(sangat_tinggi , sangat_berat ); // , very_heavy
}
// kesehatan, tidak_sehat, agak_sehat , sehat , sangat_sehat;
// health , unhealthy , somewhat_healthy, healthy, very_healthy;
void Rule(void) // Rule
{
RP[ 0] = small[ 0] * sangat_sehat; // very_healthy
RP[ 1] = small[ 1] * sehat; // healthy
RP[ 2] = small[ 2] * agak_sehat; // somewhat_healthy
RP[ 3] = small[ 3] * tidak_sehat; // unhealthy
RP[ 4] = small[ 4] * tidak_sehat; // unhealthy
RP[ 5] = small[ 5] * sehat; // healthy
RP[ 6] = small[ 6] * sangat_sehat; // very_healthy
RP[ 7] = small[ 7] * sehat; // healthy
RP[ 8] = small[ 8] * agak_sehat; // somewhat_healthy
RP[ 9] = small[ 9] * tidak_sehat; // unhealthy
RP[10] = small[10] * agak_sehat; // somewhat_healthy
RP[11] = small[11] * sangat_sehat; // very_healthy
RP[12] = small[12] * sangat_sehat; // very_healthy
RP[13] = small[13] * agak_sehat; // somewhat_healthy
RP[14] = small[14] * tidak_sehat; // unhealthy
RP[15] = small[15] * tidak_sehat; // unhealthy
RP[16] = small[16] * sehat; // healthy
RP[17] = small[17] * sangat_sehat; // very_healthy
RP[18] = small[18] * sehat; // healthy
RP[19] = small[19] * tidak_sehat; // unhealthy
RP[20] = small[20] * tidak_sehat; // unhealthy
RP[21] = small[21] * agak_sehat; // somewhat_healthy
RP[22] = small[22] * sangat_sehat; // very_healthy
RP[23] = small[23] * sehat; // healthy
RP[24] = small[24] * agak_sehat; // somewhat_healthy
}
//Fuzzyfikasi Fuzzyfication
void COA(void)
{
unsigned char n;
for(n=0;n<25;n++)
{
Mn = Mn + small[n];
Mn_RP = Mn_RP + RP[n];
}
Center_of_area = Mn_RP / Mn;
}
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
// Reading potentiometer value
tinggi = analogRead(potPin1); // height
tinggi= map(tinggi, 0, 4095, 0, 200);
berat = analogRead(potPin2); // weight
berat = map(berat, 0, 4095, 0, 100);
// Serial.print("------------------------------\nTinggi = ");
// Serial.println(tinggi);
// Serial.print("Berat = ");
// Serial.println(berat);
MF_Out();
f_tinggi();
f_berat();
smallest();
Rule();
COA();
Serial.print("Kesehatan = "); // health
Serial.print(Center_of_area);
Serial.println(" %");
// delay(100);
}