基于stm32单片机的wifi手机app宠物喂食系统设计

  • 0、毕业设计选题原则说明(重点)
  • 1、项目简介
  • 1.1 系统功能
  • 1.2 演示视频
  • 2、部分电路设计
  • 2.1 STM32单片机核心板电路设计
  • 2.2 28BYJ28 五线四相步进电机控制电路设计
  • 2.3 ESP8266 WIFI电路设计
  • 3、单片机代码展示
  • 3.1 系统初始化
  • 3.2 STM32单片机与手机APP通信
  • 3.3 DS18B20读取温度
  • 4、Anrdoid Studio APP代码设计
  • 4.1、创建网络服务器
  • 4.2、手机APP与单片机通信


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 28BYJ28 五线四相步进电机控制电路设计

  • 步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速和角加速度与脉冲频率成正比(在非超载的情况下)。因此,步进电动机又称脉冲电动机。步进电机作为一种可控制用的特种电机,利用其没有累计误差的特点,广泛的用于各种开环控制。
  • 其具体电路原理图如下图所示:
  • 实物图:
  • 基于stm32单片机的wifi手机app宠物喂食系统设计_stm32

2.3 ESP8266 WIFI电路设计

  • ESP8266 是一个非常强大的 WIFI 模块,可以利用串口与单片机进行通讯,从而编程实现控制 ESP8266。利用 ESP8266 可以访问一些 API,获取天气信息或者完成网络授时,也可以连接云平台进行开发。不过因为是串口传输,速度较慢,不能用来传输图像、视频这些大容量的数据,但是传些传感器数据还是绰绰有余的。
  • 本系统用到的是 ESP-01S
  • 其具体电路原理图如下图所示:
  • 基于stm32单片机的wifi手机app宠物喂食系统设计_智能手机_02

  • 实物图如下:
  • 基于stm32单片机的wifi手机app宠物喂食系统设计_课程设计_03

3、单片机代码展示

3.1 系统初始化

void HardWare_Init(void)
{
  DIWaterInit();  //水位传感器初始化
  DIFoodInit();   //光敏电阻初始化
  
 	Usart1_Init(115200); // 串口1功能初始化,波特率9600
	// ESP--串口3--115200
  Usart3_Init(115200); //串口3初始化 连接wifi
  
  WIF_ESP8266_AP_INIT();  //esp8266初始化为ap模式

  Stepper_GPIOInit();   //步进电机初始化
  RelayInit();   //继电器初始化
  u1_printf("init ok\r\n");
}

3.2 STM32单片机与手机APP通信

static void WifiSend(unsigned char temp, unsigned char food, 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] = food;      //粮食有无
  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 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;
    }