"我们不做一锤子买卖,只做技术成长的长期伙伴!"
目录
一、视频展示
二、项目简介
题目:基于单片机的智能宠物笼舍设计及实现
主控:STM32
显示:OLED显示屏
水位传感器
光电传感器
DHT11温湿度传感器
usb小灯
步进电机
光照传感器
蓝牙模块
水泵继电器+除湿继电器+加温继电器
通信:esp8266wifi模块上传阿里云
蜂鸣器
气体检测传感器(一氧化碳)
功能:
1、屏幕实时显示当前温湿度,水位,实物是否充足,光照强度。
2、按键可设置阈值,包括最低光照,最低水位,最低光照,最大湿度,最低温度。
3、当水位低于阈值时,打开水泵继电器,当光照低于阈值时,打开usb小灯进行补光,
当湿度大于湿度阈值时,打开除湿继电器,蜂鸣器报警,当温度低于最低温度阈值时,
打开加热继电器,蜂鸣器报警,当实物余量不足时,打开步进电机投喂。当气体检测达到阈值,声光报警,打开除湿继电器。
4、数据上传阿里云。
5、手机连接蓝牙,手机可以进行控制各个继电器和小灯,以及查看数据。
三、原理图设计

四、PCB硬件设计


五、程序设计
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "lcd.h"
#include "dht11.h"
#include "IOput.h"
#include "usart.h"
#include "timer.h"
#include "adc.h"
#include "STEPMOTOR.h"
extern u8 res;
extern u8 res;
#define d 2.7
/* 改p值这个偏差就行 */
#define p 168
float water;
int voltage;
u8 error_flag=0;
float Water_read(void)
{
u16 adcx;
float voltage;
adcx=Get_Adc_Average(4,10);
voltage = adcx*(float)d/(float)p;
Delay_1ms(50);
return voltage;
}
float Water_out(int o)
{
int i;
float num = 0;
float out;
for(i=0;i<o;i++){ num += Water_read(); }
out = num/o;
return out;
}
void wifi()
{
if(res=='a')
{
OLED_Clear();
res=0;
set_flag=1;
}
else if(res=='b')
{
res=0;
add_flag=1;
}
else if(res=='c')
{
res=0;
dec_flag=1;
}
}
u8 light,tushi,count;
u8 show_flag,show1_flag,min_lig = 30,min_lev = 10,max_sd = 50,min_wd = 10,max_co1 = 90;
u16 lev = 0;
u16 co1 = 0;
int main (void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
DHT11_Init();
OLED_Init();
delay_ms(1);
OLED_Clear();
output_init();
input_init();
Adc_Init();
stepmotor_init();
Usart1_Init(9600);
Usart2_Init(9600);
while(1)
{
wifi();
count++;
co1=Get_Adc_Average(8,10)*100/4096;
light=100-Get_Adc_Average(0,10)*100/4096;
DHT11_Read_Data(&temp,&humi);
lev = Water_out(10)-20;
key_scan(1,0,0);
if(set_flag==1 && show_flag!=1)
{
show1_flag=0;
set_flag=0;
show_flag++;
if(show_flag>=3)
{
show_flag=0;
}
}
if(show_flag==0)
{
OLED_ShowCH(0,0,"智能宠物笼舍");
OLED_ShowCH(0,2,"温度:");
OLED_ShowNum(40,2,temp,2,16);
OLED_ShowCH(64,2,"水位:");
OLED_ShowNum(104,2,lev,2,16);
OLED_ShowCH(0,4,"湿度:");
OLED_ShowNum(40,4,humi,2,16);
OLED_ShowCH(64,4,"光照:");
OLED_ShowNum(104,4,light,2,16);
OLED_ShowCH(0,6,"食物:");
if(GD == 0)
{
OLED_ShowCH(40,6,"有");
MotorStop();
USART_SendData(USART2,'B');
delay_ms(1);
USART_SendData(USART2,'g');
delay_ms(1);
USART_SendData(USART2,1);
delay_ms(1);
USART_SendData(USART2,'E');
delay_ms(1);
}
else
{
OLED_ShowCH(40,6,"无");
MotorCW(1200,168);
MotorStop();
USART_SendData(USART2,'B');
delay_ms(1);
USART_SendData(USART2,'g');
delay_ms(1);
USART_SendData(USART2,0);
delay_ms(1);
USART_SendData(USART2,'E');
delay_ms(1);
}
OLED_ShowCH(64,6,"Co1:");
OLED_ShowNum(104,6,co1,2,16);
// OLED_ShowNum(0,6,GD,2,16);
}
if(show_flag==1)
{
OLED_ShowCH(0,0,"最低光照:");
OLED_ShowCH(0,2,"最低水位:");
OLED_ShowCH(0,4,"最高湿度:");
OLED_ShowCH(0,6,"最低温度:");
OLED_ShowNum(72,0,min_lig,2,16);
OLED_ShowNum(72,2,min_lev,2,16);
OLED_ShowNum(72,4,max_sd,2,16);
OLED_ShowNum(72,6,min_wd,2,16);
if(set_flag==1&&show_flag==1)
{
set_flag=0;
show1_flag++;
if(show1_flag>=4)
{
show_flag=2;
show1_flag = 0;
OLED_Clear();
}
}
if(show1_flag==0)
{
OLED_ShowCH(112,0,"←");
if(add_flag==1)
{
add_flag=0;
min_lig++;
}
if(dec_flag==1)
{
dec_flag=0;
min_lig--;
}
if(min_lig>=100 || min_lig<=0){min_lig=0;}
}
if(show1_flag==1)
{
OLED_ShowCH(112,2,"←");
if(add_flag==1)
{
add_flag=0;
min_lev++;
}
if(dec_flag==1)
{
dec_flag=0;
min_lev--;
}
if(min_lev>=40 || min_lev<=0){min_lev=0;}
}
if(show1_flag==2)
{
OLED_ShowCH(112,4,"←");
if(add_flag==1)
{
add_flag=0;
max_sd++;
}
if(dec_flag==1)
{
dec_flag=0;
max_sd--;
}
if(max_sd>=100 || max_sd<=0){max_sd=0;}
}
if(show1_flag==3)
{
OLED_ShowCH(112,6,"←");
if(add_flag==1)
{
add_flag=0;
min_wd++;
}
if(dec_flag==1)
{
dec_flag=0;
min_wd--;
}
if(min_wd>=100 || min_wd<=0){min_wd=0;}
}
}
if(show_flag == 2)
{
key_scan(1,0,0);
OLED_ShowCH(0,0,"最高CO1:");
OLED_ShowNum(72,0,max_co1,2,16);
if(set_flag==1&&show_flag==2)
{
set_flag=0;
show1_flag++;
if(show1_flag>=1)
{
show1_flag=0;
show_flag=0;
OLED_Clear();
}
}
if(show1_flag == 0)
{
OLED_ShowCH(112,0,"←");
if(add_flag==1)
{
add_flag=0;
max_co1++;
}
if(dec_flag==1)
{
dec_flag=0;
max_co1--;
}
if(max_co1>=100 || max_co1<=0){max_co1=0;}
}
}
if(temp<=min_wd || humi>=max_sd || lev<=min_lev || light<=min_lig)
{
error_flag=1;
}
else
{
error_flag=0;
}
if(temp<=min_wd)
jdq3=0;
else
jdq3=1;
if(humi>=max_sd || co1 >= max_co1)
jdq2=0;
else
jdq2=1;
if(lev<=min_lev)
jdq1=0;
else
jdq1=1;
if(light<=min_lig)
deng=1;
else
deng=0;
if(temp<=min_wd || humi>=max_sd || co1 >= max_co1)
BEEP=0;
else
BEEP=1;
if(count>=20)
{
count=0;
USART_SendData(USART2,'B');
delay_ms(1);
USART_SendData(USART2,'a');
delay_ms(1);
USART_SendData(USART2,temp);
delay_ms(1);
USART_SendData(USART2,'b');
delay_ms(1);
USART_SendData(USART2,humi);
delay_ms(1);
USART_SendData(USART2,'c');
delay_ms(1);
USART_SendData(USART2,light);
delay_ms(1);
USART_SendData(USART2,'d');
delay_ms(1);
USART_SendData(USART2,lev);
delay_ms(1);
USART_SendData(USART2,'f');
delay_ms(1);
USART_SendData(USART2,error_flag);
delay_ms(1);
USART_SendData(USART2,'s');
delay_ms(1);
USART_SendData(USART2,co1);
delay_ms(1);
USART_SendData(USART2,'g');
delay_ms(1);
if(GD == 0)
{
USART_SendData(USART2,1);
}else
{
USART_SendData(USART2,0);
}
delay_ms(1);
USART_SendData(USART2,'E');
delay_ms(1);
}
}
}
六、资料分享
点击即可查看当前资料分享。