Trong bài này, chúng ta làm việc với cảm biến Hall A3144 để phát hiện từ trường / nam châm. Đây là cảm biến rất phổ biến trong DIY/maker, thường dùng cho:
- Phát hiện vị trí có nam châm
- Đếm vòng quay (motor, bánh xe)
- Giám sát đóng/mở không tiếp xúc
- Encoder đơn giản, công tơ, công tắc từ nâng cao
Bài viết gồm 2 ví dụ code:
- Đọc trạng thái Hall sensor local (Serial)
- Gửi trạng thái/phát hiện từ trường lên IoTLabs Cloud MQTT để theo dõi realtime
1) Cảm biến Hall A3144 là gì?
- A3144 là Hall Effect Sensor dạng digital
- Chỉ phát hiện:
- Có từ trường (nam châm gần)
- Không có từ trường
Đặc điểm
- Logic LOW khi có từ trường
- Logic HIGH khi không có từ trường
- Hoạt động ổn định, chống rung tốt hơn Reed Switch
📌 So với Reed Switch:
- Reed: tiếp điểm cơ → dễ mòn
- Hall: bán dẫn → bền & chính xác hơn
2) Chuẩn bị
Phần cứng
- ESP32-C3 SuperMini (Tenstar Robot)
- Cảm biến Hall A3144 module
- Nam châm nhỏ
- Breadboard + dây
Chân sử dụng
- OUT → GPIO2
- VCC → 3.3V
- GND → GND
✅ A3144 dùng 3.3V hoặc 5V đều được
Khuyến nghị 3.3V cho ESP32
3) Nối dây Hall A3144 với ESP32
A3144 Module ESP32-C3 SuperMini
------------------------------------
VCC ------------ 3.3V
GND ------------ GND
OUT ------------ GPIO2
Logic đọc
| Trạng thái | GPIO |
|---|---|
| Không có nam châm | HIGH |
| Có nam châm | LOW |
4) Đặc điểm tín hiệu & lưu ý
- Tín hiệu rất ổn định
- Có thể dùng:
- Edge detect (thay đổi trạng thái)
- Đếm số lần kích hoạt (counter)
- Phù hợp realtime IoT, ít nhiễu
Ví dụ 1 — Code local đơn giản (phát hiện nam châm)
Mục tiêu: in trạng thái Có từ trường / Không có từ trường
// ===== Hall A3144 Local Read =====
const int HALL_PIN = 2;
int lastState = HIGH;
void setup() {
Serial.begin(115200);
delay(200);
pinMode(HALL_PIN, INPUT);
Serial.println("Hall A3144 monitor started...");
}
void loop() {
int state = digitalRead(HALL_PIN);
if (state != lastState) {
if (state == LOW) {
Serial.println("🧲 Phát hiện TỪ TRƯỜNG / NAM CHÂM");
} else {
Serial.println("⚪ Không có từ trường");
}
lastState = state;
}
delay(20);
}
5) Chuẩn dữ liệu realtime cho IoTLabs Cloud
Topic
iotlabs/<orgId>/devices/<deviceId>/telemetry
Payload JSON
{
"ts": 1760000000,
"metrics": {
"magnet": 1
},
"status": {
"magnet": "detected"
}
}
| magnet | Ý nghĩa |
|---|---|
| 0 | không có từ trường |
| 1 | phát hiện nam châm |
Ví dụ 2 — Gửi trạng thái Hall sensor lên IoTLabs Cloud MQTT
Chiến lược:
- Gửi khi trạng thái thay đổi
- Không spam dữ liệu
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
// ===== CONFIG =====
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";
const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";
const char* MQTT_TOPIC =
"iotlabs/<orgId>/devices/<deviceId>/telemetry";
// ===== HALL =====
const int HALL_PIN = 2;
int lastState = HIGH;
WiFiClientSecure net;
PubSubClient mqtt(net);
void connectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(400);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
void connectMQTT() {
net.setInsecure(); // demo
mqtt.setServer(MQTT_HOST, MQTT_PORT);
while (!mqtt.connected()) {
if (mqtt.connect("esp32c3-hall", MQTT_USER, MQTT_PASS)) {
Serial.println("MQTT connected");
break;
}
delay(1000);
}
}
void setup() {
Serial.begin(115200);
pinMode(HALL_PIN, INPUT);
connectWiFi();
connectMQTT();
}
void loop() {
if (!mqtt.connected()) connectMQTT();
mqtt.loop();
int state = digitalRead(HALL_PIN);
if (state != lastState) {
lastState = state;
long ts = millis() / 1000;
String payload = "{";
payload += "\"ts\":" + String(ts) + ",";
payload += "\"metrics\":{\"magnet\":" + String(state == LOW ? 1 : 0) + "},";
payload += "\"status\":{\"magnet\":\"";
payload += (state == LOW ? "detected" : "none");
payload += "\"}}";
mqtt.publish(MQTT_TOPIC, payload.c_str());
Serial.println(payload);
}
delay(20);
}
6) Lỗi thường gặp & kinh nghiệm
- Nam châm để quá xa
- A3144 cần nam châm đủ mạnh, khoảng cách ngắn
- Logic bị ngược
- LOW = detected là đúng chuẩn A3144
- Dùng để đếm vòng
- Kết hợp
counter++khi LOW → HIGH
- Kết hợp
7) Ứng dụng thực tế
- Đếm vòng quay bánh xe
- Công tắc không tiếp xúc
- Phát hiện vị trí trục motor
- Kết hợp Reed Switch để so sánh độ bền
- Hệ thống giám sát cơ khí
Bài tiếp theo (Level 1 – bài cuối)
👉 Bài 7: Hướng dẫn đọc cảm biến Button/Limit Switch bằng ESP32: phát hiện nhấn/chạm & theo dõi realtime


