基于STM32的智能仓库温湿度监控系统设计

news2024/10/8 21:09:01

引言

本项目设计了一个基于STM32的智能仓库温湿度监控系统,能够实时监测仓库内的温度和湿度,并根据设定的阈值触发报警或启动风扇调节环境。该系统通过DHT11温湿度传感器获取环境数据,结合OLED显示屏、风扇和蜂鸣器,实现对仓库环境的智能化监控和调节。

环境准备

1. 硬件设备
  • STM32F103C8T6 开发板(或其他 STM32 系列)
  • DHT11 温湿度传感器
  • 风扇(用于温度过高时启动散热)
  • 蜂鸣器(用于超温或湿度报警)
  • OLED 显示屏(用于显示实时温湿度)
  • 面包板和杜邦线
  • USB-TTL 串口调试工具
2. 软件工具
  • STM32CubeMX:用于初始化 STM32 外设。
  • Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
  • ST-Link 驱动程序:用于下载程序到 STM32。

项目实现

1. 硬件连接
  • DHT11 温湿度传感器连接:将 DHT11 的数据引脚连接到 STM32 的 GPIO(如 PA1),并接上拉电阻。
  • 风扇连接:将风扇通过继电器模块连接到 STM32 的 GPIO 引脚(如 PA2),用于控制风扇的开关。
  • 蜂鸣器连接:将蜂鸣器的控制引脚连接到 STM32 的 GPIO 引脚(如 PA3),用于报警提示。
  • OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示温湿度数据。
2. STM32CubeMX 配置
  • 打开 STM32CubeMX,选择你的开发板型号。
  • 配置系统时钟为 HSI,确保系统稳定运行。
  • 配置 GPIO 引脚用于控制风扇和蜂鸣器。
  • 配置 I2C 用于与 OLED 显示屏通信。
  • 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序

在生成的项目基础上,编写温湿度检测、风扇控制、报警触发和 OLED 显示的代码。以下是智能仓库温湿度监控系统的基本代码示例:

#include "stm32f1xx_hal.h"
#include "dht11.h"
#include "oled.h"

// 温湿度报警阈值
#define TEMP_THRESHOLD_HIGH 30  // 温度超过30度时报警
#define HUM_THRESHOLD_HIGH 80   // 湿度超过80%时报警

// 定义引脚
#define FAN_PIN GPIO_PIN_2
#define BUZZER_PIN GPIO_PIN_3
#define FAN_PORT GPIOA
#define BUZZER_PORT GPIOA

// 函数声明
void Fan_Control(uint8_t state);
void Buzzer_Control(uint8_t state);
void Display_Status(uint8_t temperature, uint8_t humidity, uint8_t alarm);
void System_Init(void);

// 初始化系统
void System_Init(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_I2C1_Init();
    
    OLED_Init();
    DHT11_Init();
    OLED_ShowString(0, 0, "Warehouse Monitor");
}

// 控制风扇
void Fan_Control(uint8_t state)
{
    HAL_GPIO_WritePin(FAN_PORT, FAN_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

// 控制蜂鸣器
void Buzzer_Control(uint8_t state)
{
    HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

// 显示状态
void Display_Status(uint8_t temperature, uint8_t humidity, uint8_t alarm)
{
    OLED_Clear();
    OLED_ShowString(0, 0, "Temp:");
    OLED_ShowNumber(48, 0, temperature, 2);
    OLED_ShowString(64, 0, "C");
    
    OLED_ShowString(0, 1, "Hum:");
    OLED_ShowNumber(48, 1, humidity, 2);
    OLED_ShowString(64, 1, "%");
    
    if (alarm)
    {
        OLED_ShowString(0, 2, "ALARM");
    }
    else
    {
        OLED_ShowString(0, 2, "Normal");
    }
}

int main(void)
{
    System_Init();
    
    uint8_t temperature = 0;
    uint8_t humidity = 0;
    uint8_t alarm = 0;
    
    while (1)
    {
        // 读取温湿度
        if (DHT11_Read(&temperature, &humidity) == 0)
        {
            // 根据温度和湿度的值进行风扇和报警控制
            if (temperature >= TEMP_THRESHOLD_HIGH || humidity >= HUM_THRESHOLD_HIGH)
            {
                Fan_Control(1);  // 开启风扇
                Buzzer_Control(1);  // 报警
                alarm = 1;
            }
            else
            {
                Fan_Control(0);  // 关闭风扇
                Buzzer_Control(0);  // 停止报警
                alarm = 0;
            }
            
            // 显示当前状态
            Display_Status(temperature, humidity, alarm);
        }
        
        HAL_Delay(2000);  // 每2秒检测一次
    }
}

 

4. 温湿度传感器读取

以下是 DHT11 温湿度传感器的读取代码示例:

#include "dht11.h"

// 初始化 DHT11
void DHT11_Init(void)
{
    // GPIO 初始化代码
}

// 读取温湿度数据
uint8_t DHT11_Read(uint8_t *temperature, uint8_t *humidity)
{
    // 模拟 DHT11 数据读取
    *temperature = 28;  // 假设读取到28度
    *humidity = 65;  // 假设湿度为65%
    
    return 0;  // 返回0表示读取成功
}
5. 风扇和蜂鸣器控制

以下是用于控制风扇和蜂鸣器的代码示例:

#include "gpio.h"

// 控制风扇
void Fan_Control(uint8_t state)
{
    HAL_GPIO_WritePin(FAN_PORT, FAN_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

// 控制蜂鸣器
void Buzzer_Control(uint8_t state)
{
    HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

 

6. OLED 显示屏处理

OLED 显示屏用于显示实时的温湿度和系统状态:

#include "oled.h"

// 初始化 OLED
void OLED_Init(void)
{
    // OLED 初始化代码
}

// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, char *str)
{
    // 在 OLED 显示指定字符串
}

// 显示数字
void OLED_ShowNumber(uint8_t x, uint8_t y, uint8_t num, uint8_t len)
{
    // 在 OLED 显示数字
}

// 清屏
void OLED_Clear(void)
{
    // 清除 OLED 显示
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

7. 系统工作原理
  • 环境监测:通过 DHT11 传感器,实时检测仓库内的温度和湿度情况,温湿度数据会通过 OLED 显示屏进行显示。
  • 自动调节:当仓库内的温度或湿度超出预设的阈值,系统自动开启风扇进行环境调节,同时启动蜂鸣器发出报警提示。
  • 状态显示:OLED 显示屏实时显示当前的温湿度数据和系统状态,包括是否存在报警情况。

常见问题与解决方法

1. 温湿度数据不准确
  • 检查 DHT11 的电源和数据引脚是否连接正确。
  • 确保 DHT11 的读取时序正确,避免延时不足导致数据读取错误。
2. 风扇无法控制
  • 检查继电器模块是否正确连接,确保继电器能够控制风扇的电源开关。
  • 确认风扇的电源是否正常供电,确保风扇可正常工作。
3. OLED 显示异常
  • 检查 OLED 的 SDA 和 SCL 引脚连接是否正确,确保 I2C 通信正常。
  • 确保 OLED 初始化过程正确,确保其能够正常工作并显示数据。

结论

通过本项目,我们设计了一个基于 STM32 的智能仓库温湿度监控系统,成功实现了对仓库环境的自动监控和调节。系统能够根据环境情况自动开启风扇进行调节,并通过蜂鸣器报警提示环境异常。该系统在仓库、实验室等需要环境监控的场合具有广泛的应用前景。

 

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

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

相关文章

python中的数组模块numpy(一)(适用物联网数据可视化及数据分析)

一、创建数组对象array,认识数组的格式 array函数的格式:np.array(object,dtype,ndmin) 以下是示例代码: # coding:utf-8 import numpy as np d1[1.1,2.1,3.1] d2(1,2,3,4) d3[[a,b],[c,d],[e,f]] print(d1) print(d2) print(d3) print("以上是数…

无法编辑PDF文件?试试这3个解决方法!

PDF文件格式广泛应用于工作中,但有时候我们可能遇到无法编辑PDF文件的情况。这可能导致工作效率降低,特别是在需要修改文件内容时显得尤为棘手。遇到PDF不能编辑时,可以看看是否以下3个原因导致的。 原因一:PDF文件设置了编辑权限…

八大排序--06基数排序(桶排序)

【本质--先排序个位&#xff0c;再排序十位&#xff0c;排百位...依次类推的过程】 获取待排序数组中的最高位数 //取计算最大值的位数int maxarr[0];for(int j0;j<arr.length;j) {if(arr[j]>max) {maxarr[j];}} 存储数据&#xff08;桶排序中除了游标遍历外&#xff…

【数据结构 | PTA】栈

文章目录 7-1 汉诺塔的非递归实现7-2 出栈序列的合法性**7-3 简单计算器**7-4 盲盒包装流水线 7-1 汉诺塔的非递归实现 借助堆栈以非递归&#xff08;循环&#xff09;方式求解汉诺塔的问题&#xff08;n, a, b, c&#xff09;&#xff0c;即将N个盘子从起始柱&#xff08;标记…

分析和解决js运算精度问题,出现多位小数

加减乘除都会出现小数精度错误的问题 (见图) 原因&#xff1a;js进行运算时会将数字先转为二进制再进行运算。 错误思路&#xff1a;之前在做数字运算时都是将数字转化为整数再进行运算&#xff0c;某次突然发现在变整数的时候也会出现精度问题&#xff0c;比如上图中的数据。…

LINUX——内核移植、内核编译教程

Linux内核编译是一个将内核源代码转换成可在特定硬件架构上运行的二进制文件的过程。以下是编译Linux内核的一般步骤&#xff1a; 1、准备工作&#xff1a; 确保安装了必要的编译工具&#xff0c;如gcc、make、ncurses库&#xff08;用于make menuconfig&#xff09;等。 2、…

【读书笔记-《30天自制操作系统》-26】Day27

本篇内容不多&#xff0c;主要是一些优化的工作。首先优化了应用程序&#xff0c;然后引入对应用程序的保护功能&#xff0c;最后引入库的概念。 1. 应用程序优化 首先来解决上一篇中遗留的一个bug:使用ncst命令运行的应用程序&#xff0c;按下ShiftF1或者点击x按钮都无法关…

Hierarchical Cross-Modal Agent for Robotics Vision-and-Language Navigation

题目&#xff1a;用于视觉语言导航的层次化跨模态智能体 摘要 1. 问题背景和现有方法 VLN任务&#xff1a;这是一种复杂的任务&#xff0c;要求智能体基于视觉输入和自然语言指令进行导航。 现有方法的局限性&#xff1a;之前的工作大多将这个问题表示为离散的导航图&#x…

『网络游戏』登陆启动框架【05】

将上一章的加载界面隐藏 1.游戏启动逻辑 创建脚本GameRoot.cs &#xff08;该脚本为游戏入口&#xff0c;作用初始化游戏&#xff09; 创建脚本&#xff1a;ResSvc.cs &#xff08;&#xff09; 创建脚本&#xff1a;LoginSys.cs &#xff08;&#xff09; 编写脚本&a…

解析Vue源码中是如何进行模版编译的

模版编译 联系前文&#xff0c;讲了虚拟DOM的patch过程&#xff0c;而虚拟DOM的前提是先有VNode&#xff0c;那么VNode又是从哪里来的&#xff1f;接下来讲的模版编译便是&#xff1a;把用户写的模版进行编译&#xff0c;就会产生VNode。 在日常开发中&#xff0c;我们把写在…

Qt-目录和文件

1. 目录和文件 1.1 目录操作 QDir 类用来处理目录 常用方法&#xff1a; QDir(QString path) &#xff1a; 实例化 absolutePath() : 获取目录绝对路径 dirName() : 获取目录相对路径 exists(dirPath) : 判断目录是否存在 mkdir(QString dirPath) : 创建目录 rmdir(QStr…

经典5级流水线概述

抽象化的流水线结构&#xff1a; 流水线的基本概念 多个任务重叠&#xff08;并发/并行&#xff09;执行&#xff0c;但使用不同的资源流水线技术提高整个系统的吞吐率&#xff0c;不能缩短单个任务的执行时间其潜在的加速比&#xff1d;流水线的级数 流水线正常工作的基本条件…

使用YOLO11实例分割模型进行人物分割【附完整源码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

开放式蓝牙耳机哪个品牌好用?五大口碑最好开放式耳机力荐!

长时间佩戴传统入耳式耳机有时可能会影响耳道健康&#xff0c;鉴于此&#xff0c;转而选择不入耳设计的开放式耳机就成了不少人的新倾向&#xff0c;它们有助于减少细菌滋生和耳道闷热的烦恼。为了帮助大家找到合适的选项&#xff0c;下面我将列举一些市面上口碑不错的开放式耳…

跨境电商怎么搭建网络环境?

跨境电商搭建网络环境是一项复杂但至关重要的任务&#xff0c;它涉及到多个层面的技术和服务。以下是构建高效、安全、可扩展的跨境电商网络环境的一些建议&#xff1a; 1. 选择合适的云服务提供商 可靠性与稳定性&#xff1a;选择知名且有良好口碑的云服务提供商&#xff0c;确…

MySql复习知识及扩展内容

DDL操作库和表 -- todo ------------操作库---------------------------------- -- 创建库 create database if not exists day10 charset utf8; create database if not exists day11 char set gbk; -- 使用库 use day10; -- 查询库 show databases ; -- 删除库 drop databas…

mybatisplus整合springboot3出错(springboot多模块开发)

1.mybatisplus版本太低或者maven导入没用如下的 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency>2.maven导入冲突了&#xf…

千万不要再用varchar类型来存ip地址了!

对于一个ip地址&#xff0c;比如“192.168.0.110”&#xff0c;由于存在“.”号&#xff0c;所以大部分人都会用varchar类型的字段来进行存储&#xff0c;但是大家有没有想过&#xff0c;对于这样一个字符串&#xff0c;每个字符占用一个字节&#xff0c;那么就需要占用13个字节…

使用ChatGPT高级学术应用SciSpace的技术快速精准的搜索文献论文

在学术研究领域,文献综述是非常重要的一个部分。它不仅是对已有研究的梳理和总结,更是对新研究方向的探索和定位。面对浩瀚的学术文献海洋,传统的检索方法往往显得力不从心,既耗时又低效。 随着ChatGPT技术的突破,我们终于可以摆脱这一束缚,迎来一种全新的、高效的文献检…

程序员 -买房历险记

快生日了&#xff0c;自己又又 涨了一岁 买房 真不是 一件简单的事。 一. 买房 三大核心问题 1.一手/二手 房 2.哪个城市买 3.哪个地方买 我调研的是 三四线城市&#xff08;俺的老家&#xff09; 二. 买房需要 花多少&#xff08;看得到/看不到&#xff09; 比如 4000元…