Menyimpan data Arduino ke database MySQL

arduino mysql database
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.
arduino mysql database
arduino mysql database

Buka browser kemudian akses phpMyAdmin. http://localhost/phpmyadmin/ . maka akan tampil halaman dashboard phpMyAdmin seperti berikut.
arduino mysql database

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
arduino mysql database

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
  );
arduino mysql database

Langsung saja kita cek databasenya dengan pilih home => Databases => pilih arduino_sensor => pilih dht_data. Maka akan terlihat tabel sederhana yang masih kosong.
arduino mysql database

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
arduino mysql database
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']);
}

?>
arduino mysql database
arduino mysql database

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
arduino mysql database

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.
arduino mysql database

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.
arduino mysql connection

5. Wiring Schematic
Untuk wiringnya dapat dilihat pada gambar dibawah.
arduino mysql connection
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
Menyimpan data Arduino ke  database MySQL
Sementara apabila kita cek ke database akan terlihat beberapa data yang masuk.
Arduino Send Data to MySQL databases
Arduino Send Data to MySQL databases
Arduino Send Data to MySQL databases
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

  1. Bang, untuk menetukan url ini dari mana ya ? arduino_mysql/control.php?dataKelembaban=");

    "datakelembaoan" <-- ini dari mana?

    makasih sebelumnya.

    BalasHapus
    Balasan
    1. dataKelembaban adalah variabel pada control.php yang digunakan untuk proses pengambilan data via GET.
      nah nentuinnya ada di script ini:
      if($_GET['dataSuhu'] != '' and $_GET['dataKelembaban'] != ''){
      $dht22=new dht22($_GET['dataSuhu'],$_GET['dataKelembaban']);
      }

      Hapus
  2. bang kalau script untuk ke web hosting gimana ya

    BalasHapus
    Balasan
    1. harus buat aplikasi berbasis web. integrasi dengan database yang diatas.. lanjut upload ke hosting

      Hapus
  3. gan kalau API nya menggunakan laravel, script di arduino nya sama aja gk?

    BalasHapus
    Balasan
    1. Kurang lebih sama kok.. tinggal sesuaikan saja Alamat APInya ke bagian

      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");

      Hapus
    2. mau nanya, kalau pakek laravel yang di modifikasi route sama controller nya aja bisa nggak? kalau bisa, kira-kira gimana ya lebih jelasnya?

      Hapus
    3. maaf gan.. ane gak familiar sama lavarel.. yang jelas klo udah bisa buat API nya mah ntr tinggal di panggil di dr arduinonya

      Hapus
  4. gan, ini kalo saya ganti pake sensor ultrasonik apakah bisa pake cara yang sama seperti di atas?

    BalasHapus
  5. Sama gan, tinggal disesuaikan

    BalasHapus
  6. gan, ini saya pke sensor gy-906, apakah bisa pake cara yg sama kayak di atas?

    BalasHapus
    Balasan
    1. bisa gan, tinggal disesuaikan dengan hasil pembacaan dari gy-906.. habis itu di simpan di db

      Hapus
  7. mau nanya gan, kalo make esp32 sama atau tidak ya gan? makasih

    BalasHapus
    Balasan
    1. beda yak.. klo esp komunikasinya via wifi.. bisa dipelajari disini https://www.arducoding.com/2020/10/nodeMCU-esp8266-menyimpan-data-base-MySQL.html

      Hapus
  8. permisi, saya coba code ini dijalankan dengan emulator arduino PICSimLab. program tidak berjalan jika tidak membuka serial monitor. apakah ada solusinya? terimakasih

    BalasHapus
    Balasan
    1. wah, ane kurang paham klo model simulasi gan.. yang jelas pasti terdapat kendala karena pasti gak sama dengan hardware nya

      Hapus
  9. bang kalau pakai nodemcu menggunakan wifi, nodemcu bisa langsung akses web routesnya?

    BalasHapus
    Balasan
    1. https://www.arducoding.com/2020/10/nodeMCU-esp8266-menyimpan-data-base-MySQL.html

      Hapus
  10. Bang kalo dari sensor ultrasonik untuk menghitung barang menggunakan ethernet shield banyak yang di rubah gak codinganya bg

    BalasHapus
    Balasan
    1. relatif gan.. klo diatas kan menggunakan 2 parameter (suhu dan kelembaban).. nah klo menghitung barang kan berarti cm 1 parameter aja (jumlah barang)..

      Hapus
  11. Bang bisa minta nohpnya gaa

    BalasHapus
  12. permisi, Kak. saya mau tanya, tadi waktu saya verify ( saya sudah sesuaikan dengan sensor saya sendiri ) , terdapat error seperti ini. apakah ada saran? terimakasih sebelumnya

    error: '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

    BalasHapus
    Balasan
    1. ada beberapa kesalahan dalam pemrograman .. seperti kurang tanda } di akhir fungsi .. dan deklarasi fungsi dan variabel

      Hapus
  13. bang 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

    BalasHapus
    Balasan
    1. klo di ping dr komputer server ke 192.168.10.10 apakah tersambung?

      Hapus
  14. mau tanya kok hasil yang didapat pada serial monitor connection failed kenapa ya? padahal codingannya sudah sama

    BalasHapus
  15. permisi, mau tanya kalau ethernet dihubungkan langsung ke router apakah script nya sama atau ada yang diubah. Kalau ada yang diubah di bagian mananya ya?

    BalasHapus
    Balasan
    1. beda gan.. klo dr router biasanya konfig IP nya adalah DHCP

      Hapus
  16. misi bang, mau tanya cara agar dapat menjalankan script di atas tanpa menyalakan xampp gimana ya?

    BalasHapus
    Balasan
    1. silahkan gunakan aplikasi selain xampp gan.. ada LAMP, wamp server, AMPPS, dll..
      atau silahkan menggunakan server online...

      Hapus
  17. mas. ini kan saya udah ikutin semua tutorialnya tapi data dari sensor masih blm bisa dikirim ke data base.. itu apanya ya?
    atw ada yagn harus di rubah dulu gtu?

    BalasHapus
    Balasan
    1. 1. pastikan ip server dan device sudah benar dan dalam 1 kelas.
      2. cb nonaktifkan firewall

      Hapus