基于stm32设计的宠物投喂器(代码片段)

DS小龙哥 DS小龙哥     2022-11-30     780

关键词:

1. 前言

随着物联网技术的快速发展,智能家居已经进入人们的日常生活中,在政策加持的背景下,智能家居企业越来越关注相关技术的研发和应用;但是市场上的宠物投喂装置已经难以满足宠物主人的需求。文章介绍的宠物智能投喂装置是以STM32为核心,多个模块协调配合,共同完成针对不同年龄段的宠物进行定时定量投喂及实时环境监测与高温报警、以及主人随时可以通过智能设备了解宠物生活环境、为宠物加餐等功能。该系统的功能完善、价格低廉,使用方便,解决了宠物饲养者外出时的后顾之忧,还能保证宠物的进食有一定的规律性。

设计了一个宠物投喂器,支持手动控制粮食投喂,设置恒温阀值,定时投喂、温度、湿度实时显示、剩余粮食重量等功能。

2. 需求

做一个基于STM32的宠物投喂器,可以用来主要养鸟或者小黄鸭这种宠物。

主要功能有:

1、能通过手机wifi app跟按键控制粮食的投喂。定时投喂、每次投喂量(若没吃完,则下次补充到设定好的量,补充量不需要那么准确)

2、记录每天宠物的食量(已经食用粮食的重量)

3、屏幕显示当前盒子/鸟笼内的温度,粮食的重量

4、温控:当温度低于多少度时候(自己设定)就自动启动恒温器(就简单的一个自动开关就行)。

需求分拆:

(1)手机APP:设计一款Android手机APP,一款windows客户端作为上位机,手动控制粮食投喂,设置恒温阀值,定时投喂、温度、湿度实时显示、剩余粮食重量等功能。

手机APP与STM32之间通过TCP网络协议传输数据,STM32这边使用ESP8266作为无线网卡,创建WIFI热点,手机APP连接热点后构建小型局域网,完成数据通信。

(2)采用DHT11检测当前鸟笼里环境温度、湿度。

(3)采用0.96寸SPI接口的OLED显示屏,显示当前鸟笼的温度、湿度、粮食重量。

(4)采用LED灯模拟恒温器,当鸟笼里环境温度低于设定的阀值时,就启动恒温器加热(点亮LED模拟)。

(5)宠物投喂采用28BYJ4 4相5线步进电机+ULN2003驱动板实现,步进电机转动指定的圈数或者度数模拟粮食的投喂。

(6)投喂粮食的重量采用HX711称重传感器电子秤称重模块完成检测。

3. 所需元器件

3.1 ESP8266 WIFI

ESP8266是一款无线WIFI模块,可以通过配置,和单片机上的串口进行通信,利用WIFI传输数据。

3.2 电子秤传感器

HX711 是一款专为高精度称重传感器而设计的24位A/D 转换器芯片。

3.3 DHT11温湿度传感器

DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。

3.4 步进电机

步进电机28BYJ-48名称含义:

28:表示步进电机的有效最大外径为28毫米
B: 表示步进电机“步”字汉语拼音首字母
Y: 表示永磁式“永”字汉语拼音首字母
J: 表示减速型“减”字汉语拼音首字母
BYJ: 组合即为永磁式减速步进电机
48:表示四相八拍
5V:表示额定电压为5V,且为直流电压

步进角:5.625度,就是1个脉冲信号转5.625度,64个信号转360度。
减速比:1/64,电机壳里边的电机转64圈,电机壳外边的部分转1圈。
四相:ABCD四相(电机定子上有8个齿,相对的2个齿是1),
八拍:(A-AB-B-BC-C-CD-D-DA-A)。
一拍就是一个脉冲信号,完成一个循环用8个脉冲信号。
当通电状态的改变完成一个循环时,转子转过一个齿距。转8个齿距就是一圈,8×8=64
64拍,64个脉冲信号转一圈360度。

3.6 STM32开发板

STM32F103RCT6的芯体规格是32位,速度是72MHz,程序存储器容量是256KB,程序存储器类型是FLASH,RAM容量是48K。

3.7 杜邦线

4. 软件上位机设计

4.1 开发环境介绍

上位机软件采用Qt框架设计,Qt是一个跨平台的C++图形用户界面应用程序框架。Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单来说,QT可以很轻松的帮你做带界面的软件,甚至不需要你投入很大精力。

QT官网: https://www.qt.io/

4.2 学习教程

QT入门实战专栏: https://blog.csdn.net/xiaolong1126626497/category_11400392.html

4.3 win10运行效果

4.4 Android运行效果

4.5 通信协议

读取ESP8266发来的数据
$update,22,33,12
$update,温度,湿度,剩余克数


向ESP8266发送: 
手动喂食: $0
定时投喂时间设置: $1,2
恒温温度设置: $2,22

5. STM32设备端开发

基于STM32设计的宠物投喂器

基于STM32设计的宠物投喂器_上位机源码:https://download.csdn.net/download/xiaolong1126626497/85736919
基于STM32设计的宠物投喂器_STM32源代码 https://download.csdn.net/download/xiaolong1126626497/85736953

5.1 设备实物

5.2 硬件接线说明

硬件连接方式:

1. ESP8266 WIFI接线
ATK-ESP8266串口WIFI模块与STM32的串口2相连接。
PA2(TX)--RXD 模块接收脚
PA3(RX)--TXD 模块发送脚
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)

2. TFT 1.44 寸彩屏接线
GND   电源地
VCC   接5V或3.3v电源
SCL   接PC8(SCL)
SDA   接PC9(SDA)
RST   接PC10
DC    接PB7
CS    接PB8
BL	  接PB11

3. DHT11 温湿度
VCC--VCC
GND---GND
DAT---PA5 

4. 步进电机
ULN2003控制28BYJ-48步进电机接线:

ULN2003接线:
 IN-D: PB15   d
 IN-C: PB14   c
 IN-B: PB13   b
 IN-A: PB12   a
+  : 5V
-  : GND


5. 称重传感器
VCC--->5V
SCK--->PB0   时序控制脚--对STM32--输出模式
DT---->PB1   输出输出脚-对STM32--输入模式
GND--->GND

6. 板载LED灯接线
LED1---PA8
LED2---PD2


7. 板载按键接线
K0---PA0 
K1---PC5 
K2---PA15

5.3 工程代码框架

5.4 main.c核心代码

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "esp8266.h"
#include "motor.h"
#include "oled.h"
#include "dht11.h"
#include "adc.h"
#include <string.h>
#include <stdlib.h>
#include "HX711.h"

//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;	   
#define JTAG_SWD_DISABLE   0X02
#define SWD_ENABLE         0X01
#define JTAG_SWD_ENABLE    0X00		  
void JTAG_Set(u8 mode)

	u32 temp;
	temp=mode;
	temp<<=25;
	RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
	AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
	AFIO->MAPR|=temp;       //设置jtag模式



u8 temp;
u8 humidity;
u32 CurrentWeight=5; //默认重量值
u8 timer_hour=1; //定时投喂的时间
u8 SetTemperature=0; //设置恒温温度

//WIFI发送数据存储区域
char data_buff[300];

int main()

    u8 esp8266_state=0;
    u8 key;
    u8 i;
    u32 time_cnt=0;
    u32 timer_hour_cnt=0; //记录定时的时间
    JTAG_Set(JTAG_SWD_DISABLE); //释放PA15
    LED_Init();
    KEY_Init();
    USART1_Init(115200);
    Moto_Init();  //电机初始化
    USART2_Init(115200);//串口-WIFI
    TIMER2_Init(72,20000); //超时时间20ms
    DHT11_Init();		//初始化DHT11
    Lcd_Init(); //LCD初始化
    Lcd_Clear(0); //清屏为黑色
    LCD_LED_SET;//通过IO控制背光亮		
    Init_HX711pin(); //称重传感器
    
    printf("正在初始化WIFI请稍等.\\r\\n");
    
    for(i=0;i<5;i++)
    
        if(ESP8266_Init()==0)
        
            esp8266_state=1;
            break;
        
        else
        
            esp8266_state=0;
            printf("ESP8266硬件检测错误.\\r\\n");  
        
    
  
    if(esp8266_state)
    
       printf("准备创建热点....\\r\\n");
        
       //配置ESP8266创建的WIFI名称和WIFI密码,手机需要连接这个WIFI热点
        printf("WIFI状态:%d\\r\\n",ESP8266_AP_TCP_Server_Mode("esp8266_666","12345678",8089));
    
    
    Get_Maopi();				//称毛皮重量
	delay_ms(1000);
	delay_ms(1000);
	Get_Maopi();				//重新获取毛皮重量
    
	 while(1)
	 
        //按键可以测试投喂食物
        key=KEY_Scan(0);
        if(key==2)
        
            Motorcw_ring(1,300);   //电机正转1圈--模拟投喂粮食
            printf("启动步进电机投喂食物...\\r\\n");
        
        else if(key==3)
        
            Lcd_Clear(0); //清屏为黑色
            LED2=!LED2;
         

        //轮询时间到达
        if(time_cnt>=100)
        
            time_cnt=0;
            LED1=!LED1;
            
            //获取环境温湿度
            if(DHT11_Read_Data(&temp,&humidity))
            
                printf("温度读取失败.\\r\\n");
            
            printf("环境温度:%d\\r\\n环境湿度:%d\\r\\n",temp,humidity);
            
            //获取称重传感器反馈的重量
            Get_Weight();
            printf("净重量 = %d g\\r\\n",Weight_Shiwu); //打印 
            
            //LCD屏实时显示温湿度、称重信息
            sprintf(data_buff,"H:%d",humidity);
            Gui_DrawFont_GBK16(0,16*1,RED,GRAY0,(u8*)data_buff);
            
            sprintf(data_buff,"T:%d",temp);
            Gui_DrawFont_GBK16(0,16*2,RED,GRAY0,(u8*)data_buff);
            
            sprintf(data_buff,"G:%d",Weight_Shiwu);
            Gui_DrawFont_GBK16(0,16*3,RED,GRAY0,(u8*)data_buff);
            
            //传给手机APP实时显示
            //$update,22,33,12  CurrentWeight
            //$update,温度,湿度,剩余克数
            sprintf(data_buff,"$update,%d,%d,%d",temp,humidity,CurrentWeight);
            
            //发送数据
            ESP8266_ServerSendData(0,(u8*)data_buff,strlen(data_buff));
        
			 
        // 接收WIFI返回的数据
        if(USART2_RX_FLAG)
        
            USART2_RX_BUFFER[USART2_RX_CNT]='\\0';
            
		    printf("WIFI收到数据:\\r\\n");
            //向串口打印服务器返回的数据
            for(i=0;i<USART2_RX_CNT;i++)
            
                printf("%c",USART2_RX_BUFFER[i]);
            
            
            //如果是下发了属性
            if(USART2_RX_CNT>5)
            
                //使用字符串查找函数
                //如果需要手动投喂粮食
                if(strstr((char*)USART2_RX_BUFFER,"$0"))
                
                    Motorcw_ring(1,300);   //电机正转1圈--模拟投喂粮食
                
                //如果是设置定时投喂的时间(小时)
                //格式: 定时投喂时间设置: $1,2
                else if(strstr((char*)USART2_RX_BUFFER,"$1"))
                
                    char *p=strstr((char*)USART2_RX_BUFFER,"$2");
                    //转为整数
                    timer_hour=atoi(p+3);
                    printf("定时投喂的时间:%d\\r\\n",timer_hour);
                
                
                //如果是设置恒温器的温度
                //格式: 恒温温度设置: $2,22
                else if(strstr((char*)USART2_RX_BUFFER,"$2"))
                
                    char *p=strstr((char*)USART2_RX_BUFFER,"$2");
                    //转为整数
                    SetTemperature=atoi(p+3);
                    printf("设置恒温温度为:%d\\r\\n",SetTemperature);
                
                USART2_RX_CNT=0;
                USART2_RX_FLAG=0;
            
        
        
        //判断是否需要加热
        //如果环境温度小于了设置的恒温温度就加温
        if(temp<SetTemperature)
        
            //执行加温的代码----
        
        
        //判断定时的时间是否到达
        if(timer_hour_cnt >=(100*60*60)*timer_hour)
        
            timer_hour_cnt=0; //重新下一次计数
            Motorcw_ring(1,300);  //电机正转1圈--模拟投喂粮食
        
        
        DelayMs(10);
        time_cnt++;
        timer_hour_cnt++;
	 

6☞基于stm32的电子秤设计√★(代码片段)

6、💗💗☞基于STM32的电子秤设计√★💗💗文章目录6、💗💗☞基于STM32的电子秤设计√★💗💗Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2、系统... 查看详情

6☞基于stm32的电子秤设计√★(代码片段)

6、💗💗☞基于STM32的电子秤设计√★💗💗文章目录6、💗💗☞基于STM32的电子秤设计√★💗💗Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2、系统... 查看详情

1基于stm32的音乐喷泉√♥(代码片段)

1、基于STM32的音乐喷泉文章目录1、基于STM32的音乐喷泉Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计2.1、芯片选择方案2.2、系统概述:2.3、系统总体设计思路2.4、各功能模块程序实现原理分析2.4.1.水泵驱... 查看详情

1基于stm32的音乐喷泉√♥(代码片段)

1、基于STM32的音乐喷泉文章目录1、基于STM32的音乐喷泉Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计2.1、芯片选择方案2.2、系统概述:2.3、系统总体设计思路2.4、各功能模块程序实现原理分析2.4.1.水泵驱... 查看详情

9★♥★基于stm32单片机的颜色检测仪设计♥☆(代码片段)

9、★♥★基于STM32单片机的颜色检测仪设计♥☆文章目录9、★♥★基于STM32单片机的颜色检测仪设计♥☆引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2、系统概述2.3、设计要求2.4、系统总体... 查看详情

9★♥★基于stm32单片机的颜色检测仪设计♥☆(代码片段)

9、★♥★基于STM32单片机的颜色检测仪设计♥☆文章目录9、★♥★基于STM32单片机的颜色检测仪设计♥☆引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2、系统概述2.3、设计要求2.4、系统总体... 查看详情

5♥☆基于stm32的智能手环√★☆(代码片段)

5、♥☆基于STM32的智能手环√★☆💙💙文章目录5、♥☆基于STM32的智能手环√★☆💙💙Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2系统概述2.3、设计要求2.4、系... 查看详情

5♥☆基于stm32的智能手环√★☆(代码片段)

5、♥☆基于STM32的智能手环√★☆💙💙文章目录5、♥☆基于STM32的智能手环√★☆💙💙Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2系统概述2.3、设计要求2.4、系... 查看详情

4☛基于stm32的电子打铃器√★☆(代码片段)

4、💙💙☛基于STM32的电子打铃器√★☆💙💙文章目录4、💙💙☛基于STM32的电子打铃器√★☆💙💙Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2、... 查看详情

4☛基于stm32的电子打铃器√★☆(代码片段)

4、💙💙☛基于STM32的电子打铃器√★☆💙💙文章目录4、💙💙☛基于STM32的电子打铃器√★☆💙💙Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2、... 查看详情

8★☆基于stm32的小区环境检测系统√★☆(代码片段)

8、★☆基于STM32的小区环境检测系统√★☆文章目录8、★☆基于STM32的小区环境检测系统√★☆Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2、系统概述2.3、设计要求2.4、系统总体... 查看详情

8★☆基于stm32的小区环境检测系统√★☆(代码片段)

8、★☆基于STM32的小区环境检测系统√★☆文章目录8、★☆基于STM32的小区环境检测系统√★☆Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2、系统概述2.3、设计要求2.4、系统总体... 查看详情

基于stm32设计的拼图小游戏(代码片段)

一、环境介绍MCU: STM32F103ZET6编程软件环境: keil5LCD显示屏:  正点原子的TFT3.5寸显示屏完整工程代码下载地址: https://download.csdn.net/download/xiaolong1126626497/20706318二、运行效果 三、功能介绍因为代码原来是在2.8寸屏上设计的,... 查看详情

基于stm32的智能鱼缸设计(代码片段)

...省鱼友时间、劳力、增加养鱼乐趣;为此,本文基于STM32单片机设计了一款智能鱼缸。该鱼缸可以实现水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能为一体的控制系统,可通过控制... 查看详情

毕业设计-题目:基于stm32的病房呼叫系统(代码片段)

...丹成学长,今天向大家介绍一个学长做的单片机项目基于stm32的病房呼叫系统大家可用于课程设计或毕业设计技术解答、毕设帮助、开题指导print( 查看详情

7基于stm32的智能风扇√★(代码片段)

7、💗💗基于STM32的智能风扇√★💗💗文章目录7、💗💗基于STM32的智能风扇√★💗💗Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.1.1、控制核心的... 查看详情

7基于stm32的智能风扇√★(代码片段)

7、💗💗基于STM32的智能风扇√★💗💗文章目录7、💗💗基于STM32的智能风扇√★💗💗Introduction引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.1.1、控制核心的... 查看详情

基于stm32设计的实时心率检测仪(代码片段)

一、开发环境介绍主控芯片: STM32F103ZET6代码编程软件:keil5心率检测模块: PulseSensorWIFI模块:ESP8266--可选的。直接使用串口有线传输给上位机也可以。上位机: C++(QT)设计的。支持PC机电脑、Android手机显示。与上位... 查看详情