當前位置:網站首頁>基於STM32設計的寵物投喂器

基於STM32設計的寵物投喂器

2022-06-23 09:42:47DS小龍哥

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稱重傳感器電子秤稱重模塊完成檢測。

image.png

image.png

3. 所需元器件

3.1 ESP8266 WIFI

ESP8266是一款無線WIFI模塊,可以通過配置,和單片機上的串口進行通信,利用WIFI傳輸數據。

3.2 電子秤傳感器

img

img

img

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 設備實物

image.png

image.png

image-20220318095331645

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++;
	 }
}

版權聲明
本文為[DS小龍哥]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/174/202206230936502301.html

隨機推薦