IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 6 – Đọc cảm biến Hall A3144: phát hiện từ trường & theo dõi realtime

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:

  1. Đọc trạng thái Hall sensor local (Serial)
  2. 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áiGPIO
Không có nam châmHIGH
Có nam châmLOW

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
0không có từ trường
1phá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

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