Skip to content

IoTAn Hung Nguyen

Kí sự: Build một hệ thống bật/tắt và theo dõi trạng thái máy tính từ xa - Version 1.0

Xây dựng hệ thống IoT sử dụng ESP32-C3 và relay để bật/tắt, theo dõi trạng thái máy tính từ xa thông qua WebSocket và VPS.

Mục lục

Kí sự: Build một hệ thống bật/tắt và theo dõi trạng thái máy tính từ xa - Version 1.0

Lâu rồi không viết gì mang tính chia sẻ kỹ thuật, toàn đăng tào lao :)) Nên hôm nay mình viết đôi chút về một hệ thống IoT đơn giản mà mình tự xây dựng.

Cơ bản là viết mấy cái này cũng ít người đọc nên mình cũng lười viết lắm. Thôi, lan man đủ rồi :)))

Bài toán đặt ra

Mình có một chiếc máy tính AIPC với cấu hình tương đối tốt, đủ để thử nghiệm hoặc demo một số sản phẩm AI khi cần đi trình diễn, hoặc đơn giản là chạy thử nghiệm lại một số paper về AI được công bố trên mạng.

Tuy nhiên, không phải lúc nào mình cũng có thể ngồi bên chiếc máy tính đó. Mình cũng không muốn bật máy thường xuyên vì một số lý do sau.

1. Điện năng tiêu thụ

Nếu tính đơn thuần ở trạng thái idle, bộ máy tính tiêu thụ khoảng 50–75 W. Đây có thể xem là một khoản chi phí không cần thiết, bởi không phải lúc nào mình cũng cần bật máy. Một số thử nghiệm đơn giản hoàn toàn có thể sử dụng laptop của mình là đủ rồi.

Còn khi chạy ở mức công suất tối đa, mức tiêu thụ điện có thể lên tới khoảng 600–700 W.

Giả sử lấy mức tiêu thụ trung bình là 650 W khi chạy full load và giá điện là 2.500 đồng/kWh, nếu máy chạy liên tục suốt một tháng thì lượng điện tiêu thụ sẽ là:

  • Khi chạy full load: 650 × 24 × 30 = 468.000 Wh = 468 kWh.
  • Chi phí tương ứng: 468 × 2.500 = 1.170.000 đồng.

Trong trường hợp máy không chạy thử nghiệm gì mà chỉ duy trì trạng thái idle ở mức 70 W:

  • Điện năng tiêu thụ: 70 × 24 × 30 = 50.400 Wh = 50,4 kWh.
  • Chi phí tương ứng: 50,4 × 2.500 = 126.000 đồng.

Như vậy, kể cả khi không làm gì, mỗi tháng mình vẫn mất khoảng 125.000 đồng, tương đương gần 5 USD, chỉ để duy trì chiếc máy tính ở trạng thái bật :))

2. Vấn đề an toàn điện

Việc để máy tính hoạt động 24/7 cũng khiến mình có một vài băn khoăn về an toàn điện và độ ổn định của hệ thống.

Đôi khi, khu vực đặt máy tính bị mất điện. Khi có điện trở lại, máy không nhất thiết tự khởi động lại, khiến mình không thể truy cập từ xa để tiếp tục công việc.

3. Vấn đề khoảng cách

Giả sử mình muốn ra quán cà phê chill chill, hoặc bay sang Singapore để diễn thuyết và demo một số sản phẩm AI, thì việc phải có người ở nhà bật máy tính giúp sẽ trở thành một vấn đề khá lớn.

Mình muốn có thể bật máy tính ở nhà từ bất cứ đâu, miễn là có kết nối Internet.

4. Tiếng ồn và đèn LED

Ngoài ra, tiếng ồn từ quạt và hệ thống đèn LED cũng là những thứ mình không thực sự cần khi máy tính không được sử dụng.

Mình muốn có thể kiểm soát việc bật/tắt máy tính và các thành phần liên quan từ xa, thay vì để cả hệ thống hoạt động liên tục.

Từ những vấn đề trên, mình nghĩ đến việc xây dựng một giải pháp IoT đơn giản, cho phép bật/tắt máy tính và theo dõi trạng thái hoạt động từ xa thông qua một mạch ESP32-C3.


Nguyên lý hoạt động

1. ESP32-C3 và module relay

Mình lập trình mạch ESP32-C3 để giao tiếp với module relay, cho phép mô phỏng thao tác nhấn nút nguồn trên máy tính.

Ở đây, mình hàn dây trực tiếp vào board mạch của PC để có thể điều khiển nút nguồn thông qua relay, đồng thời vẫn giữ nguyên khả năng sử dụng nút nguồn vật lý như bình thường.

Nhờ vậy, ESP32-C3 có thể gửi tín hiệu điều khiển relay để thực hiện thao tác tương tự như khi nhấn nút nguồn trên máy tính.

Tuy nhiên, nếu chỉ có chức năng bật/tắt thì mình sẽ không biết máy tính hiện đang bật hay tắt. Vì vậy, mình bổ sung thêm một đường tín hiệu kết nối giữa PC và ESP32-C3 để theo dõi trạng thái hoạt động.

2. Theo dõi trạng thái bật/tắt của PC

Ý tưởng khá đơn giản: khi máy tính hoạt động, đường nguồn 5 V được lựa chọn để giám sát sẽ có điện áp. Tín hiệu này được đưa về mạch ESP32-C3 để xác định trạng thái của máy tính.

Do các chân GPIO của ESP32-C3 chỉ chịu được mức điện áp phù hợp với logic 3,3 V, mình cần xử lý tín hiệu đầu vào để tránh làm hỏng vi điều khiển.

Trong thiết kế ban đầu, mình sử dụng IC ổn áp AMS1117-3.3 để tạo mức 3,3 V.

Lưu ý kỹ thuật: AMS1117-3.3 là IC ổn áp, không phải mạch chuyển mức logic chuyên dụng. Khi thiết kế thực tế, cần kiểm tra cách đấu nối, giới hạn điện áp đầu vào và đặc tính tín hiệu. Với tín hiệu trạng thái 5 V đưa vào GPIO, nên sử dụng mạch chia áp hoặc mạch chuyển mức phù hợp, bảo đảm điện áp tại GPIO không vượt quá giới hạn cho phép.

Nhờ có đường tín hiệu phản hồi này, hệ thống không chỉ gửi lệnh điều khiển mà còn có thể cập nhật trạng thái bật/tắt của PC.

3. Cấp nguồn cho ESP32-C3

Về nguồn cấp cho ESP32-C3, mình sử dụng một module nguồn chuyển đổi từ điện lưới 220 V AC xuống 5 V DC, dòng tối đa 2 A.

Một phương án khác là lấy nguồn 5 V từ PSU của máy tính. Tuy nhiên, mình không muốn phụ thuộc vào PSU để duy trì hoạt động của mạch điều khiển khi máy tính đã tắt. Vì vậy, mình sử dụng một module nguồn riêng :)))

Cách này giúp ESP32-C3 vẫn có thể hoạt động độc lập, duy trì kết nối với máy chủ và nhận lệnh bật máy tính ngay cả khi PC đang tắt.

Đương nhiên, việc thiết kế mạch nguồn sử dụng điện lưới cần đặc biệt chú ý đến cách điện, bảo vệ quá dòng và an toàn khi lắp đặt.

4. Điều khiển từ xa thông qua WebSocket và VPS

Đây là phần thú vị nhất của hệ thống.

Mình muốn có thể bật máy tính ở nhà ngay cả khi đang ở Singapore, hoặc bất cứ đâu có kết nối Internet :)))

Để thực hiện điều đó, mình xây dựng một WebSocket client chạy trên ESP32-C3, cho phép mạch kết nối đến VPS thông qua Internet.

Về cơ bản, luồng hoạt động như sau:

  1. ESP32-C3 khởi động và kết nối Internet.
  2. ESP32-C3 thiết lập kết nối WebSocket với VPS.
  3. Khi mình gửi lệnh từ điện thoại hoặc laptop, VPS chuyển tiếp lệnh đến ESP32-C3.
  4. ESP32-C3 điều khiển relay để bật/tắt PC theo lệnh nhận được.
  5. ESP32-C3 đọc tín hiệu phản hồi từ máy tính và gửi trạng thái trở lại VPS.
  6. Giao diện điều khiển từ xa hiển thị trạng thái hiện tại của PC.

Nhờ đó, mình có thể điều khiển và theo dõi máy tính thông qua một giao diện web, mà không cần phải kết nối trực tiếp vào mạng nội bộ ở nhà.

VPS đóng vai trò trung gian giúp hệ thống hoạt động xuyên mạng, còn WebSocket cho phép duy trì kết nối hai chiều giữa máy chủ và thiết bị.


Tại sao không sử dụng Wake-on-LAN?

Một câu hỏi có thể xuất hiện là: tại sao mình không sử dụng Wake-on-LAN (WoL) để bật máy tính từ xa?

Lý do đơn giản là mình không muốn tạo thêm một rủi ro bảo mật cho hệ thống mạng ở nhà :)))

Mình muốn hạn chế việc phải mở thêm các cơ chế truy cập từ bên ngoài vào mạng nội bộ. Thay vào đó, ESP32-C3 chủ động thiết lập kết nối đến VPS để nhận lệnh điều khiển.

Tất nhiên, phương án sử dụng VPS và WebSocket không tự động bảo đảm an toàn tuyệt đối. Hệ thống vẫn cần xác thực thiết bị, xác thực lệnh điều khiển, sử dụng kết nối TLS và hạn chế quyền truy cập để tránh người khác có thể gửi lệnh bật/tắt máy tính trái phép.


Kết quả ban đầu

Thật thú vị là toàn bộ mạch điều khiển chỉ tiêu thụ khoảng 0,2–0,3 W ở trạng thái idle :)))

ESP32-C3 sử dụng kiến trúc RISC-V, kết hợp với khả năng tiêu thụ điện năng thấp, nên khá phù hợp cho những ứng dụng IoT cần hoạt động liên tục.

So với việc để cả bộ máy tính tiêu thụ khoảng 50–75 W khi idle, mức tiêu thụ của mạch điều khiển nhỏ hơn rất nhiều.

Ý tưởng của mình là chỉ bật máy tính khi thực sự cần sử dụng, sau đó tắt máy khi hoàn thành công việc. Nhờ vậy, mình có thể giảm điện năng tiêu thụ không cần thiết, đồng thời chủ động hơn trong việc truy cập và demo các sản phẩm AI từ xa.

Đây mới chỉ là phiên bản 1.0, nên chắc chắn vẫn còn nhiều thứ có thể cải thiện, từ phần cứng, firmware cho đến giao diện điều khiển và cơ chế bảo mật.

Hẹn mọi người ở phiên bản tiếp theo! :)))