Từ breadboard đến thiết bị dùng thật: đưa ESP32 vào hộp, khoan lỗ jack Type-C, GX16, jack DC

Đưa dự án ESP32 từ breadboard vào hộp: cấp nguồn USB 5 V hoặc adapter 12 V qua LM2596, bố trí linh kiện, khoan lỗ jack Type-C, jack DC, GX16 và chương trình hộp relay có nút nhấn.

Mạch ESP32 chạy ngon trên breadboard chưa phải là thiết bị dùng được hằng ngày: dây cắm lỏng, nguồn lấy từ máy tính, không có chỗ cắm tải, không có nút bấm. Bài này đi qua các bước biến một dự án ESP32 thành thiết bị đặt trong hộp: chọn cách cấp nguồn 5 V hoặc 12 V, bố trí linh kiện, khoan lỗ cho jack Type-C, jack DC và đầu nối GX16, nối dây, và một chương trình mẫu cho hộp điều khiển relay có nút nhấn, đèn báo, nhớ trạng thái khi mất điện và cảnh báo khi nguồn yếu.

1. Chọn cách cấp nguồn

Sơ đồ khối hai cách cấp nguồn cho ESP32 trong hộp: củ sạc 5 V qua jack Type-C gắn hộp vào chân VIN; adapter 12 V qua jack DC gắn hộp và mạch hạ áp LM2596 ra 5 V cho ESP32 và module relay
Cách A dùng nguồn USB 5 V, cách B dùng adapter 12 V qua mạch hạ áp (hình minh họa).

2. Bố trí linh kiện trong hộp

Bố trí trong hộp nhìn từ trên: vùng nguồn với jack DC và LM2596, ESP32 trên đế ra chân ở giữa, module relay gần cửa ra GX16, cầu phân áp, nút và LED ở mặt trước
Chia hộp thành vùng nguồn, vùng điều khiển và vùng tải (hình minh họa, không theo tỉ lệ).
  • Chia vùng: nguồn vào (jack DC, mạch hạ áp) ở một góc; ESP32 ở giữa; relay sát cửa ra tải để dây tải ngắn và không chạy ngang qua ESP32.
  • Cố định mạch bằng cột đồng M3 và ốc; cắm ESP32 lên đế ra chân để thay mạch không cần hàn. Không dán keo nóng lên IC hạ áp, cuộn cảm vì chúng nóng khi chạy tải lớn.
  • Đi dây: bó dây tín hiệu riêng, dây tải và dây 220 V riêng; dây vào ra đầu nối để dư một đoạn và có chỗ giữ để kéo dây không giật vào mối hàn.
  • Anten Wi-Fi: hộp nhựa không chặn sóng. Hộp kim loại chặn sóng Wi-Fi, khi đó dùng ESP32 bản anten rời và đưa anten ra ngoài hộp.
  • Thiết bị nhỏ chỉ có ESP32 và vài cảm biến thì dùng luôn hộp mica cho ESP32 DevKit 30 chân (65 × 45 × 25 mm).

3. Khoan lỗ mặt hộp

Mặt sau hộp có vị trí lỗ cho jack DC, jack Type-C tròn, đầu nối GX16 lỗ 16 mm và năm bước khoan lỗ
Vị trí lỗ ở mặt sau hộp và các bước khoan (hình minh họa, không theo tỉ lệ).
  1. Đo đường kính thân ren của từng jack bằng thước kẹp; lỗ khoan lớn hơn khoảng 0,3–0,5 mm. Đầu nối GX16 khoan lỗ 16 mm (chi tiết trong bài đầu nối GX16 là gì).
  2. Dán băng keo giấy lên mặt hộp, vẽ tâm lỗ, chấm dấu bằng mũi nhọn để mũi khoan không trượt.
  3. Khoan mồi 3 mm, mở rộng bằng mũi khoan bước; nhựa mềm thì khoan tốc độ chậm để lỗ không chảy nhựa.
  4. Gọt ba via, thử lắp. Jack có tai chống xoay thì khoét thêm rãnh nhỏ.
  5. Chừa khoảng cách giữa các lỗ đủ để vặn đai ốc và cầm đầu cắm khi rút.

Kiểm tra cực tính jack DC trước khi hàn: phần lớn adapter có tâm dương; cách đo có trong bài jack DC 5.5×2.1 và 5.5×2.5, cực tính. Đeo kính bảo hộ khi khoan.

4. Nối dây và chương trình mẫu: hộp relay có nút nhấn

Sơ đồ nối ESP32 DevKit V1 với LM2596, module relay ở D27, nút nhấn ở D33, LED qua điện trở 330 ôm ở D25, cầu phân áp 100 kΩ và 22 kΩ đo nguồn 12 V vào D35
Sơ đồ nối cho chương trình mẫu; nhãn cùng tên là cùng một dây (hình minh họa).
Linh kiệnNối với ESP32Ghi chú
LM2596, ngõ ra 5 VVIN, GNDChỉnh đúng 5 V trước khi nối ESP32
Module relay: VCC, GND, IN5 V, GND, D27Module kích mức thấp
Nút nhấn trên mặt hộpD33 và GNDDùng điện trở kéo lên bên trong
LED trên mặt hộpD25 qua điện trở 330 ΩCực âm LED về GND
Cầu phân áp 100 kΩ / 22 kΩĐiểm giữa vào D3512 V chia còn khoảng 2,2 V
// PYWORLD.VN - Hộp điều khiển dùng thật: nút nhấn trên mặt hộp bật tắt relay, LED báo trạng thái
// PYWORLD.VN - Nhớ trạng thái relay vào bộ nhớ flash (Preferences), mất điện có lại vẫn đúng trạng thái cũ
// PYWORLD.VN - Đo điện áp nguồn 12 V qua cầu phân áp 100 kΩ / 22 kΩ vào GPIO35, nháy LED cảnh báo khi nguồn yếu

#include <Preferences.h>
#include "esp_system.h"

const int RELAY_PIN = 27;
const bool RELAY_KICH_MUC_THAP = true;   // module relay kích mức thấp: IN = LOW là relay đóng
const int NUT_PIN = 33;                  // nút nhấn nối GPIO33 với GND, dùng điện trở kéo lên bên trong
const int LED_PIN = 25;                  // LED trên mặt hộp, nối qua điện trở 330 Ω xuống GND
const int CHAN_DO_NGUON = 35;            // điểm giữa cầu phân áp từ nguồn 12 V
const uint32_t CAU_TREN_KOHM = 100;      // điện trở từ nguồn 12 V xuống điểm giữa
const uint32_t CAU_DUOI_KOHM = 22;       // điện trở từ điểm giữa xuống GND
const uint32_t NGUON_YEU_MV = 10500;     // dưới 10,5 V coi là nguồn yếu
const uint32_t CHONG_DOI_MS = 30;        // thời gian chống dội phím
const uint32_t CHU_KY_IN_MS = 5000;

Preferences boNho;
bool relayDangBat = false;
uint32_t soLanBam = 0;

void datRelay(bool bat) {
  relayDangBat = bat;
  digitalWrite(RELAY_PIN, (bat == RELAY_KICH_MUC_THAP) ? LOW : HIGH);
}

// Điện áp nguồn (mV) = điện áp chân đo x (100 + 22) / 22; lấy trung bình 16 lần đo
uint32_t doNguonMv() {
  uint32_t tong = 0;
  for (int i = 0; i < 16; i++) {
    tong += analogReadMilliVolts(CHAN_DO_NGUON);
  }
  return tong / 16 * (CAU_TREN_KOHM + CAU_DUOI_KOHM) / CAU_DUOI_KOHM;
}

const char *lyDoKhoiDong() {
  switch (esp_reset_reason()) {
    case ESP_RST_POWERON: return "cap nguon";
    case ESP_RST_BROWNOUT: return "SUT AP";
    case ESP_RST_SW: return "khoi dong lai bang lenh";
    case ESP_RST_PANIC: return "LOI CHUONG TRINH";
    default: return "khac";
  }
}

void setup() {
  // Giữ relay nhả trong lúc khởi động: ghi mức "tắt" khi chân còn là ngõ vào rồi mới chuyển thành ngõ ra
  pinMode(RELAY_PIN, INPUT);
  digitalWrite(RELAY_PIN, RELAY_KICH_MUC_THAP ? HIGH : LOW);
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(NUT_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);

  Serial.begin(115200);
  delay(300);

  boNho.begin("hop_relay", false);
  bool trangThaiCu = boNho.getBool("relay", false);
  datRelay(trangThaiCu);
  digitalWrite(LED_PIN, trangThaiCu ? HIGH : LOW);

  Serial.println();
  Serial.printf("Khoi dong: %s\n", lyDoKhoiDong());
  Serial.printf("Khoi phuc relay: %s\n", trangThaiCu ? "BAT" : "TAT");
}

void loop() {
  // Nút nhấn: đọc mức, chống dội, chỉ xử lý lúc vừa nhấn xuống
  static int mucTruoc = HIGH;
  static uint32_t lucDoi = 0;
  static int mucOnDinh = HIGH;
  int muc = digitalRead(NUT_PIN);
  if (muc != mucTruoc) {
    lucDoi = millis();
    mucTruoc = muc;
  }
  if (millis() - lucDoi > CHONG_DOI_MS && muc != mucOnDinh) {
    mucOnDinh = muc;
    if (mucOnDinh == LOW) {
      datRelay(!relayDangBat);
      boNho.putBool("relay", relayDangBat);   // chỉ ghi khi trạng thái đổi để đỡ mòn flash
      soLanBam++;
      Serial.printf("Nhan nut: relay %s\n", relayDangBat ? "BAT" : "TAT");
    }
  }

  // LED: sáng khi relay bật; nháy nhanh khi nguồn yếu
  static uint32_t lanDoNguon = 0;
  static uint32_t nguonMv = 12000;
  if (millis() - lanDoNguon >= 500) {
    lanDoNguon = millis();
    nguonMv = doNguonMv();
  }
  bool nguonYeu = nguonMv < NGUON_YEU_MV;
  if (nguonYeu) {
    digitalWrite(LED_PIN, (millis() / 150) % 2);
  } else {
    digitalWrite(LED_PIN, relayDangBat ? HIGH : LOW);
  }

  static uint32_t lanIn = 0;
  if (millis() - lanIn >= CHU_KY_IN_MS) {
    lanIn = millis();
    Serial.printf("Nguon %u mV%s | relay %s | so lan nhan %u\n", (unsigned)nguonMv, nguonYeu ? " (YEU)" : "",
                  relayDangBat ? "BAT" : "TAT", (unsigned)soLanBam);
  }
}

Các điểm chính của chương trình:

  • Nhớ trạng thái: thư viện Preferences có sẵn trong gói esp32 lưu trạng thái relay vào vùng nvs của bộ nhớ flash. Mất điện có lại, relay về đúng trạng thái cũ. Chương trình chỉ ghi khi trạng thái đổi để đỡ mòn flash.
  • Relay không đóng thoáng qua lúc cấp nguồn: chân điều khiển được ghi mức "tắt" khi còn là ngõ vào rồi mới chuyển thành ngõ ra.
  • Chống dội phím: chỉ nhận lần nhấn khi mức của nút đứng yên hơn 30 ms.
  • Đo nguồn 12 V: analogReadMilliVolts() đọc điện áp chân D35, nhân với (100 + 22) / 22. Điện trở sai số 5 % thì số đo lệch vài phần trăm: đo nguồn bằng đồng hồ vạn năng, so với số in ra và chỉnh hằng số CAU_DUOI_KOHM nếu cần. Dưới 10,5 V thì LED nháy nhanh báo nguồn yếu.
Serial Monitor của chương trình hộp relay: lý do khởi động, khôi phục trạng thái relay, nhấn nút bật tắt relay, điện áp nguồn 12033 mV và cảnh báo nguồn yếu 10314 mV
Kết quả ở Serial Monitor tốc độ 115200 (hình minh họa, số liệu ví dụ).

5. Trước khi đóng hộp

  1. Cấp 12 V, đo ngõ ra LM2596 bằng đồng hồ vạn năng, chỉnh đúng 5 V khi chưa nối ESP32.
  2. Nối ESP32, nạp chương trình, thử nút, relay, LED khi hộp còn mở.
  3. Thử relay đóng cắt tải thật vài chục lần; ESP32 khởi động lại hay treo thì xem lại cách đi dây và nguồn (bài relay làm ESP32 bị reset cùng đợt bài này giải thích chi tiết).
  4. Lắc nhẹ hộp, kéo nhẹ từng dây ra vào để chắc không có mối hàn lỏng.
  5. Dán nhãn cạnh từng cổng: "12 V DC", "Tải", "USB 5 V". Đóng hộp xong muốn nạp chương trình mới thì nạp qua Wi-Fi theo bài nạp chương trình cho ESP32 qua Wi-Fi (OTA).

Thiết bị đóng cắt điện 220 V phải có cầu chì, dây đủ tiết diện và phải cắt điện khi lắp; cách nối relay an toàn có trong bài ESP32 điều khiển module relay an toàn.

6. Xem thêm

Cần tư vấn chọn linh kiện để đóng hộp thiết bị, liên hệ PYWORLD qua số 0915703319.


Tin tức liên quan

Ghi dữ liệu ESP32 lên Google Sheets bằng Apps Script: điện áp pin, Wi-Fi, không cần máy chủ riêng
Ghi dữ liệu ESP32 lên Google Sheets bằng Apps Script: điện áp pin, Wi-Fi, không cần máy chủ riêng

Tạo bảng tính, triển khai Apps Script thành web app, đo pin 18650 qua cầu phân áp và chương trình ESP32 gửi JSON lên Google Sheets mỗi phút, kèm bảng xử lý lỗi.

Hướng dẫn dùng MQTT với ESP32: gửi dữ liệu và điều khiển relay bằng PubSubClient
Hướng dẫn dùng MQTT với ESP32: gửi dữ liệu và điều khiển relay bằng PubSubClient

Hướng dẫn dùng MQTT với ESP32 trên Arduino IDE: broker, topic, publish, subscribe, cài Mosquitto và PubSubClient, gửi dữ liệu và điều khiển module relay qua mạng nội bộ.

Hướng dẫn dùng mạch tạo trễ NE555 có relay: đấu dây và chỉnh thời gian trễ
Hướng dẫn dùng mạch tạo trễ NE555 có relay: đấu dây và chỉnh thời gian trễ

Hướng dẫn dùng mạch tạo trễ NE555 có relay bản 5 V và 12 V: nguyên lý tạo trễ, ý nghĩa các cọc VCC, GND, COM, CK, CB, cách chỉnh thời gian trễ, sơ đồ đấu dây và xử lý lỗi thường gặp.

Vẽ đồ thị dữ liệu ESP32 trên ThingSpeak: theo dõi pin 18650, ngủ sâu và ước tính thời gian chạy pin
Vẽ đồ thị dữ liệu ESP32 trên ThingSpeak: theo dõi pin 18650, ngủ sâu và ước tính thời gian chạy pin

ESP32 chạy pin 18650 thức dậy mỗi 10 phút, đo điện áp pin, gửi lên ThingSpeak rồi ngủ sâu; cách tạo kênh, ước tính thời gian chạy pin và giảm dòng lúc ngủ.

Cấu hình LoRa trên ESP32: SF, băng thông, tỉ lệ mã, công suất và cách thử tầm xa
Cấu hình LoRa trên ESP32: SF, băng thông, tỉ lệ mã, công suất và cách thử tầm xa

Giải thích bốn tham số cấu hình LoRa (SF, băng thông, tỉ lệ mã, công suất), cách tính thời gian phát một gói và hướng dẫn làm bộ thử tầm xa bằng ESP32, SX1278 và màn hình OLED.

Chọn pin, driver và mạch nguồn cho xe robot ESP32 dùng 2 motor 140 mini
Chọn pin, driver và mạch nguồn cho xe robot ESP32 dùng 2 motor 140 mini

Xe robot ESP32 với 2 motor 140 mini nên dùng pin 2S 7,4 V, một driver đôi TB6612FNG và mạch hạ áp 5 V: ước tính dòng, so sánh pin, driver, nối dây, chống reset và code mẫu.

Hướng dẫn bắt đầu với Wemos D1 R2 (ESP8266) trên Arduino IDE
Hướng dẫn bắt đầu với Wemos D1 R2 (ESP8266) trên Arduino IDE

Hướng dẫn dùng Wemos D1 R2 (ESP8266 khung Arduino UNO) với Arduino IDE 2.x: sơ đồ chân, cài driver CH340 và gói board ESP8266, nạp code nháy LED, kết nối WiFi và xử lý lỗi thường gặp.

Hướng dẫn ESP-NOW trên ESP32: truyền dữ liệu giữa hai mạch không cần router Wi-Fi
Hướng dẫn ESP-NOW trên ESP32: truyền dữ liệu giữa hai mạch không cần router Wi-Fi

Hướng dẫn dùng ESP-NOW để hai mạch ESP32 truyền dữ liệu trực tiếp không cần router: xem địa chỉ MAC, chương trình gửi, chương trình nhận, đọc RSSI và xử lý lỗi thường gặp.


Bình luận
Đã thêm vào giỏ hàng