基于STM32单片机的智能鱼缸设计
0、毕业设计选题原则说明(重点)
- 选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的!
- 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。
- 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业证而已!!!
- 当你明白这一点后,作毕业设计的要求就是在满足老师的要求后,越简单越好,这样不但容易去做,而且你自己也容易去理解,掌握,同样也能花最少的钱!!!
- 满足老师的要求,这个没办法,毕竟他是决定你是否能通过答辩的人。
- 每年都有很多同学找到我的时候,后悔当初为什么要把功能写的那么复杂,后悔没有提前找我咨询一下!所以在这里提醒同学们,提交开题报告之前一定要多想想,咨询下以往的学长学姐,不要自己随便写一堆提交上去!!!
- 大家找不到学长学姐的话,也可以找我咨询,我可以给大家一些建议。
- 点击此处即可咨询
1、项目简介
1.1 系统功能
- 功能介绍:
- 1,基于stm32宠物喂食具有自动、手动功能以及WIFI远程APP控制功能
- 2,使用传感器采集水量,食物量,温度
- 3,具备手动与自动功能
- 4,手动时可以分别通过app对加粮,加水,风扇继电器进行打开与关闭
- 5,自动时,根据粮食的多少自动添加粮食,根据水位的上下阈值自动进行加水,停止加水动作,,根据温度的阈值,自动进行打开风扇与关闭风扇操作
- 6,app可以设置温度阈值
1.2 演示视频
2、部分电路设计
2.1 STM32单片机核心板电路设计
- STM32单片机最小系统是确保STM32系列单片机能够正常工作的最基本电路配置,通常包括电源电路、晶振电路、复位电路。这些组件共同为单片机提供稳定的工作环境和必要的时钟信号,确保单片机能够准确地执行程序指令。
- 电源电路:为单片机提供稳定的工作电压,通常采用3.3V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
- 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
- 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。
STM32单片机是一种功能强大、易于使用、灵活且可靠的32位微控制器,基于ARM Cortex™-M内核。其主要功能特点包括:
- 高性能和低功耗:STM32系列单片机提供多种内核选择,如Cortex-M0、Cortex-M3、Cortex-M4等,满足不同应用场景对性能的需求,同时保持低功耗特性。
- 多种通信和外设接口:STM32单片机具备广泛的通信和外设接口,如I2C、SPI、USART、USB等,便于开发者实现各种复杂功能。
- 易于开发和调试:STM32单片机提供了丰富的软件和硬件工具,如HAL库、CubeMX等,帮助开发者快速创建和调试嵌入式系统。
- 高集成度和设计灵活性:STM32系列单片机全系列产品共用大部分引脚、软件和外设,优异的兼容性为开发人员带来最大的设计灵活性
单片机最小系统原理图如下图所示:
实物图:
2.2 舵机控制电路
-
SG90舵机的工作原理比较简单。舵机内部有一个基准电压,单片机产生的PWM信号通过信号线进入舵机,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
-
sg90有三个引脚,分别是红线(VCC),棕线(GND)和橙线(信号线)。通常使用5V供电,信号线接单片机引脚,用老来接收单片机发送的PWM。
-
控制sg90舵机旋转也比较简单,只需要给它输出PWM波,修改占空比就可以调整角度。sg90的控制一般需要一个20ms 左右的时基脉冲,脉冲的高电平部分一般在0.5ms~2.5ms。高电平持续时间与旋转角度的对应关系如下
-
-
其具体电路原理图如下图所示:
-
实物图:
2.3 ESP8266 WIFI电路设计
-
ESP8266 是一个非常强大的 WIFI 模块,可以利用串口与单片机进行通讯,从而编程实现控制 ESP8266。利用 ESP8266 可以访问一些 API,获取天气信息或者完成网络授时,也可以连接云平台进行开发。不过因为是串口传输,速度较慢,不能用来传输图像、视频这些大容量的数据,但是传些传感器数据还是绰绰有余的。
-
本系统用到的是 ESP-01S
-
其具体电路原理图如下图所示:
-
实物图如下:
2.4、BH1750光照传感器电路设计
- BH1750环境光传感器内置16位的模数转换器,通过I2C接口能够直接输出一个数字信号,不需要再做复杂的计算。
- 这款环境光传感器能够直接通过光度计来测量。光强度的单位是流明"lx"。当物体在均匀的光照下它能够在每平方米获得1lx的光通量,它们的光强度是1lx。
光照亮度数据参考:
-
晚上: 0.001-0.02;
-
月夜: 0.02-0.3;
-
多云室内: 5-50;
-
多云室外: 50-500;
-
晴天室内: 100-1000;
-
夏天中午光照下: 大约10*6能量;
-
阅读书籍时的照明度:50-60;
-
家庭录像标准照明度:1400
-
其具体电路原理图如下图所示:
-
-
实物图:
-
-
3、单片机代码展示
3.1 系统初始化
void HardWare_Init(void)
{
Delay_Init(); // 延时功能初始化
Usart1_Init(115200); // 串口1功能初始化,波特率115200
Usart3_Init(115200); //串口3初始化 连接wifi
WIF_ESP8266_AP_INIT(); //esp8266初始化为ap模式
bh1750_iic_init(); //光照模块初始化
DIWaterInit(); //水位传感器初始化
RelayInit(); //继电器初始化
ServoInit();
ServoStart();
RELAY_1_ON;
RELAY_2_ON;
Delay_Ms(1000);
RELAY_1_OFF;
RELAY_2_OFF;
ServoStop();
u1_printf("init ok\r\n");
}
3.2 STM32单片机与手机APP通信
static void WifiSend(unsigned char temp, uint8_t light, unsigned char water)
{
unsigned char msg[8];
u3_printf("AT+CIPSEND=0,8\r\n");
msg[0] = 0x86;
msg[1] = 0x5;
msg[2] = temp; //温度 整数部分
msg[3] = light; //粮食有无
msg[4] = water; //水有无
msg[5] = 0x0;
msg[6] = 0x0;
msg[7] = msg[0] + msg[1] + msg[2] + msg[3] + msg[4] + msg[5] + msg[6];
Delay_Ms(200);
Usart_SendString(USART3, msg, 8);
Delay_Ms(200);
}
3.3 BH1750获取光照数据
uint8_t bh1750_read_u8(void)
{
uint8_t value = 0;
Single_Write_bh1750(0x01);
Single_Write_bh1750(0x10);
Delay_Ms(200);
bh1750_ReadContinuous1();
temp2=BUF[0];
temp2=(temp2<<8)+BUF[1];
lux=(float)temp2/1.2; //lux是float型
if((lux>0)&&(lux<100))
value=0;
else if(lux<300)
value=10;
else if(lux<700)
value=20;
else if(lux<1200)
value=30;
else if(lux<1500)
value=40;
else if(lux<1800)
value=50;
else if(lux<2100)
value=60;
else if(lux<2400)
value=70;
else if(lux<2700)
value=80;
else if(lux<3000)
value=90;
else
value=100;
u1_printf("光照强度:%f value:%d\r\n",lux,value);
return value;
}
3.4、DS18B20获取温度
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}else temp=1;//温度为正
tem=TH; //获得高八位
tem<<=8;
tem+=TL;//获得底八位
tem=(float)tem*0.625;//转换
if(temp)return tem; //返回温度值
else return -tem;
}
4、Anrdoid Studio APP代码设计
4.1、创建网络服务器
public void connect_server() {
public_info.buf_length = 8;
public_info.buf = new byte[public_info.buf_length];
public_info.need_send_cmd = false;
public_info.recv_thread_exit = false;
public_info.info_thread_exit = false;
public_info.temp_yuzhi = 10;
if (public_info.connect_cnt > 0)
public_info.info_thread_exit = true; //如果之前已经有连接了,需要断开后再连接
//创建网络线程,并在线程中连接服务器
client_info_thread = new clientInfoThread(netMessageHandle);
client_info_thread.start();
}
4.2、手机APP与单片机通信
public void send_buffer_to_network(byte []msg,byte length) {
while (true) {
if (public_info.need_send_cmd) { //如果正在发送数据,则要等待它完成再做操作
try {
Thread.sleep(100); //100ms延时
}catch (Exception ex) {}
continue;
}
break;
}
//设置要发送的数据和长度
public_info.buf_length = length;
public_info.buf = msg;
public_info.need_send_cmd = true;
}