Serial communication, format JSON, ArduinoJson library, dan dart:convert.
Komunikasi serial (UART) mengirim data bit per bit melalui satu jalur. ESP32 dan komputer berkomunikasi via USB menggunakan protokol serial.
Komunikasi Serial: ESP32 ↔ Komputer via UART
JSON (JavaScript Object Notation) adalah format standar untuk pertukaran data. Kita akan mengirim data sensor dalam format JSON.
JSON// Contoh data sensor dalam JSON:
{
"device": "ESP32",
"sensors": {
"suhu": 27.5,
"kelembaban": 65.0,
"cahaya": 2048
},
"led": {
"status": "OFF",
"pin": 2
}
}
JSON: format standar untuk pertukaran data ESP32 ↔ Flutter
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 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}
Request-Response protocol dengan 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
}