Translate

ARDUINO Fuzzy Logic Controller Mamdani untuk Monitoring Asap / Gas dan Temperature (suhu)

ARDUINO Fuzzy Logic Controller Mamdani untuk Monitoring Asap / Gas dan Temperature (suhu)


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat untuk monitoring suhu dan asap / gas dengan menggunakan metode fuzzy logic control mamdani untuk bisa menghasilkan putaran pada Fan AC yang optimal, alat ini menggunakan dua buah sensor yaitu sensor suhu ds18b20 dan sensor gas / asap MQ-2 dengan outputnya untuk kendali kipas AC. jadi saat kondisi panas dan ada asap kipas akan berputar cepat, jika kondisi dingin dan tidak ada asap maka kipas akan berputar lambat atau OFF, begitu seterusnya tergantung pada Fuzzy Rule yang dibuat, untuk lebih jelasnya berikut adalah skema dan programnya.

Link Referensi:




a. Arduino Uno






b. Sensor Suhu DS18b20





c. Sensor Asap / Gas MQ-2





d. Kipas Motor AC





e. Lcd 16x2





f. Blok Diagram Fuzzy





g. Fuzzy Logic Control






- Rumus yang dipakai yaitu:






- Rumus COG :






h. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h> 
#define AC_LOAD 6   // connect pin 6 arduino to input terminal of driver motor
#include <OneWire.h>

#define on 1
#define off 0

LiquidCrystal_I2C lcd(0x27, 16, 2);

OneWire  ds(7);

const int AOUTpin1=0;
int adc0;
int suhu;
float h;
float T;
int output;
//int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF
float dimming;

  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
 
float dingin, hangat, panas;
float sedikit, sedang, banyak;
float lb, sd, ke;
float hasillb, hasilsd, hasilke;
float Coglb, Cogsd, Cogke;
float Cogxlb, Cogxsd, Cogxke;
float Komlb, Komsd, Komke;
float Penlb, Pensd, Penke;
float Totalkom, Totalpen;
float Cog;
float lb1, lb2, lb3;
float sd1, sd2, sd3;
float ke1, ke2, ke3;
 
 

void setup()
{
  Serial.begin(9600);
  lcd.begin();
  pinMode(AC_LOAD, OUTPUT);  // Set AC Load pin as output (pin 6)
  attachInterrupt(0, zero_cross_int, FALLING);  // connect pin 2 arduino to output terminal of driver motor

}


void zero_cross_int()  //function to be fired at the zero crossing
{
  // Firing angle calculation : 1 full 50hz wave =1/50=20ms
  // Every zerocrossing thus: (50hz)-> 10ms (1/2 Cycle)
  // 10ms=10000us
  // (10000us - 10us) / 128 = 70 (Approx)

  if(output==on)
  {
  digitalWrite(AC_LOAD, LOW);  
  int dimtime = (70*dimming);   
  delayMicroseconds(dimtime);  // Wait till firing the driver motor      
  digitalWrite(AC_LOAD, HIGH);  // Fire the driver motor
  }
  else{digitalWrite(AC_LOAD, LOW);
  }  // Stop the driver motor
 
}



void loop()
{
  
  output=on;
 
   if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return;
  }
 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
 
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         // Read Scratchpad

  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
 
  celsius = (float)raw / 16.0;
  T = celsius;
  lcd.setCursor(0,0);
  lcd.print("T=");
  lcd.print(celsius,1);


   h = 1.953125 *(analogRead(AOUTpin1));
   lcd.setCursor (0,1);
   lcd.print ("Gas=");
   lcd.print (h,1);
   lcd.print ("   ");




   //======================
   //   fuzzyfikasi suhu
   //======================
  
   if(T <= 25){
   dingin = 1;
   hangat = 0;
   panas = 0;
   }
   else if(T >= 35){
   panas = 1;
   hangat = 0;
   dingin = 0;
   }
   else if(T == 30){
   hangat = 1;
   dingin = 0;
   panas = 0;
   }
   else if((T > 25)&&(T < 30)){
   hangat = (T - 25)/5;
   dingin = 1-(T - 25)/5;
   panas = 0;
   }
   else if((T > 30)&&(T < 35)){
   panas = (T - 30)/5;
   hangat = 1-(T - 30)/5;
   dingin = 0;
   }
  
  
 //  Serial.print("panas= ");  
 //  Serial.println(panas);
 //  Serial.print("hangat= ");  
 //  Serial.println(hangat);
 //  Serial.print("dingin= ");  
 //  Serial.println(dingin);
     
   //===============================
   //       fuzzyfikasi gas
   //===============================
  
   if(h <= 150){
   sedikit = 1;
   sedang = 0;
   banyak = 0;
   }
   else if(h >= 300){
   banyak = 1;
   sedang = 0;
   sedikit = 0;
   }
   else if(h == 200){
   banyak = 0;
   sedang = 1;
   sedikit = 0;
   }
   else if((h > 150)&&(h < 200)){
   sedang = (h - 150)/50;
   sedikit = 1-(h - 150)/50;
   banyak = 0;
   }
   else if((h > 200)&&(h < 300)){
   sedang = (h - 200)/100;
   banyak = 1-(h - 200)/100;
   sedikit = 0;
   }
  
 //  Serial.print("Sedikit= ");  
 //  Serial.println(sedikit);
 //  Serial.print("sedang= ");  
 //  Serial.println(sedang);
 //  Serial.print("banyak= ");  
 //  Serial.println(banyak);
   
  
  
  
   //==================================
   //           fuzzy rule
   //===================================
     
   //============================================================================
   if((T <= 25 )&&(h <= 150)){ //1A
    if(dingin < sedikit){
    lb = dingin;
    }
    else if(dingin > sedikit){
    lb = sedikit;
    }
    else if(dingin == sedikit){
    lb = sedikit;
    }
   
    hasillb = lb;
    hasilsd = 0;
    hasilke = 0;
    
   }
  
   //=========================================================================
  
   else if((T <= 25 )&&(h > 150)&&(h < 200)){ //1AB
    if(dingin < sedikit){
    lb1 = dingin;
    }
    else if(dingin > sedikit){
    lb1 = sedikit;
    }
    else if(dingin == sedikit){
    lb1 = sedikit;
    }
   
    if(dingin < sedang){
    lb2 = dingin;
    }
    else if(dingin > sedang){
    lb2 = sedang;
    }
    else if(dingin == sedang){
    lb2 = sedang ;
    }
   
    if(lb1 < lb2){   
     hasillb = lb2;  
    }
    else if(lb1 > lb2){   
     hasillb = lb1;  
    }
    else if(lb1 == lb2){   
     hasillb = lb1;  
    }
   
    hasilsd = 0;
    hasilke = 0;
    
   }
  
   //========================================================================
    else if((T <= 25 )&&(h > 200)&&(h < 300)){ //1BC
    if(dingin < sedang){
    lb = dingin;
    }
    else if(dingin > sedang){
    lb = sedang;
    }
    else if(dingin == sedang){
    lb = sedang;
    }
   
    if(dingin < banyak){
    sd = dingin;
    }
    else if(dingin > banyak){
    sd = banyak;
    }
    else if(dingin == banyak){
    sd = banyak;
    }
   
    hasillb = lb;  
    hasilsd = sd;
    hasilke = 0;
    
   }
  
   //=======================================================================
    else if((T <= 25 )&&(h >= 300)){ //1C

    if(dingin < banyak){
    sd = dingin;
    }
    else if(dingin > banyak){
    sd = banyak;
    }
    else if(dingin == banyak){
    sd = banyak;
    }
   
    hasillb = 0;  
    hasilsd = sd;
    hasilke = 0;
    
   }
  
  
   //==========================================================================
  
    else if((T > 25 )&&(T < 30 )&&(h <= 150)){ //12A

    if(dingin < sedikit){
    lb1 = dingin;
    }
    else if(dingin > sedikit){
    lb1 = sedikit;
    }
    else if(dingin == sedikit){
    lb1 = sedikit;
    }
   
   
    if(hangat > sedikit){
    lb2 = sedikit;
    }
    else if(hangat < sedikit){
    lb2 = hangat;
    }
    else if(hangat == sedikit){
    lb2 = hangat;
    }
   
   
    if(lb1 < lb2){   
     hasillb = lb2;  
    }
    else if(lb1 > lb2){   
     hasillb = lb1;  
    }
    else if(lb1 == lb2){   
     hasillb = lb1;  
    }
   
    hasilsd = 0;
    hasilke = 0;
    
   }
  
   //=========================================================================
  
    else if((T > 25 )&&(T < 30 )&&(h > 150)&&(h < 200)){ //12AB

    if(dingin < sedikit){
    lb1 = dingin;
    }
    else if(dingin > sedikit){
    lb1 = sedikit;
    }
    else if(dingin == sedikit){
    lb1 = sedikit;
    }
   
   
    if(dingin < sedang){
    lb2 = dingin;
    }
    else if(dingin > sedang){
    lb2 = sedang;
    }
    else if(dingin == sedang){
    lb2 = sedang;
    }
   
   
    if(hangat < sedikit){
    lb3 = dingin;
    }
    else if(hangat > sedikit){
    lb3 = sedikit;
    }
    else if(hangat == sedikit){
    lb3 = sedikit;
    }
   
   
    if(hangat < sedang){
    sd = hangat;
    }
    else if(hangat > sedang){
    sd = sedang;
    }
    else if(hangat == sedang){
    sd = sedang;
    }
   
   
   if((lb1 > lb2)&&(lb1 > lb3)){                         
   hasillb = lb1;
   }
   else if((lb1 > lb2)&&(lb1 == lb3)){
   hasillb = lb1;
   }
   else if((lb1 == lb2)&&(lb1 > lb3)){
   hasillb = lb1;
   }
   else if((lb1 == lb2)&&(lb1 == lb3)){
   hasillb = lb1;
   }
   else if((lb2 > lb1)&&(lb2 > lb3)){
   hasillb = lb2;
   }
   else if((lb2 > lb1)&&(lb2 == lb3)){
   hasillb = lb2;
   }
   else if((lb2 == lb1)&&(lb2 > lb3)){
   hasillb = lb2;
   }
   else if((lb2 == lb1)&&(lb2 == lb3)){
   hasillb = lb2;
   }
   else if((lb3 > lb1)&&(lb3 > lb2)){
   hasillb = lb3;
   }
   else if((lb3 > lb1)&&(lb3 == lb2)){
   hasillb = lb3;
   }
   else if((lb3 == lb1)&&(lb3 > lb2)){
   hasillb = lb3;
   }
   else if((lb3 == lb1)&&(lb3 == lb2)){
   hasillb = lb3;
   }

   hasilsd = sd;
   hasilke = 0;
   
   }
  
   //===============================================================================
  
   else if((T > 25)&&(T < 30)&&(h > 200)&&(h < 300)){ //12BC
   if (dingin < sedang){
   lb = dingin;
   }
   else if(dingin > sedang){
   lb = sedang;
   }
   else if(dingin == sedang){
   lb = sedang;
   }

   if(dingin < banyak){
   sd1 = dingin;
   }
   else if(dingin > banyak){
   sd1 = banyak;
   }
   else if(dingin == banyak){
   sd1 = banyak;
   }

   if(hangat < sedang){
   sd2 = hangat;
   }
   else if(hangat > sedang){
   sd2 = sedang;
   }
   else if(hangat == sedang){
   sd2 = sedang;
   }

   if(hangat < banyak){
   ke = hangat;
   }
   else if(hangat > banyak){
   ke = banyak;
   }
   else if(hangat == banyak){
   ke = banyak;
   }

   if(sd1 > sd2){
   hasilsd = sd1;
   }
   else if(sd2 > sd1){
   hasilsd = sd2;
   }
   else if(sd2 == sd1){
   hasilsd = sd2;
   }

   hasillb = lb;
   hasilke = ke;

   }

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

   else if((T > 25)&&(T < 30)&&(h >= 300)){ //12C
    
   if(dingin < banyak){
   sd = dingin;
   }
   else if(dingin > banyak){
   sd = banyak;
   }
   else if(dingin == banyak){
   sd = banyak;
   }

   if(hangat > banyak){
   ke = banyak;
   }
   else if(hangat < banyak){
   ke = hangat;
   }
   else if(hangat == banyak){
   ke = hangat;
   }
  
   hasilsd = sd;
   hasilke = ke;
   hasillb = 0;
   }

   //===============================================================
   else if ((T == 30) && (h <= 150)){ //2A
   if (hangat > sedikit){    
   lb = sedikit;
   }
   else if (hangat < sedikit){
   lb = hangat;
   }
   else if (hangat == sedikit){
   lb = hangat;
   }

   hasillb = lb;
   hasilsd = 0;
   hasilke = 0;
   }
  
   //============================================================
   else if ((T == 30) && (h > 150) && (h < 200)){ //2AB
   if (hangat < sedikit){
   lb = hangat;
   }
   else if (hangat > sedikit){
   lb = sedikit;
   }
   else if (hangat == sedikit){
   lb = sedikit;
   }
  

   if (hangat < sedang){
   sd = hangat;
   }
   else if (hangat > sedikit){
   sd = sedikit;
   }
   else if (hangat == sedikit){
   sd = sedikit;
   }

   hasillb = lb;
   hasilsd = sd;
   hasilke = 0;
  
   }

//===================================================================
   else if ((T == 30) && (h > 200) && (h < 300)){ //2BC
   if (hangat < sedang){
   sd = hangat;
   }
   else if (hangat > sedang){
   sd = sedang;
   }
   else if (hangat == sedang){
   sd = sedang;
   }

   if (hangat < banyak){
   ke = hangat;
   }
   else if (hangat > banyak){
   ke = banyak;
   }
   else if (hangat == banyak){
   ke = banyak;
   }

   hasilsd = sd;
   hasilke = ke;
   hasillb = 0;
  
   }

 //=============================================================
   else if ((T == 30) && (h >= 300)){  //2C
   if (hangat < banyak){
   ke = hangat;
   }
   else if (hangat > banyak){
   ke = banyak;
   }
   else if (hangat == banyak){
   ke = banyak;
   }

   hasilke = ke;
   hasilsd = 0;
   hasillb = 0;

}


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

   else if ((T > 30) && (T < 35) && (h <= 150)){ //23A
   if (hangat < sedikit){
   lb = hangat;
   }
   else if (hangat > sedikit){
   lb = sedikit;
   }
   else if (hangat == sedikit){
   lb = sedikit;
   }
  
   if (panas < sedikit){
   sd = panas;
   }
   else if (panas > sedikit){
   sd = sedikit;
   }
   else if (panas == sedikit){
   sd = sedikit;
   }

   hasillb = lb;
   hasilsd = sd;
   hasilke = 0;
   }

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

   else if ((T > 30) && (T < 35) && (h > 150) && (h < 200)){  //23AB
   if (hangat < sedikit){
   lb = hangat;
   }
   else if (hangat > sedikit){
   lb = sedikit;
   }
   else if (hangat == sedikit){
   lb = sedikit;
   }

   if (hangat < sedang){
   sd1 = hangat;
   }
   else if (hangat > sedang){
   sd1 = sedang;
   }
   else if (hangat == sedang){
   sd1 = sedang;
   }
  
   if (panas < sedikit){
   sd2 = panas;
   }
   else if (panas > sedikit){
   sd2 = sedikit;
   }
   else if (panas == sedikit){
   sd2 = sedikit;
   }

   if (panas < sedang){
   ke = panas;
   }
   else if (panas > sedang){
   ke = sedang;
   }
   else if (panas == sedang){
   ke = sedang;
   }

   if (sd1 < sd2){
   hasilsd = sd2;
   }
   else if (sd1 > sd2){
   hasilsd = sd1;
   }
   else if (sd1 == sd2){
   hasilsd = sd1;
   }

   hasilke = ke;
   hasillb = lb;
   }

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

   else if ((T > 30) && (T < 35) && (h > 200) && (h < 300)){ //23BC
   if (hangat < sedang){
   sd = hangat;
   }
   else if (hangat > sedang){
   sd = sedang;
   }
   else if (hangat == sedang){
   sd = sedang;
   }

   if (hangat < banyak){
   ke1 = hangat;
   }
   else if (hangat > banyak){
   ke1 = banyak;
   }
   else if (hangat == banyak){
   ke1 = banyak;
   }

   if (panas < sedang){
   ke2 = panas;
   }
   else if (panas > sedang){
   ke2 = sedang;
   }
   else if (panas == sedang){
   ke2 = sedang;
   }

   if (panas < banyak){
   ke3 = panas;
   }
   else if (panas > banyak){
   ke3 = banyak;
   }
   else if (panas == banyak){
   ke3 = banyak;
   }
  
   if ((ke1 > ke2) && (ke1 > ke3)){
   hasilke = ke1;
   }
   else if ((ke1 > ke2) && (ke1 == ke3)){
   hasilke = ke1;
   }
   else if ((ke1 == ke2) && (ke1 > ke3)){
   hasilke = ke1;
   }
   else if ((ke1 == ke2) && (ke1 == ke3)){
   hasilke = ke1;
   }
   else if ((ke2 > ke1) && (ke2 > ke3)){
   hasilke = ke2;
   }
   else if ((ke2 > ke1) && (ke2 == ke3)){
   hasilke = ke2;
   }
   else if ((ke2 == ke1) && (ke2 > ke3)){
   hasilke = ke2;
   }
   else if ((ke2 == ke1) && (ke2 == ke3)){
   hasilke = ke2;
   }

   else if ((ke3 > ke1) && (ke3 > ke2)){
   hasilke = ke3;
   }
   else if ((ke3 > ke1) && (ke3 == ke2)){
   hasilke = ke3;
   }
   else if ((ke3 == ke1) && (ke3 > ke2)){
   hasilke = ke3;
   }
   else if ((ke3 == ke1) && (ke3 == ke2)){
   hasilke = ke3;
   }

   hasilsd = sd;
   hasillb = 0;
   }

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

   else if ((T > 30) && (T < 35) && (h >= 300)){ //23C
   if (hangat < banyak){
   ke1 = hangat;
   }
   else if (hangat > banyak){
   ke1 = banyak;
   }
   else if (hangat == banyak){
   ke1 = banyak;
   }

   if (panas < banyak){
   ke2 = panas;
   }
   else if (panas > banyak){
   ke2 = banyak;
   }
   else if (panas == banyak){
   ke2 = banyak;
   }

   if (ke1 < ke2){
   hasilke = ke2;
   }
   else if (ke1 > ke2){
   hasilke = ke1;
   }
   else if (ke1 == ke2){
   hasilke = ke1;
   }

   hasilsd = 0;
   hasillb = 0;
   }

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

  else if ((T >= 35) && (h <= 150)){  //3A
   if (panas < sedikit){
   sd = panas;
   }
   else if (panas > sedikit){
   sd = sedikit;
   }
   else if (panas == sedikit){
   sd = sedikit;
   }

   hasilsd = sd;
   hasillb = 0;
   hasilke = 0;
   }

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

else if ((T >= 35) && (h > 150) && (h < 200)){  //3AB
   if (panas < sedikit){
   sd = panas;
   }
   else if (panas > sedikit){
   sd = sedikit;
   }
   else if (panas == sedikit){
   sd = sedikit;
   }

   if (panas < sedang){
   ke = panas;
   }
   else if (panas > sedang){
   ke = sedang;
   }
   else if (panas == sedang){
   ke = sedang;
   }

   hasilsd = sd;
   hasilke = ke;
   hasillb = 0;
   }
  
  
//======================================================================  
  
else if ((T >= 35) && (h > 200) && (h < 300)){ //3BC
   if (panas < sedang){
   ke1 = panas;
   }
   else if (panas > sedang){
   ke1 = sedang;
   }
   else if (panas == sedang){
   ke1 = sedang;
   }

   if (panas < banyak){
   ke2 = panas;
   }
   else if (panas > banyak){
   ke2 = banyak;
   }
   else if (panas == banyak){
   ke2 = banyak;
   }

   if (ke1 < ke2){
   hasilke = ke2;
   }
   else if (ke1 > ke2){
   hasilke = ke1;
   }
   else if (ke1 == ke2){
   hasilke = ke1;
   }

   hasillb = 0;
   hasilsd = 0;
   }

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

else if ((T >= 35) && (h >= 300)){ //3C
   if (panas < banyak){
   ke = panas;
   }
   else if (panas > banyak){
   ke = banyak;
   }
   else if (panas == banyak){
   ke = banyak;
   }

   hasilke = ke;
   hasilsd = 0;
   hasillb = 0;
}


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

else if ((T <= 25) && (h == 200)){ //1B
   if (dingin < sedang){
   lb = dingin;
   }
   else if (dingin > sedang){
   lb = sedang;
   }
   else if (dingin == sedang){
   lb = sedang;
   }

   hasillb = lb;
   hasilsd = 0;
   hasilke = 0;
}

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

else if ((T > 25) && (T < 30) && (h == 200)){ //12B
   if (dingin < sedang){
   lb = dingin;
   }
   else if (dingin > sedang){
   lb = sedang;
   }
   else if (dingin == sedang){
   lb = sedang;
   }

   if (hangat < sedang){
   sd = hangat;
   }
   else if (hangat > sedang){
   sd = sedang;
   }
   else if (hangat == sedang){
   sd = sedang;
   }

   hasillb = lb;
   hasilsd = sd;
   hasilke = 0;
}

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

else if ((T == 30) && (h == 200)){ //2B
   if (hangat < sedang){
   sd = hangat;
   }
   else if (hangat > sedang){
   sd = sedang;
   }
   else if (hangat == sedang){
   sd = sedang;
   }

   hasilsd = sd;
   hasillb = 0;
   hasilke = 0;
  
}


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

else if ((T > 30) && (T < 35) && (h == 200)){ //23B
   if (hangat < sedang){
   sd = hangat;
   }
   else if (hangat > sedang){
   sd = sedang;
   }
   else if (hangat == sedang){
   sd = sedang;
   }

   if (panas < sedang){
   ke = panas;
   }
   else if (panas > sedang){
   ke = sedang;
   }
   else if (panas == sedang){
   ke = sedang;
   }
  
   hasilsd = sd;
   hasilke = ke;
   hasillb = 0;
}



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

else if ((T >= 35) && (h == 200)){  //3B
   if (panas < sedang){
   ke = panas;
   }
   else if (panas > sedang){
   ke = sedang;
   }
   else if (panas == sedang){
   ke = sedang;
   }

   hasilke = ke;
   hasilsd = 0;
   hasillb = 0;

}



//==================================================
//               Defuzzifikasi
//==================================================


//0-10-20-30
Coglb = 60;
Cogxlb = 4;

//40-50-60-70
Cogsd = 220;
Cogxsd = 4;

//80-90-100-110-120
Cogke = 500;
Cogxke = 5;

/*
//0-10-20-30-40-50
Coglb = 150;
Cogxlb = 6;

//60-70-80-90-100-110-120
Cogsd = 630;
Cogxsd = 7;

//130-140-150-160-170-180-190-200
Cogke = 1320;
Cogxke = 8;
*/
//Komlb = Coglb * hasillb;
//Komsd = Cogsd * hasilsd;
//Komke = Cogke * hasilke;

//Totalkom = Komlb + Komsd;
//Totalkom = Totalkom + Komke;

//Penlb = hasillb * Cogxlb;
//Pensd = hasilsd * Cogxsd;
//Penke = hasilke * Cogxke;

//Totalpen = Penlb + Pensd;
//Totalpen = Totalpen + Penke;

Totalkom = (Coglb * hasillb) + (Cogsd * hasilsd) + (Cogke * hasilke);

Totalpen = (hasillb * Cogxlb) + (hasilsd * Cogxsd) + (hasilke * Cogxke);

Cog = Totalkom / Totalpen;
  
   dimming = 128 - Cog;
  
   //Serial.print("Totalkom= ");
   //Serial.println(Totalkom);
   //Serial.print("Totalpen= ");
   //Serial.println(Totalpen);
   //Serial.print("COG= ");
   //Serial.println(Cog);
  
   lcd.setCursor (9,0);
   lcd.print ("D=");
   lcd.print (dimming,1);
   lcd.print ("  ");
  
   lcd.setCursor (10,1);
   lcd.print ("C=");
   lcd.print (Cog,1);
   lcd.print ("  ");
  
  
   delay(100);

}






i. Video Hasilnya














Membuat Alat ON / OFF Lampu Otomatis Menggunakan Sensor Cahaya (LDR) dan ARDUINO

Membuat Alat ON / OFF Lampu Otomatis Menggunakan Sensor Cahaya (LDR) dan ARDUINO


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang menggunakan Arduino dan sensor cahaya sebagai kendalinya, jadi alat ini adalah alat kendali lampu otomatis berdasarkan intensitas cahaya, jadi semisal kondisi gelap maka lampu akan otomatis menyala, kebalikannya jika kondisi terang maka lampu akan mati, untuk parameternya bisa diubah menggunakan koding pada Arduino. pada contoh jika nilai ADC <= 20 maka menyala namun jika ADC > 20 maka lampu akan mati, alat ini menggunakan relay untuk saklarnya. berikut adalah program dan skemanya. 




a. Arduino UNO





b. Relay 1 Channel





c. Sensor Cahaya (LDR)






d.Program Arduino

int relay = 12;

void setup(){
  Serial.begin(9600);
  pinMode(relay,OUTPUT);

}


void loop(){

  int dataadc = analogRead(A1);
 
  Serial.println(dataadc);

  if(dataadc <= 20){
  digitalWrite(relay,HIGH);
  }
  else{
  digitalWrite(relay,LOW);
  }
 
  delay(200);

}






e. Video Hasilnya










Mengakses PN532 RFID NFC Mifare Reader Dengan ARDUINO

Mengakses PN532 RFID NFC Mifare Reader Dengan ARDUINO


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara mengakses RFID Reader atau NFC / Mifare card PN532 menggunakan Arduino, pada penjelasan kali ini saya hanya menjelaskan bagaimana cara mengaksesnya saja dan bagaimana program yang tepat untuk membuat alatnya. jadi sistem kerjanya yaitu ada mifare card atau NFC yang mana akan dibaca datanya oleh PN532 yang kemudian datanya akan dikirm ke komputer melalui serial port. berikut adalah skema dan programnya.





a. Arduino Mega





b. Reader PN532 







c. Program Arduino IDE

 #include <Wire.h>
//#include <Adafruit_NFCShield_I2C.h>
#include <SPI.h>
#include <Adafruit_PN532.h>

// If using the breakout with SPI, define the pins for SPI communication.
#define PN532_SCK  (2)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)

#define IRQ   (2)
#define RESET (3)

Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

//Adafruit_NFCShield_I2C nfc(IRQ, RESET);

void setup(void) {
  Serial.begin(115200);
  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print(">Didn't find PN53x board, please close and open serial monitor. If problem still exist please check your wiring");
    while (1); // halt
  }
 
  // Got ok data, print it out!
  Serial.print(">Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);
  Serial.print(">Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
 
  // Set the max number of retry attempts to read from a card
  // This prevents us from waiting forever for a card, which is
  // the default behaviour of the PN532.
  //nfc.setPassiveActivationRetries(0xFF);
 
  // configure board to read RFID tags
  nfc.SAMConfig();
  
  //Serial.println("Waiting for an ISO14443A card");
}

void loop(void) {
  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
 
  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
 
  if (success) {
    //Serial.println("Found a card!");
    //Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    //Serial.print("UID Value: ");
    nfc.PrintHex(uid, uidLength);
    uint8_t keya[6] = { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 };
    success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 4, 0, keya);
    //if (success)
    //{
    //  Serial.println("Authentication work");
    //}
    //uint8_t data[16];
    uint8_t data[16];
    success = nfc.mifareclassic_ReadDataBlock(4, data);
    //success = nfc.mifareultralight_ReadPage (32, data);
    nfc.PrintHexChar(data, 16);
    // Wait 1 second before continuing
    delay(1000);
  }

}





d. VIDEO HASILNYA









 

Membuat Alat Monitor Ketinggian Badan Menggunakan Sensor Jarak PING dan OUTPUT Suara ISD1420

Membuat Alat Monitor Ketinggian Badan Menggunakan Sensor Jarak PING dan OUTPUT Suara ISD1420 ARDUINO


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang digunakan untuk mengukur jarak atau tinggi badan seseorang dengan menggunakan sensor jarak PING))) dan output suara ISD1420. jadi alat ini dilengkapi dengan dua buah interface pemberitahuan, yaitu pada tampilan lcd dan output suara. sehinga jika orang yang tuna netra dia akan mengetahui berapa tinggi badannya tanpa harus melihat di layar LCD. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Minimum System ATMega32 + Skema






b. Modul ISD1420





c. Sensor Jarak PING)))






d. LCD 16x2






e. Program Bascom AVR

$regfile = "m32def.dat"
$crystal = 16000000

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2

Config Timer1 = Timer , Prescale = 64

Declare Sub Regratusan
Declare Sub Regpuluhan
Declare Sub Regsatuan
Declare Sub Belakang

Sigout Alias Portb.0
Sigin Alias Pinb.0
Dirsig Alias Ddrb.0

Dim Data_timer As Integer
Dim Tinggi As Integer
Dim Ratusan As Integer
Dim Puluhan As Integer
Dim Satuan As Integer
Dim Temp As Integer


Dim A As Integer
Dim X As Integer
A = 0
X = 350

Ddrb.3 = 1
Ddrb.1 = 0
Portb.1 = 1

Ddra = &B11111111

Cls
Cursor Off


Do

Gosub Ambil_datatimer
Data_timer = Data_timer / 10

Tinggi = 200 - Data_timer

If Tinggi > 200 Then
Tinggi = 200
End If

If Tinggi < 1 Then
Tinggi = 0
End If

Locate 1 , 1
Lcd "Tinggi = " ; Tinggi ; " cm    "


Waitms 100

Temp = Tinggi
'Mencari angka Ratusan
Ratusan = Temp / 100
'Mencari angka Puluhan
Temp = Temp Mod 100
Puluhan = Temp / 10
'Mencari angka Satuan
Satuan = Temp Mod 10


'Locate 2 , 1
'Lcd Ratusan

'Locate 2 , 4
'Lcd Puluhan

'Locate 2 , 7
'Lcd Satuan


If Pinb.1 = 0 Then
Wait 1

Porta = 130
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X


If Ratusan = 1 Then
A = 0
Call Regratusan

Elseif Ratusan = 2 Then
A = 160
Call Regratusan

Elseif Ratusan = 3 Then
A = 170
Call Regratusan

Elseif Ratusan = 4 Then
A = 40
Call Regratusan

Elseif Ratusan = 5 Then
A = 50
Call Regratusan

Elseif Ratusan = 6 Then
A = 60
Call Regratusan

Elseif Ratusan = 7 Then
A = 70
Call Regratusan

Elseif Ratusan = 8 Then
A = 80
Call Regratusan

Elseif Ratusan = 9 Then
A = 90
Call Regratusan

End If


If Puluhan = 1 And Satuan = 1 Then
Porta = 0
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X


Porta = 120
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X


Elseif Puluhan = 1 And Satuan = 0 Then
Porta = 0
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X


Porta = 110
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X


Elseif Puluhan = 2 Then
A = 160
Call Regpuluhan

Elseif Puluhan = 3 Then
A = 170
Call Regpuluhan

Elseif Puluhan = 4 Then
A = 40
Call Regpuluhan

Elseif Puluhan = 5 Then
A = 50
Call Regpuluhan

Elseif Puluhan = 6 Then
A = 60
Call Regpuluhan

Elseif Puluhan = 7 Then
A = 70
Call Regpuluhan

Elseif Puluhan = 8 Then
A = 80
Call Regpuluhan

Elseif Puluhan = 9 Then
A = 90
Call Regpuluhan

End If

If Satuan = 1 And Puluhan <> 1 Then
A = 10
Call Regsatuan

Elseif Satuan = 2 Then
A = 160
Call Regsatuan

Elseif Satuan = 3 Then
A = 170
Call Regsatuan

Elseif Satuan = 4 Then
A = 40
Call Regsatuan

Elseif Satuan = 5 Then
A = 50
Call Regsatuan

Elseif Satuan = 6 Then
A = 60
Call Regsatuan

Elseif Satuan = 7 Then
A = 70
Call Regsatuan

Elseif Satuan = 8 Then
A = 80
Call Regsatuan

Elseif Satuan = 9 Then
A = 90
Call Regsatuan

End If

If Puluhan = 1 And Satuan <> 0 And Satuan <> 1 Then
Porta = 120
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X

End If

Porta = 150
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X

Waitms 500

End If

Loop


Ambil_datatimer:
Dirsig = 1
Set Sigout
Waitus 10
Reset Sigout

Dirsig = 0
Set Sigout
Bitwait Sigin , Set
Data_timer = 0
Timer1 = 0
Start Timer1
Do
If Sigin = 0 Then
Data_timer = Timer1
Stop Timer1
Exit Do
End If
If Tifr.2 = 1 Then
Stop Timer1
Tifr.2 = 1
Data_timer = 0
Exit Do
End If
Loop
Stop Timer1
Return





Sub Regratusan:
Portb.3 = 1
Porta = A
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X

Porta = 100
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X

End Sub
Return





Sub Regpuluhan:

Porta = A
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X


Porta = 110
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X


End Sub
Return


Sub Regsatuan:
Porta = A
Portb.3 = 0
Waitms X
Portb.3 = 1
Waitms X


End Sub
Return







f. VIDEO HASILNYA











Membuat Alat Pengukur Tegangan dan Arus AC serta Frequency 50 Hz

Membuat Alat Pengukur Tegangan dan Arus AC serta Frequency 50 Hz


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang digunakan untuk mengukur tegangan dan arus AC serta frequency 50 Hz, alat ini menggunakan sensor tegangan AC satu fasa zmpt101b dan sensor arus WCS1700, untuk sensor Frequency menggunakan Trafo step down dan voltage divider agar output menjadi 5v AC. untuk lebih jelasnya berikut adalah program dan skemanya. 




a. Arduino Mega





b. Sensor Tegangan AC ZMPT101B





c. Sensor Arus WCS1700





d. Sensor Frequency






e. Program Arduino IDE

#include "Wire.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(19, 18, 17, 16, 15, 14);

int input=5;        //pin yang digunakan adalah pin digital 5
//untuk di arduino mega disediakan khusus pin 5 & 6
int high_time;
int low_time;
float time_period;
float frequency;
float teta = 8.10961446;

unsigned long start_times[300];
unsigned long stop_times[300];
unsigned long values[300];

// Define various ADC prescaler
const unsigned char PS_16 = (1 << ADPS2);
const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

int a = 0;
int zero = 0;

void setup()
{
 
  // set up the ADC
  ADCSRA &= ~PS_128;  // remove bits set by Arduino library

  // you can choose a prescaler from above.
  // PS_16, PS_32, PS_64 or PS_128
  ADCSRA |= PS_128;    // set our own prescaler to 64

 lcd.begin(16, 2);
 lcd.clear();
 lcd.noCursor();

 Serial.begin(9600);
 pinMode(input,INPUT);

}

void loop()
{
   
  //tegangan AC =============================
  unsigned int i;
  unsigned int z;
  z = 0;
  
  // capture the values to memory
  for(i=0;i<300;i++) {
    start_times[i] = micros();
    values[i] = analogRead(A0);            

  if (values[i] >= z) {
  z = values[i];
  }
    stop_times[i] = micros();
  }

  int teg = z;
  z = 0;
  
  // capture the values to memory
  for(i=0;i<300;i++) {
    start_times[i] = micros();
    values[i] = analogRead(A1);            

  if (values[i] >= z) {
  z = values[i];
  }
    stop_times[i] = micros();
  }

 int arus = z;
 z = 0;

high_time=pulseIn(input,HIGH);
low_time=pulseIn(input,LOW);
time_period=high_time+low_time;
time_period=time_period/1000;
frequency=1000/time_period;
//////=============////////

 float arusx = (arus - 524.0) / 33.33;
 float tegx = (teg - 525.0) / 0.882;

if(arusx < 0){
arusx = 0.0;
}

if(tegx < 0){
tegx = 0.0;
}

float cosphi = 4 / (tegx * arusx);

float p = arusx * tegx * cosphi;
float a = p / (2 * 3.14 * frequency * tegx * tegx);
float b = tan(teta) * p / (2 * 3.14 * frequency * tegx * tegx);
float tetal = acos(cosphi);
float c = a * tan(tetal) - b;

  lcd.setCursor(0, 0);
  lcd.print("V= ");
  lcd.print(tegx);
  lcd.print(" ");
  lcd.setCursor(0, 1);
  lcd.print("I= ");
  lcd.print(arusx);
  lcd.setCursor(8, 0);
  lcd.print("F= ");
  lcd.print(frequency);
  lcd.setCursor(8, 1);
  lcd.print("C= ");
  lcd.print(cosphi);

delay(200);
delay(5000);

  lcd.clear();
 
  lcd.setCursor(0, 0);
  lcd.print("P= ");
  lcd.print(p);
  lcd.print(" ");
  lcd.setCursor(0, 1);
  lcd.print("a= ");
  lcd.print(a);
  lcd.setCursor(8, 0);
  lcd.print("b= ");
  lcd.print(b);
  lcd.setCursor(8, 1);
  lcd.print("T= ");
  lcd.print(tetal);

  delay(5000);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("C= ");
  lcd.print(c);
 
  delay(5000);
  lcd.clear();
 
}
 
 


f. VIDEO HASILNYA















Membuat Alat Kontrol Angle Servo Menggunakan PID Control ARDUINO

Membuat Alat Kontrol Angle Servo Menggunakan PID Control ARDUINO


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat untuk kendali angle servo dengan menggunakan PID Control sebagai penentu arah sudutnya. aplikasi dari alat ini bisa untuk buka tutup tempat sampah otomatis atau buka tutup pintu otomatis, prinsip kerjanya yaitu menggunakan sensor jarak SRF04 dan aktuatornya berupa servo, semakin dekat jaraknya maka servo akan semakin membuka / menutup atau menuju ke sudut tertentu yang telah diprogram menggunakan PID. untuk lebih jelasnnya berikut adalah skema dan programnya. 




a. Arduino UNO





b. Sensor Jarak SRF04





c. Motor Servo






d. Program Arduino IDE

#include <Servo.h>

#define trigPin 10
#define echoPin 11

Servo myservo;

int sp = 90;

float kp = 1.18;
float ki = 0.67;
float kd = 0.15;

float p,i,d,suhu,pid,pidx;
float error,errorx,sumerr;
long duration, distance;

void setup() {
  myservo.attach(9);
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  }

void loop() {

  error = sp - distance;
  p = error * kp;
  sumerr = error + errorx;
  i = ki * sumerr;
  d = error - errorx;
  pid = p + i + d;
  pid = 250.0 - pid;
 
  pidx = sp - pid;
 
  myservo.write(pidx);

  if(pidx < 1){
  pidx = 0;
  }
 
  if(pidx > 250){
  pidx = 250;
  }


  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  Serial.print(distance);
  Serial.println(" cm");
  Serial.print("PID= ");
  Serial.println(pidx);
  delay(200);

 errorx = error;

}





e. VIDEO HASILNYA











Membuat Alat Kendali Lampu dan Kipas ON/OFF Menggunakan Sensor PIR dan Suhu LM35

Membuat Alat Kendali Lampu dan Kipas ON/OFF Menggunakan Sensor PIR dan Suhu LM35


          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat dengan menggunakan sensor gerakan atau manusia yaitu PIR dan sensor suhu LM35, jadi prinsip kerja alat ini yaitu ketika ada orang masuk maka lampu akan menyala secara otomatis kemudian jika suhu yang dideteksi didalam ruangan lebih dari 28 derajat celcius maka kipas akan menyala secara otomatis, kemudian jika suhu sudah 16 derajat celcius maka kipas akan mati sendiri, mikrokontroller yang digunakan yaitu Arduino Uno dan kendalinya menggunakan relay. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Arduino Uno + Skema






b. Sensor Gerakan PIR





c. Sensor Suhu LM35






d. Relay






e. Program Arduino IDE

float suhu;
int pir;
int dataadc;

int lampu = 2;
int ac = 3;
int x = 0;

void setup(){
Serial.begin(9600);
pinMode(lampu,OUTPUT);
pinMode(ac,OUTPUT);
pinMode(4,INPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
}


void loop(){

  dataadc = analogRead(A5);
  suhu = dataadc*(5.0 /1023.0)*100.0;
 
  pir = digitalRead(4);
 
  if((pir == 1)&&(x == 0)){
  digitalWrite(lampu,HIGH);
  digitalWrite(9,HIGH);
  delay(5000);
  pir = 0; 
  x = 1;
  }
 
  if((pir == 1)&&(x == 1)){
  digitalWrite(lampu,LOW);
  digitalWrite(ac,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  delay(5000);
  pir = 0;
  x = 0;
  }
   
  Serial.println("Suhu= ");
  Serial.println(suhu);
  Serial.println("PIR= ");
  Serial.println(pir);
 
  if((suhu >= 28)&&(x == 1)){
  digitalWrite(ac,HIGH);
  digitalWrite(8,HIGH);
  }
 
  if((suhu <= 16)&&(x == 1)){
  digitalWrite(ac,LOW);
  digitalWrite(8,LOW);
  }
   
  delay(200);
 
}





f. VIDEO HASILNYA