Ubah angka dari proyek lain menjadi jarum meteran sungguhan di meja. Servo menunjuk suhu dari proyek 021, isi tandon dari proyek 065, atau angka apa pun di Klenik. Skala kertas di belakang jarum bisa kamu gambar sendiri.
Semua proyek di buku ini mengirim angka lewat broker yang sama. ESP32 di proyek ini berlangganan topic milik proyek lain, misalnya ichibot/budi1234/p021/suhu, dan ikut menerima angka suhu setiap kali proyek 021 mengirimnya. Satu alat mengukur, alat lain menampilkan, dan keduanya tidak perlu saling tahu.
Angka diubah ke sudut servo dengan perbandingan lurus. Nilai minimum menjadi 180° (jarum di kiri), dan nilai maksimum menjadi 0° (jarum di kanan). Jarum digerakkan 1° setiap 15 ms supaya halus seperti jarum meteran analog. Dari dashboard, jarum juga bisa digerakkan lewat slider di topic nilai.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Servo MG90 Metal Gear Micro 9g Tower Pro 180 Der | 1 | Rp33.950 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 3 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp112.450 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Servo MG90 (coklat −, merah +, oranye S) − | → | GND | coklat |
| Servo MG90 (coklat −, merah +, oranye S) + | → | VIN | merah |
| Servo MG90 (coklat −, merah +, oranye S) S | → | D13 GPIO13 | oranye |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p099.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Slider Output Uji Jarum | ichibot/KODE/p099/nilai | 20–40 |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), ESP32Servo. Board di Arduino IDE: ESP32 Dev Module.
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 099 - Penunjuk Jarum Servo (Meteran Analog)
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_NILAI = "ichibot/budi1234/p099/nilai";
const char* SUMBER = "ichibot/budi1234/p021/suhu"; // topic yang ditunjuk jarum
const float NILAI_MIN = 20, NILAI_MAKS = 40; // ujung kiri dan kanan skala
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
Servo jarum;
const int PIN_SERVO = 13;
float sudutSekarang = 90, sudutTujuan = 90;
unsigned long gerakTerakhir = 0;
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
float nilai = constrain(p.toFloat(), NILAI_MIN, NILAI_MAKS);
// servo 180° = kiri (nilai kecil), 0° = kanan (nilai besar), seperti meteran jarum
sudutTujuan = 180 - (nilai - NILAI_MIN) / (NILAI_MAKS - NILAI_MIN) * 180;
}
void langganan() {
mqtt.subscribe(SUMBER);
mqtt.subscribe(TOPIK_NILAI); // bisa juga digerakkan dari slider
}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
jarum.setPeriodHertz(50);
jarum.attach(PIN_SERVO, 500, 2400);
jarum.write(sudutSekarang);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
// jarum bergerak pelan seperti meteran sungguhan: 1° setiap 15 ms
if (abs(sudutTujuan - sudutSekarang) >= 1 && millis() - gerakTerakhir >= 15) {
gerakTerakhir = millis();
sudutSekarang += (sudutTujuan > sudutSekarang) ? 1 : -1;
jarum.write((int)sudutSekarang);
}
}Langkah 4: Pahami kodenya
- Topic lengkap yang ditunjuk jarum. Ganti
budi1234dengan KODE-mu danp021/suhudengan proyek dan data yang diinginkan, misalnyap065/persen. - Rentang skala. Untuk persen isi tandon, pakai 0 dan 100.
- Perbandingan lurus seperti
map(), tetapi dengan pecahan (float), jadi angka seperti 27,5 tetap tepat. - Berlangganan topic milik proyek lain. Proyek sumber harus menyala dan memakai KODE yang sama.