Pada kesempatan kali ini, saya akan mencoba share mengenai metode penyimpanan data dari arduino ke MySQL database. Mengapa harus disimpan di database? Hal ini untuk memudahkan pengolahan data ke tahap selanjutnya seperti pembuatan grafik atau tabel yang digunakan sebagai acuan komparasi perubahan nilai dari waktu ke waktu tertentu, dan sebagainya. Sebagai contohnnya saya akan menggunakan sensor DHT 22 yang basicnya dapat dilihat pada posting berikut. Agar lebih mudah dalam mempelajari tutorial berikut, diharapkan terlebih dahulu untuk mempelajari mengenai database dan pemrograman web. Namun saya akan mencoba memaparkan dengan bahasa yang mudah dipahami sehingga diharapkan dapat mengikuti sambil belajar.
1. Alat dan Bahan
Untuk tools yang digunakan adalah ARDUINO UNO, ETHERNET SHIELD W5100, DHT22, LCD 16X2 with I2C Driver. Untuk bagian server database silahkan disiapkan XAMPP, TEXT EDITOR (NOTEPAD ++).
2. Konfigurasi Database
Download Xampp(saya menggunakan versi 5.6.40) lalu install dan jalankan. Jalankan service untuk modul apache dan MySQL.
Buka browser kemudian akses phpMyAdmin. http://localhost/phpmyadmin/ . maka akan tampil halaman dashboard phpMyAdmin seperti berikut.
Sekarang kita lanjut untuk membuat database yang nantinya akan digunakan untuk menyimpan data suhu dan kelembaban dari arduino. Nama databasenya adalah arduino_sensor, nama tabelnya adalah dht_data, dengan 4 kolom didalamnya yaitu id, waktu, kelembaban, dan suhu. Klik tombol Home dan pilih menu SQL
pada query SQL tuliskan kode berikut untuk membuat databasenya. selanjutnya pilih Go. Kalau berhasil maka akan ada keterangan checklist hijau.
CREATE DATABASE arduino_sensor; CREATE TABLE arduino_sensor.dht_data ( id integer primary key auto_increment, waktu timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, kelembaban float, suhu float );
Langsung saja kita cek databasenya dengan pilih home => Databases => pilih arduino_sensor => pilih dht_data. Maka akan terlihat tabel sederhana yang masih kosong.
3. PHP Script untuk insert data ke database
Untuk melakukan proses insert data ke MySQL terdapat beberapa metode, silahkan dibaca-baca disini. Sementara untuk perolehan datanya saya akan menggunakan metode GET dari parameter yang kita masukkan dalan URL (lebih jelasnya silahkan main kesini). Siapkan folder untuk menyimpan script php (disini saya buat folder namanya arduino_mysql) di direktori C:\xampp\htdocs
Buka folder tersebut kemudian buat file control.php . Buka file tersebut dengan notepad ++ , isi dengan script berikut. Untuk koneksi ke mysql pastikan username dan passowrd telah sesuai. Secara default username= 'root' dan password = ' ' sehingga ditulis mysqli_connect('localhost','root',' ')
Untuk melakukan proses insert data ke MySQL terdapat beberapa metode, silahkan dibaca-baca disini. Sementara untuk perolehan datanya saya akan menggunakan metode GET dari parameter yang kita masukkan dalan URL (lebih jelasnya silahkan main kesini). Siapkan folder untuk menyimpan script php (disini saya buat folder namanya arduino_mysql) di direktori C:\xampp\htdocs
Buka folder tersebut kemudian buat file control.php . Buka file tersebut dengan notepad ++ , isi dengan script berikut. Untuk koneksi ke mysql pastikan username dan passowrd telah sesuai. Secara default username= 'root' dan password = ' ' sehingga ditulis mysqli_connect('localhost','root',' ')
<?php class dht22{ public $link=''; function __construct($suhu, $kelembaban){ $this->connect(); $this->storeInDB($suhu, $kelembaban); } function connect(){ $this->link = mysqli_connect('localhost','root','') or die('Cannot connect to the DB'); mysqli_select_db($this->link,'arduino_sensor') or die('Cannot select the DB'); } function storeInDB($suhu, $kelembaban){ $query = "insert into dht_data set kelembaban='".$kelembaban."', suhu='".$suhu."'"; $result = mysqli_query($this->link,$query) or die('Errant query: '.$query); if($result === TRUE){echo "Data Tersimpan";}else{echo "Gagal Menyimpan data";} } } if($_GET['dataSuhu'] != '' and $_GET['dataKelembaban'] != ''){ $dht22=new dht22($_GET['dataSuhu'],$_GET['dataKelembaban']); } ?>
OK. Sekarang kita bisa ujicoba script diatas dengan menggunakan URL melalui web browser denganmengakses = http://localhost/arduino_mysql/control.php?dataKelembaban=Nilai_kelembaban&dataSuhu=Nilai_suhu , misal kita kasih nilai kelembaban =90 dan nilai suhu = 27 , maka tinggal dimasukkan saja http://localhost/arduino_mysql/control.php?dataKelembaban=90&dataSuhu=27
Kalau berhasil maka akan ada keterangan seperti gambar berikut
Mari kita chek di database apakah sudah tersimpan atau cuma tipu-tipu? Dan ternyata data sudah ter record ya.. Selanjutnya mari kita oprek bagian arduinonya.
4. Server IP Adddress Setting
Sesuai dengan dasar komunikasi jaringan komputer, agar suatu perangkat dapat berkomunikasi dengan perangkat lain dalam suatu jaringan, maka perangkat-perangkat tersebut harus memiliki IP address yang satu kelas. Lebih mudahnya mari kita definisikan untuk IP komputer kita adalah 192.168.10.10 dan IP untuk arduino adalah 192.168.10.5. Jadi ubah pengaturan IP pada PC menjadi static dengan IP 192.168.10.10 . Detail cara mengubah IP address pada windows 10 dapat dilihat disini.
5. Wiring Schematic
Untuk wiringnya dapat dilihat pada gambar dibawah.
6. Arduino Program
Pastikan terlebih dahulu telah menginstall library yang dibutuhkan yaitu DHT dan LiquidCrystal_I2C.
7. Hasil
Setelah proses upload selesai dan tidak ada masalah, maka program akan bekerja. Pastikan kabel LAN telah tersambung antara arduino dengan komputer. Apabila dilihat dari serial Monitor hasilnya kurang lebih seperti ini
Sementara apabila kita cek ke database akan terlihat beberapa data yang masuk.
Script program PHP diatas merupakan program sederhana. kamu juga bisa menggunakan contoh yang lebih tersetruktur dalam PHP Rest API seperti di post berikut.
Mari kita chek di database apakah sudah tersimpan atau cuma tipu-tipu? Dan ternyata data sudah ter record ya.. Selanjutnya mari kita oprek bagian arduinonya.
4. Server IP Adddress Setting
Sesuai dengan dasar komunikasi jaringan komputer, agar suatu perangkat dapat berkomunikasi dengan perangkat lain dalam suatu jaringan, maka perangkat-perangkat tersebut harus memiliki IP address yang satu kelas. Lebih mudahnya mari kita definisikan untuk IP komputer kita adalah 192.168.10.10 dan IP untuk arduino adalah 192.168.10.5. Jadi ubah pengaturan IP pada PC menjadi static dengan IP 192.168.10.10 . Detail cara mengubah IP address pada windows 10 dapat dilihat disini.
5. Wiring Schematic
Untuk wiringnya dapat dilihat pada gambar dibawah.
6. Arduino Program
Pastikan terlebih dahulu telah menginstall library yang dibutuhkan yaitu DHT dan LiquidCrystal_I2C.
/* Arduino Send data to mysql server */ #include "DHT.h" #include <SPI.h> #include <Ethernet.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27, 16, 2); byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //MAC Address #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN,DHTTYPE); float DataKelembaban; float DataSuhu; int period = 30000; //interval simpan data ke db unsigned long time_now = 0; unsigned long byteCount = 0; bool printWebData = true; // set to false for better speed measurement char server[] = "192.168.10.10"; IPAddress ip(192,168,10,5); //arduino IP EthernetClient client; void setup() { Serial.begin(115200); dht.begin(); lcd.begin(); //intro gak penting lcd.setCursor(0,0); lcd.print(" Temperature"); lcd.setCursor(0,1); lcd.print(" Monitor"); Ethernet.begin(mac, ip); Serial.print("Local IP: "); Serial.println(Ethernet.localIP()); delay(2000); lcd.clear(); } void loop(){ DataKelembaban = dht.readHumidity(); DataSuhu = dht.readTemperature(); String print_temp = "Temp: "; print_temp += String(DataSuhu); print_temp += " C"; String print_humd = "Humd: "; print_humd += String(DataKelembaban); print_humd += " %"; lcd.setCursor(0,0); lcd.print(print_temp); lcd.setCursor(0,1); lcd.print(print_humd); if(millis() >= time_now + period){ time_now += period; SendtoDB(); } int len = client.available(); if (len > 0) { byte buffer[80]; if (len > 80) len = 80; client.read(buffer, len); if (printWebData) { Serial.write(buffer, len); // show in the serial monitor (slows some boards) } byteCount = byteCount + len; } } //insert data ke DB via injeksi control.php void SendtoDB(){ if (client.connect(server, 80)) { Serial.println(""); Serial.println("connected"); // Make a HTTP request: Serial.print("GET /arduino_mysql/control.php?dataKelembaban="); Serial.print(DataKelembaban); Serial.print("&dataSuhu="); Serial.println(DataSuhu); Serial.println(""); client.print("GET /arduino_mysql/control.php?dataKelembaban="); //YOUR URL client.print(DataKelembaban); client.print("&dataSuhu="); client.print(DataSuhu); client.print(" "); //SPACE BEFORE HTTP/1.1 client.print("HTTP/1.1"); client.println(); client.println("Host: 192.168.10.5"); client.println("Connection: close"); client.println(); } else { // if you didn't get a connection to the server: Serial.println("connection failed"); } }
7. Hasil
Setelah proses upload selesai dan tidak ada masalah, maka program akan bekerja. Pastikan kabel LAN telah tersambung antara arduino dengan komputer. Apabila dilihat dari serial Monitor hasilnya kurang lebih seperti ini
Sementara apabila kita cek ke database akan terlihat beberapa data yang masuk.
Script program PHP diatas merupakan program sederhana. kamu juga bisa menggunakan contoh yang lebih tersetruktur dalam PHP Rest API seperti di post berikut.
32 Komentar
Bang, untuk menetukan url ini dari mana ya ? arduino_mysql/control.php?dataKelembaban=");
BalasHapus"datakelembaoan" <-- ini dari mana?
makasih sebelumnya.
dataKelembaban adalah variabel pada control.php yang digunakan untuk proses pengambilan data via GET.
Hapusnah nentuinnya ada di script ini:
if($_GET['dataSuhu'] != '' and $_GET['dataKelembaban'] != ''){
$dht22=new dht22($_GET['dataSuhu'],$_GET['dataKelembaban']);
}
bang kalau script untuk ke web hosting gimana ya
BalasHapusharus buat aplikasi berbasis web. integrasi dengan database yang diatas.. lanjut upload ke hosting
Hapusgan kalau API nya menggunakan laravel, script di arduino nya sama aja gk?
BalasHapusKurang lebih sama kok.. tinggal sesuaikan saja Alamat APInya ke bagian
Hapusclient.print("GET /arduino_mysql/control.php?dataKelembaban="); //YOUR URL
client.print(DataKelembaban);
client.print("&dataSuhu=");
client.print(DataSuhu);
client.print(" "); //SPACE BEFORE HTTP/1.1
client.print("HTTP/1.1");
client.println();
client.println("Host: 192.168.10.5");
client.println("Connection: close");
mau nanya, kalau pakek laravel yang di modifikasi route sama controller nya aja bisa nggak? kalau bisa, kira-kira gimana ya lebih jelasnya?
Hapusmaaf gan.. ane gak familiar sama lavarel.. yang jelas klo udah bisa buat API nya mah ntr tinggal di panggil di dr arduinonya
Hapusgan, ini kalo saya ganti pake sensor ultrasonik apakah bisa pake cara yang sama seperti di atas?
BalasHapusSama gan, tinggal disesuaikan
BalasHapusgan, ini saya pke sensor gy-906, apakah bisa pake cara yg sama kayak di atas?
BalasHapusbisa gan, tinggal disesuaikan dengan hasil pembacaan dari gy-906.. habis itu di simpan di db
Hapusmau nanya gan, kalo make esp32 sama atau tidak ya gan? makasih
BalasHapusbeda yak.. klo esp komunikasinya via wifi.. bisa dipelajari disini https://www.arducoding.com/2020/10/nodeMCU-esp8266-menyimpan-data-base-MySQL.html
Hapuspermisi, saya coba code ini dijalankan dengan emulator arduino PICSimLab. program tidak berjalan jika tidak membuka serial monitor. apakah ada solusinya? terimakasih
BalasHapuswah, ane kurang paham klo model simulasi gan.. yang jelas pasti terdapat kendala karena pasti gak sama dengan hardware nya
Hapusbang kalau pakai nodemcu menggunakan wifi, nodemcu bisa langsung akses web routesnya?
BalasHapushttps://www.arducoding.com/2020/10/nodeMCU-esp8266-menyimpan-data-base-MySQL.html
HapusBang kalo dari sensor ultrasonik untuk menghitung barang menggunakan ethernet shield banyak yang di rubah gak codinganya bg
BalasHapusrelatif gan.. klo diatas kan menggunakan 2 parameter (suhu dan kelembaban).. nah klo menghitung barang kan berarti cm 1 parameter aja (jumlah barang)..
HapusBang bisa minta nohpnya gaa
BalasHapuspermisi, Kak. saya mau tanya, tadi waktu saya verify ( saya sudah sesuaikan dengan sensor saya sendiri ) , terdapat error seperti ini. apakah ada saran? terimakasih sebelumnya
BalasHapuserror: 'SendtoDB' was not declared in this scope
SendtoDB();
^
error: a function-definition is not allowed here before '{' token
void SendtoDB(){
^
error: expected '}' at end of input
}
^
exit status 1
'SendtoDB' was not declared in this scope
ada beberapa kesalahan dalam pemrograman .. seperti kurang tanda } di akhir fungsi .. dan deklarasi fungsi dan variabel
Hapusbang mau tanya, saya coba kok di serial monitor local ip nya terbaca 0.0.0.0 kenapa ya.. sudah setting ip menggunakan ip 192.168.10.10
BalasHapusklo di ping dr komputer server ke 192.168.10.10 apakah tersambung?
Hapusmau tanya kok hasil yang didapat pada serial monitor connection failed kenapa ya? padahal codingannya sudah sama
BalasHapuspermisi, mau tanya kalau ethernet dihubungkan langsung ke router apakah script nya sama atau ada yang diubah. Kalau ada yang diubah di bagian mananya ya?
BalasHapusbeda gan.. klo dr router biasanya konfig IP nya adalah DHCP
Hapusmisi bang, mau tanya cara agar dapat menjalankan script di atas tanpa menyalakan xampp gimana ya?
BalasHapussilahkan gunakan aplikasi selain xampp gan.. ada LAMP, wamp server, AMPPS, dll..
Hapusatau silahkan menggunakan server online...
mas. ini kan saya udah ikutin semua tutorialnya tapi data dari sensor masih blm bisa dikirim ke data base.. itu apanya ya?
BalasHapusatw ada yagn harus di rubah dulu gtu?
1. pastikan ip server dan device sudah benar dan dalam 1 kelas.
Hapus2. cb nonaktifkan firewall