Phiên học · tuần này làm gì
Kế hoạch chia phiên
17 phiên cho GĐ 0–5, chia theo khối. Mỗi phiên đúng một mục tiêu falsifiable — không đạt thì phiên sau làm tiếp, và đó là chuyện bình thường.
Trang Kế hoạch trả lời mua gì, học gì, vì sao. Trang này trả lời tuần này làm gì.
Con số 17 phiên là ước lượng, không phải cam kết. Cộng trượt lịch khoảng 25%, ở nhịp một phiên chính mỗi tuần thì rơi vào khoảng 5 tháng cho GĐ 0–5. GĐ 6 không chia phiên cố định.
Nội dung phiên sau phải điều chỉnh theo chỗ vướng thật của phiên trước. Soạn trước cả 17 phiên nghe có vẻ kỷ luật, nhưng nó giả định mọi phiên đều diễn ra đúng như dự đoán — mà giả định đó sai ngay từ phiên thứ hai.
Cột Cần ghi phiên đó có phải cắm board không: board nghĩa là phải có mạch trên bàn,
host nghĩa là làm được ở phiên phụ ngắn.
Khối A — Chip lên tiếng
GĐ 0–1 · 4 phiên · cần Đợt 1
| # | Tên | Cần | Mục tiêu falsifiable |
|---|---|---|---|
| P1 | Toolchain và dòng log đầu tiên | board | cargo run nạp được lên board; thấy dòng log do chính mình viết; panic!() cố ý in ra backtrace chứ không reset im lặng |
| P2 | Blink, nút nhấn, và hiện tượng nảy phím | board | Đếm số lần bấm bằng polling, quan sát 1 bấm ra nhiều đếm; bắt được waveform nảy phím trên logic analyzer và ghi lại số ms nó kéo dài |
| P3 | Interrupt và debounce | board | Chuyển sang GPIO interrupt; bấm 20 lần liên tiếp cho ra đúng 20 đếm |
| P4 | Embassy: hai task độc lập → M1 | board | Hai task chạy song song; logic analyzer cho thấy chu kỳ blink 500ms không lệch khi bấm nút liên tục |
P2 là phiên đấu dây đầu tiên — dành sẵn thời gian cho ba bẫy vật lý (nút 4 chân chọn nhầm cặp, LED ngược, dây đứt ngầm). Đây là phiên dễ vỡ timebox nhất khối A.
Việc cho phiên phụ: đọc examples/ của esp-hal ở đúng tag version đang
dùng Nguồn source · ví dụ esp-rs/esp-hal — examples/ và qa-test/ Tài liệu thật của dự án. README nói thẳng: xem examples ở đúng tag của bản esp-hal đang dùng, đừng đọc nhánh main. Mở trong tab mới · Esc để đóng ; đọc Embassy Book chương executor và task Nguồn sách Embassy Book Mô hình async trên bare metal; đọc chương executor và task trước Khối A. Mở trong tab mới · Esc để đóng .
Khối B — I²C và datasheet
GĐ 2 · 4 phiên · cần Đợt 2. Khối quan trọng nhất.
| # | Tên | Cần | Mục tiêu falsifiable |
|---|---|---|---|
| P5 | Bus I²C và chip ID | board | Đo pull-up bằng đồng hồ trước khi cắm; scan bus in ra địa chỉ ACK; đọc 0xD0 nhận về 0x60; chỉ ra được start condition / byte địa chỉ / ACK trên waveform |
| P6 | Calibration block và raw data | board | Dump được toàn bộ khối calibration từ NVM; giá trị raw thay đổi rõ khi thổi vào cảm biến |
| P7 | Công thức bù | host | compensate() viết thành hàm thuần trong crate riêng; cargo test pass với bộ số mẫu lấy từ datasheet và driver tham chiếu của hãng |
| P8 | Driver embedded-hal → M2 | board | Driver generic over trait I2c, test embedded-hal-mock pass; nhiệt độ khớp ±1°C với DS18B20 đặt cạnh |
P7 không cần board — nếu đẩy được sang phiên phụ thì khối B rút còn 3 tuần. Đây là phiên duy nhất trong toàn lộ trình làm được điều đó một cách trọn vẹn Nguồn datasheet BME280 Datasheet (Bosch Sensortec) Riêng phần công thức bù — chú ý có hai phiên bản, số nguyên 32-bit và số thực, trộn lẫn là sai. Đọc thêm source · ví dụ boschsensortec/BME280_SensorAPI Driver tham chiếu của hãng — lấy bộ số mẫu ở đây để viết test chạy trên host. Mở trong tab mới · Esc để đóng .
Việc cho phiên phụ: đọc datasheet BME280 mục công thức bù — đọc trước P7 thì P7 mới vừa 2h.
Khối C — Năng lượng
GĐ 3 · 2 phiên · cần Đợt 2
| # | Tên | Cần | Mục tiêu falsifiable |
|---|---|---|---|
| P9 | Deep sleep và RTC memory | board | Dựng đường log UART trước (USB-JTAG sẽ rớt mỗi lần ngủ); biến đếm trong RTC fast memory tăng đúng qua 10 chu kỳ ngủ/thức |
| P10 | Đo dòng → M3 | board | Bảng số dòng đo được ở 3 trạng thái: chạy có WiFi / chạy không WiFi / deep sleep |
P9 mở đầu bằng việc dựng UART logging, không phải bằng code sleep. Làm ngược thứ tự là mất phiên vào việc "sao không thấy log gì".
Khối D — Không dây
GĐ 4 · 2 phiên · cần 2 board từ Đợt 1
| # | Tên | Cần | Mục tiêu falsifiable |
|---|---|---|---|
| P11 | esp-radio lên sóng | board | Cấu hình esp-alloc và RTOS layer; lấy được MAC hai board; board B in ra đúng byte board A gửi |
| P12 | Giao thức và tỉ lệ mất gói → M4 | board | Struct cảm biến serialize bằng postcard (hàm serialize/deserialize test trên host); gửi 100 gói đánh số; báo cáo được tỉ lệ mất gói, đạt ít nhất 95% |
P11 là phiên dễ đốt giờ nhất khối D: heap size và RTOS layer là hai thứ sai thì không ra compile error mà ra crash lúc chạy Nguồn tài liệu chính chủ esp-radio (tên mới của esp-wifi) Còn ở 1.0-beta, API vẫn đổi — ghim cứng version bằng dấu =. Đọc thêm source · ví dụ esp-rs/esp-hal — examples/ và qa-test/ Tài liệu thật của dự án. README nói thẳng: xem examples ở đúng tag của bản esp-hal đang dùng, đừng đọc nhánh main. Mở trong tab mới · Esc để đóng . Đừng làm gì khác trong phiên này.
Khối E — Gateway
GĐ 5 · 5 phiên · cần Đợt 2 và Mosquitto/HA trên máy trạm. Khối gai nhất.
| # | Tên | Cần | Mục tiêu falsifiable |
|---|---|---|---|
| P13 | WiFi STA và DHCP | board | Board lấy được IP qua DHCP và in ra; ping được IP đó từ máy dev. Credential đọc từ env lúc build, không nằm trong git |
| P14 | MQTT lên Mosquitto | board | mosquitto_sub trên máy trạm nhận được message do board publish; Mosquitto đã bật auth user/pass |
| P15 | MQTT Discovery và entity trong HA | board | Hàm build payload discovery test trên host; entity tự xuất hiện trong Home Assistant mà không sửa dòng YAML nào |
| P16 | Uptime, reconnect, khởi động test 72h | board | Có uptime counter và đường reconnect khi WiFi rớt; bài test 72h bắt đầu chạy, cấp nguồn từ củ sạc tường |
| P17 | Gateway kép: ESP-NOW + WiFi → M5 | board | Đọc kết quả 72h đầu phiên: uptime counter tăng đơn điệu, không reset lần nào. Node → ESP-NOW → gateway → MQTT → HA chạy thông |
ESP-NOW và STA dùng chung radio nên phải cùng kênh WiFi, mà mesh có thể tự đổi kênh. Nếu node mất liên lạc "ngẫu nhiên" thì nghi kênh trước khi nghi code Nguồn tài liệu chính chủ ESP-NOW (Espressif) Gói đi thẳng trên lớp WiFi MAC — không association, không DHCP, không TCP/IP. Mở trong tab mới · Esc để đóng .
Giữa P16 và P17 phải cách nhau ít nhất 72h — đúng một tuần theo lịch, vừa khít. Khoảng trống hàng tuần trở thành bài test độ bền miễn phí.
Khối F — Sản phẩm hoá
GĐ 6 · không chia phiên cố định
Đến đây thiết bị đã chạy, nên nhịp học chuyển sang nhịp làm. Danh sách chủ đề, làm theo thứ tự nào cũng được:
- OTA update — đổi partition table sang 2 slot app ngay từ lần flash đầu. Việc này phải làm trước khi bắt thiết bị lên tường Nguồn tài liệu chính chủ The Rust on ESP Book Tài liệu chính chủ cho Rust trên chip Espressif — có cả phần OTA, debugging và troubleshooting. Đọc thêm source · ví dụ esp-rs/esp-hal — examples/ và qa-test/ Tài liệu thật của dự án. README nói thẳng: xem examples ở đúng tag của bản esp-hal đang dùng, đừng đọc nhánh main. Mở trong tab mới · Esc để đóng .
- Hàn mạch lên perfboard, bỏ breadboard.
- Chuyển sang LiFePO4 cấp thẳng 3V3, cắt LED nguồn, tối ưu duty cycle.
- Watchdog và đường phục hồi tự động.
- Đóng hộp, bắt lên tường.
Tiêu chí M6: cập nhật firmware không cần chạm vào thiết bị; thiết bị chạy pin trên 1 tháng.
Bảng mốc
| Mốc | Sau phiên | Chỉ tay vào được cái gì |
|---|---|---|
| M1 | P4 | LED nhấp nháy đều, không giật khi bấm nút — đo bằng logic analyzer |
| M2 | P8 | Driver BME280 tự viết, cargo test pass, số khớp DS18B20 |
| M3 | P10 | Bảng số dòng tiêu thụ ở 3 trạng thái |
| M4 | P12 | Hai chip trao đổi dữ liệu không dây, có số tỉ lệ mất gói |
| M5 | P17 | Cảm biến hiện trong Home Assistant, chạy 72h không reset |
| M6 | — | Thiết bị chạy pin, cập nhật OTA, đã lên tường |
Quy tắc vận hành
Không chuyển phiên khi mục tiêu falsifiable chưa đạt. "Về cơ bản là chạy" không tính. Chưa đạt thì phiên sau làm tiếp.
Mỗi phiên chỉ một mục tiêu. Thấy thứ khác thú vị thì ghi vào sổ, không làm ngay.
15 phút cuối là bất khả xâm phạm: chụp ảnh breadboard, ghi 3 dòng, commit.
Giáo trình chi tiết của từng phiên soạn trước phiên đó, không soạn trước cả khối. Hai phiên đã soạn nằm ở nav bên trên.
Đọc trước hoặc trong phiên
- source · ví dụesp-rs/esp-hal — examples/ và qa-test/
Tài liệu thật của dự án. README nói thẳng: xem examples ở đúng tag của bản esp-hal đang dùng, đừng đọc nhánh main.
- sáchEmbassy Book
Mô hình async trên bare metal; đọc chương executor và task trước Khối A.
- datasheetBME280 Datasheet (Bosch Sensortec)
Riêng phần công thức bù — chú ý có hai phiên bản, số nguyên 32-bit và số thực, trộn lẫn là sai.
- tài liệu chính chủThe Rust on ESP Book
Tài liệu chính chủ cho Rust trên chip Espressif — có cả phần OTA, debugging và troubleshooting.
Tra khi cần, không đọc tuyến tính
- source · ví dụboschsensortec/BME280_SensorAPI
Driver tham chiếu của hãng — lấy bộ số mẫu ở đây để viết test chạy trên host.
Để dành cho giai đoạn sau
- tài liệu chính chủesp-radio (tên mới của esp-wifi)
Còn ở 1.0-beta, API vẫn đổi — ghim cứng version bằng dấu =.
- tài liệu chính chủESP-NOW (Espressif)
Gói đi thẳng trên lớp WiFi MAC — không association, không DHCP, không TCP/IP.