Translate

JUAL MODUL KENDALI MENGGUNAKAN KONTROL WAKTU

JUAL MODUL KENDALI MENGGUNAKAN KONTROL WAKTU

Harga : Rp. 1.500.000

      



1. Penjelasan Alat dan Gambar :

             Alat ini baik digunakan untuk kendali beberapa device atau perakat yang menggunakan control timer / pewaktu, terdapat mikrokontroller yang berfungsi sebagai pengolah data sensor suhu dan juga eksekutor perangkat melalui relay dan transistor, sensor suhu yang dipakai adalah DHT11 yang memikliki error 2%, jadi cukup bagus jika digunakan sebagai sensor yang akurat. Terdapat modul RTC atau Real Time Clock yang berfungsi sebagai pengatur waktu yang diinginkan, jadi pengguna bisa men-setting kapan waktu nyala misal pompa dan juga waktu matinya. Dilengkapi juga dengan tombol yang digunakan untuk men-setting waktu on dan off-nya.

A.  Pada Gambar yang ditunjukkan oleh anak panah A adalah empat buah tombol yang berfungsi untuk setting, input data dan menyimpan data.

B. Pada anak panah B adalah RTC (Real Time Clock) module yang berfungsi sebagai control waktu dan timer, baik itu hari / tanggal dan juga jam , jadi saat mikrokontroller dalam keadaan mati atau off, jam yang akan ditampilkan saat mikrokontroller dihidupkan kembali adalah benar atau menunjukkan waktu sekarang

C. Pada anak panah C adalah sebuah LCD display yang berfungsi untuk menampilkan data baik itu tulisan maupun jam dan tanggal

D. Pada anak panah D adalah modul relay yang berfungsi untuk menghidupkan atau mematikan pompa dengan batas maksimal arus adalah 10A.

E. Pada anak panah E adalah mikrokontroller ATMega16 yang berfungsi untuk mengolah data baik itu data analog maupun digital, dan juga sebagai eksekusi data dari sensor maupun dari device lainnya

F. Pada anak panah F adalah sebuah battery CR 2023 yang digunakan sebagai supply RTC agar saat mikro tidak diberikan tegangan, IC RTC tetap berjalan, sehingga data yang ditampilkan adalah data real time.

G. Pada anak panah G adalah sebuah transistor 2N3904 yang berfungsi sebagai saklar ON/OFF kipas, kipas membutuhkan tegangan 12 volt dc sedangkan mikrokontroller hanya bisa memberikan 5 v dc, sehingga dipakailah transistor.




2. Skematik Alat






3. Video Demo Alat dan Cara Penggunaan

















Cara Menggunakan RTC Module Arduino

Cara Menggunakan RTC Module Arduino


          Kali ini saya akan menjelaskan mengenai bagaimana cara mengakses RTC menggunakan Arduino, saya mendapatkan banyak sekali referensi library RTC namun setelah saya coba, hasilnya hanya librari ini yang bisa diandalkan, jika menggunakan library lain juga boleh namun saya sudah mencoba untuk library yang akan dibahas ini dan hasilnya bagus serta sesuai harapan. Berikut adalah penjelasan skema dan programnya.



a. Arduino Uno






b. RTC Tiny



*NOTE:
Ada lima port yang disediakan oleh module, namun yang digunakan hanya empat saja yaitu VCC, GND, SDA dan SCL, untuk Port DS tidak digunakan karena berhubungan dengan sensor suhu.





 c. Program Arduino IDE tanpa LCD

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  // setDS3231time(0,5,23,6,24,7,15);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Day of week: ");
  switch(dayOfWeek){
  case 1:
    Serial.println("Sunday");
    break;
  case 2:
    Serial.println("Monday");
    break;
  case 3:
    Serial.println("Tuesday");
    break;
  case 4:
    Serial.println("Wednesday");
    break;
  case 5:
    Serial.println("Thursday");
    break;
  case 6:
    Serial.println("Friday");
    break;
  case 7:
    Serial.println("Saturday");
    break;
  }
}
void loop()
{
  displayTime(); // display the real-time clock data on the Serial Monitor,
  delay(1000); // every second
}




d. Program Arduino dengan LCD I2C

#include "Wire.h"
#include <LiquidCrystal_I2C.h>
#define DS3231_I2C_ADDRESS 0x68

LiquidCrystal_I2C lcd(0x3F, 16, 2);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;


// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}


void setup() {

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

  Wire.begin();
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
   setDS3231time(0,47,11,6,23,11,18);

}


void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void displayTime()
{
  lcd.setCursor(0,0);
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  lcd.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  lcd.print(":");
  if (minute<10)
  {
    lcd.print("0");
  }
  lcd.print(minute, DEC);
  lcd.print(":");
  if (second<10)
  {
    lcd.print("0");
  }
  lcd.print(second, DEC);
  lcd.print(" ");

  lcd.setCursor(0,1);
  lcd.print(dayOfMonth, DEC);
  lcd.setCursor(0,2);
  lcd.print(month, DEC);
  lcd.print(" / ");
  lcd.print(year, DEC);
  lcd.setCursor(0,3);
  //lcd.print(" Day of week: ");

  switch(dayOfWeek){
  case 1:
    lcd.print("Sunday");
    break;
  case 2:
    lcd.print("Monday");
    break;
  case 3:
    lcd.print("Tuesday");
    break;
  case 4:
    lcd.print("Wednesday");
    break;
  case 5:
    lcd.print("Thursday");
    break;
  case 6:
    lcd.print("Friday");
    break;
  case 7:
    lcd.print("Saturday");
    break;
  }
}

void loop(){
 displayTime();

   delay(1000);

}




*NOTE:
Pada bagian code  //setDS3231time(0,5,23,6,24,7,15); harus di-uncomment atau hilangkan tanda "//" dahulu untuk memasukkan data waktu dan tanggal kedalam DS1307, setelah di-upload ke Arduino kemudian upload kembali dengan menonaktifkan code tersebut agar tidak kembali reset ke nilai awal.










Membuat Alat Pengukur Kecepatan Putaran Motor DC (RPM)

Membuat Alat Pengukur Kecepatan Putaran Motor DC (RPM)


             Malam hari yang cerah ditemani nyamuk2 genit, kali ini saya akan menjelaskan mengenai bagaimana cara membuat alat yang digunakan untuk mengetahui kecepatan putaran motor atau RPM meter sederhana menggunakan mikrokontroller ATMega16 dan Crystal 12 Mhz, prinsip kerjanya yaitu terdapat sebuah optocoupler , encoder dan motor dc, kemudian motor akan berputar yang mana juga akan memutarkan encoder, dari encoder masuk ke optocoupler sehingga data yang dihasilkan adalah berupa data high dan low (nilai 1 dan nilai 0). Nilai 0 artinya tegangan kurang dari 2,5 v dan jika lebih dari 2,5 v akan bernilai high. berikut adalah penjelasan program dan skemanya.



a. Minimum System





b. Motor DC dan Encoder





c. Program Bascom AVR

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

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

'setting pwm
Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up
Config Timer0 = Timer , Prescale = 256

Ddrb.0 = 1
Ddrb.1 = 1

Cls
Cursor Off


'=========== set counter ==========

Ch Alias Pind.2

Config Pind.2 = Output
Config Ch = Input
Config Int0 = Falling

Const Debouncetime = 1

Dim Wtime As Byte
Dim Encounter As Integer
Dim Rpm As Integer
Dim Detak As Byte
Dim Detik1 As Integer
Dim Detik As Byte


Set Ch

On Int0 Getencoder
On Ovf0 Int_timer0

Wtime = 100
Encounter = 0

Enable Interrupts
Enable Int0
Enable Timer0

'=================================

Do

Portb.0 = 0
Portb.1 = 1


Pwm1a = 200

Upperline
Lcd "Lubang = " ; Encounter ; "  " ; Detik

Lowerline
Lcd "RPM = " ; Rpm

Loop

Getencoder:
  Waitms Debouncetime
  If Ch = 0 Then
     Incr Encounter

  End If
  Gifr = 64
Return

Int_timer0:
Incr Detak

If Detak > 0 Then
Detak = 0
Incr Detik1
End If

'nilai 197 adalah nilai counter untuk mencapai satu detik

If Detik1 > 197 Then
Detik1 = 0

Incr Detik

'mengubah ke RPM
'dikalikan 60 untuk mendapatkan nilai per menit
'dibagi 20 yaitu lubang encoder yang dipakai

Rpm = Encounter * 60
Rpm = Rpm / 20
Encounter = 0

End If

Return





d. VIDEO HASILNYA
 




 

Cara Mengakses Sensor Magnetometer / Compass GY-273 (HMC5883L)

Cara Mengakses Sensor Magnetometer / Compass GY-273 (HMC5883L)

         Pagi hari yang cerah ditemani oleh sejuknya angin dingin, seakan membuat diri ini terbang ke nirwana, kali ini saya akan menjelaskan mengenai bagaimana cara mengakses sensor magnetometer atau compass dengan menggunakan bahasa Bascom AVR, sensor ini adalah sensor yang sangat sering sekali dipakai untuk keperluan membaca rotasi atau arah hadap dari sensor, range output dari sensor ini adalah 0 derajat sampai 360 derajat maka dari itu jika menginginkan pebacaan rotasi penuh sangat dianjurkan untuk menggunakan sensor ini, misal untuk menentukan arah utara, selatan, timur dan barat, atau bisa juga untuk petunjuk arah mata angin dsb. Untuk lebih jelasnya berikut penjelasan lengkapnya.



a. Minimum System





b. Sensor GY-273 / HMC5883L





c. Program Bascom AVR

$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600
$hwstack = 64
$swstack = 64
$framesize = 64
'-------------------------------------------------------------------------------

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

Cls
Cursor Off

Main:

'=====[ Global Vars & Constants ]========
Dim Hmc_x As Integer
Dim Hmc_xl As Byte At Hmc_x + 0 Overlay
Dim Hmc_xh As Byte At Hmc_x + 1 Overlay

Dim Hmc_y As Integer
Dim Hmc_yl As Byte At Hmc_y + 0 Overlay
Dim Hmc_yh As Byte At Hmc_y + 1 Overlay

Dim Hmc_z As Integer
Dim Hmc_zl As Byte At Hmc_z + 0 Overlay
Dim Hmc_zh As Byte At Hmc_z + 1 Overlay
Dim Hmc_status As Byte

Dim X1 As Single
Dim Y1 As Single
Dim Z1 As Single
Dim Angle1 As Single
Dim X2 As Single
Dim Y2 As Single
Dim Z2 As Single
Dim Angle2 As Single
Dim Jumlah As Integer
Dim W As Integer

W = 0
Jumlah = 0


Const Hmc_w = &H3C
Const Hmc_r = &H3D

'-------------------------------------------------------------------------------

'=====[ Misc. config ]==============
Config Scl = Portc.0
Config Sda = Portc.1


Config Twi = 400000
I2cinit
Gosub Hmc_initialize
'-------------------------------------------------------------------------------

'*****[ Start of main loop ]*******
Do

   Gosub Hmc_readdata
   Gosub Hmc_readstatus

   ' convert integer to float
   X1 = Hmc_x
   Y1 = Hmc_y
   Z1 = Hmc_z

   Angle1 = Atn2(y1 , X1)
   Angle1 = Angle1 * 57.29577951
   Angle1 = Angle1 + 180

'jika output sensor salah maka lakukan kalibrasi dengan regresi linier
'catat output sudut sensor dan sesuaikan dengan busur drajat
'catat di ms.Exel lalu tampilkan grafik
'pilih menu linier dan akan terlihat rumusnya
'maka akan tampil seperti rumus (misal) y = 0.971x - 20.62
'lalu masukkan kedalam program

   'Angle1 = Angle1 + 20.62
   'Angle1 = Angle1 / 0.971


If Angle1 > 30 And W = 0 Then
Incr Jumlah
W = 1
Waitms 200
End If

If Angle1 < 30 And W = 1 Then
W = 0
End If


Upperline
Lcd "sudut 1 = " ; Fusing(angle1 , "#.#")
Lowerline
Lcd "count = " ; Jumlah



Waitms 200
Cls

Loop

End
'-------------------------------------------------------------------------------


'=====[ Initialize HMC Compass ]========
Hmc_initialize:
   I2cstart
    I2cwbyte Hmc_w
    I2cwbyte &H00
    I2cwbyte &B0101_1000
    I2cwbyte &H0010_0000
    I2cwbyte &H0000_0000
   I2cstop
Return
'-------------------------------------------------------------------------------

'=====[ Read HMC Compass ]===========
Hmc_readstatus:
' Read HMC Compass status
   I2cstart
    I2cwbyte Hmc_w
    I2cwbyte &H09
   I2cstart
    I2cwbyte Hmc_r
    I2crbyte Hmc_status , Nack
   I2cstop
Return
'-------------------------------------------------------------------------------

'=====[ Read HMC Compass ]=========
Hmc_readdata:
   I2cstart
    I2cwbyte Hmc_w
    I2cwbyte &H03
   I2cstart
    I2cwbyte Hmc_r
    I2crbyte Hmc_xh , Ack
    I2crbyte Hmc_xl , Ack
    I2crbyte Hmc_zh , Ack
    I2crbyte Hmc_zl , Ack
    I2crbyte Hmc_yh , Ack
    I2crbyte Hmc_yl , Nack
   I2cstop
Return
'-------------------------------------------------------------------------------





d. DEMO VIDEO 









Membuat Alat Pemanas Dengan Kontrol Suhu Menggunakan Kontrol PID

Membuat Alat Pemanas Dengan Kontrol Suhu Menggunakan Kontrol PID


               Pada malam Ramadhan yang barokah ini saya akan menjelaskan mengenai bagaimana cara mengontrol suhu suatu alat pemanas menggunakan PID, alat ini sebenarnya bertujuan untuk memanaskan lilin untuk batik jadi harus berada di suhu 70 derajat celcius, maka dari itu supaya stabil digunakanlah PID, pada contoh ini tidak menggunakan ziegler nicols untuk menentukan nilai P, I dan D namun langsung memasukkan nilai secara manual P, I dan D nya. berikut penjelasan gambarnya.


a. Minimum System





b. Rangkaian Control Pemanas


*note = karena menggunakan elemen pemanas, maka ganti LAMP dengan ujung elemen pemanas, dan ganti 220v dengan Step Down trafo CT, masukkan 35v AC ke input TRIAC X3-2 dan satunya lagi 35v AC ke ujung elemen pemanas, kemudian ujung elemen pemanas lainnya masukkan ke output X3-1



c. Sensor Suhu LM35




d. Program Bascom AVR

$regfile = "m8def.dat"
$crystal = 12000000
'==========================
Config Lcdpin = Pin , E = Portd.6 , Rs = Portd.7 ,
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5
Config Lcd = 16 * 2

'setting pwm
Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Down

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Ddrd.0 = 1

Cls
Cursor Off

Dim Dataadc As Word
Dim V As Single
Dim X As String * 5                                         ' Setpoint
Dim Pv As Single                                            ' Process Value
Dim Cv As Single                                            ' PID output
Dim Kp As Single
Dim Ki As Single
Dim Kd As Single
Dim Setpoint As Single
Dim P As Single
Dim Pi As Single
Dim Pid As Single
Dim I As Single
Dim D As Single
Dim Error As Single
Dim Errorx As Single
Dim Sum_err As Single

Start Adc


Kp = .85                                                    ' Proportional factor
Ki = .67                                                    ' Integration factor
Kd = .15                                                    ' derrivative factor
Setpoint = 70

Do

Dataadc = Getadc(5)

V = Dataadc * 5
V = V / 1023
Pv = V * 100

X = Fusing(pv , "#.##")

Error = Setpoint - Pv


P = Error * Kp

Sum_err = Error + Errorx
I = Ki * Sum_err

D = Error - Errorx

Pi = P + I
Pid = Pi + D

Pwm1a = Pid

Upperline
Lcd "Suhu = " ; X

Lowerline
Lcd "PWM = " ; Pid

Waitms 200

Errorx = Error

Loop










Membuat alat untuk menghitung kecepatan putaran/detik dan Data logger

Membuat alat untuk menghitung kecepatan putaran/detik dan Data logger


       Kali ini saya akan menjelaskan mengenai bagaimana cara membuat alat untk memantau kecepatan putaran motor kemudian disimpan ke sd card, modul yang digunakan yaitu modul optocoupler dan komparator, modul RTC, dan modul mikrokontroller, jadi pada contoh ini di misalkan bahwa jika kecepatan putaran motor melebihi 10 maka akan menyimpan ke sd card, berikut penjelasan skemanya.


a. Minimum System




 b. Modul Optocoupler




 
 c. SD Card Modul





d. Program Bascom AVR

$regfile = "m32def.dat"
$crystal = 11059200
'==========================
Config Lcdpin = Pin , E = Portc.7 , Rs = Portc.6 ,
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2
$lib "ds1307clock.lib"


Cursor Off
Cls


Ch Alias Pind.2
Config Pind.2 = Output
Config Ch = Input
Config Int0 = Falling
Const Debouncetime = 1
Dim Wtime As Byte
Dim Encounter As Integer
Set Ch


Const Clockmode = 0

Config Date = Dmy , Separator = /                           ' ngebatasin
Config Clock = User                                         ' this will dim the bytes automatic

'Date$ = "10/09/12"                                          'mm/dd/yy
'Time$ = "22:14:00"                                          'hh:mm:ss

'configure the scl and sda pins
Config Sda = Portc.1
Config Scl = Portc.0

Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

'VARIABEL TIME ////////////////////////////
Dim Weekday As Byte                                         'dim other needed variables
'Dim Day As Byte
'Dim Bln As Byte
'Dim Thn As Byte
'Dim Sthn As Byte

'VARIABEL MMC//////////////////////////////
Dim A As Byte
Dim L As String * 10
Dim Ff As Byte
Dim S As Long
Dim Diskf As Long
Dim Disks As Long
Dim Nama As String * 20

'VARIABEL TGS
Dim Co As Integer
Dim No As Integer
Dim Ax As Single
Dim Vo As Single
Dim X As Single
Dim Y As Single
Dim Rs As Single
Dim D As Single
Dim E As Single
Dim Ppm As Single
Dim Ro As Single

Dim Res As String * 10
Dim Ppm1 As String * 10
Dim Hitung As Integer
'================================================================
Dim P As Byte
'================================================================

$include "Config_AVR-DOS32.BAS"
$include "Config_MMC32.bas"

Ff = Drivereset()
Ff = Driveinit()



$external Waitms

Perintah:

Waitms 500

Gosub Getdatetime




On Int0 Getencoder
Wtime = 100
Encounter = 0

Enable Interrupts
Enable Int0

A = 0


Do
If Encounter > 10 And A < 5 Then
Goto Utama
End If

Set Portd.6
Waitms Wtime

If Encounter > 10 And A < 5 Then
Goto Utama
End If

Upperline
Lcd "encounter: " ; Encounter ;
Reset Portd.6
Lowerline
Lcd "Count = " ; A

If Encounter > 10 And A < 5 Then
Goto Utama
End If

Waitms Wtime

Incr A

If Encounter > 10 And A < 5 Then
Goto Utama
End If

If A > 5 Then
A = 0
Encounter = 0
End If

Cls
Loop



Utama:
Disable Interrupts
Cls
Waitms 200
Upperline
Lcd " PLEASE WAIT !!"
Wait 1
Cls
Do
If Gbdriveerror <> 0 Then                                   'CEK MEMORY CARD ERROR
   Cls
   Locate 1 , 1
   Lcd "Error Config"
   Locate 2 , 1
   Lcd "CEK MEMORY"
   Wait 2

End If

A = Initfilesystem(1)                                       'init file system
If A <> 0 Then
   Cls
   Locate 1 , 1
   Lcd "Error MEMORY"
   Locate 2 , 1
   Lcd "CEK MEMORY CARD"
   Wait 2
   Cls
   Goto Perintah

End If
  'Goto Perintah
  'Cls

If A = 0 Then
   Cls
   Locate 1 , 1
   Lcd "MEMORY OK"
   Wait 1
End If


Diskf = Diskfree()
Select Case Diskf                                           'CEK FREESPACE
S = Diskf
S = Str(s)

Case Is > 3000 : Locate 2 , 1
                  Lcd " Free > 3MB"
                  Lcd S


Case Is > 1000 : Locate 2 , 1
                  Lcd " Free > 1MB"
                  Lcd S


Case Else : Locate 2 , 1
             Lcd "!! FREE < 1MB !!"
             Wait 1
             Locate 2 , 1
             Lcd "GANTI memoryCARD"

End Select

Wait 3
Gosub Getdatetime
Cls
Upperline
Lcd Date$
Lowerline
Lcd Time$
Wait 3
Cls
Ff = Freefile()

L = "TEST"
Nama = L + ".txt"
Open Nama For Append As #ff                                 'buat file baru (bisa append bisa output)

Print #ff , "             RESULT"
Print #ff , "#################################"
Print #ff , "#" ; Date$ ; ", " ; Time$
Print #ff , "#################################"
Print #ff , "KECEPATAN: " ; Encounter ; "km/jam"
Print #ff ,

Close #ff                                                   'tutup file

Cls
   Locate 1 , 1
   Lcd "FILE CREATED"
   Wait 2
   Goto Perintah
   Cls

   Loop
   Return

'///////////////////////////////////////////////////////////////////////////////
'dari ds1307clock.lib
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack                                       'detik
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart                                                    ' Generate start code
I2cwbyte Ds1307w                                            ' send address
I2cwbyte 4                                                  ' starting address in 1307
I2cwbyte _day                                               ' Send Data to day
I2cwbyte _month                                             ' Month
I2cwbyte _year                                              ' years
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart                                                    ' Generate start code
I2cwbyte Ds1307w                                            ' send address
I2cwbyte 0                                                  ' starting address in 1307
I2cwbyte _sec                                               ' Send Data to SECONDS
I2cwbyte _min                                               ' MINUTES
I2cwbyte _hour                                              ' Hours
I2cstop
Return

Getencoder:
  Waitms Debouncetime
  If Ch = 0 Then
     Incr Encounter
  End If
  Gifr = 64
Return