Cuối tuần này Cali trời mưa lạnh, chẳng biết làm gì. Tôi đành phải giở tiếp công trình lâu đài cát của mình là hệ thống tự động hóa trong nhà để thêm chức năng. Tôi đã viết về hệ thống này trước đó. Kỳ trước, tôi đã điều khiển được chiếc đèn ngủ trong phòng. Kỳ này, tôi quyết định thêm cho nó chức năng báo nhiệt độ và độ ẩm. Tôi lâu nay có một chiếc sensor nhiệt kế kiêm ẩm kế (AM2301) mua ở AliExpress giá 3-4 đô gì đó (link Amazon). Phen này chuyến phiêu lưu của tôi là làm sao đo được độ ẩm trong ngoài nhà bằng chiếc ẩm kế này.
Để các bạn tiện theo dõi, tôi xin liệt kê các linh kiện tôi đang có trong thiết kế này:
- 1 x bo mạch Lolin ESP32 Pro của Wemos giá 10 USD.
- 1 x PowerSwitch Tails (nếu không mua được ở Việt Nam, bạn có thể thay thế bằng một chiếc Relay như thế này - Cần chế tiếp một cái vỏ cho nó hoặc gắn vào trong một chiếc dây nối dài - Cẩn thận điện giật).
- Một số dây nối nhỏ.
Trước tiên công việc của chúng ta là kết nối chiếc sensor này vào hệ thống vi điều khiển - microcontroller - hiện tại. 

Hiện tại chiếc Power Tails đã dùng pin 5. Chúng ta có thể tiếp tục dùng các pin còn rỗi của bo mạch này. Tôi chọn pin 2. Việc còn lại là nối VCC (3.3V - sensor này chạy 3.3V hay 5V đều được) và đất - Ground. Sơ đồ kết nối như hình vẽ ở trên. Trên thực tế thì nó như thế này:

Việc lập trình để đọc nhiệt độ từ sensor xem ra khó khăn hơn tôi tưởng. Nếu dùng Arduino, thì LadyAda đã viết thư viện sẵn ở đây. Nhưng tôi không dùng Arduino mà dùng SDK chính thức của ESP32, vốn dựa vào FreeRTOS. Như vậy là tôi phải dùng C. May mắn, sau khi Google một lúc thì tôi thấy có người đã viết thư viện cho chiếc sensor này bằng C cho ESP32.
Lưu ý: Đoạn dưới đây sẽ rất khó hiểu cho bạn nào chưa từng làm việc với các thiết bị điện tử. Nếu bạn không hiểu, bỏ qua đoạn này.
** Bắt đầu đoạn khó hiểu ** Chỉ đọc nếu bạn thật sự muốn hiểu cơ chế hoạt động của chiếc sensor này như thế nào.
Thông thường việc đầu tiên khi viết mã nguồn để giao tiếp với một chiếc sensor hay một thiết bị điện tử mà mình chưa bao giờ tiếp xúc là đọc Datasheet.
Thông thường các giao thức điện tử đều dùng hai dây, một gửi và một nhận. Điều đặc biệt của chiếc sensor này là nó dùng giao thức 1-wire, tức là cả truyền lẫn nhận dữ liệu đều trên một dây. Khi nào vi điều khiển muốn kiểm tra nhiệt độ từ sensor thì phải "thông báo" cho sensor bằng cách kéo tín hiệu xuống thấp, rồi nâng lên cao, rồi chờ xem sensor có trả lời bằng cách kéo lại xuống thấp không.


Điều kì lạ là tôi nhận được lỗi sau:

Phase B khi đọc mã nguồn thì tôi thấy là lúc vi điều khiển muốn xem sensor có trả lời không:


Sau khi dành ra 5 giờ đồng hồ để debug và càu nhàu không biết làm sao thư viện này không chạy (tôi đã thử sensor này với một thư viện khác với một bo mạch khác, chạy tốt) thì tôi nhận ra một điều là mình đã sử dụng pin 15. Đây là một chân đặc biệt của vi điều khiển ESP32. Khi sử dụng pin này có vẻ như ESP32 sẽ không chạy như bình thường. Khi tôi chuyển sang pin 2 thì mọi thứ chạy hầu như là tốt. Tôi có thay đổi một chút mã nguồn để thư viện chạy ổn định hơn, nhưng không có gì quá phức tạp.
** Kết thúc đoạn khó hiểu **
Bạn cũng không cần hiểu cụ thể sensor giao tiếp với mạch vi điện tử ra sao nếu có người như tôi đã viết và đã giải quyết vấn đề cho bạn. Với tư cách một lập trình viên, bạn chỉ cần biết cần gọi cái gì vào lúc nào.
Cách dễ nhất là xem ví dụ. Như vậy, chỉ cần gọi "dht_read_data":
dht_read_data(sensor_type, dht_gpio, &humidity, &temperature)
Vấn đề còn lại là chạy một "task" (ý tưởng như "thread" khi lập trình song song), để truy vấn nhiệt độ một cách thường xuyên (15 giây thì cập nhật một lần). Đoạn mã này chạy trong một vòng lặp, và publish dữ liệu lên server MQTT cứ 15 giây một lần:

Và, sau khi configure homebridge-mqttthing, kết quả là Apple HomeKit đã đọc được nhiệt độ và độ ẩm của phòng tôi.


Dĩ nhiên, Siri vẫn thông minh như thường.



Tôi có để mã nguồn cho dự án mà mình đang sử dụng ở đây: https://github.com/htruong/esp32_room_automation. Chỉ việc clone repository này là bạn có thể làm theo và có một căn phòng thông minh, có đèn ngủ và sensor điều khiển bằng giọng nói.
Cũng may chế điện tử cả ngày làm cho thời gian trôi vun vút không như Sài Gòn, nếu không tôi đã khóc một giòng sông (sic)...
TB: Làm những việc như vậy ngay cả một người tương đối có kinh nghiệm như tôi cũng mất cả ngày lẩm bẩm chửi rủa mãi mới nhận ra mình sai chỗ nào. Khi bạn muốn làm được những việc như thế này, điều quan trọng nhất là nhận ra mọi việc sẽ rất tốn thời gian. Người ta nói để hiểu và làm được một việc gì tốt cũng phải bỏ ra 10,000 giờ, quả là không sai.