STM32驱动的智能宠物投喂系统:设计原理、程序实现与APP集成全攻略
内容包括:
1、源程序(C语言含详细备注)
2、原理图&PCB+照片版
3、实物图
4、原件清单
5、参考焊接图片
6、原理图绘制软件AD17
7、元器件焊接方法及注意事项
8、文档参考
9、所用到的芯片、电路模块资料
10、疑难问题解答
11、da辩问题解答
12、C语言学习视频
13、程序下载串口软件FluMuc安装包
14、手机软件
15、PL2303下载器驱动
16、程序编写软件Keil安装包
17、参考PPT
18、主流程图
基于 STM32 的智能宠物投喂系统设计
摘要:本文设计了一款基于 STM32F103C8T6 单片机的智能宠物投喂系统。该系统能够实时监测宠物窝的温度、湿度,记录投喂食物的次数,并在显示屏上实时显示这些信息。通过光敏电阻实时监测环境变化,自动调节灯光为宠物照明。同时,系统支持手机 APP 远程控制投喂、开关灯及模式切换等功能,提高了宠物护理的便捷性和智能化水平。
关键词:STM32F103C8T6;智能宠物投喂系统;温湿度监测;灯光自动调节;手机 APP 控制
一、引言
随着人们生活水平的提高,宠物已成为许多家庭的重要成员。然而,宠物的日常护理,特别是定时投喂,给宠物主人带来了不少麻烦。传统的手动投喂方式不仅耗时费力,还容易因遗忘而导致宠物饥饿。因此,设计一款能够自动投喂、实时监测宠物环境并具备远程控制功能的宠物投喂系统显得尤为重要。本文基于 STM32F103C8T6 单片机,设计了一款智能宠物投喂系统,旨在解决上述问题。
二、系统总体设计
2.1 设计目标
设计一款基于 STM32F103C8T6 单片机的智能宠物投喂系统,实现以下功能:
- 实时监测宠物窝的温度、湿度,并在显示屏上显示。
- 记录投喂食物的次数,并在显示屏上显示。
- 使用光敏电阻实时监测环境变化,自动调节灯光为宠物照明。
- 支持手机 APP 远程控制投喂、开关灯及模式切换等功能。
2.2 系统总体框图
系统主要由 STM32F103C8T6 单片机、DHT11 温湿度传感器、光敏电阻、步进电机、OLED 显示屏、蓝牙模块、电源模块等组成。STM32F103C8T6 单片机作为系统的主控器,负责数据处理和指令发送;DHT11 温湿度传感器用于检测宠物窝的温湿度;光敏电阻用于监测环境光线的变化;步进电机用于控制食物的投喂;OLED 显示屏用于显示温湿度、投喂次数等信息;蓝牙模块用于实现手机 APP 与系统的通讯;电源模块为系统提供稳定的电源供应。
三、硬件设计
3.1 STM32F103C8T6 单片机
STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的 32 位微控制器,具有丰富的外设接口和强大的数据处理能力。在本系统中,它作为主控器,负责采集传感器数据、处理控制逻辑、与显示模块和蓝牙模块通信以及控制步进电机和灯光。
3.2 DHT11 温湿度传感器
DHT11 是一款数字式温湿度传感器,能够同时测量环境的温度和湿度。它通过单总线与 STM32F103C8T6 单片机连接,将采集到的温湿度数据传输给单片机。
3.3 光敏电阻
光敏电阻是一种能够根据光照强度变化而改变电阻值的元件。在本系统中,光敏电阻用于监测环境光线的变化。当光线变暗时,光敏电阻的阻值增大,系统检测到这一变化后自动打开灯光;当光线变亮时,光敏电阻的阻值减小,系统检测到这一变化后自动关闭灯光。
3.4 步进电机
步进电机是一种将电脉冲信号转换为角位移或线位移的开环控制电机。在本系统中,步进电机用于控制食物的投喂。通过控制步进电机的转动步数和方向,可以实现食物的定量投喂。
3.5 OLED 显示屏
OLED 显示屏具有自发光、对比度高、视角广等特点,能够清晰地显示信息。在本系统中,OLED 显示屏用于显示宠物窝的温湿度、投喂次数等信息。
3.6 蓝牙模块
蓝牙模块用于实现手机 APP 与系统的通讯。通过蓝牙模块,手机 APP 可以向系统发送控制指令,如投喂、开关灯、模式切换等;系统也可以将采集到的温湿度、投喂次数等信息发送给手机 APP 进行显示。
3.7 电源模块
电源模块为系统提供稳定的电源供应。考虑到系统的功耗和便携性,可以选择使用锂电池作为电源,并通过电源管理芯片将锂电池的电压转换为系统所需的电压。
3.8 硬件电路连接
四、软件设计
4.1 软件总体流程
软件设计主要包括主程序、初始化程序、传感器数据采集程序、显示程序、控制逻辑程序、蓝牙通信程序等。主程序负责初始化系统、循环检测传感器数据、调用各子程序;初始化程序设置系统参数;传感器数据采集程序采集温湿度、光线强度等数据;显示程序显示相关信息;控制逻辑程序根据采集的数据和设定的阈值进行控制;蓝牙通信程序实现手机 APP 与系统的通讯。
4.2 初始化程序
初始化程序包括系统时钟初始化、GPIO 初始化、ADC 初始化、I2C 初始化、USART 初始化等。系统时钟初始化设置 STM32F103C8T6 单片机的主频;GPIO 初始化将连接传感器、步进电机、OLED 显示屏、蓝牙模块的 GPIO 口设置为相应的输入或输出模式;ADC 初始化设置 ADC 的通道、采样频率等参数;I2C 初始化设置 I2C 接口的时钟频率、地址等参数;USART 初始化设置 USART 的波特率、数据位、停止位等参数。
4.3 传感器数据采集程序
4.4 显示程序
使用 OLED 显示屏的驱动程序,将采集到的温湿度、投喂次数等信息显示到显示屏上。在显示程序中,需要定义显示函数,将采集到的数据转换为字符串格式,然后通过 I2C 接口发送到 OLED 显示屏进行显示。
4.5 控制逻辑程序
4.6 蓝牙通信程序
蓝牙通信程序实现手机 APP 与系统的通讯。在蓝牙通信程序中,需要配置 USART 接口,并编写相应的通信函数。通过 USART 接口接收手机 APP 发送的控制指令,并根据指令执行相应的操作,如投喂、开关灯、模式切换等;同时,也可以通过 USART 接口将系统的状态信息(如温湿度、投喂次数等)发送给手机 APP 进行显示。
五、系统详细功能实现
5.1 温湿度监测功能实现
系统上电后,初始化 DHT11 温湿度传感器和 OLED 显示屏。在主程序的循环中,不断调用 DHT11 温湿度传感器数据采集程序,采集宠物窝的温湿度数据。采集到的数据通过显示程序显示到 OLED 显示屏上,方便用户实时了解宠物窝的环境状况。
5.2 灯光自动调节功能实现
在自动模式下,系统上电后初始化光敏电阻和灯光控制模块。在主程序的循环中,不断调用光敏电阻数据采集程序,采集环境光线强度数据。根据采集到的光线强度数据与设定的阈值进行比较,判断是否需要打开或关闭灯光。当光线强度低于设定的阈值时,控制灯光打开;当光线强度高于设定的阈值时,控制灯光关闭。
5.3 投喂控制功能实现
系统上电后初始化步进电机和投喂控制模块。用户可以通过手机 APP 或系统按键设置投喂时间和投喂次数。当到达设定的投喂时间时,系统控制步进电机转动一定的步数,实现食物的定量投喂。同时,记录投喂次数,并在 OLED 显示屏上显示。
5.4 手机 APP 控制功能实现
手机 APP 通过蓝牙模块与系统进行通讯。用户可以在手机 APP 上设置投喂时间、投喂次数、开关灯、模式切换等参数。手机 APP 将设置参数通过蓝牙模块发送给系统,系统接收到参数后执行相应的操作。同时,系统也可以将采集到的温湿度、投喂次数等信息通过蓝牙模块发送给手机 APP 进行显示。
六、系统测试与优化
6.1 系统测试
在实际硬件电路上进行系统测试,检查智能宠物投喂系统的各项功能是否正常。测试内容包括传感器数据采集的准确性、显示功能的正确性、灯光自动调节的效果、投喂控制的精准度、手机 APP 控制的可靠性等。
6.2 问题分析与解决
在测试过程中,可能会遇到一些问题,如传感器数据不准确、显示异常、灯光控制失灵、投喂不准确、手机 APP 连接不稳定等。针对这些问题,进行详细的分析,找出问题的原因,并采取相应的解决措施。例如,如果传感器数据不准确,可能是传感器校准不准确或信号干扰导致,需要重新校准传感器或增加滤波措施;如果显示异常,可能是 OLED 显示屏驱动程序错误或硬件连接问题导致,需要检查驱动程序和硬件连接。
6.3 系统优化
为了提高系统的性能和稳定性,对系统进行优化。例如,优化传感器数据采集算法,提高数据采集的精度和速度;优化灯光控制算法,使灯光调节更加平滑和准确;优化投喂控制算法,提高投喂的精准度和稳定性;优化蓝牙通信程序,提高手机 APP 连接的稳定性和可靠性。
七、结论
本文设计了一款基于 STM32F103C8T6 单片机的智能宠物投喂系统,实现了对宠物窝温湿度的实时监测、灯光自动调节、投喂控制以及手机 APP 远程控制等功能。经过系统测试和优化,该系统具有较高的准确性和稳定性,能够满足智能宠物投喂的需求。通过 STM32F103C8T6 单片机的控制,实现了对宠物护理的智能化管理,提高了宠物护理的便捷性和效率。
八、展望
未来的研究可以进一步拓展该智能宠物投喂系统的功能,如增加语音提醒功能、自动清洁功能、宠物体重监测功能等。同时,可以提高系统的集成度和可靠性,降低成本,使智能宠物投喂系统具有更广泛的应用前景。此外,还可以将该系统与物联网技术相结合,实现远程监控和数据共享,为宠物主人提供更加便捷和智能的宠物护理体验。
#include "ds18b20.h"
#include "delay.h"
/*******************************************************************************
函数名:DS18B20_GPIO_Init
功能:初始化DS18B20引脚
输入:
输出:
返回值:
备注:
*******************************************************************************/
void DS18B20_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_DS18B20_PORT, ENABLE); //使能PORTA口时钟
GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);
GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN); //输出1
}
/*******************************************************************************
函数名:DS18B20_Init
功能:初始化DS18B20
输入:
输出:
返回值:初始化成功为0,不成功为1
备注:
*******************************************************************************/
u8 DS18B20_Init(void)
{
unsigned char wait=0;
DS18B20_IO_OUT(); //输出模式
DS18B20_OUT_0; //拉低
delay_us(750); //至少延时480us
DS18B20_OUT_1; //拉高
delay_us(15); //15us
DS18B20_IO_IN(); //输入模式
while(READ_DS18B20_IO && wait++<200)delay_us(1);//等待高电平结束
if(wait>=200)return 1;
else wait=0;
while(!READ_DS18B20_IO && wait++<240)delay_us(1);//等待低电平结束
if(wait>=240)return 1;
else return 0;
}
/*******************************************************************************
函数名:DS18B20_ReadByte
功能:从DS18B20读一个字节
输入:
输出:
返回值:读取到的字节
备注:
*******************************************************************************/
unsigned char DS18B20_ReadByte(void)
{
unsigned char i;
unsigned char dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DS18B20_IO_OUT(); //输出模式
DS18B20_OUT_0; //开始时间片
delay_us(2); //延时等待
DS18B20_OUT_1; //准备接收
DS18B20_IO_IN(); //输入模式
delay_us(12); //接收延时
if(READ_DS18B20_IO) dat |= 0x80; //读取数据
delay_us(60); //等待时间片结束
}
return dat;
}
/*******************************************************************************
函数名:DS18B20_WriteByte
功能:写一个字节
输入:unsigned char dat
输出:
返回值:
备注:
*******************************************************************************/
void DS18B20_WriteByte(unsigned char dat)
{
unsigned char i;
unsigned char temp;
DS18B20_IO_OUT();//输出模式
for (i=1; i<=8; i++)
{
temp = dat & 0x01;
dat = dat >> 1;
if (temp)
{
DS18B20_OUT_0;
delay_us(2);
DS18B20_OUT_1; //写1
delay_us(60);
}
else
{
DS18B20_OUT_0;//写0
delay_us(60);
DS18B20_OUT_1;
delay_us(2);
}
}
}
/**************************************
从DS18B20中获取温度值得浮点值
参数: 空
返回值: 读取到的温度值(有效范围-55.0~125.0)
**************************************/
float ReadTemperature(void)
{
unsigned char TPH; //存放温度值的高字节
unsigned char TPL; //存放温度值的低字节
short i16=0;
float f32=0;
DS18B20_Init();
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
DS18B20_Init();
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TPL = DS18B20_ReadByte(); //读温度低字节
TPH = DS18B20_ReadByte(); //读温度高字节
i16 = 0;
i16 = (TPH<<8) |TPL; // 将高位(MSB)与低位(LSB)合并
f32 = i16 * 0.0625; // 12bit精度时温度值计算
return(f32); // 返回读取到的温度数值(float型)
}
作者:科创工作室li