STM32项目分享:基于STM32的智能饲养机 - 实践

“我们不做一锤子买卖,只做工艺成长的长期伙伴!”

目录

一、视频展示

二、项目简介

三、原理图设计

四、PCB硬件设计

五、程序设计

六、资料分享


一、视频展示

基于STM32的智能饲养机 -视频分享

二、项目简介

题目:基于STM32的智能饲养机
主控:STM32
显示:OLED显示屏
HX711重量传感器
光检测模块:光照传感器
DS1302时钟模块
JQ8400语音播报
舵机(投喂)
wifi通信:esp8266云智能
功能:
1、实时监测当前环境光强度,实物重量,时间。
2、可通过按键设置实物重量阈值,做到定量投喂
3、wifi模块可连接手机然后经过手机查看当前信息信息控制投喂。
4、可按键设置定时投喂。
5、到达定时时间,语音播报唤醒宠物过来吃食物,
6、屏幕显示重量,时间。光照等数据。

三、原理图设计

四、PCB硬件设计

五、程序设计

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "lcd.h"
#include "ds1302.h"
#include "IOput.h"
#include "adc.h"
#include "HX711.h"
#include "usart.h"
#include "pwm.h"
#include "jq8400.h"
u8 show_flag, show1_flag,shi=12,fen=30,light,mode,open_flag,sound_flag=1,count2;
u16 weight,dec_weight=20;
extern u8 receiving_flag; // 新增一个标志,用于标记是否开始接收数组
extern u16 buf[20],res,ress;
u8 mode,controlState,f;
void showtime(void)
{
ds1032_read_realTime();         //??????
OLED_ShowNum(0,4,TimeData.year,4,16);
OLED_ShowString(35,4,"/",16);
OLED_ShowNum(43,4,TimeData.month,2,16);
OLED_ShowString(60,4,"/",16);
OLED_ShowNum(70,4,TimeData.day,2,16);
OLED_ShowNum(0,6,TimeData.hour,2,16);
OLED_ShowString(20,6,":",16);
OLED_ShowNum(30,6,TimeData.minute,2,16);
OLED_ShowString(50,6,":",16);
OLED_ShowNum(60,6,TimeData.second,2,16);
}
void show_change_time(void)
{
OLED_ShowString(0,4,"20",16);
OLED_ShowNum(16,4,lssj.year,2,16);
OLED_ShowString(35,4,"/",16);
OLED_ShowNum(43,4,lssj.month,2,16);
OLED_ShowString(60,4,"/",16);
OLED_ShowNum(70,4,lssj.day,2,16);
OLED_ShowNum(0,6,lssj.hour,2,16);
OLED_ShowString(20,6,":",16);
OLED_ShowNum(30,6,lssj.minute,2,16);
OLED_ShowString(50,6,":",16);
OLED_ShowNum(60,6,lssj.second,2,16);
Delay_50ms(2);
}
int main (void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OLED_Init();
delay_ms(1);
OLED_Clear();
ds1302_gpio_init();
input_init();
output_init();
Usart2_Init(9600);
Usart1_Init(9600);
Adc_Init();
TIM_PWM_Init(71,9600);
Init_HX711pin();
HX711_Read();
Get_Maopi();
TIM_SetCompare2(TIM2,10);
playsong(2);
while(1)
{
count2++;
Get_Weight();
weight=Weight_Shiwu/10;
key_scan();
if(weight>=200)
weight=200;
light=100-Get_Adc_Average(0,10)*100/4096;
if (key1_flag == 1 && show_flag == 0)
{
key1_flag = 0;
show1_flag++;
if (show1_flag >= 4)
show1_flag = 0;
}
// 时间修改页面
if (show1_flag == 1)
{
if (key2_flag == 1)
{
key2_flag = 0;
show_flag++;
}
if (show_flag == 7)
{
show_flag = 0;
lssj.month = (lssj.month / 10 * 16) + (lssj.month % 10);
lssj.day = (lssj.day / 10 * 16) + (lssj.day % 10);
lssj.hour = (lssj.hour / 10 * 16) + (lssj.hour % 10);
lssj.minute = (lssj.minute / 10 * 16) + (lssj.minute % 10);
lssj.second = (lssj.second / 10 * 16) + (lssj.second % 10);
lssj.year = lssj.year;
ds1032_init();
}
// 显示和修改时间各部分
switch (show_flag)
{
case 0:
showtime();
lssj.year = TimeData.year - 2000;
lssj.month = TimeData.month;
lssj.day = TimeData.day;
lssj.hour = TimeData.hour;
lssj.minute = TimeData.minute;
lssj.second = TimeData.second;
lssj.week = TimeData.week;
break;
case 1:
show_change_time();
if (key1_flag == 1)
{
key1_flag = 0;
lssj.year++;
}
if (key3_flag == 1)
{
key3_flag = 0;
lssj.year--;
}
if (lssj.year > 100)
lssj.year = 0;
OLED_ShowChar(24, 4, '_', 16);
Delay_50ms(2);
break;
case 2:
show_change_time();
if (key1_flag == 1)
{
key1_flag = 0;
lssj.month++;
}
if (key3_flag == 1)
{
key3_flag = 0;
lssj.month--;
}
if (lssj.month > 12)
lssj.month = 1;
if (lssj.month  31)
lssj.day = 1;
if (lssj.day  23)
lssj.hour = 0;
}
if (key3_flag == 1)
{
key3_flag = 0;
lssj.hour--;
if (lssj.hour > 200)
lssj.hour = 23;
}
OLED_ShowChar(8, 6, '_', 16);
Delay_50ms(2);
break;
case 5:
show_change_time();
if (key1_flag == 1)
{
key1_flag = 0;
lssj.minute++;
if (lssj.minute > 59)
lssj.minute = 0;
}
if (key3_flag == 1)
{
key3_flag = 0;
lssj.minute--;
if (lssj.minute > 200)
lssj.minute = 59;
}
OLED_ShowChar(38, 6, '_', 16);
Delay_50ms(2);
break;
case 6:
show_change_time();
if (key1_flag == 1)
{
key1_flag = 0;
lssj.second++;
if (lssj.second > 59)
lssj.second = 0;
}
if (key3_flag == 1)
{
key3_flag = 0;
lssj.second--;
if (lssj.second > 200)
lssj.second = 59;
}
OLED_ShowChar(68, 6, '_', 16);
Delay_50ms(2);
break;
default:
break;
}
}
// 显示信息界面
if (show1_flag == 0)
{
showtime();
OLED_ShowCH(0,0,"重量:");
OLED_ShowNum(40,0,weight,4,16);
OLED_ShowCH(0,2,"光照:");
OLED_ShowNum(40,2,light,2,16);
if(key2_flag==1)
{
key2_flag=0;
mode++;
if(mode>=2)
mode=0;
}
if(mode==0)
{
OLED_ShowCH(96,6,"手动");
if(key3_flag==1)
{
key3_flag=0;
open_flag++;
if(open_flag>=2)
open_flag=0;
}
if(open_flag==0)
TIM_SetCompare2(TIM2,10);
else
TIM_SetCompare2(TIM2,17);
}
if(mode==1)
{
OLED_ShowCH(96,6,"定时");
if(weight= 201)
dec_weight = 0;
}
if (show1_flag == 3)
{
OLED_ShowCH(0,0,"    定时时间    ");
OLED_ShowNum(40,2,shi,2,16);
OLED_ShowCH(74,2,":");
OLED_ShowNum(82,2,fen,4,16);
if (key2_flag == 1)
{
key2_flag = 0;
shi++;
}
if (key3_flag == 1)
{
key3_flag = 0;
fen++;
}
if (shi >= 24)
shi = 0;
if (fen >= 60)
fen = 0;
}
if(count2>=30)
{
count2 = 0;
USART_SendData(USART1,'B');
delay_ms(1);
USART_SendData(USART1,'a');
delay_ms(1);
USART_SendData(USART1,light);
delay_ms(1);
USART_SendData(USART1,'b');
delay_ms(1);
USART_SendData(USART1,weight);
delay_ms(1);
USART_SendData(USART1,'c');
delay_ms(1);
USART_SendData(USART1,mode);
delay_ms(1);
USART_SendData(USART1,'d');
delay_ms(1);
USART_SendData(USART1,open_flag);
delay_ms(1);
USART_SendData(USART1,'E');
delay_ms(1);
}
if(receiving_flag == 2) //按位操作的思想,方便阿里云调试
{
receiving_flag = 0;
for( f = 0; f < 20; f++)
{
if (buf[f] == 'c')
{
if(buf[f+1] == '0')
{
mode=0;
}
if(buf[f+1] == '1')
{
mode=1;
}
}
if(buf[f] == 'd')
{
if(buf[f+1] == '0')
{
open_flag=0;
}
if(buf[f+1] == '1')
{
mode=0;
open_flag=1;
}
}
}
}
}
}

六、资料分享

点击即可查看当前资料分享。

posted @ 2025-09-09 10:07  yjbjingcha  阅读(6)  评论(0)    收藏  举报