【STM32项目开源】基于STM32的智能养殖场环境监测系统 - 详解

news/2025/10/4 22:19:48/文章来源:https://www.cnblogs.com/lxjshuju/p/19125996

目录

一、设计背景和意义

1.1设计背景

1.2设计意义

二、实物效果展示

2.1实物图片

2.2实物演示视频

三、硬件机制简介

3.1工程功能详解

3.2元器件清单

四、主框图与软件流程图

五、硬件PCB展示

六、软件程序设计

七、项目资料包内容

资料获取:查看主页介绍“充哥单片机设计”


一、设计背景和意义

1.1设计背景

在现代农业快速发展的背景下,智能化养殖已成为推动农业产业升级的重要方向之一。传统养殖方式普遍存在人工管理强度大、实时性差、环境控制滞后等疑问,特殊是在温湿度、光照、水质、空气质量等关键环境因素无法实现精确调控的情况下,极易导致动物应激、饲料浪费、疫病传播等风险,从而制约了养殖效益的提升与规模化发展。当前市场上虽然存在部分商用的智能养殖解决方案,但往往存在价格高昂、系统封闭、部署复杂、定制性差等问题,难以被广大中小型养殖户广泛接受。同时,这类产品在灵活性和可扩展性方面也存在一定局限性,难以根据具体的养殖需求进行灵活配置。

1.2设计意义

传统养殖业中,人工巡检存在效率低下、误差较大且难以实现 24 小时连续监测的问题,这往往导致环境异常不能被及时发现,进而影响养殖生物的生长甚至存活。而该体系能够实时、精准地监测养殖环境中的温湿度、空气质量、光照强度等多参数,一旦发现异常便能迅速响应,有效减少环境变化对养殖生物的不良影响,显著提高养殖生物的存活率。不仅如此,远程控制与自动调节功能的实现,大幅降低了人工干预的成本,让养殖管理不再受地域和时间的限制,极大提升了养殖管理的智能化水平。

二、实物效果展示

2.1实物图片

2.2实物演示视频

【开源】基于STM32的智能养殖环境监测系统

三、硬件功能简介

3.1项目功能详解

  1. 传感器检测:检测温湿度、氨气浓度、饲料重量、水槽水位、光照强度等数据。
  2. 数据表明:0.96OLED屏幕显示全部的传感器内容以及传感器的阈值等素材。
  3. 执行机构:控制风扇、水泵、LED灯、步进电机(喂食)。
  4. 接入云平台:系统通过ESP8266 WIFI联网后,接入机智云平台。
  5. App远程监控:通过App远程监控全部传感器数据;App远程控制LED和步进电机。
  6. 通过阈值信息设定:系统通过按键设定阈值,也能够通过手机App远程设定。
  7. 模式切换:可能通过按键或者手机App搭建自动/手动模式的切换。
  8. 手动模式:凭借手机App或小程序控制开关
  9. 自动模式: 检测到光照强度低于阈值,自动打开补光灯; 检测到水位低于阈值,自动打开水泵;检测到氨气浓度或温度超过阈值,打开风扇通风,并蜂鸣器报警;检测到饲料重量低于阈值,自动打开步进电机喂食。

3.2元器件清单

  1. 主控STM32F103C8T6最小系统板
  2. 0.96OLED显示屏幕
  3. DHT11温湿度传感器
  4. MQ-135氨气浓度传感器
  5. 光敏电阻传感器
  6. 水位传感器
  7. 称重传感器
  8. 继电器
  9. 加热片
  10. 加水水泵
  11. 风扇水泵
  12. 步进电机
  13. 蜂鸣器
  14. 按键

四、主框图与软件流程图

主框图

流程图

五、硬件PCB展示

六、软件程序设计

#include "delay.h"
#include "sys.h"
#include "bmp.h"
#include "adc.h"
#include "key.h"
#include "oled.h"
#include "usart.h"
#include "control.h"
#include "dht11.h"
#include "hx711.h"
#include "uln2003.h"
#include "timer.h"
int NH3_value_door = 50;
int food_time = 0;
int food_space = 0;
int food_num = 0;
int food_high = 0;
int food_low = 0;
int water_time = 0;
int water_high = 0;
int water_low = 0;
uint8_t water_mode = 0;
uint8_t food_mode = 0;
uint16_t timeone = 0;
uint16_t timetwo = 0;
uint16_t timethree = 0;
uint16_t timefore = 0;
uint8_t food_flag = 0;
uint8_t water_flag = 0;
uint8_t option = 0;
uint8_t keu_num = 0;
uint8_t page_num = 1;
void LED_Init(void);
void OLED_Show_FirstPage();
void OLED_Show_SecondPage();
void OLED_Show_ThirdPage();
void get_all_sensor_data();
void Sensor_Data_Handle();
int value;
float weight;
int32_t reset;
u8 bufff[30];
float Weights=19231.0;  //100g
int32_t Weights_100=8493860;  //100g
int main(void)
{delay_init();OLED_Init();OLED_Show_FirstPage();uart3_init(9600);uart1_init(115200);
//	uart2_init(115200);HX711_Init();reset = HX711_GetData();Uln2003_Init();TIME_Config();KEY_Init();DHT11_Init();Adc_Init();Control_Init();while(1){get_all_sensor_data();Sensor_Data_Handle();if(page_num == 1){OLED_Show_FirstPage();}else if(page_num == 2){OLED_Show_SecondPage();}else if(page_num == 3){OLED_Show_ThirdPage();}}
}
void Sensor_Data_Handle()
{if(food_mode==1){if(weight=food_high*1000)food_flag=0;if(food_flag==1)Stepper_RotateByLoop(Forward,1,1);if(timeone>=food_space*5&&food_flag==0){Stepper_RotateByLoop(Forward,food_num,1);timeone=0;}//5秒钟代替1分钟if(timetwo>=food_time*5){food_mode=0;}}if(water_mode==1){if(Water_Value=water_high)water_flag=0;if(water_flag==1)Watertwo=1;else Watertwo=0;//5秒钟代替1分钟if(timefore>=water_time*5){water_mode=0;Watertwo=0;}}else{Watertwo=0;}if(NH3_Value>NH3_value_door)Waterone=1;else Waterone=0;if(temp>27)Wind=1;else Wind=0;
}
void get_all_sensor_data()
{DHT11_Read_Data(&temp,&hum);    //获取温湿度数据value = HX711_GetData();weight=(float)(value-reset)*Weights/(float)(Weights_100-reset);weight=(int)weight;Get_NH3_Value(&NH3_Value);Get_Water_Value(&Water_Value);
}
void Key_event_handle(void)
{keu_num = KEY_Scan(0);switch(keu_num){case 1:if(page_num == 1){option++;if(option==4)option=0;OLED_Show_FirstPage();}else if(page_num == 2){option++;if(option==6)option=0;OLED_Show_SecondPage();}else if(page_num == 3){option++;if(option==4)option=0;OLED_Show_ThirdPage();}break;case 2:if(page_num==1&&option==2){page_num=2;option=0;OLED_Clear();OLED_Show_SecondPage();}else if(page_num==1&&option==3){page_num=3;option=0;OLED_Clear();OLED_Show_ThirdPage();}else if(page_num==2||page_num==3){page_num=1;option=0;OLED_Clear();OLED_Show_FirstPage();}break;case 3:if(page_num==1&&option==1){NH3_value_door++;OLED_Show_FirstPage();}else if(page_num==1&&option==2){food_mode=0;OLED_Show_FirstPage();}else if(page_num==1&&option==3){water_mode=0;OLED_Show_FirstPage();}else if(page_num==2&&option==1){food_time+=10;OLED_Show_SecondPage();}else if(page_num==2&&option==2){food_space+=1;OLED_Show_SecondPage();}else if(page_num==2&&option==3){food_num+=1;OLED_Show_SecondPage();}else if(page_num==2&&option==4){food_low+=1;OLED_Show_SecondPage();}else if(page_num==2&&option==5){food_high+=1;OLED_Show_SecondPage();}else if(page_num==3&&option==1){water_time+=10;OLED_Show_ThirdPage();}else if(page_num==3&&option==2){water_high+=1;OLED_Show_ThirdPage();}else if(page_num==3&&option==3){water_low+=1;OLED_Show_ThirdPage();}break;case 4:if(page_num==1&&option==1){NH3_value_door--;OLED_Show_FirstPage();}else if(page_num==1&&option==2){food_mode=1;OLED_Show_FirstPage();}else if(page_num==1&&option==3){water_mode=1;OLED_Show_FirstPage();}else if(page_num==2&&option==1){food_time-=10;OLED_Show_SecondPage();}else if(page_num==2&&option==2){food_space-=1;OLED_Show_SecondPage();}else if(page_num==2&&option==3){food_num-=1;OLED_Show_SecondPage();}else if(page_num==2&&option==4){food_low-=1;OLED_Show_SecondPage();}else if(page_num==2&&option==5){food_high-=1;OLED_Show_SecondPage();}else if(page_num==3&&option==1){water_time-=10;OLED_Show_ThirdPage();}else if(page_num==3&&option==2){water_high-=1;OLED_Show_ThirdPage();}else if(page_num==3&&option==3){water_low-=1;OLED_Show_ThirdPage();}break;}
}
/*氨(0) 气(1) 浓(2) 度(3) 温(4) 水(5) 位(6) 自(7) 动(8) 喂(9) 食(10) 补(11) 水(12) 间(13) 隔(14) 次(15)数(16) 时(17) 长(18) 开(19) 关(20) ℃(21) 饲(22) 料(23) 设(24) 置(25) 最(26) 低(27) 高(28 重(29) 量(30)
*/
void OLED_Show_FirstPage(){OLED_ShowChar(8*0,0,'T',16,1);OLED_ShowChar(8*1,0,':',16,1);				//	“:”OLED_ShowNum(16*1,0,temp,2,16,1);		//	tempOLED_ShowChinese(16*2,0,21,16,1);			//	“湿”OLED_ShowChinese(16*4-8,0,5,16,1);OLED_ShowChinese(16*5-8,0,6,16,1);OLED_ShowChar(16*6-8,0,':',16,1);OLED_ShowNum(16*6,0,Water_Value,2,16,1);OLED_ShowString(16*0,16,"NH3:",16,1);if(option==1)OLED_ShowNum(16*2,16,NH3_value_door,2,16,0);else OLED_ShowNum(16*2,16,NH3_Value,2,16,1);OLED_ShowChinese(16*4-8,16,22,16,1);OLED_ShowChinese(16*5-8,16,23,16,1);OLED_ShowChar(16*6-8,16,':',16,1);OLED_ShowNum(16*6,16,weight,4,16,1);OLED_ShowChinese(16*0,32,7,16,1);OLED_ShowChinese(16*1,32,8,16,1);OLED_ShowChinese(16*2,32,9,16,1);OLED_ShowChinese(16*3,32,10,16,1);OLED_ShowChar(16*4,32,':',16,1);if(food_mode==1)OLED_ShowChinese(16*4+8,32,19,16,1);else OLED_ShowChinese(16*4+8,32,20,16,1);OLED_ShowChinese(16*0,48,7,16,1);OLED_ShowChinese(16*1,48,8,16,1);OLED_ShowChinese(16*2,48,11,16,1);OLED_ShowChinese(16*3,48,12,16,1);OLED_ShowChar(16*4,48,':',16,1);if(water_mode==1)OLED_ShowChinese(16*4+8,48,19,16,1);else OLED_ShowChinese(16*4+8,48,20,16,1);if(option == 2){OLED_ShowChar(16*5+8,32,'<',16,1);OLED_ShowChar(16*5+8,48,' ',16,1);}else if(option == 3){OLED_ShowChar(16*5+8,32,' ',16,1);OLED_ShowChar(16*5+8,48,'<',16,1);}else{OLED_ShowChar(16*5+8,32,' ',16,1);OLED_ShowChar(16*5+8,48,' ',16,1);}OLED_Refresh();
}
void OLED_Show_SecondPage(){OLED_ShowChinese(16*1,0,7,16,0);OLED_ShowChinese(16*2,0,8,16,0);OLED_ShowChinese(16*3,0,9,16,0);OLED_ShowChinese(16*4,0,10,16,0);OLED_ShowChinese(16*5,0,24,16,0);OLED_ShowChinese(16*6,0,25,16,0);OLED_ShowChinese(16*0,16,17,16,1);OLED_ShowChinese(16*1,16,18,16,1);OLED_ShowChar(16*2,16,':',16,1);if(option==1)OLED_ShowNum(16*2+8,16,food_time,3,16,0);else OLED_ShowNum(16*2+8,16,food_time,3,16,1);OLED_ShowString(16*4,16,"m",16,1);OLED_ShowChinese(16*0,32,13,16,1);OLED_ShowChinese(16*1,32,14,16,1);OLED_ShowChar(16*2,32,':',16,1);if(option==2)OLED_ShowNum(16*2+8,32,food_space,2,16,0);else OLED_ShowNum(16*2+8,32,food_space,2,16,1);OLED_ShowString(16*3+8,32,"m",16,1);OLED_ShowChinese(16*4,32,15,16,1);OLED_ShowChinese(16*5,32,16,16,1);OLED_ShowChar(16*6,32,':',16,1);if(option==3)OLED_ShowNum(16*6+8,32,food_num,2,16,0);else OLED_ShowNum(16*6+8,32,food_num,2,16,1);OLED_ShowChinese(16*0,48,22,16,1);OLED_ShowChinese(16*1,48,23,16,1);OLED_ShowChinese(16*2,48,29,16,1);OLED_ShowChinese(16*3,48,30,16,1);OLED_ShowChar(16*4,48,':',16,1);if(option==4)OLED_ShowNum(16*4+8,48,food_low,2,16,0);else OLED_ShowNum(16*4+8,48,food_low,2,16,1);OLED_ShowString(16*5+8,48,"-",16,1);if(option==5)OLED_ShowNum(16*6,48,food_high,2,16,0);else OLED_ShowNum(16*6,48,food_high,2,16,1);OLED_ShowString(16*7,48,"kg",16,1);OLED_Refresh();
}
void OLED_Show_ThirdPage(){OLED_ShowChinese(16*1,0,7,16,0);OLED_ShowChinese(16*2,0,8,16,0);OLED_ShowChinese(16*3,0,11,16,0);OLED_ShowChinese(16*4,0,12,16,0);OLED_ShowChinese(16*5,0,24,16,0);OLED_ShowChinese(16*6,0,25,16,0);OLED_ShowChinese(16*0+8,16,17,16,1);OLED_ShowChinese(16*1+8,16,18,16,1);OLED_ShowChar(16*2+8,16,':',16,1);if(option==1)OLED_ShowNum(16*3,16,water_time,3,16,0);else OLED_ShowNum(16*3,16,water_time,3,16,1);OLED_ShowString(16*4+8,16,"min",16,1);OLED_ShowChinese(16*0+8,32,26,16,1);OLED_ShowChinese(16*1+8,32,28,16,1);OLED_ShowChinese(16*2+8,32,5,16,1);OLED_ShowChinese(16*3+8,32,6,16,1);OLED_ShowChar(16*4+8,32,':',16,1);if(option==2)OLED_ShowNum(16*5,32,water_high,2,16,0);else OLED_ShowNum(16*5,32,water_high,2,16,1);OLED_ShowString(16*6,32,"%",16,1);OLED_ShowChinese(16*0+8,48,26,16,1);OLED_ShowChinese(16*1+8,48,27,16,1);OLED_ShowChinese(16*2+8,48,5,16,1);OLED_ShowChinese(16*3+8,48,6,16,1);OLED_ShowChar(16*4+8,48,':',16,1);if(option==3)OLED_ShowNum(16*5,48,water_low,2,16,0);else OLED_ShowNum(16*5,48,water_low,2,16,1);OLED_ShowString(16*6,48,"%",16,1);OLED_Refresh();
}

七、项目资料包内容

资料获取:查看主页介绍“充哥单片机设计”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress地址为灰色免费智能seo收录工具

集成联调交付&#xff08;Integrated Joint Debugging and Delivery&#xff09;是软件开发过程中的一个阶段&#xff0c;主要涉及将不同的软件模块或组件整合在一起&#xff0c;并进行联合调试和测试&#xff0c;以确保它们能够作为一个整体正常工作。这个过程通常发生在开发周…

前端学习教程-Axios

Axios 是一个基于 Promise 的流行的 HTTP 客户端,用于浏览器和 Node.js 环境,支持 Promise API、拦截请求和响应、转换请求数据和响应数据等功能。 一、安装 Axios使用 npm 或 yarn 安装(适用于 Vue/React 等项目)…

镇江网站开发图片摄影网站

在2018杭州云栖大会的主论坛上&#xff0c;阿里云技术研发总经理蒋江伟发表了《飞天2.0&#xff0c;万物智能的基础服务》的主题演讲&#xff0c;从全连接、安全、简便、高速四个方面&#xff0c;阐述了飞天2.0网络的新特性。 蒋江伟表示&#xff0c;万物智能时代产生的海量数据…

网站域名怎么做杰恩设计网站是谁做的

JVM 案例 案例一&#xff1a;服务器内存不足&#xff0c;影响Java应用 问题&#xff1a; 收到报警&#xff0c;某Java应用集群中一台服务器可用内存不足&#xff0c;超过报警阈值。 排查过程&#xff1a; 首先&#xff0c;通过Hickwall查看该应用各项指标&#xff0c;发现无论…

网站是怎样制作的自媒体135手机版

电商技术揭秘相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xf…

网站开发分包网站开发运营工程师待遇

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、默认成员函数二、构造函数构造函数的概念及特性 三、析构函数析构函数的特性…

网站如何交换链接临淄房产信息网123

文章目录 一、区别二、编写loader三、编写plugin参考文献 一、区别 前面两节我们有提到Loader与Plugin对应的概念&#xff0c;先来回顾下 loader 是文件加载器&#xff0c;能够加载资源文件&#xff0c;并对这些文件进行一些处理&#xff0c;诸如编译、压缩等&#xff0c;最终…

『回忆录』返校前夜 230102

经典佳作返校,一件每个周末都会经历的事情。而对于居家学习的我们,成了一个梦。 而这个梦,如今已变成现实。一个再平常不过的周末,我们上着竞赛。可是,中午wsh就把我们所有人叫到教室。 “因为疫情,学校要求你们…

断更

今天很忙,没时间学习

前端学习教程-环境配置

1 安装nvm(下载地址:https://github.com/coreybutler/nvm-windows/releases) 2.查看node和npm版本 3.配置npm registry 4.安装VSCode(https://code.visualstudio.com/) 5.VSCode安装插件:Live Server、Vue - Offic…

详细介绍:一篇文章讲清Prompt、Agent、MCP、Function Calling

详细介绍:一篇文章讲清Prompt、Agent、MCP、Function Callingpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

docker单机部署hadoop 官方镜像3.3.6 过程问题记录 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20251004 qmd 弱化规约(未完成)

弱化规约就是指,对于原问题F,先考虑一个弱化版问题F 如果解决F的复杂度是O(n),那么F一定不会优于F 通常的,如果一个算法G能解决F和F,但是一个能解决F的算法不能解决F,那么F比F要弱。 一般弱化问题不能丢掉关键的…

深入解析:人工智能专业术语详解(C)

深入解析:人工智能专业术语详解(C)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

徐州做公司网站多少钱wordpress 评论优化

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

怎么建设投票网站平面设计提高审美网站

当谈论MobileNet、MobileNetV2和MobileNetV3时&#xff0c;我们指的是一系列基于深度学习的轻量级神经网络架构&#xff0c;这些架构旨在在保持高度准确性的同时减少模型的计算和参数量。以下是它们各自的创新点的详细总结&#xff1a; MobileNet&#xff1a; 深度可分离卷积&…

网站后台界面 园林设计网站负责人照片

如果你想通过 RabbitMQ 的死信队列功能实现消费者拒绝消息投递到死信交换机的行为&#xff0c;你可以按照以下步骤操作&#xff1a; 创建原始队列&#xff0c;并将其绑定到一个交换机上&#xff1a; export RABBITMQ_SERVER127.0.0.1 export RABBITMQ_PORT5672 export RAB…

BQ24650 MPPT管理控制芯片测试

BQ24650 MPPT管理控制芯片测试 10月1号开始焊接调试,1号下午开始进行充电测试,截止到10月3号晚上23:05(因为夜间无人监护,所以夜间断电,停止测试。)终于看到充电结束,进入浮充状态(绿灯亮、红灯灭)…

黄金替罪羊

题面 黄金替罪羊实在是太难玩了,所以开拓者弄了个简化版。 黄金替罪羊需要替罪羊和开拓者的配合一起完成任务。 地图可以认为是一棵带权树,每次开拓者会问你一个有序点对 (u,v),表示起点为 u 而终点为 v,在开拓者的…

现在网站如何做优化装修体验馆app

行级触发器&#xff1a;当触发器被触发时&#xff0c;要使用被插入、更新或删除的记录中的列值&#xff0c;有时要使用操作前、后列的值.:NEW 修饰符访问操作完成后列的值:OLD 修饰符访问操作完成前列的值例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时&#xff0c;把被…