“我们不做一锤子买卖,只做技术成长的长期伙伴!”
目录
一、视频展示
基于stm32的宠物饲养远程控制系统设计 -视频分享
二、项目简介
题目:基于stm32的宠物饲养远程控制系统设计
主控:STM32
显示:OLED显示屏
温湿度:dht11
红外光电检测余量
光敏电阻检测光照强度
控制模块:一个加水继电器 一个投喂步进电机
水位传感器检测水位
usb小灯
esp8266透传控制单片机并且接收数据
功能:
1、可分为手动和自动模式,可通过手机或者按键修改 自动模式下,检测水位是否过低,过低会打开加水继电器模拟加水,光电检测实物余量 过低自动打开步进电机进行加食物,根据换光照强度自动选择开灯或者关灯。
2、屏幕实时显示温湿度,水位,食物余量。投喂次数,当前模式。
三、原理图设计
四、PCB硬件设计
五、程序设计
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "lcd.h"
#include "IOput.h"
#include "usart.h"
#include "adc.h"
#include "pwm.h"
#include "STEPMOTOR.h"
#include "dht11.h"
extern u8 res;
u8 show_flag,mode_flag=12,dec_yw=20,gz,yw,open,count,count1,count2,open1=0,moto_flag=0,moto_stop=0,moto_open=0;
int main (void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OLED_Init();
delay_ms(1);
OLED_Clear();
output_init();
input_init();
Adc_Init();
Usart1_Init(9600);
TIM_PWM_Init(100,10);
stepmotor_init();
DHT11_Init();
while(1)
{
while(mode_flag==12)
{
key_scan(1,0,0);
OLED_ShowCH(0,4," 宠物投喂系统 ");
if(set_flag==1 || res=='s')
{
res=0;
OLED_Clear();
set_flag=0;
mode_flag++;
if(mode_flag>=2)
mode_flag=0;
}
}
DHT11_Read_Data(&temp,&humi);
count++;
gz=100-Get_Adc_Average(0,10)*100/4096;
yw=100-Get_Adc_Average(4,10)*100/4096;
open=gz;
key_scan(1,0,0);
if(gz>=50)
TIM_SetCompare2(TIM2,close);
else if(open>=30 && open<50)
TIM_SetCompare2(TIM2,one_step);
else if(open>=20 && open<30)
TIM_SetCompare2(TIM2,two_step);
else if(open>=0 && open<20)
TIM_SetCompare2(TIM2,three_step);
// OLED_ShowCH(0,0," 宠物投喂系统 ");
OLED_ShowCH(0,0,"温度:");
OLED_ShowNum(40,0,temp,2,16);
OLED_ShowCH(64,0,"湿度:");
OLED_ShowNum(104,0,humi,2,16);
OLED_ShowCH(0,2,"光照:");
OLED_ShowNum(40,2,gz,2,16);
OLED_ShowCH(0,4,"液位:");
OLED_ShowNum(40,4,yw,2,16);
OLED_ShowNum(104,2,count1,2,16);
if(set_flag==1 || res=='s')
{
res=0;
OLED_Clear();
set_flag=0;
mode_flag++;
if(mode_flag>=2)
mode_flag=0;
}
if(mode_flag==0)
{
OLED_ShowCH(64,2,"手动");
if(add_flag==1 || res == 'a')
{
res=0;
add_flag=0;
JDQ1=~JDQ1;
}
if(dec_flag==1 || res=='d')
{
res=0;
dec_flag=0;
moto_flag++;
if(moto_flag>=2)
moto_flag=0;
}
if(JDQ1==0)
{
OLED_ShowCH(0,6,"加水开");
}
else
{
OLED_ShowCH(0,6,"加水关");
}
if(moto_flag==1)
{
OLED_ShowCH(64,6,"投喂开");
}
else
{
OLED_ShowCH(64,6,"投喂关");
}
}
if(mode_flag==1)
{
OLED_ShowCH(64,2,"自动");
OLED_ShowCH(64,4,"阈值:");
OLED_ShowNum(104,4,dec_yw,2,16);
if(add_flag==1 || res=='a')
{
res=0;
add_flag=0;
dec_yw++;
}
if(dec_flag==1 || res=='d')
{
res=0;
dec_flag=0;
dec_yw--;
}
if(dec_yw>=100 || dec_yw<=0)
dec_yw=0;
if(yw<=dec_yw)
JDQ1=0;
else
JDQ1=1;
if(gd==1)
moto_flag=1;
else
moto_flag=0;
if(JDQ1==0)
{
OLED_ShowCH(0,6,"加水开");
}
else
{
OLED_ShowCH(0,6,"加水关");
}
if(moto_flag==1)
{
OLED_ShowCH(64,6,"投喂开");
}
else
{
OLED_ShowCH(64,6,"投喂关");
}
}
if(moto_flag==1)
open1=1;
else
{
open1=0;
count2=0;
}
if(open1==1)
{
count2++;
if(count2==1)
count1++;
if(count2>=2)
count2=2;
}
if(count>=20)
{
count=0;
UsartPrintf(USART1,"light:%d\r\n",gz);
UsartPrintf(USART1,"water:%d\r\n",yw);
UsartPrintf(USART1,"count:%d\r\n",count1);
if(mode_flag==1)
UsartPrintf(USART1,"Automatic mode\r\n");
else
UsartPrintf(USART1,"Manual mode\r\n");
if(JDQ1==0)
UsartPrintf(USART1,"Turn on with water\r\n");
else
UsartPrintf(USART1,"Add water and turn off\r\n");
if(moto_flag==1)
UsartPrintf(USART1,"Feeding begins\r\n");
else
UsartPrintf(USART1,"Feeding off\r\n");
UsartPrintf(USART1,"\r\n\r\n");
}
if(moto_flag==1)
{
moto_stop=0;
moto_open++;
if(moto_open==1)
{
MotorCCW(1200,128);
MotorStop();
}
if(moto_open>=2)
moto_open=2;
}
else
{
moto_open=0;
moto_stop++;
if(moto_stop==1)
{
MotorCW(1200,128);
MotorStop();
}
if(moto_stop>=2)
moto_stop=2;
}
}
}
六、资料分享
点击即可查看当前资料分享。