# Washing_Machine
**Repository Path**: scpsyl/washing_-machine
## Basic Information
- **Project Name**: Washing_Machine
- **Description**: 一个基于STM32F4的洗衣机系统设计仿真 作为实验课的课程设计 采用proteus作为仿真平台 通过CLion进行代码编写 最终实现一些基本功能
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2023-06-03
- **Last Updated**: 2024-08-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: stm32, Proteus
## README
## 基于STM32F401CEU6的多功能家用洗衣机系统设计
### 项目简介
本项目采用`STM32F401CEU6`作为主控 相比于`AT89c51` 其拥有更易于移植的库函数和初始化软件`STM32CubeMX` 通过使用HAL库函数更易于移植 且结合`CLion`等更优雅更方便的代码编辑器 结合`openOCD`等链接软件 实现更方便的下载与调试
在淘宝网上搜索到的数据显示:STC89C51单片要大概3.5元 STM32F103C6T6单片大概要2.8元 STM32F401CEU6单片大概要5.5元 价格相差不多 成本可以在可控范围内 且F4具有更大的FLASH空间 可以挂载更多外设 不至于显示驱动就会跑炸掉
本次项目通过在`proteus`上绘制电路系统并进行标识 通过使用`STM32CubeMX`进行外设初始化 并使用`Clion`作为编译链接的IDE 通过生成`.hex`文件或`.elf`文件 进行项目验证 如果没有`Clion`或`VsCode`等将文件夹打开的IDE 可以在`./src`和`./Inc`下查看 `.c/h`文件 已编写相关注释
---
### 功能介绍
作为一个普通的家用洗衣机 其应具备的主要功能有:
1. 温度控制:通过温度传感器检测洗衣水温度,并根据用户设置自动加热或保持恒温。
2. 洗涤模式选择:提供多种洗涤模式供用户选择,例如快速洗、标准洗、节能洗等。
3. 洗涤时间设置:允许用户设置洗涤时间,或根据洗涤模式自动设定。
4. 转速控制:根据洗涤模式或用户设置,自动控制洗衣机的转速。
5. 漂洗次数设定:允许用户设定漂洗次数,或根据洗涤模式自动设定。
6. 脱水时间设置:允许用户设置脱水时间,或根据洗涤模式自动设定。
7. 进水和排水控制:通过控制阀门或泵,实现洗衣机的自动进水和排水。
8. 显示和操作界面:设计一个用户友好的显示和操作界面,方便用户进行设置和查看洗衣过程状态。
综合以上因素 本次项目中所给出的仿真解决方案如下:
1. 洗涤模式:本次洗衣机项目中 仿照普通家用的洗衣机 我给出了5种功能 分别是:
* 标准洗(`STANDARD`):这是洗衣机的基本洗涤模式,适用于各种日常衣物。包括1次洗涤、2次漂洗和1次脱水
* 快速洗(`FAST`):适用于轻度污渍或需要快速清洗的衣物。包括1次洗涤、1次漂洗和1次脱水,洗涤时间较短
* 强力洗(`HEAVY`):适用于重度污渍的衣物,例如工作服、运动服等。通常包括2次洗涤、2次漂洗和1次脱水
* 单脱水(`SINGLE_DRY`):单独进行脱水操作,适用于需要额外脱水的衣物。通常包括1次脱水
* 桶自洁(`CLEAN`):单独清洗洗衣机 且在更高温度下进行 时间较长
通过模拟旋钮(拨码开关) 实现不同模式的选择
同时每次洗涤开始 设置了**5s倒计时**;洗涤完成后输出`OK!!`
2. 主显示模块:由于所需要显示的变量较多 选用LCD1602作为数据显示模块 显示内容包括:
1. 当前所处模式 例如`STANDARD`
2. 5s倒计时显示
3. 当前所处状态 例如`WASHING`
4. 当前所处温度 例如`Temp:29C`
3. 温度控制模块:采用`DS18B20` 通过人为设定对应变量模拟温度 并通过人为的赋值(非线性变化 通过调用特定的库函数实现)来模拟在运行过程中温度的变化趋势 最后通过LCD显示
---
### 代码结构
* `task.c` 所有洗衣机相关任务进行封装
* `lcd1602.c` LCD显示驱动 内包含`ms`和`us`级延时
* `gpio.c` 由`CubeMX`自动生成的与引脚有关的初始化
* `stm32f4xx_it.c` 中断回调函数的句柄 本次项目中采用阻塞轮询式 并未使用中断
* `tim.c` 定时器相关的初始化 对于本项目中 驱动电机采用L298N作为电机驱动芯片 并使用4路PWM波作为电机正反转&速度调控方式 原理图如下
* 一些其他初始化生成的杂项文件
对于查看`.hex`文件 在`project\CLion\cmake-build-debug\CLion.hex`进行查看和选中 即可在`Proteus`中进行仿真
### 引脚定义
`CubeMX`中部分引脚定义截图
`Proteus`原理图截图
具体引脚定义 可以参照`main.h`中有关`#define`的部分进行比对 在`Cubemx`中通过UI修改 有关初始化重定义代码如下
```C
#define INPUT_Pin GPIO_PIN_0
#define INPUT_GPIO_Port GPIOA
#define STANDARD_Pin GPIO_PIN_1
#define STANDARD_GPIO_Port GPIOA
#define FAST_Pin GPIO_PIN_2
#define FAST_GPIO_Port GPIOA
#define HEAVY_Pin GPIO_PIN_3
#define HEAVY_GPIO_Port GPIOA
#define SINGLE_DRY_Pin GPIO_PIN_4
#define SINGLE_DRY_GPIO_Port GPIOA
#define OUTPUT_Pin GPIO_PIN_5
#define OUTPUT_GPIO_Port GPIOA
#define CLEAN_Pin GPIO_PIN_6
#define CLEAN_GPIO_Port GPIOA
#define EN_Pin GPIO_PIN_7
#define EN_GPIO_Port GPIOA
#define D0_Pin GPIO_PIN_0
#define D0_GPIO_Port GPIOB
#define D1_Pin GPIO_PIN_1
#define D1_GPIO_Port GPIOB
#define D2_Pin GPIO_PIN_2
#define D2_GPIO_Port GPIOB
#define RW_Pin GPIO_PIN_10
#define RW_GPIO_Port GPIOB
#define E_Pin GPIO_PIN_12
#define E_GPIO_Port GPIOB
#define RGB_R_Pin GPIO_PIN_13
#define RGB_R_GPIO_Port GPIOB
#define RGB_G_Pin GPIO_PIN_14
#define RGB_G_GPIO_Port GPIOB
#define RGB_B_Pin GPIO_PIN_15
#define RGB_B_GPIO_Port GPIOB
#define D3_Pin GPIO_PIN_3
#define D3_GPIO_Port GPIOB
#define D4_Pin GPIO_PIN_4
#define D4_GPIO_Port GPIOB
#define D5_Pin GPIO_PIN_5
#define D5_GPIO_Port GPIOB
#define D6_Pin GPIO_PIN_6
#define D6_GPIO_Port GPIOB
#define D7_Pin GPIO_PIN_7
#define D7_GPIO_Port GPIOB
#define RS_Pin GPIO_PIN_9
#define RS_GPIO_Port GPIOB
```
### 代码结构
项目代码采用C语言编写 尽可能做到了解耦 以OOP为思想依据
#### 亮点
对于**状态任务**(例如:`washing`)和**状态任务**(例如:`standard`) 在对不同状态或不同模式进行判断时 相较于常规C语言的`switch-case`或`if-else`写法 本项目采用`X-MARCO` 宏的写法 具体代码介绍如下
在`task.h`里封装X宏 并通过与一个全局的数组进行映射 实现不同的指向来输出不同格式的数据 以**状态任务**为例
```C
//task.h
#define WORK_STATE_LIST \
X(INIT, "Initialization") \
X(WATER_INPUT, "Water Input") \
X(WATER_OUTPUT, "Water Output") \
X(WASHING, "Washing") \
X(RINSING, "Rinsing") \
X(DRYING, "Drying") \
X(_IDLE, "Idle")
typedef enum {
#define X(state, str) state,
WORK_STATE_LIST
#undef X
} work_state;
//task.c
void Task_JudgeState()
{
if (state >= INIT && state <= DRYING) {
task_func_t task_func = task_functions[state];
if (task_func != NULL) {
task_func();
}
}
}
```
#### 部分代码截图
### 运行状态截图
**标准模式下的初始启动** 可以看到有倒计时
倒计时结束后开始工作 依次是:进水、洗涤、两次漂洗、脱水
**标准模式下进水** 此时进水指示灯亮 进出水电机正转
**标准模式下出水** 此时出水指示灯亮 进出水电机反转
**标准模式下洗涤** 此时RGB指示灯表现为 **红色** 洗涤电机以**中等**转速旋转
**标准模式下漂洗** 此时RGB指示灯表现为 **绿色** 洗涤电机以**低速**旋转
**标准模式下甩干** 此时RGB指示灯表现为**蓝色** 洗涤电机以**高速**旋转
**快速洗模式部分截图** 此时LCD显示为`FAST` 且按快速洗程序运行
**强力洗模式部分截图** 此时LCD显示为`HEAVY` 且按快速洗程序运行
**单脱水模式下部分截图** 此时LCD显示为`HEAVY` 且按快速洗程序运行 只有`OUTPUT`指示灯亮 且只有进出水电机工作
**桶自洁模式下部分截图** 与普通模式相比 各个工作状态的温度普遍升高
**洗涤结束** 此时在LCD上显示`OK!!`
---
* written by scpsyl(lys)