Tempel magnet kecil di roda, kipas, atau poros motor, lalu sensor Hall 49E menghitung berapa kali magnet lewat. Klenik menampilkan kecepatan putar dalam RPM (putaran per menit). Bisa dipakai untuk speedometer sepeda mini atau memantau kipas.
Sensor Hall 49E menghasilkan tegangan sebanding dengan kekuatan medan magnet. Tanpa magnet, keluarannya sekitar setengah tegangan suplai. Kutub utara mendekat membuatnya naik, dan kutub selatan membuatnya turun. Saat ESP32 menyala, nilai tanpa magnet diukur sebagai titik tengah, jadi jauhkan magnet saat itu.
Setiap kali selisih dari titik tengah melewati ambang, magnet dianggap lewat dan dihitung satu. Ambang untuk "menjauh" dibuat setengahnya (histeresis), supaya satu lintasan magnet tidak terhitung dua. Setiap 2 detik, hitungan diubah ke RPM: hitungan per detik × 60.
analogRead() dipanggil di setiap putaran loop(), ribuan kali per detik, sehingga putaran sampai beberapa ribu RPM masih terbaca.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| OH49E Hall Effect Sensor Magnet Switch OH 49E | 1 | Rp1.950 |
| Magnet 6x3mm Neodymium Bulat NdFeB Kuat 6mm 3mm | 1 | Rp1.463 |
| Breadboard mini 170 titik | 1 | Rp4.875 |
| 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) | Rp86.788 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Sensor Hall 49E (sisi tulisan menghadap kamu) VCC | → | 3V3 | merah |
| Sensor Hall 49E (sisi tulisan menghadap kamu) GND | → | GND | hitam |
| Sensor Hall 49E (sisi tulisan menghadap kamu) OUT | → | D34 GPIO34 | hijau |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p138.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 |
|---|---|---|
| Gauge Kecepatan | ichibot/KODE/p138/rpm | 0–3000 RPM |
| Chart Grafik RPM | ichibot/KODE/p138/rpm | 0–3000 RPM |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). 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 138 - Kecepatan Putar Motor (Hall Sensor)
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.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_RPM = "ichibot/budi1234/p138/rpm";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_HALL = 34;
const int MAGNET_PER_PUTARAN = 1;
int tengah = 1900, ambang = 150; // diisi otomatis saat menyala
bool dekat = false;
unsigned long hitungan = 0, kirimTerakhir = 0;
void kalibrasi() { // ukur nilai tanpa magnet sebagai titik tengah
long jumlah = 0;
for (int i = 0; i < 200; i++) { jumlah += analogRead(PIN_HALL); delay(2); }
tengah = jumlah / 200;
}
void langganan() {}
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);
kalibrasi(); // jauhkan magnet saat menyala
sambungWiFi();
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
int v = analogRead(PIN_HALL);
int beda = abs(v - tengah); // kutub magnet mana pun dihitung
if (!dekat && beda > ambang) { dekat = true; hitungan++; } // magnet mendekat: satu hitungan
if (dekat && beda < ambang / 2) dekat = false; // histeresis
if (millis() - kirimTerakhir >= 2000) {
float detik = (millis() - kirimTerakhir) / 1000.0;
kirimTerakhir = millis();
float rpm = hitungan / detik * 60 / MAGNET_PER_PUTARAN;
hitungan = 0;
mqtt.publish(TOPIK_RPM, String(rpm, 0).c_str());
}
}Langkah 4: Pahami kodenya
abs()membuat kutub utara maupun selatan sama-sama terhitung, jadi arah memasang magnet tidak penting.- Ambang turun lebih rendah daripada ambang naik, mencegah hitungan ganda saat magnet tepat di batas.
- Kalau memasang 2 magnet di roda (lebih seimbang), ubah menjadi 2.