# 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波作为电机正反转&速度调控方式 原理图如下 motor * 一些其他初始化生成的杂项文件 对于查看`.hex`文件 在`project\CLion\cmake-build-debug\CLion.hex`进行查看和选中 即可在`Proteus`中进行仿真 ### 引脚定义 `CubeMX`中部分引脚定义截图 cubemx `Proteus`原理图截图 proteus_pcb 具体引脚定义 可以参照`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(); } } } ``` #### 部分代码截图 code ### 运行状态截图 **标准模式下的初始启动** 可以看到有倒计时 standard_start 倒计时结束后开始工作 依次是:进水、洗涤、两次漂洗、脱水 **标准模式下进水** 此时进水指示灯亮 进出水电机正转 standard_input **标准模式下出水** 此时出水指示灯亮 进出水电机反转 standard_output **标准模式下洗涤** 此时RGB指示灯表现为 **红色** 洗涤电机以**中等**转速旋转 standard_washing **标准模式下漂洗** 此时RGB指示灯表现为 **绿色** 洗涤电机以**低速**旋转 standard_rinsing **标准模式下甩干** 此时RGB指示灯表现为**蓝色** 洗涤电机以**高速**旋转 standard_drying **快速洗模式部分截图** 此时LCD显示为`FAST` 且按快速洗程序运行 FAST **强力洗模式部分截图** 此时LCD显示为`HEAVY` 且按快速洗程序运行 heavy **单脱水模式下部分截图** 此时LCD显示为`HEAVY` 且按快速洗程序运行 只有`OUTPUT`指示灯亮 且只有进出水电机工作 single_dry **桶自洁模式下部分截图** 与普通模式相比 各个工作状态的温度普遍升高 clean **洗涤结束** 此时在LCD上显示`OK!!` ok! --- * written by scpsyl(lys)