ESP32-C6 / Rust

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.

Tổng17 phiên cho GĐ 0–5
Ước lượng~5 tháng ở nhịp 1 phiên chính/tuần
Giáo trìnhsoạn just-in-time, không soạn trước

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.

Vì sao giáo trình soạn just-in-time

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ênCầnMục tiêu falsifiable
P1Toolchain và dòng log đầu tiênboardcargo 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
P2Blink, nút nhấn, và hiện tượng nảy phímboardĐế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
P3Interrupt và debounceboardChuyển sang GPIO interrupt; bấm 20 lần liên tiếp cho ra đúng 20 đếm
P4Embassy: hai task độc lập → M1boardHai 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ênCầnMục tiêu falsifiable
P5Bus I²C và chip IDboardĐ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
P6Calibration block và raw databoardDump được toàn bộ khối calibration từ NVM; giá trị raw thay đổi rõ khi thổi vào cảm biến
P7Công thức bùhostcompensate() 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
P8Driver embedded-halM2boardDriver 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ênCầnMục tiêu falsifiable
P9Deep sleep và RTC memoryboardDự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 → M3boardBả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ênCầnMục tiêu falsifiable
P11esp-radio lên sóngboardCấu hình esp-alloc và RTOS layer; lấy được MAC hai board; board B in ra đúng byte board A gửi
P12Giao thức và tỉ lệ mất gói → M4boardStruct 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ênCầnMục tiêu falsifiable
P13WiFi STA và DHCPboardBoard 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
P14MQTT lên Mosquittoboardmosquitto_sub trên máy trạm nhận được message do board publish; Mosquitto đã bật auth user/pass
P15MQTT Discovery và entity trong HAboardHà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
P16Uptime, reconnect, khởi động test 72hboardCó 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
P17Gateway kép: ESP-NOW + WiFi → M5boardĐọ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
Bẫy riêng của P17

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ốcSau phiênChỉ tay vào được cái gì
M1P4LED nhấp nháy đều, không giật khi bấm nút — đo bằng logic analyzer
M2P8Driver BME280 tự viết, cargo test pass, số khớp DS18B20
M3P10Bảng số dòng tiêu thụ ở 3 trạng thái
M4P12Hai chip trao đổi dữ liệu không dây, có số tỉ lệ mất gói
M5P17Cảm biến hiện trong Home Assistant, chạy 72h không reset
M6Thiế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

Để dành cho giai đoạn sau