Có. Nếu mục tiêu của bạn là học cách một vi điều khiển điều khiển máy giặt, ta có thể nhìn máy giặt như một hệ thống điều khiển gồm đọc cảm biến → quyết định trạng thái → điều khiển motor/van/bơm → chuyển sang trạng thái tiếp theo.
1. Lưu đồ thuật toán tổng quát của máy giặt
Một máy giặt cửa trên/cửa ngang hiện đại có thể khái quát như sau:
┌───────────────┐
│ START │
└───────┬───────┘
│
▼
┌────────────────────────┐
│ Khởi tạo vi điều khiển │
│ - GPIO │
│ - Timer │
│ - ADC │
│ - cảm biến │
└───────────┬────────────┘
│
▼
┌─────────────────────┐
│ Người dùng chọn │
│ chương trình giặt │
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Nhấn START ? │
└──────────┬──────────┘
│
Chưa ─┴─ Có
│ │
└──► ▼
┌────────────────┐
│ Kiểm tra cửa │
│ đã khóa chưa? │
└───────┬────────┘
│
Chưa ──┴── Có
│ │
▼ ▼
Báo lỗi CẤP NƯỚC
│
▼
┌────────────────────┐
│ Đã đủ nước chưa? │
└─────────┬──────────┘
│
Chưa ──┴── Có
│ │
└────► ▼
┌──────────────┐
│ GIẶT │
│ motor quay │
│ trái ↔ phải │
└──────┬───────┘
│
▼
Đã hết thời gian?
│
Chưa ──┴── Có
│ │
└────► ▼
┌────────────┐
│ XẢ NƯỚC │
│ chạy bơm │
└─────┬──────┘
│
▼
Đã hết nước?
│
Chưa ──┴── Có
│ │
└────► ▼
┌────────────┐
│ RINSE │
│ Cấp nước │
│ + đảo │
└─────┬──────┘
│
▼
Còn lần xả?
│ │
Có Không
│ │
└─────► ▼
┌──────────┐
│ SPIN │
│ Vắt │
└────┬─────┘
│
▼
Giảm tốc / dừng
│
▼
KẾT THÚC
│
▼
END
Đây là lưu đồ cấp cao. Nhưng nếu chúng ta muốn học lập trình vi điều khiển thì nên đi sâu hơn.
2. Thực tế máy giặt không chỉ có “giặt → xả → vắt”
Bên trong chương trình điều khiển, ta có thể hình dung máy giặt là một state machine:
┌──────────────┐
│ IDLE │
│ Chờ người dùng│
└──────┬───────┘
│ START
▼
┌──────────────┐
│ DOOR LOCK │
└──────┬───────┘
│
▼
┌──────────────┐
│ FILL │
│ Cấp nước │
└──────┬───────┘
│ Đủ nước
▼
┌──────────────┐
│ WASH │
│ Giặt │
└──────┬───────┘
│
▼
┌──────────────┐
│ DRAIN │
│ Xả │
└──────┬───────┘
│
▼
┌──────────────┐
│ RINSE │
│ Giũ │
└──────┬───────┘
│
│ lặp lại
└──────┐
│
▼
┌───────────┐
│ SPIN │
│ Vắt │
└─────┬─────┘
│
▼
┌───────────┐
│ END │
└───────────┘
Đây chính là tư duy State Machine (FSM) rất quan trọng khi lập trình các thiết bị điện tử thực tế.
3. Nhưng vi điều khiển phải đọc rất nhiều cảm biến
Ví dụ trong lúc FILL – cấp nước, thuật toán không đơn giản là:
Valve_ON();
mà có thể là:
CẤP NƯỚC
│
▼
Mở van cấp nước
│
▼
Đọc cảm biến mức nước
│
┌───────┴────────┐
│ │
Chưa đủ Đủ
│ │
▼ ▼
tiếp tục Đóng van
cấp nước │
│ ▼
└──────────► SANG GIẶT
Nếu quá thời gian mà vẫn chưa đủ nước:
CẤP NƯỚC
│
▼
Timer chạy
│
▼
Đủ nước chưa?
│ │
Có Không
│ │
▼ ▼
đóng van Timeout?
│
┌────┴────┐
Chưa Có
│ │
▼ ▼
tiếp tục BÁO LỖI
4. Đến bước GIẶT thì thuật toán lại khác
Ví dụ máy giặt cần đảo chiều motor:
GIẶT
│
▼
Motor quay thuận
│
5 giây
│
▼
Motor dừng
│
chờ 1 giây
│
▼
Motor quay nghịch
│
5 giây
│
▼
Motor dừng
│
chờ 1 giây
│
▼
Đã hết thời gian
giặt chưa?
│ │
Chưa Có
│ │
└───► ▼
XẢ NƯỚC
Như vậy motor không đơn giản là:
ON
mà bộ điều khiển phải tạo ra một chuỗi trạng thái.
5. Đặc biệt quan trọng: bước VẮT
Vắt là phần thuật toán phức tạp hơn.
Ví dụ:
VẮT
│
▼
Kiểm tra cửa
│
▼
Khóa cửa OK?
│ │
Không Có
│ │
▼ ▼
ERROR Xả nước
│
▼
Nước đã hết?
│
▼
Có → START
│
▼
Tăng tốc motor
│
▼
Đọc tốc độ motor
│
▼
Đạt tốc độ?
│ │
Chưa Có
│ │
└────► ▼
Duy trì tốc độ
│
▼
Hết thời gian?
│
▼
Có
│
▼
Giảm tốc
│
▼
STOP
Ở đây ta bắt đầu thấy rõ bản chất của lập trình điều khiển máy thực tế.
6. Nếu chuyển sang tư duy STM32
Ta có thể ánh xạ máy giặt thành:
┌──────────────────┐
│ STM32 │
└────────┬─────────┘
│
┌─────────────┼──────────────┐
│ │ │
▼ ▼ ▼
INPUT PROCESS OUTPUT
│ │ │
│ │ │
┌──────┴──────┐ │ ┌──────┴────────┐
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Cảm biến Nút FSM Van nước Motor
mức nước nhấn Bơm xả Heater
cửa Khóa cửa ...
Ví dụ:
INPUT
│
├── WATER_LEVEL
├── DOOR_SENSOR
├── START_BUTTON
├── TEMPERATURE
├── MOTOR_SPEED
└── CURRENT_SENSOR
│
▼
VI ĐIỀU KHIỂN
│
▼
FSM
│
┌─────┼─────┐
▼ ▼ ▼
FILL WASH SPIN
│ │ │
▼ ▼ ▼
VALVE MOTOR MOTOR
PUMP
7. Và đây chính là điểm liên hệ với chiếc đồng hồ bạn vừa làm
Hai chương trình nhìn bề ngoài hoàn toàn khác nhau, nhưng tư duy lập trình rất giống nhau.
Đồng hồ của bạn:
while(1)
{
Clock_Update();
Display_Scan();
Button_Process();
}
Máy giặt:
Có thể khái quát:
while(1)
{
Read_Sensors();
Process_Buttons();
WashingMachine_StateMachine();
Control_Motor();
Control_Valve();
Control_Pump();
Update_Display();
}
Tức là:
Đồng hồ của bạn đang là phiên bản rất đơn giản của một hệ thống điều khiển máy thực tế.
Bạn đã có:
HAL_GetTick()
↓
Timer phần mềm
↓
State/Mode
↓
Input
↓
Logic
↓
Output
Máy giặt chỉ mở rộng nó lên rất nhiều:
┌───────────────┐
│ CẢM BIẾN │
└───────┬───────┘
↓
┌─────────────┐
│ STM32/MCU │
│ │
│ FSM │
│ Timer │
│ Logic │
└──────┬──────┘
↓
┌────────────┼────────────┐
↓ ↓ ↓
MOTOR VAN BƠM
↓ ↓ ↓
GIẶT CẤP NƯỚC XẢ
Nếu bạn muốn học sâu về lập trình vi điều khiển, mình khuyên bước tiếp theo là chúng ta lấy chính máy giặt làm một “dự án STM32 lớn”: vẽ lưu đồ chi tiết từ IDLE → LOCK → FILL → WASH → DRAIN → RINSE → SPIN → END, sau đó biến từng trạng thái thành enum STATE và viết một chương trình C mô phỏng máy giặt trên STM32. Đây sẽ là bước rất tự nhiên sau chương trình đồng hồ của bạn.

