Welcome

Welcome to My Blog

Sunday 26 March 2017

MEMASUKKAN DATA CSV KE DATABASE MYSQL MELALUI PYTHON






Dalam artikel kali ini, saya akan membahas bagaimana cara memasukkan data ke tabel MySQL melalui Python, mulai dari cara mengkoneksikan Python ke MySQL hingga memasukkan data-data yang telah dibuat ke MySQL melalui Python dengan GUI Tkinter.
Sebelum mulai, MySQL dan Python 2.7 harus sudah terinstall dalam PC anda. Jika belum, anda dapat mendownloadnya di link berikut ini.

Python 2.7.13:

MySQL Community:

Saat anda menginstall MySQL, maka anda akan diminta mengisi username dan password, nantinya username dan password ini akan kita pakai untuk mengkoneksikan Python dan MySQL.
Setelah Python dan MySQL sudah terinstall, maka langkah selanjutnya adalah membuat database dan tabel pada MySQL, pada artikel kali ini saya akan membuat database tentang Dota 2 dengan tabel hero dan abilities. Disini saya anggap pembaca sudah mengerti bagaimana membuat database dan tabel pada MySQL, jadi saya akan langsung lompat ke database saya. Berikut database dota2 yang telah saya buat pada MySQL Command Line Client.

Setelah membuat database dan tabel di MySQL, kita akan membuat sekumpulan data yang akan dibaca oleh python dan menghubungkannya dengan MySQL. Data yang dibuat adalah data yang berekstensi .csv (Comma Separated Values). Untuk membuat file .csv ini, saya menggunakan microsoft excel. Berikut data untuk tabel abilities yang telah saya buat.





Setelah mengetikkan data di microsoft excel, klik save as, lalu pada kolom “save as type” pilih format CSV (Comma delimited) (*.csv).


Barulah kita dapat memulai program pada Pythonnya. Berikut adalah link full code yang telah saya buat.


Pertama kita import semua module yang diperlukan

from Tkinter import *
import mysql.connector
import csv, sys
import tkFileDialog

Kita membuat exception handling untuk koneksi ke MySQL dengan try dan except. Pastikan anda memasukkan nama user dan password MySQL anda dengan benar, untuk host, karena disini saya hanya mengkoneksikan dengan MySQL yang berada di PC saya, maka saya gunakan localhost.

try:
    conn=mysql.connector.connect(user='root', password='24Ka103li98sapnjri', host='localhost', database='dota2')
except mysql.connector.Error as err:
  if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    print("Invalid username or password")
  elif err.errno == errorcode.ER_BAD_DB_ERROR:
    print("Database does not exist")
  else:
    print(err)

Lalu, semua code yang berada di dalam class Application(Frame), adalah code untuk GUI dan fungsi-fungsinya.
Di dalam createWidgets anda dapat membuat label, button, dan interface lainnya. Disini saya menggunakan fungsi grid() untuk menempatkan interface pada windows.
Pada bagian __init__ memanggil class createWidgets dan fungsi pack() untuk widgets GUI ini.

    def createWidgets(self):
       
        self.lbl_title = Label(self, text="Dota 2 Insert  Databases", fg="#fff", bg="#007", padx="20px", pady="8px", font=("Times New Roman", 18))
        self.lbl_hero = Label(self, text="Choose .csv file for hero data", fg="#fff", bg="#828282", padx="10px", pady="6px", font=("Times New Roman", 12))
        self.btn_hero = Button(self, text='Browse', width=8, height=2, command=self.openHeroFile)

        self.lbl_title.grid(row=0, column=0, columnspan=3, sticky=N+E+W)
        self.lbl_hero.grid(row=1, column=0,sticky=W)
        self.btn_hero.grid(row=2, column=0)

    #Initialize
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

Didalam def openHeroFile(self): , adalah program utama untuk memasukkan data-data dari .csv yang kita buat ke dalam MySQL database.

        filename = tkFileDialog.askopenfilename(filetypes = (("Template files", "*.csv"), ("All files", "*")))

Code diatas adalah untuk membuat sebuah command untuk memilih file dari directories kita.
Setelah itu, kita buat code untuk membaca setiap baris yang ada pada file .csv kita.

with open(filename, 'rb') as f:
            reader = csv.reader(f)

Kita buat try and except lagi karena ada kemungkinan error dalam pembacaan filenya. Lalu kita uraikan data-data dari .csv yang telah kita buat. Karena data-data yang ada pada .csv terpisah oleh tanda ‘;’ maka kita harus menggunakan fungsi split(‘;’) untuk memisahkan data-datanya.
Setelah itu kita harus membuat data-data tersebut menjadi string dengan menggunakan perintah str(). Lalu kita buat perintah command yang akan dieksekusi MySQL. Disini saya ingin membuat dua buah kondisi, jika ID belum ada di dalam tabel, maka kita gunakan perintah “insert into”, tetapi jika ID sudah ada di dalam tabel, maka kita gunakan perintah “update”.

try:
                for row in reader:
                    data = row[0].split(';')
                    hero_id = str(data[0])
                    hero_name = str(data[1])
                    print("hero_id = " + hero_id)
                    print("hero_name = " + hero_name)
                    cmd = "select hero_id from hero where hero_id = {};".format(hero_id)
                    cursor = conn.cursor()
                    cursor.execute(cmd, hero_id)
                    recordExist = 0
                    for r_row in cursor:
                        recordExist = 1
                    if recordExist == 1:
                        cmd = "update hero set hero_name=%s where hero_id=%s;"
                        cursor.execute(cmd, (hero_name, hero_id))
                    else:
                        cmd = "insert into hero values(%s, %s);"
                        cursor.execute(cmd, (hero_id, hero_name))
                   
                conn.commit()
                cursor.close()
                conn.close()
                   
            except csv.Error as e:
                sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

Terakhir, kita memanggil class Application yang telah kita buat, dan kita buat aplikasi tersebut terus mengulang dengan perintah .mainloop(). Lalu jika aplikasi sudah selesai digunakan, kita destroy dengan perintah .destroy().
Karena sebelumnya kita telah membuka koneksi Python dengan MySQL, maka yang harus dilakukan saat sudah selesai menggunakan aplikasi adalah dengan menutup koneksinya, yaitu dengan perintah .close().

root = Tk()
root.resizable(width=False, height=False)
root.title("Dota 2 Insert Databases")
app = Application(master=root)
app.mainloop()
conn.close()
root.destroy()

Jika kita run full code yang telah saya berikan diatas, maka hasilnya akan seperti berikut.


Anda tinggal menekan tombol Browse dan pilih file .csv yang telah anda buat, maka otomatis data-data yang ada dalam file .csv tersebut akan dimasukkan ke dalam tabel database MySQL yang telah dibuat sebelumnya (dalam hal ini, database=dota2).

Saturday 11 February 2017

SENSOR ULTRASONIK HC-SR04 DENGAN ARDUINO UNO




 
Sensor Ultrasonik HC-SR04 adalah sensor yang memancarkan ultrasonik untuk menentukan jarak suatu benda yang berada di jangkauannya. Jarak jangkauan dari sensor HC-SR04 adalah dari 2cm sampai 400cm.

Ultrasonik itu sendiri merupakan gelombang suara dengan frekuensi tinggi yaitu sekitar 20 kHz. Manusia tidak dapat mendengar suara ini, hanya hewan tertentu seperti lumba-lumba dan kelelawar yang dapat mendengarnya. Gelombang ultrasonik dapat merambat pada medium padat, cair dan gas.

Sensor ini memiliki 4 pin, yaitu Vcc, Trigger, Echo dan Ground. Seperti biasa Vcc disambungkan ke sumber tegangan 5V DC dan Ground ke ground kontroler. Pin trigger dan echo disambungkan ke salah satu pin IO kontroler yang kali ini saya menggunakan arduino uno. Pin trigger untuk mentrigger output sensor yang berupa gelombang ultrasonik dengan 8x40KHz, untuk mentriggernya adalah dengan memberikan tegangan positif pada pin trigger selama 10µs, dengan demikian sensor akan mengirimkan sinyal ultrasonik. Pin echo sebagai penerima sinyal pantulan dari gelombang yang memantul dari benda.


 
Lalu bagaimana cara mengetahui jarak suatu benda dengan sensor ini? langsung saja kita bahas.
Kita tau bahwa kecepatan suara adalah v = 340 m/s atau 0,034 cm/µs karena kita ingin jaraknya dalam bentuk satuan cm. Untuk menghitung jarak kita gunakan persamaan s = v * t. Karena v = 0,034 cm/µs. Maka s = 0,034 * t. Tidak hanya sampai disitu, karena waktu tempuh gelombang suara adalah dua kali yaitu saat pertama dikeluarkan dan setelah memantul dari benda kembali ke sensor maka persamaan tadi menjadi s = 0,034 * t/2.

Kecepatan suara
v = 340 m/s atau 0,034 cm/µs

Rumus jarak
s = v * t
s = 0,034 * t

Rumus jarak pada sensor ultrasonik HC-SR04
s = 0,034 * t/2

Berikut merupakan gambar rangkaian sensor dengan arduino uno. Pin Vcc dihubungkan Vcc 5V dari arduino. Ground ke ground dari arduino. Trigger ke pin 9 dan echo ke pin 8.


 
Program Sensor Ultrasonic HC-SR04 dengan Arduino Uno :

int trigPin = 9;
int echoPin = 8;

long distance, duration;

void setup() {
  // put your setup code here, to run once:
  pinMode(trigPin, OUTPUT);//Setting pin trigger menjadi output
  pinMode(echoPin, INPUT);//Setting pin echo menjadi input
  Serial.begin(9600);//Memulai komunikasi serial
}

void loop() {
  // put your main code here, to run repeatedly:
  /*Kode untuk mentrigger sensor mengeluarkan gelombang ultrasonik*/
  digitalWrite(trigPin, LOW);//Set sinyal trigger menjadi low
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);//Set sinyal trigger menjadi high
  delayMicroseconds(10);/*Delay 10 us
  digitalWrite(trigPin, LOW);//Set sinyal trigger low kembali

  /*Membaca hasil dari pin echo berupa waktu tempuh gelombang ultrasonik dalam microseconds*/
  duration = pulseIn(echoPin, HIGH);//Menghitung waktu saat pin echo high

  /*Memasukkan rumus untuk menghitung jarak dengan sensor ultrasonik*/
  distance = duration*0.034/2;

  /*Tampilkan hasil perhitungan jarak pada serial monitor arduino*/
  Serial.print("Jarak = ");
Serial.print(distance);
Serial.print(" cm");
}