Laporan eksperimen ini adalah kelanjutan dari tulisan sebelumnya yang berjudul: Arduino: Mengirim Data Suhu dan Kelembaban DHT11 Melalui Serial Dengan Format JSON Menggunakan Library ArduinoJson.

Itu judul apa paragraf ya? Hehehe…

Pada eksperimen sebelumnya, kita berhasil menyusun data dengan format JSON dan mengirimkan data tersebut ke port Serial dengan memanfaatkan library ArduinoJson. Pada eksperimen tersebut, kita hanya menggunakan proses serialisasi saja.

Pada eksperimen ini, selain proses serialisasi JSON, kita juga akan melakukan proses deserialisasi. Proses serialisasi digunakan untuk menyusun data JSON yang akan dikirim ke PC. Dan proses deserialisasi digunakan untuk membaca (parsing) data JSON yang dikirimkan oleh PC.

Data yang dikirim Arduino adalah data hasil pengukuran suhu dan kelembaban menggunakan modul sensor DHT11. Sedangkan data yang dikirim oleh PC (diterima oleh Arduino) adalah perintah untuk mengontrol RELAY (ON/OFF).

Nah, sebagai “lawan tanding” dari ArduinoJson yang menggunakan C++, saya menggunakan unit-unit fpjson dan fpjsonparser dari Lazarus/Freepascal untuk memrogram aplikasi pada PC.

Untuk wiring, silakan membaca tulisan sebelumnya.

Kode Program Arduino

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

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

#define DHT11_PIN 8
#define RELAY_PIN 9

DHTStable DHT;

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

DynamicJsonDocument jsonIN(50);
DynamicJsonDocument jsonOUT(50);

void setup()
{
  digitalWrite(RELAY_PIN, HIGH);
  pinMode(RELAY_PIN, OUTPUT);
  
  Serial.begin(9600);

  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.print("Temperature: 00C");
  lcd.setCursor(0, 1);
  lcd.print("Humidity:    00%");

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

void update_lcd(int t, int h)
{
  lcd.setCursor(13, 0);
  lcd.print(t);

  lcd.setCursor(13, 1);
  lcd.print(h);
}

void loop()
{
  int temp = 0;
  int hum = 0;
  static int x = 20;

  if (Serial.available())
  {
    deserializeJson(jsonIN, Serial);
    
    const char *sender = jsonIN["Sender"];
    const char *relay = jsonIN["Relay"];
    
    if (strcmp(relay, "ON")==0 && strcmp(sender, "Lazarus")==0)
    {
      digitalWrite(RELAY_PIN, LOW);
    }
    else if (strcmp(relay, "OFF")==0 && strcmp(sender, "Lazarus")==0)
    {
      digitalWrite(RELAY_PIN, HIGH);
    }
  }

  x--;
  
  if (0 == x) //kirim data tiap 2 detik
  {
    x = 20;
    
    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);

    serializeJsonPretty(jsonOUT, Serial);
    Serial.print("#");
  }

  delay(100);
}

Let’s the magic of ArduinoJson begin.

Jika ada data yang masuk ke Serial, maka Arduino akan menangkap data tersebut dengan fungsi (method) deserializeJson(jsonIN, Serial);

if (Serial.available())
  {
    deserializeJson(jsonIN, Serial);
    
    const char *sender = jsonIN["Sender"];
    const char *relay = jsonIN["Relay"];
    
    if (strcmp(relay, "ON")==0)
    {
      digitalWrite(RELAY_PIN, LOW);
    }
    else if (strcmp(relay, "OFF")==0)
    {
      digitalWrite(RELAY_PIN, HIGH);
    }
  }

Selanjutnya, Arduino akan membaca nilai (value) dari kunci (key) Sender dan Relay. Masing value disimpan ke dalam variabel const char *sender dan const char *relay.

Kemudian Arduino akan membandingkan:

  • jika Relay = ON, maka aktifkan RELAY
  • jika Relay = OFF, maka non-aktifkan RELAY

Program Lazarus/Freepascal

Form aplikasi yang saya buat adalah sebagai berikut.

Untuk komunikasi serial, saya menggunakan komponen TLazSerial. Komponen menggunakan library pemrograman serial Synaser.

Data JSON dari Arduino dibaca oleh TLazSerial dan di-copy ke Memo1. Data dengan format JSON tersebut kemudian di deserialisasi dengan fungsi GetJSON. Selanjutnya, data di parsing menggunakan fungsi FindPath. Berikut ini adalah kode programnya.

procedure TForm1.LazSerial1RxData(Sender: TObject);
var
  s: string;
  data: TJSONData;
begin
  s:= LazSerial1.SynSer.RecvTerminated(1000, '#');

  data:= GetJSON(s);

  if data=nil then exit;

  Memo1.Lines.Clear;
  Memo1.Append(s);

  edit5.Text:= data.FindPath('Room').AsString;
  edit6.Text:= data.FindPath('Sensor').AsString;
  edit3.Text:= IntToStr(data.FindPath('Temperature').AsInteger);
  edit4.Text:= IntToStr(data.FindPath('Humidity').AsInteger);
end;

Dua buah button Kirim digunakan untuk mengirimkan perintah pengontrolan Relay kepada Arduino.

Untuk mengaktifkan Relay, PC (Lazarus/Freepascal) mengirimkan data dengan format JSON sbb:

{"Sender":"Lazarus", "Relay":"ON"}

Perintah untuk mengirimkan data ke Arduino adalah: LazSerial1.WriteData(edit1.Text);

Dan untuk menon-aktifkan Relay, PC mengirimkan data sbb:

{"Sender":"Lazarus", "Relay":"OFF"}

Perintah untuk mengirimkan data ke Arduino adalah: LazSerial1.WriteData(edit2.Text);

Program aplikasi Lazarus/Freepascal setelah dijalankan, hasilnya adalah sbb:

Mudah, bukan?

Dari eksperimen ini, kita dapat menyimpulkan bahwa pemrosesan data dengan format JSON tidaklah sulit jika kita menggunakan library yang memang dibuat untuk memudahkan pemrosesan data JSON.

Sekian dulu laporan eksperimen saya kali ini, semoga bermanfaat. Silakan meninggalkan jejak di kolom komentar.

Pelatihan PRIVAT Online

Jika Anda membutuhkan pelatihan atau bimbingan dalam pemrograman, silakan menghubungi melalui Whatsapp 0882-3560-7047.

Kami juga melayani perancangan dan pembuatan hardware berbasis mikrokontroler (Arduino, AVR, 8051, PIC, STM8) dan Zelio Smart-Relay (mini PLC).

Selamat berkarya.