基于 Arduino Pro Mini 和 OLED 显示屏的智能洗衣机定时器
项目简介
本项目旨在为一台洗衣机定时器损坏的洗衣机制作替代电子定时器。原机械定时器/方向开关控制洗涤电机的运行方式如下:
- 接收用户设定的洗涤时间(分钟)
- 电机顺时针旋转数秒
- 电机停止数秒
- 电机逆时针旋转数秒
- 电机停止数秒
- 循环执行上述四步,直到设定时间耗尽
本项目将构建一个功能相同的电子定时器。
演示视频
以下视频演示了该电子定时器的运行效果:
硬件清单
- Arduino Pro Mini (5V/16MHz):运行代码,控制全局
- 1306 OLED 显示屏 (128x64):显示用户提示和倒计时
- 红/黑按钮 (DFRobot Gravity 数字按钮):设置时间、启动定时器
- 5V 双路继电器模块 (Seeed Grove):为电机供电并控制正反转
- 5V 2.5A 开关电源适配器:为定时器供电
- HC-05 蓝牙模块:用于无线烧录代码
- USB-UART 转串口模块 (CY7C65213):配合 HC-05 修改波特率
编程与烧录流程
步骤 1:修改 HC-05 蓝牙模块波特率
使用另一块 Arduino Uno 或 USB-串口模块,通过 AT 命令将 HC-05 波特率设为 57600:
AT
AT+UART=57600,0,0
AT+RESET
步骤 2:连接 HC-05 到 Pro Mini
按接线图连接 HC-05 与 Pro Mini 的串口引脚(TX/RX 交叉连接,VCC 接 5V,GND 接地)。
步骤 3:Arduino IDE 烧录
在 Arduino IDE 中选择 Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega328P,粘贴代码并点击上传。利用蓝牙串口实现“无线现场可编程”,后续如需修改代码无需拆卸硬件。
接线原理与设备工作详解
不同品牌/型号洗衣机接线可能不同,以下以作者的“夏普”洗衣机为例:
- 从市电引入一根白色线进入原定时器
- 从原定时器引出红色线和蓝色线
- 将这三根线从故障定时器上拆下,引出洗衣机顶部
控制逻辑:
- 白线接红线 → 电机顺时针旋转
- 白线接蓝线 → 电机逆时针旋转
电子定时器运行序列(可在代码中调整):
- 继电器 1 闭合(白-红导通)→ 电机顺时针运行 5 秒
- 两路继电器全断 → 电机停止 5 秒
- 继电器 2 闭合(白-蓝导通)→ 电机逆时针运行 5 秒
- 两路继电器全断 → 电机停止 5 秒
- 循环上述步骤,直到设定洗涤时间结束
核心代码
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(A4, A5, 12, 11, 10); // CLK, DIN, CS, D/C, RES
volatile int rbc = 0; // 红按钮计数
volatile int bbc = 0; // 黑按钮计数
int sec = 0, mi = 0, motor_rotation = 0;
void setup() {
u8g.setRot180();
analogReference(INTERNAL);
pinMode(2, INPUT_PULLUP); // 红按钮 - INT0
pinMode(3, INPUT_PULLUP); // 黑按钮 - INT1
attachInterrupt(0, ISR_SW_RED, FALLING);
attachInterrupt(1, ISR_SW_BLACK, FALLING);
pinMode(5, OUTPUT); digitalWrite(5, LOW); // 继电器 1
pinMode(4, OUTPUT); digitalWrite(4, LOW); // 继电器 2
}
void loop() {
// 1. 设置时间菜单
while (!rbc) {
u8g.firstPage();
do { draw_menu(); } while (u8g.nextPage());
if (rbc > 0 && bbc == 0) { // 仅按红键未先设时间
u8g.firstPage();
do { draw_message(); } while (u8g.nextPage());
delay(2000);
rbc = 0;
}
}
// 2. 启动倒计时
if (rbc > 0) {
sec = 59; mi = bbc - 1;
while (mi >= 0) {
unsigned long temp = millis() + 1000;
while (temp >= millis()) {
u8g.firstPage();
do { draw_timer(); } while (u8g.nextPage());
}
sec--;
if (sec % 5 == 0) control_motor(); // 每 5 秒切换电机状态
if (sec <= 0) { sec = 59; mi--; }
}
rbc = bbc = mi = sec = 0;
digitalWrite(5, LOW); digitalWrite(4, LOW);
}
}
// 绘制菜单、提示、倒计时界面及中断服务函数见原文完整代码
void control_motor() {
motor_rotation++;
if (motor_rotation > 3) motor_rotation = 0;
}
原理图与接线图
安全警示
⚠ 本项目涉及市电 (AC 220V) 操作,请务必具备相关电气安全知识,自担风险!
参考资料
- 继电器使用教程
- 按钮使用教程
制造工艺