饮水机功能构建指导思想以及最小试验
引言
我们饮水机, 其实就只有两个必须使用的功能, 一个是控制加热, 一个是控制放水, 我们现在就可以直接实现这两个功能.
我们使用stm32单片机, 直接控制两个io口的高低电平, 通过继电器, 就可以控制大电流设备的开关. 没错这就已经结束了, 饮水机项目已经完成了.
但是我们控制加热及其开关,还想要结合其他因素, 比如加热,想结合用户设置的水温阈值, 达温即停,并且用户可以远程控制加热的开关.
我们家庭有小宝宝的用户, 想要达到绝对的安全, 不让小孩子误触,造成烫伤 , 我们就不能直接放水,而是通过一系列检测措施, 只在真正安全的情况下放水, 比如, 放上杯子后, 用户按下开关,在童锁关闭的情况下, 我们才放水。
对于上述,功能我们慢慢加入 , 现在直接实现, 加热和放水。以及对应的 解耦文件。
实现加热和放水的io直接控制
1.创建最小例程
创建stm32f103c8t6基本工程_keil stm32f103c8t6 工程-CSDN博客
2.创建完成后, 我们打开main.c
我们选中PA6, PA7分别为加热控制和放水控制的io口
所以我们直接进行初始化, 然后控制io口电平, 观察现象
main.c文件代码
#include "stm32f10x.h" // Device header
void HEAT_water_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_6);
}
void OUT_water_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
}
int main(void)
{
//加热初始化
HEAT_water_Init();
//开水初始化
OUT_water_Init();
//加热
GPIO_SetBits(GPIOA, GPIO_Pin_6);
//开水龙头
GPIO_SetBits(GPIOA, GPIO_Pin_7);
while(1)
{
}
}
-
编译运行, 烧录进最小板, 观察现象
烧录方法:https://blog.csdn.net/qq_57484399/article/details/141263965
跳转加热小灯和开水小灯连线视频:
跳转
加热和开关水代码解耦
我们结合预警系统的fun和led的思想, 进行解耦, 分离, 通过函数传入状态, 从而控制 加热和 开水
导入出水和加热模块的文件夹
导入文件夹固定步骤:
创建stm32f103c8t6基本工程_keil stm32f103c8t6 工程-CSDN博客
从第九步开始
加热模块
文件夹名字: Heatmodule
文件名: heat.c 和 heat.h
出水模块
文件夹名字: out_water
文件名: out_water.c 和 out_water.h
加热和开水解耦代码索引:
跳转
https://blog.csdn.net/qq_57484399/article/details/141268237
在锤子里面, 记得保存对应的文件夹路径 (上面导入文件夹固定步骤包含,这里只做提醒)
main.c函数内调用
(1)引入heat.c何out_water.c的头文件
(2)初始化对应的器件函数
(3)为了优雅的控制器件,还有器件控制的可读性, 我们调用器件 控制函数,然后传入状态
(4)烧录, 然后观察现象, 把传入的状态,换成
(5)观察现象
至此艺术已成
优雅的控制加热和开水, 并且我们直接把此调用函数,放在while循环里面照样可以避免, 重复启动器件的老问题,因为我们在操作器件的时候, 加入了判断状态的控制