Ini adalah eksperimen sederhana – sekedar ingin mencoba “keampuhan” library ArduinoJson yang terkenal itu. Dari berbagai library JSON yang menggunakan bahasa C/C++, ArduinoJson ini disebut-sebut sebagai yang paling joss. Joss dalam performa dan joss dalam teknik pemrogramannya. Banyak yang mengagumi teknik pemrograman ArduinoJson karena library ini paling mudah digunakan. Dan saking joss-nya, pembuatnya mengklaim bahwa ArduinoJson lebih joss dibanding library Arduino_JSON dari tim Arduino.

Nah, pada eksperimen ini saya menggunakan Arduino UNO, Modul Sensor DHT11 dan LCD 16×2. Dan untuk menampilkan output data serial, untuk saat ini cukuplah kita gunakan Serial Monitor saja. Pada eksperimen selanjutnya, saya akan menangkap data dari Arduino UNO tersebut menggunakan Lazarus/Freepascal. Sekalian belajar unit-unit pendukung JSON dari Freepascal.

Jadi, pada eksperimen ini akan kita buktikan bahwa proses serialisasi (serialization) menggunakan library ArduinoJson sangatlah mudah.

Wiring

Ini mudah saja. Pin Data-Output dari DHT11 saya hubungkan ke Pin-8 Arduino UNO. Dan untuk LCD, saya menggunakan LCD dengan I2C, jadi wiringnya menggunakan SDA dan SCL.

arduino dht11 lcd dhtstable

Kode Program (Sketch)

// DHT11 - LCD 16x2 - Relay - Serial - ArduinoJson
// Mengambil data dari DHT11 dan mengirimkan data ke Serial dengan format JSON
// Chandra MDE - telinks.wordpress.com

#include "DHTStable.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>

#define DHT11_PIN 8

DHTStable DHT;

LiquidCrystal_I2C lcd(0x3F, 16, 2); //0x27 jika 0x3F gagal

DynamicJsonDocument jsonOUT(100);

void setup()
{
  Serial.begin(9600);
  
  lcd.init();
  lcd.backlight();
  lcd.clear();  
  lcd.print("DHT11 HMDTY/TEMP");
  lcd.setCursor(0, 1);
  lcd.print("H = 00%  T = 00C");

  jsonOUT["Room"] = "Workshop";
  jsonOUT["Sensor"] = "DHT11";
}

void update_lcd(int t, int h)
{
  lcd.setCursor(13, 1);
  lcd.print(t);
    
  lcd.setCursor(4, 1);
  lcd.print(h);
}

void loop()
{
  int temp = 0;
  int hum = 0;
  
  int chk = DHT.read11(DHT11_PIN);
    
  if (DHTLIB_OK==chk)
  {
    temp = DHT.getTemperature();
    hum = DHT.getHumidity();

    jsonOUT["Temperature"] = temp;
    jsonOUT["Humidity"] = hum;
  }
  else
  {
    jsonOUT["Temperature"] = 0;
    jsonOUT["Humidity"] = 0;
  }

  update_lcd(temp, hum);
    
  String s;
  serializeJson(jsonOUT, s);
  Serial.println(s);
  serializeJsonPretty(jsonOUT, Serial);
  Serial.println("");
  
  delay(2000);
}

Penjelasan Singkat Program

Untuk pemrograman modul sensor DHT11, saya menggunakan library DHTStable buatan Rob Tillaart. Standar saja, kita perlu mendefinisikan pin GPIO yang digunakan untuk data DHT11 dan mendeklarasi object DHT.

#define DHT11_PIN 8

DHTStable DHT;

Selanjutnya, untuk membaca data suhu dan kelembaban, kita cukup memanggil fungsi/metode readDHT11. Dan jika sukses (DHTLIB_OK), maka selanjutnya kita ambil data suhu dan kelembaban dengan getTemperature dan getHumidity.

  int chk = DHT.read11(DHT11_PIN);
    
  if (DHTLIB_OK==chk)
  {
    temp = DHT.getTemperature();
    hum = DHT.getHumidity();
    /* ... */
  }

Untuk menampilkan data suhu dan kelembaban, digunakan fungsi update_lcd sbb:

void update_lcd(int t, int h)
{
  lcd.setCursor(13, 1);
  lcd.print(t);
    
  lcd.setCursor(4, 1);
  lcd.print(h);
}

Untuk pemrograman data JSON, diawali dengan mendeklarasikan objek DynamicJsonDocument. DynamicJsonDocument mengalokasikan data di heap menggunakan fungsi-fungsi alokasi memori seperti malloc dan free. Selain yang dinamik, tersedia juga objek StaticJsonDocument yang mengalokasikan data di stack.

Jadi, jika data hanya sedikit (tidak butuh memori banyak), maka bisa menggunakan objek StaticJsonDocument.

Program dalam eksperimen ini juga tidak butuh data banyak, tapi kita main di Arduino, maka pakai heap saja (DynamicJsonDocument).

DynamicJsonDocument jsonOUT(100);

Setelah terdeklarasi, kita bisa menyusun atau menambahkan data ke dalam dokumen JSON dengan cara sbb:

jsonOUT["Room"] = "Workshop";
jsonOUT["Sensor"] = "DHT11";

Dua baris program tersebut akan membentuk data JSON dengan pasangan key:value sbb:

{
  "Room":"Workshop",
  "Sensor":"DHT11"
}

Untuk menambahkan data suhu dan kelembaban, caranya sama saja:

jsonOUT["Temperature"] = temp;
jsonOUT["Humidity"] = hum;

Nah, sekarang tinggal bagian yang rumit, yakni serialisasi.

Proses serialisasi ArduinoJson bisa disimpan ke dalam objek String atau ditulis ke objek Serial (data dikirim ke port serial) atau bisa juga ke objek ethernetClient atau wifiClient.

Proses ini sangat sulit, tapi dimudahkan oleh library ArduinoJson dengan cara sbb:

String s;
serializeJson(jsonOUT, s);
serializeJson(jsonOUT, Serial);
serializeJson(jsonOUT, ethernetClient);
serializeJson(jsonOUT, wifiClient);

Sesuai dengan judul tulisan di atas, maka kita kirimkan data dengan format JSON ke Serial dan ke objek String untuk sekedar mencoba.

String s;
serializeJson(jsonOUT, s);
Serial.println(s);
serializeJsonPretty(jsonOUT, Serial);
Serial.println("");

Dan berikut adalah screenshot hasil eksekusi program di atas.

Fungsi serializeJson akan menghasilkan output data JSON tanpa indentasi.

{"Room":"Workshop","Sensor":"DHT11","Temperature":29,"Humidity":13}

Fungsi serializeJsonPretty akan menghasilkan output data JSON dengan indentasi. Format ini lebih mudah dibaca.

{
  "Room": "Workshop",
  "Sensor": "DHT11",
  "Temperature": 29,
  "Humidity": 13
}

Nah, demikianlah sekelumit laporan hasil eksperimen dengan proses serialisasi menggunakan library ArduinoJson.

Masih banyak fitur ArduinoJson yang perlu kita pelajari dan kuasai. So, stay tuned.

Selamat berkarya.

Pelatihan PRIVAT Online

Kami menyediakan layanan Pelatihan/Bimbingan PRIVAT Online untuk materi pemrograman dan perancangan maupun troubleshooting sistem mikrokontroler berbasis Arduino, AVR dan 8051.

Kami juga mengerjakan custom project sesuai kebutuhan Anda.

Silakan menghubungi kami melalui Whatsapp 0882-3560-7047.

Kunjungi Situs Kami

Teknik Elektro Linkshttps://teknikelektrolinks.com