1、前言
本设计以STM32F103C8T6单片机为主控芯片,WIFI模块ESP8266-01S作为通信模块连接onenet云平台,通过HX711压力传感器检测宠物余粮重量、水位传感器检测水位数据、红外传感器检测是否有宠物靠近喂食器、DHT11温湿度传感器检测环境温湿度、光照传感器检测光照数据、DS1302时钟模块自动走时。OLED屏幕显示当前余粮重量、水位、温度、湿度、光照强度、是否有宠物、时间和手自动模式。通过WIFI连接ONENET云平台,手机APP连接ONENET云平台,APP可以查看当前环境信息数据,可调节阈值范围。操作简单易懂,手把手教小白完成整套设计,UniAPP开发环境搭建非常简单,可打包生成手机APP。
2、元器件组成
本设计由STM32F103C8T6单片机+WIFI模块ESP8266-01S+OLED屏幕+HX711压力传感器+水位传感器+红外传感器+DHT11温湿度传感器+光照传感器+JQ8400语音播报模块+DS1302时钟模块+UL2003步进电机+水泵+继电器+LED+按键+电源电路组成
3、功能简介
1、环境采集:HX711压力传感器检测宠物余粮重量、水位传感器检测水位数据、红外传感器检测是否有宠物靠近喂食器、DHT11温湿度传感器检测环境温湿度、光照传感器检测光照数据、DS1302时钟模块自动走时。
2、屏幕显示:OLED屏幕显示当前余粮重量、水位、温度、湿度、光照强度、是否有宠物、时间和手自动模式
3、余粮监测:通过HX711压力传感器检测宠物余粮重量。
4、水位监测:通过水位传感器检测剩余水位
5、宠物检测:通过红外传感器检测是否有宠物靠近喂食器
6、定时投食:通过按键设置早中晚定时喂食时间,当到达定时喂食时间自动喂食,并且播放宠物进食诱食声音
7、自动照明:自动模式下,当检测到过低时自动开启照明
8、自动加水:自动模式下,当检测到水位不足时自动加水
9、喂食控制:手动模式下,通过按键和APP控制喂食开关
10、喂水控制:手动模式下,通过按键和APP控制喂水开关
11、阈值设置:可以设置温度阈值、湿度阈值、光照阈值、余粮阈值、水位阈值、早晨中午晚上定时喂食时间
12、时间校准:可以通过按键校准系统时间
13、模式设置:可以设置手动模式和自动模式切换。
14、温度报警:当检测到温度大于设置的阈值时语音播报提醒
15、湿度报警:当检测到湿度大于设置的阈值时语音播报提醒
16、远程控制:通过WIFI连接ONENET云平台,手机APP连接ONENET云平台,APP可以查看当前环境信息数据,可调节阈值范围
4、设计实现效果
哔哩哔哩视频链接:
https://www.bilibili.com/video/BV1oKh96dEXQ/?spm_id_from=333.1387.homepage.video_card.click
资料分享看文章末尾
5、设计原理图
6、设计PCB图
7、程序设计
#include "stm32f10x.h" #include "delay.h" #include "usart.h" #include "USART2/usart2.h" #include "timer.h" #include "menu.h" #include "key.h" #include "modules.h" #include "beep.h" #include "oled.h" #include "adc.h" #include "water.h" #include "light.h" #include "DS1302/ds1302.h" #include "HX711/HX711.h" #include "hw.h" #include "usart3.h" #include "play.h" #include "DHT11/dht11.h" #include "led.h" #include "uln2003.h" #include "relay.h" /****************洪科单片机工作室******************* *** 破晓单片机 *** 项目:基于STM32单片机WiFi智能宠物喂食器系统 *** BILIBILI:洪科单片机 *** 小红书:洪科单片机 *** 授权IP:洪科单片机 *** 淘宝:洪科单片机 *** 闲鱼:洪科单片机 *** 版本:V01.01 *** MCU:STM32F103C8T6 ******************洪科单片机***********************/ //显示界面 CaiDanJieGouTi KeyTab[SIZE_CAIDAN]= { {0 ,0 ,0 ,0 ,0 ,Main_Menu0}, / {1 ,1 ,1 ,1 ,1 ,Main_Menu1}, {2 ,2 ,2 ,2 ,2 ,Main_Menu2}, {3 ,3 ,3 ,3 ,3 ,Main_Menu3}, {4 ,4 ,4 ,4 ,4 ,Main_Menu4}, {5 ,5 ,5 ,5 ,5 ,Main_Menu5}, {6 ,6 ,6 ,6 ,6 ,Main_Menu6}, {7 ,7 ,7 ,7 ,7 ,Main_Menu7}, {8 ,8 ,8 ,8 ,8 ,Main_Menu8}, {9 ,9 ,9 ,9 ,9 ,Main_Menu9}, {10,10,10,10,10,Main_Menu10}, {11,11,11,11,11,Main_Menu11}, {12,12,12,12,12,Main_Menu12}, } ; //传感器变量声明 typedef struct { u8 temp; u8 humi; uint16_t Weight; uint16_t youren; uint16_t Water; uint16_t light; }SensorModulesValue; typedef struct { uint16_t tempTV;// uint16_t humiTV;// uint16_t WeightTV;// uint16_t lightTV;// uint16_t WaterTV;// }SensorThresholdValue; typedef struct { uint16_t sendcount; uint8_t MODEFlag; uint8_t MOTORFlag; uint8_t RELAYFlag; uint8_t LEDFlag; uint8_t MOTORKZFlag; uint8_t WEISHIFlag; uint8_t BEEPFlag; uint8_t BJ1Flag; uint8_t BJ2Flag; uint8_t BJ3Flag; uint8_t BJ4Flag; uint8_t BJ5Flag; }DriveFlag; int main(void) { delay_init(); TIM3_Int_Init(499,7199);//1MS系统定时 OLEDGUI_Config(); //OLED初始化 OLEDGUI_DispString(30,0,"Init...",16,1); key_Init();//按键初始化 Adc_Init();//Adc初始化 light_Init();//light初始化 WATER_Init();//WATER初始化 HW_Init();//HW初始化 Init_HX711pin(); //重力传感器 Get_Maopi(); delay_ms(100); DHT11_Init();//DHT11初始化 ULN2003_IO_Init();//ULN2003初始化 relay_Init(); //relay初始化 InitClock(); //时钟初始化 ReadDS1302Clock(TM); //时钟 delay_ms(100); uart2_init(115200); delay_ms(100); uart1_init(115200); delay_ms(100); OLEDGUI_DispString(0,0,"Hardware init OK",16,1); //WiFi初始化 ESP8266_Init(); //初始化ESP8266 OLEDGUI_Clear(); //OLED清屏 OLEDGUI_DispString(0,0,"Connect MQTTs Server...",16,1); while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT")) DelayXms(500); OLEDGUI_DispString(0,16,"Connect MQTT Server Success",16,1); DelayXms(500); OLEDGUI_Clear(); //OLED清屏 OLEDGUI_DispString(0,0,"Device login ...",16,1); while(OneNet_DevLink()) //接入OneNET { OLEDGUI_DispString(0,32,"CONNECT",16,1); ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"); DelayXms(500); OLEDGUI_DispString(0,32,"CONNECT",16,1); } OneNET_Subscribe(); OLEDGUI_Clear(); //OLED清屏 SensorThresholdSet();//阈值设置 SensorDataGet(); //获取传感器数据 OLEDGUI_Clear(); while(1) { //获取按键值 key_scan(); //进入菜单界面显示处理数据 GetKeylnput(&Keystatus); //获取传感器数据 SensorDataGet(); delay_ms(100); } }