Đồng hồ để bàn “chỉ báo chất lượng giấc ngủ” không cần camera
Ghi chú làm một đồng hồ ESP32 cạnh giường, dùng CO2, nhiệt độ, ánh sáng và cảm biến hiện diện để giải thích vì sao sáng dậy thấy phòng ngủ không ổn, không cần camera.
Chia sẻ

Có những sáng dậy thấy người mệt nhưng không rõ vì sao: phòng bí, điều hòa để hơi nóng, rèm lọt sáng sớm, hay đơn giản là tối qua lên giường muộn. Mình muốn có một chiếc đồng hồ cạnh giường ghi lại vài dấu hiệu đó, để sáng hôm sau nhìn một cái là biết nên sửa điều gì trước.
Điểm mình không muốn đụng vào là camera trong phòng ngủ. Dự án này không cố “nhìn” người ngủ. Nó ghép các tín hiệu đơn giản từ phòng và giường, rồi hiện một chỉ báo tham khảo vào buổi sáng. Không đo REM, không kết luận ngủ sâu và cũng không chẩn đoán ngưng thở.
Đồng hồ thực sự biết được gì?
| Tín hiệu | Điều có thể suy ra hợp lý |
|---|---|
| CO2, nhiệt độ, độ ẩm | Phòng có bí, nóng hoặc ẩm hơn mức quen thuộc hay không |
| Ánh sáng | Phòng tối lúc bắt đầu ngủ và có bị sáng sớm hay không |
| Mức ồn | Có bao nhiêu khoảng thời gian ồn vượt nền phòng |
| FSR dưới giường | Thời điểm lên giường, rời giường và tổng thời gian nằm |
| Lịch sử 7 ngày | Giờ ngủ và giờ dậy có đều hay không |
FSR không biết mình đang thức hay ngủ. Mức ồn cũng không chứng minh tiếng động đã làm mình tỉnh. Đây là lý do trên màn hình nên ghi “Sleep conditions” hoặc “Chỉ báo đêm qua”, thay vì khẳng định “bạn ngủ sâu 3 giờ 20 phút”.

Bản đầu tiên nên đo ít nhưng rõ: CO2, nhiệt độ, độ ẩm, ánh sáng, mức ồn và trạng thái có người trên giường.
Phần cứng cho bản đầu tiên
- ESP32-S3, ưu tiên board có PSRAM nếu dùng giao diện lớn.
- OLED SH1107 128 x 128 hoặc e-paper 2.9 inch. OLED dễ làm đồng hồ liên tục; e-paper dịu mắt hơn nhưng không hợp để cập nhật từng giây.
- SCD40/SCD41 để đo CO2, nhiệt độ và độ ẩm.
- BH1750 để đo ánh sáng phòng.
- Microphone MEMS I2S hoặc mạch đo âm lượng analog chỉ dùng để tính mức ồn tại chỗ.
- Encoder có nút nhấn để xem lý do mất điểm và đặt giờ báo thức.
- Một node ESP32 riêng cùng một hoặc hai FSR dưới nan giường.
- Vỏ in 3D có khe thoáng quanh cảm biến, nhưng không để luồng nhiệt từ ESP32 thổi thẳng vào SCD41.
Nếu muốn bản gọn nhất, có thể bỏ microphone và cảm biến giường. Khi đó, đồng hồ chỉ chấm môi trường phòng cùng độ đều của giờ tắt đèn. Điểm sẽ ít thông tin hơn nhưng vẫn hữu ích và dễ tin hơn một thuật toán quá tham.
Chấm điểm thế nào để không tự lừa mình?
Mình sẽ bắt đầu với công thức dễ giải thích:
40 điểm: CO2, nhiệt độ, độ ẩm, ánh sáng và mức ồn
35 điểm: tổng thời gian có người trên giường
15 điểm: số lần rời giường kéo dài
10 điểm: độ đều của giờ lên giường trong 7 ngày
Ngưỡng không nên đóng đinh cho mọi người. Hãy ghi dữ liệu khoảng một tuần, chọn những đêm bản thân cảm thấy ổn làm baseline, rồi mới đặt vùng tốt/cần chú ý. Ở Việt Nam, phòng dùng máy lạnh, phòng mở cửa sổ và phòng có hai người sẽ có đường CO2, nhiệt độ rất khác nhau.
Điểm số cũng cần đi kèm lý do. 72 - phòng bí từ 02:10 có ích hơn một vòng tròn màu cam không giải thích gì.
Khung ESPHome cho cảm biến phòng
Phần đọc dữ liệu cơ bản khá ngắn:
i2c:
sda: GPIO8
scl: GPIO9
sensor:
- platform: scd4x
measurement_mode: low_power_periodic
co2:
name: "Bedroom CO2"
temperature:
name: "Bedroom Temperature"
humidity:
name: "Bedroom Humidity"
- platform: bh1750
name: "Bedroom Illuminance"
update_interval: 60s
Điểm tổng có thể được tính trong Home Assistant vì cần lịch sử qua đêm. Đồng hồ chỉ nhận lại sleep_condition_score và một dòng lý do ngắn. Nếu Home Assistant mất kết nối, nó vẫn phải xem giờ và báo thức bình thường; sáng hôm đó chỉ hiện “chưa đủ dữ liệu”.

Ban đêm chỉ giữ giờ ở độ sáng thấp hoặc tắt hẳn; điểm đánh giá chỉ cần xuất hiện vào buổi sáng.
Riêng tư nên được thiết kế ngay từ đầu
Không có camera mới chỉ là bước đầu. Với microphone, firmware chỉ nên tính RMS/dB theo cửa sổ ngắn rồi bỏ mẫu âm thanh; không lưu file, không stream và không có API nghe lại. Có thể thêm công tắc vật lý ngắt nguồn microphone để người dùng kiểm tra được bằng mắt.
Dữ liệu cũng nên ở trong mạng nội bộ qua ESPHome và Home Assistant. Trên màn hình chỉ hiện điểm tổng, không hiện lịch sử chi tiết nếu đồng hồ được đặt ở nơi người khác dễ nhìn thấy.
Mình sẽ thử MVP như sau
- Dùng SOAS làm đồng hồ, giữ encoder và chế độ màn hình ban đêm.
- Thêm SCD41 cùng BH1750, log dữ liệu trong bảy đêm.
- Làm node FSR một bên giường, thêm
delayed_onvàdelayed_offđể tránh đếm nhầm khi trở mình. - Chỉ tính ba thông tin đầu tiên: thời gian trên giường, CO2 trung bình và số phút phòng quá sáng.
- Sau mỗi sáng, tự ghi lại cảm nhận bằng một nút “ổn/chưa ổn” để chỉnh baseline.
Điểm mình muốn kiểm chứng không phải là một “điểm ngủ” thật chính xác. Mình chỉ cần nó đủ trung thực để nói: đêm qua CO2 cao từ khoảng 2 giờ sáng, phòng sáng sớm hơn mọi ngày, hoặc thời gian nằm trên giường ngắn hơn tuần trước. Nếu thông tin đó giúp mình sửa một thói quen nhỏ vào tối hôm sau, chiếc đồng hồ đã có ích rồi.
Nguồn tham khảo
Chia sẻ
Tiếp tục khám phá
Đọc tiếp
Bài viết liên quan
Smart thermostat tự học cách căn phòng ấm lên
Ghi chú làm smart thermostat bằng ESP32, ESPHome và Home Assistant, có lớp tốc độ làm ấm để bật đúng lúc mà vẫn giữ giới hạn an toàn.
Remote giọng nói tiếng Việt cho Home Assistant chạy nội bộ
Ghi chú làm một remote giọng nói dùng ESP32-S3, ESPHome và Home Assistant Assist local để điều khiển nhà thông minh bằng tiếng Việt mà không phải gửi giọng nói lên cloud.
Thiết bị báo nhiệt độ tủ lạnh, tủ đông khi mất điện
Ghi chú thiết kế một hộp đo nhiệt độ đặt ngoài tủ lạnh, dùng ESP32, hai đầu dò DS18B20 và Home Assistant để biết sớm khi ngăn đông ấm lên sau mất điện.