Translate

Membuat Alat Monitor Daya, Tegangan 220v ZMPT101b dan Arus AC ACS712 / KWH Meter / Token Pulsa Listrik Menggunakan ATMega CV AVR dan Interface VB 6

Membuat Alat Monitor Daya, Tegangan 220v ZMPT101b dan Arus AC ACS712  / KWH Meter / Token Pulsa Listrik Menggunakan ATMega CV AVR dan Interface VB 6


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa digunakan untuk monitoring tegangan dan arus AC 220v 50Hz kemudian dicari daya-nya sehingga bisa dibuat KWH meter, alat ini menggunakan mikrokontroller ATMega32 dan bahasa CV AVR, prinsip kerja alat ini yaitu hanya mengambil data tegangan dan arus kemudian dicari nilai daya dengan mengkalikan nilai arus dan tegangan, selain itu alat ini juga terdapat fitur memasukkan nilai menggunakan keypad matrik3x4 sesuai kebutuhan daya yang dipakai, jika beban yang terdeteksi melebihi daya maka relay akan aktif dan mematikan sumber tegangan pada beban seperti halnya fuse, namun jika daya yang kita inputkan masih diatas dengan daya yang termonitoring maka output masih menyala. alat ini menggunakan interface VB 6 dan LCD sebagai penampilnya. untuk lebih jelasnya berikut adalah skema dan program keseluruhannya.




a. Minimum System ATMega32





b. Keypad matrik 3x4





c. RTC DS1307





d. LCD 16x2






e. Sensor Tegangan ZMPT101B





f. Sensor Arus ACS712





g. Modul Relay






h. Program CodeVision AVR

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional

Chip type               : ATmega32
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32.h>

#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

// I2C Bus functions
#asm
   .equ __i2c_port=0x15 ;PORTC
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>

// Alphanumeric LCD Module functions
#include <alcd.h>


#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here
char buf[33];
unsigned char dd;
unsigned char mm;
unsigned char yy;
unsigned char detik;
unsigned char menit;
unsigned char jam;

int biaya;
int dataadc;
char temp[10];
char temp1[10];
char temp2[10];
char temp3[10];
char temp4[10];
int z,zm,zk,zs;
int i,k,m,s;
int values[300];
float vrms;

float p;
char temp5[10];

int dataadcx;
char tempx[10];
char temp1x[10];
char temp2x[10];
char temp3x[10];
char temp4x[10];
int zx,zmx,zkx,zsx;
int ix,kx,mx,sx;
int valuesx[300];
float irms;

void simpan_dlm_1variabel();
void scanning_keypad();
void tampil_lcd();
void inputdaya();

float nilai = 0;
unsigned char tempo[12];
unsigned char array[10];
int n=0;


void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB = 0XFF;
DDRB=0XF0;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=T State0=T
PORTC=0x00;
DDRC=0xFC;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 2
// RD - PORTD Bit 3
// EN - PORTD Bit 4
// D4 - PORTD Bit 5
// D5 - PORTD Bit 6
// D6 - PORTD Bit 7
// D7 - PORTC Bit 2
// Characters/line: 16
lcd_init(16);

//rtc_set_time(22,30,00);
//rtc_set_date(8,8,17);

while (1)
      {
          
      rtc_get_time(&jam,&menit,&detik);
      rtc_get_date(&dd,&mm,&yy);
      lcd_gotoxy(0,0);
      sprintf(buf,"%02u:%02u:%02u",jam,menit,detik);
      lcd_puts(buf);
      //printf("Tanggal: %02u:%02u:%02u \r",dd,mm,yy);
      //printf("Waktu  : %02u:%02u:%02u \r",h,m,s);  
          
              
      for(i=0;i<300;i++) {
        values[i] = read_adc(0);            

      if (values[i] >= z) {
        z = values[i];
      }        
    
      } 
    
      for(k=0;k<300;k++) {
        values[k] = read_adc(0);            

      if (values[k] >= zk) {
        zk = values[k];
      }        
    
      }
    
      for(m=0;m<300;m++) {
        values[m] = read_adc(0);            

      if (values[m] >= zm) {
        zm = values[m];
      }        
    
      }
    
      for(s=0;s<300;s++) {
        values[s] = read_adc(0);            

      if (values[s] >= zs) {
        zs = values[s];
      }        
    
      }


      if((z >= zk)&&(z >= zm)&&(z >= zs)){  
         vrms = (float)(z - 518.1) / 0.413;
         if(vrms < 100){
         vrms = 0;
         }
         ftoa(vrms,1,temp);
      }
      if((zk >= z)&&(zk >= zm)&&(zk >= zs)){  
         vrms = (float)(zk - 518.1) / 0.413;
         if(vrms < 100){
         vrms = 0;
         }
         ftoa(vrms,1,temp);
      }
      if((zm >= z)&&(zm >= zk)&&(zm >= zs)){   
         vrms = (float)(zm - 518.1) / 0.413;
         if(vrms < 100){
         vrms = 0;
         }
         ftoa(vrms,1,temp);
      }
      if((zs >= z)&&(zs >= zk)&&(zs >= zm)){
         vrms = (float)(zs - 518.1) / 0.413;
         if(vrms < 100){
         vrms = 0;
         }
         ftoa(vrms,1,temp);
      }

       
      
   
      z = 0;
      zk = 0;
      zm = 0;
      zs = 0;
     
     
     
      //======================================================
     
      for(ix=0;ix<300;ix++) {
        valuesx[ix] = read_adc(1);            

      if (valuesx[ix] >= zx) {
        zx = valuesx[ix];
      }        
    
      }  
    
      for(kx=0;kx<300;kx++) {
        valuesx[kx] = read_adc(1);            

      if (valuesx[kx] >= zkx) {
        zkx = valuesx[kx];
      }        
    
      }
    
      for(mx=0;mx<300;mx++) {
        valuesx[mx] = read_adc(1);            

      if (valuesx[mx] >= zmx) {
        zmx = valuesx[mx];
      }        
    
      }
    
      for(sx=0;sx<300;sx++) {
        valuesx[sx] = read_adc(1);            

      if (valuesx[sx] >= zsx) {
        zsx = valuesx[sx];
      }        
    
      }


      if((zx >= zkx)&&(zx >= zmx)&&(zx >= zsx)){
         irms = (float)(zx * (5.0/1023.0));
         irms = (float)(irms - 2.50) / 0.1;
         if(irms < 0){
         irms = 0;
         }
         ftoa(irms,2,tempx);
      }
      if((zkx >= zx)&&(zkx >= zmx)&&(zkx >= zsx)){
         irms = (float)(zkx * (5.0/1023.0));
         irms = (float)(irms - 2.50) / 0.1;
         if(irms < 0){
         irms = 0;
         }
         ftoa(irms,2,tempx);
      }
      if((zmx >= zx)&&(zmx >= zkx)&&(zmx >= zsx)){
         irms = (float)(zmx * (5.0/1023.0));
         irms = (float)(irms - 2.50) / 0.1; 
         if(irms < 0){
         irms = 0;
         }
         ftoa(irms,2,tempx);
      }
      if((zsx >= zx)&&(zsx >= zkx)&&(zsx >= zmx)){
         irms = (float)(zsx * (5.0/1023.0));
         irms = (float)(irms - 2.50) / 0.1;  
         if(irms < 0){
         irms = 0;
         }
         ftoa(irms,2,tempx);
      }
       
     
        
        PORTB = 0b11011111;
        delay_ms(20);
        if(PINB.2 == 0){
        delay_ms(200);
               
        lcd_gotoxy(0,1);
        lcd_putsf("V=");
        lcd_puts(temp);
        lcd_putsf("   ");
      
        lcd_gotoxy(8,1);
        lcd_putsf("I=");
        lcd_puts(tempx);
        lcd_putsf("   ");
       
        }
       
        if(PINB.2 == 1){
        delay_ms(200);
        lcd_gotoxy(0,1);      
        lcd_putsf("Pmax= ");
        lcd_puts(tempo);
        lcd_putsf(" watt            ");            
        }
       
       
        p = (float)(vrms * irms);
       
        ftoa(p,1,temp5);
       
        lcd_gotoxy(9,0);
        lcd_putsf("P=");
        lcd_puts(temp5);
        lcd_putsf(" ");
       
      delay_ms(200);
    
      zx = 0;
      zkx = 0;
      zmx = 0;
      zsx = 0;
     
       PORTB = 0b10111111;
       delay_ms(20);
       if(PINB.3 == 0){
       delay_ms(2000);
        i=0;
        nilai=0;
       lcd_clear();
       inputdaya();
      
       } 
      
      
       if(p > nilai){
       //off
        PORTC.7 = 0;
       }
       if(p < nilai){
       //on
        PORTC.7 = 1;
       }
      
        if((p > nilai - 20)&&(p > 0)){
       //off
        PORTC.6 = 0;
        delay_ms(200);
        PORTC.6 = 1;
        delay_ms(200);
       }
       if(p < nilai - 20){
       //on
        PORTC.6 = 0;
       }
      
       biaya = p * 450;
      
       printf("%0.1f",vrms);
       putchar('|');
       printf("%0.1f",irms);
       putchar('|');
       printf("%0.1f",p);
       putchar('|');
       printf("%i",biaya);
       putchar('|');                        
      } 
     
}


void inputdaya(){

        PORTC.6 = 0;
       
        scanning_keypad();
        tampil_lcd();
       
        PORTB = 0b11101111;
        delay_ms(20);
        if(PINB.3 == 0){
        delay_ms(200);
        lcd_clear();
        return;
        } //*

        delay_ms(200);
        inputdaya();
}

void scanning_keypad()
{

 int waktu = 300;

 PORTB = 0b10111111;
 delay_ms(20);
 if(PINB.2 == 0){n++; array[n]=9; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.1 == 0){n++; array[n]=6; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.0 == 0){n++; array[n]=3; simpan_dlm_1variabel();delay_ms(waktu);}

 PORTB = 0b11011111;
 delay_ms(20);
 if(PINB.3 == 0){n++; array[n]=0; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.2 == 0){n++; array[n]=8; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.1 == 0){n++; array[n]=5; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.0 == 0){n++; array[n]=2; simpan_dlm_1variabel();delay_ms(waktu);}

 PORTB = 0b11101111;
 delay_ms(20);
 if(PINB.2 == 0){n++; array[n]=7; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.1 == 0){n++; array[n]=4; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.0 == 0){n++; array[n]=1; simpan_dlm_1variabel();delay_ms(waktu);}


}

void simpan_dlm_1variabel()
{
    if ( n == 1 ){nilai = array[n];}
    if ( n >= 2 &&  n <= 8 )
    {
        nilai = (nilai*10)+array[n];
    }
   
}

void tampil_lcd()
{
 lcd_gotoxy(0,0);
 lcd_putsf("Input Daya");
 if(nilai>0)
 {
    ftoa(nilai,0,tempo);
    lcd_gotoxy(0,1);
    lcd_puts(tempo);
 }        

}






i. Program Interface VB 6


Option Explicit
Dim arrdata()
Dim TotalBaca As Integer
Dim BMI As Single
Dim Keterangan As String
Const MAKSBACA = 30
Dim sHari As String
Dim aHari



Private Sub berhenti_Click()
  start.Enabled = True
    berhenti.Enabled = False
    TimerBaca.Enabled = False
End Sub


Private Sub Command2_Click()
Unload Me
End Sub



Private Sub Form_Load()
Dim i As Byte
For i = 1 To 16
    ComboCOM.AddItem (i)
Next i
 aHari = Array("Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu")

End Sub



Private Sub MSComm2_OnComm()
Dim buffer As String
Dim temp As String
Dim pisah() As String
Dim i As Integer

If MSComm2.CommEvent = comEvReceive Then
    buffer = MSComm2.Input
    'pisah = Split(buffer, Chr$(13))
    pisah = Split(buffer, "|")

On Error Resume Next
If buffer <> " " Then
With Text1
    .SelStart = Len(.Text)
    .SelText = buffer
End With
For i = 0 To 4
    If 0 < 5 Then
        Text2(i).Text = CStr(pisah(i))
        End If
        Next i
    Else
    buffer = " "
    End If
End If
End Sub

Private Sub start_Click()
Dim u As Integer

    On Error GoTo ada_eror
   
    MSComm2.CommPort = ComboCOM.Text
    MSComm2.Settings = "9600,N,8,1"
    MSComm2.RThreshold = 20
    MSComm2.InputLen = 20
    MSComm2.InputMode = comInputModeText
    MSComm2.PortOpen = True ' buka port
   
    ReDim arrdata(1 To MAKSBACA + 1)
    For u = 1 To MAKSBACA
        arrdata(u) = 0
    Next
    TotalBaca = 0
    start.Enabled = False
    berhenti.Enabled = True
    TimerBaca.Enabled = True
ada_eror:
 If ComboCOM.ListIndex < 1 Then
    MsgBox "COM berada di Nomor : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "ERROR"
    start.Enabled = True
    berhenti.Enabled = True
    ComboCOM.Text = "Pilih COM"
End If
End Sub

Private Sub Timer1_Timer()
 sHari = aHari(Abs(Weekday(Date) - 1))
 Text3.Text = "" & sHari & "," & Format(Date, "dd mmmm yyyy")
 Text4.Text = Format(Time, "hh:mm:ss")
End Sub

Private Sub TimerBaca_Timer()
Dim strInput As String
Dim strPotong As String
Dim singleInput As Single
Dim u As Integer
    strInput = MSComm2.Input
        strPotong = strInput
        'Text1.Text = Text1.Text + strPotong + vbCrLf
        'singleInput = Val(strPotong)
        'Label1.Caption = singleInput
        If TotalBaca >= MAKSBACA Then
            TimerBaca.Enabled = False
            If MSComm2.PortOpen = True Then MSComm2.PortOpen = False
            Call berhenti_Click
        End If
 
End Sub






j. VIDEO HASILNYA











ARDUINO Monitoring Daya, Tegangan AC 220v zmpt101b dan Arus AC TRAFO CT ARUS VIA SMS GATEWAY SIM800L

ARDUINO Monitoring Daya, Tegangan AC 220v zmpt101b dan Arus AC TRAFO CT ARUS VIA SMS GATEWAY SIM800L


        Pada pembahasan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang digunakan untuk me-monitoring daya yaitu tegangan dan arus AC 220v 50Hz dengan menggunakan Arduino dan sensor yang digunakan adalah zmpt101b dan trafo arus CT 60/5 kemudian modul sms gateway yang digunakan adalah SIM800L. jadi alat ini bisa mengirimkan informasi terkait daya yang sedang di-sensing oleh sensor saat kita kirimkan sms "Monitor" ke alat maka akan dibalas dengan "DAYA = xxxxx watt" seperti itu gambarannya. yang perlu diperhatikan yaitu cara kalibrasi kedua sensor tersebut agar didapatkan nilai yang tepat. untuk lebih jelasnya berikut adalah program dan skemanya.




a. Arduino Mega





b. Sensor Tegangan AC ZMPT101B





c. Sensor Arus Trafo CT 60/5







d. Modul SMS Gateway SIM800L + Buck Converter








e. Program Arduino IDE

//supply SIM800L adalah 4v
//RX-TX Arduino Mega untuk sim800l adalah pin 50 dan 51
//rubah library SIM800l pada GSM.cpp ganti ke pin 50 dan 51


#include "SIM900.h"
#include <SoftwareSerial.h>

//#include <stdlib.h>
#include "sms.h"
SMSGSM sms;


#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //i2C LCD Library

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);

char string[160];
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
char strsms[5];

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 = 1;
int vin = 0;
int iin = 0;



void setup() {

  lcd.begin();
  lcd.clear();
  lcd.noCursor();

  Serial.begin(9600);

  // 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

  Serial.println("GSM Shield testing.");

  if (gsm.begin(2400)){
    Serial.println("\nstatus=READY");
    started=true;
  }
  else Serial.println("\nstatus=IDLE");


if(started) {
          //Enable this two lines if you want to send an SMS.
          if (sms.SendSMS("085604457904", "Ready"))
          Serial.println("\nSMS sent OK");
     }


}


void loop() {

  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 vin = 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();
  }
     float v1 = z * (5.0/1023.0);
     float iin = (v1-2.5)/0.1 ;

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();
  }
     float v1x = z * (5.0/1023.0);
     float iinx = (v1x-2.5)/0.1 ;

float iintot = (iin + iinx) / 2;

if (iintot < 0) {
iintot = 0;
}

 z = 0;

float vrms = (vin - 559.9) / 0.413 ;

if (vrms < 0) {
vrms = 0;
}

float p = vrms * iin;

 sprintf(string,"Daya: %s watt", dtostrf(p, 8, 5, strsms));

 if(gsm.begin(9600)){
  started=true;
 }
 int pos=0;
 if(started){
  pos=sms.IsSMSPresent(SMS_ALL);
  if(pos){
    sms.GetSMS(pos,n,smsbuffer,100);
  
    if(!strcmp(smsbuffer,"monitor")){
      sms.SendSMS(n,string);
    }
    if(!strcmp(smsbuffer,"Monitor")){
      sms.SendSMS(n,string);
    }
 
    delsms();
  }
 }

  lcd.setCursor(0, 0);
  lcd.print("v=");
  lcd.print(vrms,1);
 
  lcd.print(" I=");
  lcd.print(iintot);
  lcd.print("     ");
 
  lcd.setCursor(0, 1);
  lcd.print("P=");
  lcd.print(p,1);
  lcd.print("     ");

delay(200);

}

void delsms()
{
  for (int i=0; i<10; i++)
  {
      int pos=sms.IsSMSPresent(SMS_ALL);
      if (pos!=0)
      {
        if (sms.DeleteSMS(pos)==1){}else{}
      }
  }
}





f. VIDEO HASILNYA








Membuat Kendali Stop Kontak / Saklar Menggunakan HP Android via Bluetooth BASCOM AVR

Membuat Kendali Stop Kontak / Saklar Menggunakan HP Android via Bluetooth BASCOM AVR


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa mengendalikan stop kontak on dan off menggunakan handphone android, alat ini sama halnya dengan stop kontak biasa yang mana perbedaannya yaitu terletak pada efisiensi waktu dan jarak, jika saklar atau stop kontak manual masih menggunakan tombol on/off sehingga diperlukan energi dan gerakan untuk mematikan atau menghidupkan saklar tersebut, namun jika menggunakan handphone android, si pengguna tidak perlu repot-repot datang ketempat saklar lalu menekan tombol, yang perlu dilakukan hanyalah hidupkan handphone dan duduk dimanapun berada lalu tekan tombol pada interface aplikasi yang terhubung pada handphone, jarak yang diijinkan sekitar 5 - 10 meter namun jika diarea terbuka bisa mencapai 20 meter, alat ini menggunakan komunikasi bluetooth sehingga harus dipastikan handhpone tersebut memiliki fitur bluetooth, yang bisa dikendalikan oleh saklar ini yaitu segala macam peralatan elektronik rumah tangga dengan daya yang rendah. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Minimum System ATMega16






b. Bluetooth HC-05





c. Modul Relay + Buzzer





d. Stop Kontak 






e. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 12000000
$baud = 9600

Ddrd.7 = 1
Ddrd.6 = 1
Ddrd.5 = 1

Ddra = &B11111111

Porta.7 = 0
Porta.6 = 0
Porta.5 = 0

Portd.7 = 0
Portd.6 = 0
Portd.5 = 0


Porta.0 = 1
Waitms 200

Porta.0 = 0
Waitms 200

Porta.0 = 1
Waitms 200

Porta.0 = 0
Waitms 200

Porta.0 = 1
Waitms 200

Porta.0 = 0
Waitms 200


Dim Perintah As String * 10

Cls
Cursor Off

Do

Perintah = Waitkey()

Select Case Perintah

    Case "a" :
    Porta.7 = 1
    Portd.7 = 1

    Case "b" :
    Porta.7 = 0
    Portd.7 = 0

    Case "c" :
    Porta.6 = 1
    Portd.6 = 1

    Case "d" :
    Porta.6 = 0
    Portd.6 = 0

    Case "e" :
    Porta.5 = 1
    Portd.5 = 1

    Case "f" :
    Porta.5 = 0
    Portd.5 = 0


  End Select

Loop





f. Program Android








g. VIDEO HASILNYA











 

Membuat Conveyor System Alat Pemisah Kayu Otomatis Menggunakan Arduino dan Sensor jarak HC-SRF04

Membuat Conveyor System Alat Pemisah Kayu Otomatis Menggunakan Arduino dan Sensor jarak HC-SRF04


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang menggunakan sistem konveyor sebagai penggeraknya yang mana difungsikan untuk pemilah kayu atau pemisah kayu yang standart ukurannya dan yang tidak standart ukurannya, jadi ada dua tempat peletakkan pada ujung konveyor, jika kayu didefinisikan kayu standart maka akan masuk ke kotak kayu standart namun jika tidak standart maka akan masuk ke kayu reject, alat ini menggunakan arduino sebagai kontrollernya dan pemisah kayu menggunakan motor servo, untuk sensor deteksi kayu menggunakan sensor jarak HC-SRF04 sebanyak 2 buah yang dipasang dibagaian atas dan bawah, untuk lebih jelasnya berkut adalah skema dan programnya.




a. Arduino UNO dan i2C LCD





b. Sensor Jarak HC-SRF04





c. Motor Servo





d. Motor DC + Gearbox






e. Sistem Konveyor






f. Program Arduino IDE

#include<Wire.h>
#include<Servo.h>
#include<LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);

Servo myservo;
const int TRIG_PIN1=10;
const int ECHO_PIN1=11;

int counter = 0;
int cacat = 0;

const int TRIG_PIN2=3;
const int ECHO_PIN2=4;

long duration1,distanceCm1;
long duration2,distanceCm2;

int normal = 0;
int x = 100;

int waktu = 20;

int btlihat = 5;
int btreset = 6;

int btlihatx = 0;
int btresetx = 0;

void setup(){
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
   
  pinMode(TRIG_PIN1,OUTPUT);
  pinMode(ECHO_PIN1,INPUT);

  pinMode(TRIG_PIN2,OUTPUT);
  pinMode(ECHO_PIN2,INPUT);
 
  pinMode(btlihat,INPUT_PULLUP);
  pinMode(btreset,INPUT_PULLUP);
 
  myservo.attach(9);
  myservo.write(5);
 
}

void loop(){
 
    btlihatx = digitalRead(btlihat);

    if(btlihatx == 0){
    lcd.clear(); 
    delay(3000);
    btlihatx = 1;
    setting();
    }

    digitalWrite(TRIG_PIN1,LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN1,HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN1,LOW);
    duration1=pulseIn(ECHO_PIN1,HIGH);
   
    distanceCm1=duration1/29.1/2;
   
    lcd.setCursor(0,1);
    lcd.print(distanceCm1);
    lcd.print(" bawah   ");
       
    digitalWrite(TRIG_PIN2,LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN2,HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN2,LOW);
    duration2=pulseIn(ECHO_PIN2,HIGH);
   
    distanceCm2=duration2/29.1/2;
   
    lcd.setCursor(0,0);
    lcd.print(distanceCm2);
    lcd.print(" atas   ");


if(distanceCm2 == 10){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("proses");
    sampling();
}

}


void sampling(){

    digitalWrite(TRIG_PIN1,LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN1,HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN1,LOW);
    duration1=pulseIn(ECHO_PIN1,HIGH);
   
    distanceCm1=duration1/29.1/2;
           
    digitalWrite(TRIG_PIN2,LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN2,HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN2,LOW);
    duration2=pulseIn(ECHO_PIN2,HIGH);
   
    distanceCm2=duration2/29.1/2;

    lcd.setCursor(0,0);
    lcd.print("UP = ");
    lcd.print(distanceCm2);
    lcd.print("   ");
    lcd.print(counter);
   
    lcd.setCursor(0,1);
    lcd.print("BOT = ");
    lcd.print(distanceCm1);
    lcd.print("   ");

if((distanceCm2 == 14)&&(counter < waktu))
{
delay(1000);
myservo.write(10);
delay(x);
myservo.write(20);
delay(x);
myservo.write(30);
delay(x);
myservo.write(40);
delay(x);
myservo.write(50);
delay(x);
myservo.write(60);
delay(x);
myservo.write(70);
delay(x);
myservo.write(80);
delay(x);
myservo.write(90);
delay(x);
myservo.write(5);
counter = 0;
lcd.clear();
delay(1000);
lcd.setCursor(0,0);
lcd.print("REJECT");
delay(3000);
lcd.clear();
cacat++;
return;
}


if((distanceCm1 == 7)&&(counter < waktu))
{
delay(1000);
myservo.write(10);
delay(x);
myservo.write(20);
delay(x);
myservo.write(30);
delay(x);
myservo.write(40);
delay(x);
myservo.write(50);
delay(x);
myservo.write(60);
delay(x);
myservo.write(70);
delay(x);
myservo.write(80);
delay(x);
myservo.write(90);
delay(x);
myservo.write(5);
counter = 0;
lcd.clear();
delay(1000);
cacat++;
lcd.setCursor(0,0);
lcd.print("REJECT");
delay(3000);
lcd.clear();
return;
}


counter++;


if(counter > waktu){
lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("STANDART");
counter = 0;
delay(3000);
lcd.clear();
normal++;
return;
}

sampling();
}




void setting(){

    btresetx = digitalRead(btreset);
    btlihatx = digitalRead(btlihat);
   
    if(btresetx == 0){
    cacat = 0;
    normal = 0;
    }
   
    if(btlihatx == 0){     
    lcd.clear(); 
    btlihatx = 1;
    delay(3000);
    return;
    }
   
    lcd.setCursor(0,0);
    lcd.print("REJECT = ");
    lcd.print(cacat);
    lcd.setCursor(0,1);
    lcd.print("STANDART = ");
    lcd.print(normal);

 delay(200);
 setting();
}





g. VIDEO HASILNYA












Cara Mengakses I2C LCD ARDUINO ( SCANNER I2C LCD )

Cara Mengakses I2C LCD ARDUINO ( SCANNER I2C LCD )


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara mengekases sebuah device yang digunakan untuk interface seperti nilai sensor atau nilai adc dan indikator suatu keadaan, yaitu LCD i2C, perlu diperhatikan bahwa device I2C LCD ini memiliki keunikan dibanding dengan device lain salah satunya yaitu alamat address yang tidak sama, maka dari itu disini akan dijelaskan bagaimana cara mengaksesnya dan bagaimana cara membuatnya, pada contoh kali ini dicontohkan pada LCD 16x2 yang memiliki 16 kolom dan 2 baris, untuk library bisa didownload di link berikut. perlu diketahui jika membeli i2C lcd langkah yang harus diperhatikan pertama kali adalah scanning nilai addressnya, biasanya ada 2 address yaitu 0x27 atau 0x3F, sebenernya masih ada variasi lain namun kedua address itu yang sering ditemui. untuk lebih jelasnya berikut adalah skema dan program scannernya.


Link Library DOWNLOAD



a. Arduino UNO





b. LCD 16x2





c. I2C LCD Modul





d. Cara Pemasangan






e. Program Scanner Address I2C

//Pertama sertakan library Wire.h
#include <Wire.h>

void setup() {
  Serial.begin (9600);
  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }
  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 8; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup
 

void loop() {
//empty

}





f. Program Menampilkan LCD Menggunakan I2C

#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x3F, 16, 2);

void setup(){
lcd.begin();
lcd.clear();
lcd.noCursor();
}

void loop(){
  lcd.setCursor(0,0);
  lcd.print("YANUAR M");
}






g. VIDEO HASILNYA











Kursus Robotika dan Mikrokontroller untuk SD - SMP - SMA

Kursus Robotika dan Mikrokontroller untuk SD - SMP - SMA


Pada kesempatan kali ini kami resmi mengumumkan untuk kursus atau pelatihan robotik dan mikrokontroller untuk level SD, SMP dan SMA, adapun sistem pelatihan yang kami lakukan yaitu dengan praktek dan teori jadi siswa akan kami ajarkan secara praktek bagaimana cara membuat sebuah alat instrumentsi yang berguna dan bagaimana cara membuat sebuah robot yang bisa membantu manusia atau untuk sekedar lomba. Untuk tiap level akan berbeda materi pelatihan dan metode mengajarnya, untuk lebih detailnya berikut kami jelaskan sistemnya.

                                  
Sistem Pelatihan:
1. Trainer mengajar di sekolah / di lab komputer
2. Waktu pelatihan setelah jam sekolah
3. Bisa sebagai mapel ekstrakulikuler
4. Jumlah pertemuan per bulan 8 kali
5. Waktu pelatihan maksimal 2.5 jam


Biaya:
1. Biaya untuk trainer / pelatih per bulan Rp. 2.000.000,-  


Biaya Kelengkapan Pelatihan:
1. Modul pelatihan per anak Rp. 300.000,- (Beli komponen)
2. Buku pelatihan per anak Rp. 50.000,- (hard copy)
3. Biaya kelengkapan ini hanya sekali saja bayar diawal  













Jasa Program ARDUINO dan Mikrokontroller AVR untuk UMUM

Jasa Program ARDUINO dan Mikrokontroller AVR untuk UMUM


        Akhirnya pada kesempatan kali kami mengumumkan bahwa jasa program Arduino dan AVR resmi dibuka, kami menyediakan beberapa pilihan program yaitu ARDUINO, CodeVision AVR dan Bascom AVR, kemudian program interface yang bisa kami buat yaitu Visual Basic 6 dan Delphi 7. biaya yang kami tawarkan bervariaasi tergantung tingkat kesulitan program dan mekanisme hardware yang dipakai, kami bisa menyelesaikan program paling cepat 1 hari dan itu program yang kami anggap mudah atau sudah pernah kami buat sebelumnya, untuk program yang sulit atau yang belum pernah kami buat estimasi waktu 3 hari - 2 minggu. demikian informasi yang bisa kami berikan untuk lebih jelasnya silahkan Whatsup di nomer 085726496643 (Yanuar M).


Program Mikrokontroller:
1. Arduino IDE
2. CodeVision AVR
3. Bascom AVR


Program Interface Komputer:
1. Visual Basic 6
2. Visual Studio 2010
3. Delphi 7


Program Interface Web:
1. HTML
2. PHP
3. MySQL
4.Java Script