Fase 1 · Minggu 4

Komunikasi Data & JSON

Serial communication, format JSON, ArduinoJson library, dan dart:convert.

Konsep Serial Communication

Komunikasi serial (UART) mengirim data bit per bit melalui satu jalur. ESP32 dan komputer berkomunikasi via USB menggunakan protokol serial.

ESP32 TX (kirim) Data → ← Command Baud Rate: 115200 bps Computer RX (terima) 🔑 Konsep penting: • TX (Transmit) → kirim data • RX (Receive) → terima data • Baud rate harus sama • Data dikirim sebagai bytes

Komunikasi Serial: ESP32 ↔ Komputer via UART

ℹ️ Baud Rate: Kecepatan komunikasi (bit per detik). 115200 adalah standar yang sering dipakai. Kedua sisi (ESP32 & komputer) harus menggunakan baud rate yang sama.

Format Data: JSON

JSON (JavaScript Object Notation) adalah format standar untuk pertukaran data. Kita akan mengirim data sensor dalam format JSON.

Kenapa JSON?

JSON// Contoh data sensor dalam JSON:
{
  "device": "ESP32",
  "sensors": {
    "suhu": 27.5,
    "kelembaban": 65.0,
    "cahaya": 2048
  },
  "led": {
    "status": "OFF",
    "pin": 2
  }
}
❌ String biasa "suhu=27.5,lembab=65" → susah di-parse! vs ✅ JSON {"suhu":27.5,"lembab":65} → mudah di-parse! ESP32 ArduinoJson JSON string Flutter dart:convert parse Map {...}

JSON: format standar untuk pertukaran data ESP32 ↔ Flutter

ESP32: Kirim JSON dengan ArduinoJson

Install library ArduinoJson di Arduino IDE: Sketch → Include Library → Manage Libraries → cari "ArduinoJson"

C++ (Arduino)#include <ArduinoJson.h>

#define DHT_PIN 4
#define LDR_PIN 34
#define LED_PIN 2

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // Baca sensor (simulasi - ganti dengan sensor asli nanti)
  float suhu = 25.0 + random(0, 50) / 10.0;
  float kelembaban = 60.0 + random(0, 200) / 10.0;
  int cahaya = analogRead(LDR_PIN);

  // Buat JSON document
  JsonDocument doc;
  doc["device"] = "ESP32";
  doc["timestamp"] = millis();

  JsonObject sensors = doc["sensors"].to<JsonObject>();
  sensors["suhu"] = suhu;
  sensors["kelembaban"] = kelembaban;
  sensors["cahaya"] = cahaya;

  doc["led"] = digitalRead(LED_PIN) ? "ON" : "OFF";

  // Kirim sebagai JSON string via Serial
  serializeJson(doc, Serial);
  Serial.println();  // newline sebagai delimiter

  delay(1000);
}

// Output di Serial Monitor:
// {"device":"ESP32","timestamp":1234,"sensors":{"suhu":27.3,"kelembaban":65.2,"cahaya":2048},"led":"OFF"}

ESP32: Terima Command JSON

ESP32 juga bisa menerima perintah dalam format JSON dari Serial.

C++ (Arduino)#include <ArduinoJson.h>

#define LED_PIN 2

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  Serial.println("Ready! Send JSON command...");
}

void loop() {
  if (Serial.available()) {
    String input = Serial.readStringUntil('\n');

    JsonDocument doc;
    DeserializationError error = deserializeJson(doc, input);

    if (error) {
      Serial.print("JSON Error: ");
      Serial.println(error.c_str());
      return;
    }

    // Parse command
    const char* command = doc["command"];
    int pin = doc["pin"] | LED_PIN;  // default pin 2

    if (strcmp(command, "ON") == 0) {
      digitalWrite(pin, HIGH);
      Serial.println("{\"status\":\"OK\",\"led\":\"ON\"}");
    }
    else if (strcmp(command, "OFF") == 0) {
      digitalWrite(pin, LOW);
      Serial.println("{\"status\":\"OK\",\"led\":\"OFF\"}");
    }
    else {
      Serial.println("{\"status\":\"ERROR\",\"msg\":\"Unknown command\"}");
    }
  }
}

// Kirim via Serial Monitor:
// {"command":"ON","pin":2}
// {"command":"OFF","pin":2}
Flutter json.encode() json.decode() {"command":"ON"} {"status":"OK","led":"ON"} ESP32 deserializeJson() serializeJson() Protocol 1. Flutter kirim command 2. ESP32 parse JSON 3. ESP32 eksekusi 4. ESP32 kirim response

Request-Response protocol dengan JSON

Flutter/Dart: Parse JSON

Di sisi Flutter, kita menggunakan dart:convert untuk encode/decode JSON.

Dartimport 'dart:convert';

void main() {
  // ===== DECODE: JSON String → Dart Map =====
  String jsonString = '{"device":"ESP32","sensors":{"suhu":27.5,"cahaya":2048},"led":"ON"}';

  Map<String, dynamic> data = jsonDecode(jsonString);

  print(data['device']);              // ESP32
  print(data['sensors']['suhu']);     // 27.5
  print(data['sensors']['cahaya']);   // 2048
  print(data['led']);                 // ON

  // ===== ENCODE: Dart Map → JSON String =====
  Map<String, dynamic> command = {
    'command': 'ON',
    'pin': 2,
  };

  String jsonCmd = jsonEncode(command);
  print(jsonCmd);  // {"command":"ON","pin":2}
  // → kirim string ini ke ESP32 via serial/bluetooth/wifi
}

Checklist Minggu 4