Tutorial Belanja komponen

Tutorial › Keamanan

Deteksi Kotak Diangkat (Kemiringan)

ESP32-WROOM-32D23D22TX0RX0D21D19D18D5TX2RX2D4D2D15GND3V3ENVPVND34D35D32D33D25D26D27D14D12D13GNDVINVCCSDASCLI2I1GNDMMA8452 (I2C)+S+−Modul buzzer aktif KY-012

Akselerometer MMA8452 di dalam kotak perhiasan, kotak amal, atau tas. Begitu kotak diangkat, dimiringkan, atau digeser, sirine berbunyi dan Klenik memberi tahu, walaupun kotaknya tidak dibuka.

Akselerometer mengukur percepatan di tiga arah (x, y, z). Saat diam, yang terukur hanya gravitasi bumi: total 1 g yang terbagi ke tiga sumbu sesuai kemiringan kotak. Begitu kotak dimiringkan atau diangkat, pembagiannya berubah.

Saat alarm diaktifkan, posisi diam disimpan sebagai awalX, awalY, awalZ. Setelah itu setiap 0,1 detik dihitung jarak antara bacaan sekarang dan posisi diam itu dengan rumus Pythagoras tiga dimensi. Kalau jaraknya lebih dari 0,15 g, kotak dianggap bergerak. Cara ini peka terhadap gerakan ke segala arah sekaligus, tanpa perlu memeriksa setiap sumbu.

Komponen

KomponenQtyHarga
ESP32 DOIT DevKit V1 30 pin1Rp75.000
Akselerometer MMA84521Rp8.000
Modul buzzer aktif KY-0121Rp7.500
Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 71Rp3.500
Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data1Rp11.700
Total (tanpa opsional)Rp94.000
Daftar komponen proyek ini otomatis masuk ke pesan. Hapus yang sudah kamu punya sebelum dikirim.

Langkah 1: Rangkai komponen

Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.

DariKeKabel
MMA8452 (I2C) VCC→3V3merah
MMA8452 (I2C) SDA→D21 GPIO21biru
MMA8452 (I2C) SCL→D22 GPIO22kuning
MMA8452 (I2C) GND→GNDhitam
Modul buzzer aktif KY-012 S→D26 GPIO26oranye
Modul buzzer aktif KY-012 +→VINmerah
Modul buzzer aktif KY-012 −→GNDhitam

Langkah 2: Siapkan dashboard Klenik

Jaga Kotakichibot/budi1234/p118/siaga
Siaga
0 detik lalu
Kotakichibot/budi1234/p118/alarm
DIPINDAH!
0 detik lalu
Perubahanichibot/budi1234/p118/beda
0 – 10.02 g
0 detik lalu
Catatanichibot/budi1234/p118/log
Kotak dipindahkan! perubahan 0.41 g
0 detik lalu

Cara cepat: unduh p118.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.

WidgetTopicSetting
Switch
Jaga Kotak
ichibot/KODE/p118/siagapayload ON / OFF
Indikator Boolean
Kotak
ichibot/KODE/p118/alarmON = 1 “DIPINDAH!”, OFF = 0
Gauge
Perubahan
ichibot/KODE/p118/beda0–1 g
Text Log
Catatan
ichibot/KODE/p118/logmenampilkan teks masuk

Langkah 3: Upload kode

Library: PubSubClient (Nick O'Leary), SparkFun MMA8452Q Accelerometer. 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).

p118.inoUnduh .ino
// Proyek 118 - Deteksi Kotak Diangkat (Kemiringan)
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <SparkFun_MMA8452Q.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_ALARM = "ichibot/budi1234/p118/alarm";
const char* TOPIK_SIAGA = "ichibot/budi1234/p118/siaga";
const char* TOPIK_LOG   = "ichibot/budi1234/p118/log";
const char* TOPIK_BEDA  = "ichibot/budi1234/p118/beda";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
MMA8452Q akselero;                    // I2C: SDA 21, SCL 22
const int SIRINE = 26;
const float BATAS = 0.15;             // perubahan (g) yang dianggap kotak bergerak
float awalX, awalY, awalZ;                     // posisi diam saat alarm diaktifkan
bool siaga = false, berbunyi = false;
unsigned long terakhir = 0;

void simpanPosisi() {
  delay(200);
  while (!akselero.available()) delay(5);
  awalX = akselero.getCalculatedX(); awalY = akselero.getCalculatedY(); awalZ = akselero.getCalculatedZ();
}

void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
  String p;
  for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
  siaga = (p == "ON");
  berbunyi = false;
  if (siaga) simpanPosisi();          // posisi sekarang = posisi aman
  mqtt.publish(TOPIK_ALARM, "0", true);
}

void langganan() {
  mqtt.subscribe(TOPIK_SIAGA);
}

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); pinMode(SIRINE, OUTPUT); Wire.begin(); if (!akselero.begin()) Serial.println("MMA8452 tidak ditemukan, cek SDA/SCL"); sambungWiFi(); mqtt.setServer(BROKER, 1883); mqtt.setCallback(pesanMasuk); } void loop() { if (!mqtt.connected()) sambungMQTT(); mqtt.loop(); digitalWrite(SIRINE, berbunyi && (millis() / 200) % 2); if (!akselero.available() || millis() - terakhir < 100) return; terakhir = millis(); float x = akselero.getCalculatedX(), y = akselero.getCalculatedY(), z = akselero.getCalculatedZ(); float beda = sqrt(sq(x - awalX) + sq(y - awalY) + sq(z - awalZ)); // jarak dari posisi aman if (siaga && !berbunyi && beda > BATAS) { berbunyi = true; mqtt.publish(TOPIK_ALARM, "1", true); mqtt.publish(TOPIK_LOG, ("Kotak dipindahkan! perubahan " + String(beda, 2) + " g").c_str()); } static unsigned long kirim = 0; if (millis() - kirim > 1000) { kirim = millis(); mqtt.publish(TOPIK_BEDA, String(beda, 2).c_str()); } }

Langkah 4: Pahami kodenya

  1. Jarak 3D antara posisi sekarang dan posisi aman. sq() = kuadrat, sqrt() = akar.
  2. Setiap kali alarm diaktifkan, posisi kotak saat itu menjadi patokan. Kotak boleh diletakkan miring asal tidak bergerak setelahnya.
  3. Kepekaan. 0,15 g kira-kira sama dengan kemiringan 9°. Gauge Perubahan membantu memilih angka yang pas.