一、项目背景
随着智能化的迅速发展,人们对于生活中的各类设备也越来越有智能化的需求,其中智能饮水机是一种比较常见的设备。智能饮水机不仅可以提供饮用水,还可以通过智能化的技术满足人们对于水质、水温、出水量等方面的需求。因此,当前设计了一种基于 STM32 的智能饮水机系统,以满足人们对智能化饮水机的需求。
智能饮水机系统其主要功能包括:
【1】控制加热芯片:通过继电器模块控制加热芯片,在水烧开后自动断电。
【2】液位感应:使用液位传感器感应水箱水位,当水位过低时通过语音模块进行播报提示。
【3】移动端控制:Android 手机端可以显示当前双水箱内的水温,设置出水温度及出水量,并且还可以控制出水操作。
【4】主控芯片:采用 STM32F103RCT6 主控芯片,这款芯片有着强劲的处理能力和丰富的外设资源,可以满足饮水机系统的控制需求。
【5】WIFI 通信:选择 ESP8266 与手机端通信,可以实现远程控制。
【6】水温测量:采用 DS18B20 实现水温测量,能够准确地测量水温。
【7】出水开关控制:采用 SG90 电机实现出水开关控制,可以精准地控制出水量。
【8】本地有 2 个指示灯,绿色和红色灯。可以表示加热状态。
二、系统硬件设计
【1】系统核心芯片选择
STM32F103RCT6 作为本系统的主控芯片,其具有较高的计算速度和稳定性,在众多 STM32 系列中也是使用比较广泛的型号之一。
【2】温度测量模块
温度测量采用 DS18B20 数字温度传感器,通过单总线协议与主控芯片进行通信,实现对水温的精准测量。
【3】液位检测模块
液位检测采用液位传感器,通过测量水箱内水位来判断是否需要进行添加水操作。
【4】控制加热芯片模块
继电器模块负责控制加热芯片,当水烧开后自动断电,以确保水的安全。
【5】出水操作模块
出水操作通过 SG90 电机实现,其可以控制水龙头的开关,实现出水的自动控制。
【6】WIFI 通信模块 ESP8266 作为 WIFI 模块,与手机端进行通信,实现了智能饮水机系统的远程操控和监测。
三、系统软件设计
【1】温度测量与显示模块
STM32 芯片通过单总线协议与 DS18B20 传感器进行通信,获取当前水温数据,并将其通过 LCD1602 液晶显示屏展示在饮水机面板上。
【2】液位检测模块
液位传感器负责检测水箱内水位情况,并将水位数据传递给主控芯片。当水位过低时,系统会通过语音提示模块向用户发出添加水的提醒。
【3】控制加热芯片模块
主控芯片通过继电器模块控制加热芯片的开关,在水烧开后自动断电,以保证水的安全性。
【4】出水操作模块
出水操作通过 SG90 电机控制,实现了对饮水机出水的自动控制。同时,在 Android 手机端,用户可以设置出水温度和出水量,使得出水操作更加便捷。
【5】WIFI 通信模块
系统通过 ESP8266 与 Android 手机端进行通信,实现了智能饮水机系统的远程操控和监测功能。用户可以通过手机端查看当前双水箱内的水温并进行相应的操作。
ESP8266 配置成 AP+TCP 服务器模式,开启 WIFI 热点等待手机连接,手机连接之后使用 TCP 客户端模式连接饮水机完成数据通信。
四、核心代码
4.1 SG90 控制代码
SG90 电机是一种小型舵机,用于模型航空、船模、车模和机器人等小型机械装置中,可以控制舵、飞控等运动部件的转动角度。其最大扭矩为 1.6kg/cm(4.8V 时),转速为 0.12 秒/60 度(4.8V 时),工作电压为 4.8V~6V。SG90 电机采用三线接口,其中红色接 VCC(正极)、棕色接 GND(负极)、橙色接 PWM 信号线,可以通过控制器的 PWM 信号控制电机的角度。
以下是使用延时模拟 PWM 波形控制 SG90 电机旋转并封装成子函数的示例代码:
#include "stm32f10x.h"
#define SG90_PIN GPIO_Pin_5
#define SG90_PORT GPIOB
void SG90_rotate(uint8_t angle);
int main(void)
{
// 初始化GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置PB5为推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SG90_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SG90_PORT, &GPIO_InitStructure);
while (1)
{
SG90_rotate(0); // 转到0度
delay_ms(1000);
SG90_rotate(90); // 转到90度
delay_ms(1000);
SG90_rotate(180); // 转到180度
delay_ms(1000);
}
}
void SG90_rotate(uint8_t angle)
{
// 计算PWM波形高电平持续时间
uint32_t high_time = 500 + angle * 11.11;
// 发送PWM波形
GPIO_SetBits(SG90_PORT, SG90_PIN);
delay_us(high_time);
GPIO_ResetBits(SG90_PORT, SG90_PIN);
delay_us(20000 - high_time);
}
复制代码
在上面的代码中,将 SG90 电机控制引脚连接到了 STM32F103 的 PB5 口,并通过计算 PWM 波形高电平持续时间来控制电机旋转角度。使用了SG90_rotate
子函数来实现控制过程。当调用SG90_rotate
函数并传入目标旋转角度时,函数会自动计算出对应的 PWM 波形高电平持续时间,并发送 PWM 波形来控制电机旋转到指定角度。使用了delay_ms
和delay_us
这两个函数来实现延时操作。
4.2 DS18B20 温度传感器
DS18B20 是一种数字温度传感器,它可以直接测量环境温度并转换为数字信号输出。DS18B20 温度传感器采用一线式总线接口(也叫单总线接口),具有精度高、抗干扰能力强、可靠性高和使用方便等优点。
DS18B20 温度传感器的测量范围为-55℃~+125℃,精度为±0.5℃。传感器内置了温度补偿电路,可以自动补偿温度影响导致的测量误差。
DS18B20 温度传感器有多种封装形式,包括 TO-92 封装、SOIC 封装和 TO-263 封装。其中 TO-92 封装是最常见的,也最容易使用,它的引脚分别为 GND(负极)、DQ(数据线)和 VDD(正极)。传感器可以通过单总线接口连接控制器,控制器通过发送指令读取传感器的数据。
以下是接口函数的代码示例:
#include "stm32f103xb.h"
#include <stdint.h>
#define DS18B20_GPIO_Port GPIOB
#define DS18B20_GPIO_Pin GPIO_PIN_6
void delay_us(uint16_t us)
{
uint16_t i;
for(i=0; i<us*8; i++);
}
void DS18B20_Init(void)
{
// 设置PB6为输出模式
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DS18B20_GPIO_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStruct);
// 拉低总线500us-1000us复位DS18B20
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_RESET);
delay_us(600);
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_SET);
delay_us(60);
// 等待DS18B20拉低总线告知存在
while(HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin) == GPIO_PIN_SET);
delay_us(240);
// 发送SKIP ROM指令(跳过ROM应答)
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_SET);
delay_us(60);
// 等待DS18B20转换完成
while(HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin) == GPIO_PIN_SET);
}
float DS18B20_ReadTemperature(void)
{
float temperature = 0;
// 发送START CONVERT指令(启动转换)
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_SET);
delay_us(60);
// 等待DS18B20转换完成
while(HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin) == GPIO_PIN_SET);
// 发送READ SCRATCHPAD指令(读取温度值)
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_SET);
delay_us(60);
// 读取温度值
uint8_t data[9] = {0};
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_RESET);
delay_us(2);
HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin, GPIO_PIN_SET);
delay_us(10);
data[i] |= (HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_GPIO_Pin) << j);
delay_us(50);
}
}
// 计算温度值
int16_t rawTemperature = (data[1] << 8) | data[0];
if (rawTemperature & 0x8000) {
rawTemperature = ~rawTemperature + 1;
temperature = (float)rawTemperature * -0.0625;
} else {
temperature = (float)rawTemperature * 0.0625;
}
return temperature;
}
复制代码
调用方式:
DS18B20_Init(); // 初始化
float temperature = DS18B20_ReadTemperature(); // 读取温度值
复制代码
五、总结
本项目是基于 STM32 的智能饮水机系统设计,实现了自动断电、液位感应、语音提示、手机远程控制等功能。其中,STM32 主控芯片选择 STM32F103RCT6,WIFI 选择 ESP8266 与手机端通信,水温测量采用 DS18B20,出水开关控制采用 SG90 电机实现。
通过继电器模块控制加热芯片,在水烧开后自动断电,避免了过度烧水和安全隐患。同时,利用液位传感器感应水箱水位,当水位过低时通过语音模块进行播报提示,提醒用户及时加水。
在 Android 手机端,用户可以方便地查看当前双水箱内的水温,设置出水温度及出水量,并控制出水操作。这极大地提高了用户的使用体验和方便性。
本项目具有实用性和创新性,不仅满足了用户对智能化、便捷化的需求,也展示了 STM32 等技术在智能家居领域的应用前景。
评论