【单片机毕业设计选题24102】-基于STM32和阿里云的禽舍环境监测控制系统

news2024/11/25 3:29:20

系统功能:

系统分为主机端和从机端,主机端主动向从机端发送信息和命令,从机端

收到主机端的信息后回复温湿度氨气浓度和光照强度等信息。

从机端操作:

从机端上电后显示“欢迎使用环境监测系统请稍后”两秒后显示第一页面。

从机端口上电后系统处于自动控制状态,如果获取到的温度值大于设定的

温度值或获取到的甲烷值大于设定甲烷值则自动打开风扇。如果获取到的

湿度值小于设定的湿度值则打开加湿器。如果获取到的光照值大于设定的

光照值则打开LED。

第一页面第一行显示温度状态监测,第二行显示获取到的温度值,第三行显示

设定的温度值,第四行显示是否超温。

短按B4按键可切换到第二页面

短按B5按键可增加温度设定阈值

短按B6按键可减少温度设定阈值

第二页面第一行显示湿度状态监测,第二行显示获取到的湿度值,第三行显示

设定的湿度值,第四行显示湿度状态是否超标。

短按B4按键可切换到第三页面

短按B5按键可增加湿度设定阈值

短按B6按键可减少湿度设定阈值

第三页面第一行显示甲烷状态监测,第二行显示获取到的甲烷值,第三行显示

设定的甲烷值,第四行显示甲烷状态是否超标。

短按B4按键可切换到第四页面

短按B5按键可增加甲烷设定阈值

短按B6按键可减少甲烷设定阈值

第四页面第一行显示光照状态监测,第二行显示获取到的光照值,第三行显示

设定的光照值,第四行显示LED灯是否开启。

短按B4按键可切换到第一页面

短按B5按键可增加光照设定阈值

短按B6按键可减少光照设定阈值

主机端操作:

主机端上电后显示“欢迎使用环境监测系统请稍后”,两秒后显示第一页面。

第一页面第一行显示一号从机数据,第二行显示一号从机温湿度,第三行显示

一号从机甲烷值,第四行显示一号从机光照值。

短按B4按键可切换到第二页面

第二页面第一行显示二号从机数据,第二行显示二号从机温湿度,第三行显示

二号从机甲烷值,第四行显示二号从机光照值。

短按B4按键可切换到第一页面

主机通过蓝牙模块连接手机后,手机APP可收到系统发送上来的一号二号从机的

传感器数据。

主要功能模块原理图:

电源时钟烧录接口:

单片机和按键输入电路:

传感器采集电路:

继电器控制电路:

资料获取地址

系统主要功能模块代码

初始化代码:

  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */

    InitVar();


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_USART1_UART_Init();

  MX_USART2_UART_Init();

  MX_USART3_UART_Init();

  /* USER CODE BEGIN 2 */

//在HAL库初始化串口1后调用

    HAL_Delay(100);

    SetUart1RxToInput();

    HAL_Delay(50);

//uart1打开接收中断

    HAL_UART_Receive_IT(&huart1, (uint8_t*)&uart1RecBuff, 1);

//uart2打开接收中断

    HAL_UART_Receive_IT(&huart2, (uint8_t*)&uart2RecBuff, 1);

//uart3打开接收中断

    HAL_UART_Receive_IT(&huart3, (uint8_t*)&uart3RecBuff, 1);

   

    InitOled();

    InitOledDisp();

//初始化ESP8266

    ESP8266_Init();  

    HAL_Delay(100);

    OledFill(0x00);     //全屏熄灭   


  /* USER CODE END 2 */

系统控制代码;
 

//系统信息更新

void SystemControl(void)

{

    static uint8_t updateCnt = 0;

   

    updateCnt++;   

    if(updateCnt>=SYSTEM_UPDATE_INTER)

    {

        updateCnt = 0;

        Aliyun_SendData();

    }

    uart3SendData();

//显示不同页面

    if(dispPageIndex==DISP_PAGE_1)

    {

        OledDispPage1();

    }

    else if(dispPageIndex==DISP_PAGE_2)

    {

        OledDispPage2();

    } 

}

系统显示:
 

//第一页面显示一号从机数据

void OledDispPage1(void)

{

    char textBuf[20];

    uint8_t i = 0;


//第一行显示一号从机数据

    for(i=13; i<19; i++)

    {

        OledShowCN(16+(i-13)*16, 0, i); 

    }  

//显示温湿度  

    sprintf(textBuf,"Temp:%02d Humi:%02d ", getTempVal1, getHumiVal1);

    OledShowString(0, 2, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符

//显示甲烷值

    sprintf(textBuf,"NH3:%04d        ", getNH3Val1);

    OledShowString(0, 4, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符

//显示光照值

    sprintf(textBuf,"Light:%04d      ", getLightVal1);

    OledShowString(0, 6, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符

}


//第二页面显示二号从机数据

void OledDispPage2(void)

{

    char textBuf[20];

    uint8_t i = 0;


//第一行显示二号从机数据

    for(i=19; i<25; i++)

    {

        OledShowCN(16+(i-19)*16, 0, i); 

    } 

//显示温湿度  

    sprintf(textBuf,"Temp:%02d Humi:%02d ", getTempVal2, getHumiVal2);

    OledShowString(0, 2, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符

//显示甲烷值

    sprintf(textBuf,"NH3:%04d        ", getNH3Val2);

    OledShowString(0, 4, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符

//显示光照值

    sprintf(textBuf,"Light:%04d      ", getLightVal2);

    OledShowString(0, 6, (uint8_t*)textBuf, OLED_FONT_8X16); //测试8*16字符

}

此设计提供的资料包含原理图PCB(包含PDF,AD,立创EDA三个版本),源代码,系统框图,主程序流程图,物料清单(包含使用到的器件手册),功能操作说明等。

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

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

相关文章

每日学习笔记:C++ STL算法之数值算法

目录 算法头文件 运算后产生结果 对容器所有元素(数列)进行某种运算&#xff1a; accumulate(beg, end, initValue) accumulate(beg, end, initValue, op) 计算两数列的内积&#xff1a; inner_product(beg1, end1, end2, initValue) inner_product(beg1, end1, end2…

红酒与奶酪:欧洲风情的整合

在欧洲的浪漫风情中&#xff0c;红酒与奶酪总是携手相伴&#xff0c;它们各自不同的魅力交织在一起&#xff0c;仿佛一首悠扬的交响曲&#xff0c;在味蕾上奏响。当洒派红酒&#xff08;Bold & Generous&#xff09;与精选奶酪相遇&#xff0c;一场欧洲风情的整合即将上演。…

亚马逊自发货erp,自动虚拟发货自动生成订单

亚马逊自发货 ERP 自动化虚拟发货&#xff0c;贴牌定制独立部署。 大家好&#xff0c;今天来讲一下 ERP 的虚拟自动发货&#xff01; 1. 以为发货都是人工手动去发货的&#xff0c;其实不然&#xff0c;很多产品一爆就是几十、一百单&#xff0c;不可能一个一个点的去发货&am…

vue3 ResizeObserver如何监听一个容器盒子div宽度高度发生改变

ResizeObserver定义 ResizeObserver&#xff1a;是一个 JavaScript API&#xff0c;用于监视元素的大小变化。它可以观察一个或多个 DOM 元素&#xff0c;以便在元素的大小或形状发生变化时触发回调函数。 ResizeObserver &#xff1a;为了更有效地处理元素尺寸变化而引入的&am…

Linux驱动开发—设备树传递给内核,匹配驱动过程分析

文章目录 总体流程图传递DTB过程编译设备树源文件将 .dtb 文件与内核或引导加载程序集成 内核初始化阶段解析DTB内核启动阶段解析 DTB注册设备树节点驱动程序绑定 内核解析设备树二进制文件&#xff08;DTB&#xff09;的过程主要分为几个步骤&#xff0c;从设备树的传递到最终…

Mybatis学习-day19

Mybatis学习-day19 1. resultMap resultMap 是 MyBatis 中最复杂的元素&#xff0c;主要用于解决实体类属性名与数据库表中字段名不一致的情况&#xff0c;可以将查询结果映射成实体对象。 <resultMap id"staffAndDep" type"com.easy.bean.Staff">…

apache 漏洞

影响版本 Apache HTTP Server 2.4.49 某些Apache HTTPd 2.4.50也存在此漏洞 环境搭建 docker pull blueteamsteve/cve-2021-41773:no-cgid 漏洞复现 http://1.15.136.212:8080 1.使⽤poc curl http://1.15.136.212:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

在没有硬盘的情况下进行电脑数据迁移

电脑数据迁移方式 在更换电脑的时候需要进行文件的传输&#xff0c;但是没有硬盘可以选择使用网线直连或者无线文件共享。通用配置 1.将旧电脑的文件夹或者磁盘设置文件共享 找到指定的文件夹右键属》属性&#xff0c;点击共享》点击高级共享 选择共享文件夹以及修改共享用户…

缓冲区和文件IO--linux系统调用

缓冲区&#xff1a; 缓冲区是一块内存区域&#xff0c;用于存储数据&#xff0c;直到数据被真正写入到文件或设备中&#xff0c;或从文件或设备中读取。这种机制使得程序可以一次处理较大的数据块&#xff0c;而不是频繁地进行较小的I/O操作。 缓冲模式&#xff1a; 全缓冲&…

学习LLM大模型,不容错过的《大语言模型:基础与前沿》(附PDF下载)

前言 就目前来看&#xff0c;大量工作正逐渐被大型语言模型&#xff08;LLM&#xff09;所替代&#xff0c;就比如文本自动生成、智能客服、数据分析和预测等多个领域。这暗示着LLM正逐步成为支撑社会运作的关键基础设施。未来&#xff0c;比Devin更为智能的LLM将会问世。我们…

ARMxy 智能控制器:工业自动化的创新解决方案

工业自动化对控制器的要求也越来越高。ARMxy 智能控制器集成了 PLC 控制和 4G 边缘计算网关&#xff0c;具有多合一的功能&#xff0c;为工业自动化提供了创新的解决方案。 ARMxy 智能控制器的 PLC 控制功能使其能够实现对工业生产过程的精确控制。它可以接收各种传感器的信号…

mapbox-gl 实现绘制图形吸附功能

文章目录 一、前言二、实现代码 一、前言 mapbox-gl 为地图前端框架&#xff0c;以优美的地图样式著称。mapbox-gl-draw 插件可以实现绘制图形&#xff0c;编辑图形的功能&#xff0c;但是编辑图形时无法吸附点位&#xff0c;导致相邻面无法相接。使用mapbox-gl-draw-snap-mod…

JS+CSS案例:用CSS+JS做漂亮的拟真时钟

JSCSS案例&#xff1a;用CSSJS做漂亮的拟真时钟 今天给大家分享一个挺酷的CSSjs模拟的时钟。 案例效果图&#xff1a; 案例分析 通过CSS画一个表的外观&#xff0c;通过JS获取当前时间&#xff0c;并控制表针做对应角度的旋转。 制作时钟外观 HTML结构 首先&#xff0c;我…

python实现小游戏随机猜数

1、脚本练习 import random# 初始化剩余的猜测次数 counts 3 # 生成一个1到10之间的随机整数 numb random.randint(1, 10)# 循环直到猜测次数用完 while counts > 0:tmp input("请输入小鱼手里的数字 (你还剩下 {} 次机会): ".format(counts))guess int(tmp)…

精通剪辑艺术,2024年度四大必备剪辑软件推荐!

在这个视觉为王的时代&#xff0c;视频内容的创作和编辑已经成为了一种艺术形式。无论是个人创作者还是专业团队&#xff0c;都在寻找能够提升工作效率和创作质量的工具。今天&#xff0c;就让我们一起探索几款市面上广受好评的视频剪辑工具&#xff0c;它们将帮助你将创意变为…

测试总结8/6

1.签到 判断其大小写是否与之相等 #include<bits/stdc.h> using namespace std; long long t,x,y; int ans,n,m,k0; const int N2e57; int s[N]; string sum; string num"CodeForces"; int main() {cin>>n;for(int i1; i<n; i) {cin>>sum;int …

细腻呵护静音生活缓冲器,家具中的隐形侍者

在忙碌的生活节奏中&#xff0c;家是我们寻找宁静与放松的避风港。而家具缓冲器&#xff0c;就像一位隐形的侍者&#xff0c;在不经意间为我们营造出温馨、宁静的居住环境。它们静静地工作&#xff0c;细腻地呵护着每一处细节&#xff0c;让家的每一次触碰成为一次尊享体验。 细…

当上领导,不可不懂的3大管人法则

当上领导&#xff0c;不可不懂的3大管人法则&#xff0c;精辟&#xff01; 法则一&#xff1a;软硬都要 在团队管理中&#xff0c;只硬不软或只软不硬都无法达到理想的效果。 只有软硬兼施&#xff0c;刚柔并济&#xff0c;才能四两拨千斤&#xff0c;根据不同的情况和员工&a…

深入解析数据仓库ADS层-从理论到实践的全面指南

在大数据时代,数据仓库已经成为企业进行数据分析和决策的核心系统。而在数据仓库的分层架构中,ADS(Application Data Store)层作为最上层的数据应用层,直接面向业务应用和分析需求,其重要性不言而喻。然而,很多数据从业者对ADS层的理解还停留在表面,不清楚如何构建高效的ADS层来…

2024年全国青少信息素养大赛python编程复赛集训第十一天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…