【STM32/HAL】嵌入式课程设计:简单的温室环境监测系统|DS18B20 、DHT11

前言  

  板子上的外设有限,加上想法也很局限,就用几个传感器实现了非常简单的监测,显示和效应也没用太复杂的效果。虽说很简单,但传感器驱动还是琢磨了不久,加上串口线坏了,调试了半天才发现不是代码错了而是线有问题,总而言之,课设不复杂,难度不高,凑合看吧。

电路图

系统的需求描述

温室环境监测系统的功能性需求描述如下:

1.光照监测与响应

系统对光敏电阻进行 AD 采样获取环境光照强度。当环境光照减弱至预设阈值以下时, 系统会自动点亮绿灯以提供照明。同时,LED 灯闪烁报警,蜂鸣器需发出报警声。

2.温度监测与响应

系统通过 DS18B20 数字温度传感器和 DHT11 数字湿温度传感器获取温室环境温度, 以两者平均值作为测量的温度。当温度低于预设的下限阈值时,系统自动启动加热装置进行 加热(开发板并无加热设备,这里使用点亮红灯来模拟),直到温度上升至正常水平。当温 度高于预设的上限阈值时,系统需驱动电机旋转(风扇)以进行散热。并且,温度异常(过 高或过低)时,LED 灯闪烁报警,蜂鸣器需发出报警声。

3.湿度监测与响应

系统通过 DHT11 数字湿温度传感器获取环境湿度。当湿度超出预设的正常范围时, LED 灯闪烁报警,蜂鸣器需发出报警声。湿度太高时,还会亮起蓝灯。湿度太低时,会驱动 电机模拟启动灌溉设备。

4.数据显示

LCD 屏幕会实时显示光照、温度和湿度的数据信息。显示要做到清楚、直观,更新频率 适中。

5.串口通信

上位机和系统能通过串口进行通信,系统能够将光照、温度和湿度的采样数据实时发送 给上位机,上位机可以将数据存储到本地文件或上传到云服务器,实现了环境数据的采集、 传输、存储,可以为后续大数据处理提供数据支持。数据传输需稳定可靠,数据格式要遵守 通信协议。

6.按键控制

管理员可以通过按键开关报警功能和手动开关全彩灯。按键操作简单直观,响应时间快, 如果系统自动化调整功能失效,还可以通过手动方式调整设备。 

结构图

 详细设计

只说明传感器的部分

DS18B20 模块:

用于环境温度的数据采集。

DS18B20 是常用的数字温度传感器,单总线结构。该传感器体积小、硬件开销低、抗干扰能力强、误差小。一般在启动传感器并与之通信前,需要先经过 ROM 检测,但是开发板上只挂载了一个 DS18B20 设备,可以在初始化总线之后直接发送 0xcc 跳过 ROM 检查。使用 Convert T 开始温度转化命令(0x44)开始温度转化之后,经过一定时间,DS18B20 会将温度转化之后的数据存储到暂存器内。通过 Read Scratchpad 读取命令(0xBE) 可以从暂存器读数据。只采集温度数据所以只用接受前两个字节,高八位的高五位是符号位,高八位的低三位和低八位的高四位表示温度的整数位,低八位的低四位表示小数位。在本系统中温度数据保留一位小数。该模块对应文件为"ds18b20.h"和"ds18b20.c"。

相关的讲解可看(这两篇文章并不是使用的stm32,主要看模块的时序):

蓝桥杯电子类单片机学习二——DS18B20温度传感器(onewire驱动)_蓝桥杯板子用ds18b20-CSDN博客

51单片机-18B20温度传感器-CSDN博客

 参考代码:

适配stm32板子 、hal库

#include "ds18b20.h"
#include "tim.h"void DS18B20_IO_IN(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = GPIO_PIN_2;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);
}void DS18B20_IO_OUT(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = GPIO_PIN_2;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);
}void DS18B20_Rst(void)
{DS18B20_IO_OUT();DS18B20_DQ_OUT_LOW;delay_us_by_Tim(750);DS18B20_DQ_OUT_HIGH;delay_us_by_Tim(15);
}uint8_t DS18B20_Check(void)
{uint8_t retry = 0;DS18B20_IO_IN();while(DS18B20_DQ_IN && retry < 200){retry++;delay_us_by_Tim(1);}if(retry >= 200)return 1;elseretry = 0;while(!DS18B20_DQ_IN && retry < 240){retry++;delay_us_by_Tim(1);}if(retry >= 240)return 1;return 0;
}uint8_t DS18B20_Read_Bit(void)
{uint8_t data;DS18B20_IO_OUT();DS18B20_DQ_OUT_LOW;delay_us_by_Tim(2);DS18B20_DQ_OUT_HIGH;DS18B20_IO_IN();delay_us_by_Tim(12);if(DS18B20_DQ_IN)data = 1;elsedata = 0;delay_us_by_Tim(50);return data;
}uint8_t DS18B20_Read_Byte(void)
{uint8_t i,j,data;data = 0;for(i=1;i<=8;i++){j = DS18B20_Read_Bit();data = (j<<7)|(data>>1);}return data;
}void DS18B20_Write_Byte(uint8_t data)
{uint8_t j;uint8_t testb;DS18B20_IO_OUT();for(j=1;j<=8;j++){testb=data&0x01;data=data>>1;if(testb){DS18B20_DQ_OUT_LOW;delay_us_by_Tim(2);DS18B20_DQ_OUT_HIGH;delay_us_by_Tim(60);}else{DS18B20_DQ_OUT_LOW;delay_us_by_Tim(60);DS18B20_DQ_OUT_HIGH;delay_us_by_Tim(2);}}
}void DS18B20_Start(void)
{DS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0x44);
}uint8_t DS18B20_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = GPIO_PIN_2;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Pull = GPIO_PULLUP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);DS18B20_Rst();return DS18B20_Check();
}short DS18B20_Get_Temperature(void)
{//uint8_t temp;uint8_t TL,TH;short temperature;DS18B20_Start();DS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);DS18B20_Write_Byte(0xbe);TL = DS18B20_Read_Byte();TH = DS18B20_Read_Byte();if(TH>7){TH = ~TH;TL = ~TL;//	temp = 0;}
//	else
//		temp = 1;temperature = TH;temperature <<= 8;temperature += TL;temperature = (float)temperature*0.625;//0.0625*10,保留小数一位,后面处理的时候要除以10if(temperature)return temperature;elsereturn -temperature;
}

DHT11 模块:

用于环境温度和湿度的数据采集。

DHT11 数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。一次完整的数据传输为 40bit,高位先出,数据格式为:8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和,校验和数据为前四个字节相加。

DHT11 传输时序为:总线空闲状态为高电平,主机把总线拉低等待 DHT11 响应(总线拉低必须大于 18 毫秒,保证 DHT11 能检测到起始信号),主机发送开始信号结束后,延时等待 20-40us,DHT11 接收到主机的开始信号后,等待主机开始信号结束,然后发送 80us(一般存在误差,20-100us 都可以认为是正常响应时间)低电平响应信号。如果读取总线为低电平,说明 DHT11 发送响应信号,如果读取总线为高电平,则 DHT11 没有响应。DHT11 发送响应信号后,再把总线拉高,准备发送数据,每 1bit 数据都以 50us 低电平时隙开始,告诉主机开始传输一位数据了。当 50us 低电平时隙过后拉高总线,高电平持续 26~28us 表示数据“0”;持续 70us 表示数据“1”。由于存在误差,程序中在延时 40us 后检测总线状态,为高说明该位数据为“1”,为低说明该位数据为“0”。当最后 1bit 数据传送完毕后,

DHT11 拉低总线 50us,表示数据传输完毕,随后总线由上拉电阻拉高进入空闲状态。该模块对应文件为"dht11.h"和"dht11.c"。

该模块可从下面博客移植:

HAL库:

STM32F103ZET6——DHT11温湿度传感器(hal库)_dht11stm32f103-CSDN博客

 标准库(主要参考其的时序讲解):

DHT11详细介绍(内含51和STM32代码)-CSDN博客

基于STM32的温湿度传感器(DHT11)+OLED屏显示(超详细)_stm32控制dht11-CSDN博客

参考代码

(注意这里的延时函数命名成了delay_us_by_Tim()): 

#include "dht11.h"
#include "tim.h"void DHT11_IO_IN(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = GPIO_PIN_3;GPIO_InitStructure.Mode = GPIO_MODE_INPUT;HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);
}void DHT11_IO_OUT(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.Pin = GPIO_PIN_3;GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);
}//复位DHT11
void DHT11_Rst(void)	   
{                 DHT11_IO_OUT(); 	//设置为输出DHT11_DQ_OUT_LOW; 	//拉低DQHAL_Delay(20);    	//拉低至少18msDHT11_DQ_OUT_HIGH; 	//DQ=1 delay_us_by_Tim(30);     	//主机拉高20~40us
}//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void) 	   
{   uint8_t retry=0;DHT11_IO_IN();      //设置为输出	 while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us{retry++;delay_us_by_Tim(1);};	 if(retry>=100)return 1;else retry=0;while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us{retry++;delay_us_by_Tim(1);};if(retry>=100)return 1;	    return 0;
}//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void) 			 
{uint8_t retry=0;while(DHT11_DQ_IN&&retry<100)//等待变为低电平{retry++;delay_us_by_Tim(1);}retry=0;while(!DHT11_DQ_IN&&retry<100)//等待变高电平{retry++;delay_us_by_Tim(1);}delay_us_by_Tim(40);//等待40usif(DHT11_DQ_IN)return 1;else return 0;		   
}//从DHT11读取一个字节
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)    
{        uint8_t i,dat;dat=0;for (i=0;i<8;i++) {dat<<=1; dat|=DHT11_Read_Bit();}						    return dat;
}//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(uint16_t *temp,uint16_t *humi)    
{        uint8_t buf[5];uint8_t i;DHT11_Rst();if(DHT11_Check()==0){for(i=0;i<5;i++)//读取40位数据{buf[i]=DHT11_Read_Byte();}if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]){*humi=(buf[0]<<8) + buf[1];*temp=(buf[2]<<8) + buf[3];}}else return 1;return 0;	    
}//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在     	 
uint8_t DHT11_Init(void)
{ DHT11_Rst();return DHT11_Check();
}

报告与源文件下载:

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

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

相关文章

【持续集成_03课_Linux部署Sonar+Gogs+Jenkins】

一、通过虚拟机搭建Linux环境-CnetOS 1、安装virtualbox&#xff0c;和Vmware是一样的&#xff0c;只是box更轻量级 1&#xff09;需要注意内存选择&#xff0c;4G 2、启动完成后&#xff0c;需要获取服务器IP地址 命令 ip add 服务器IP地址 通过本地的工具&#xff0c;进…

苍穹外卖--启用和禁用员工

实现 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.dto.EmployeePageQueryDTO; import com.sky.entity.Employee; import com.sky.properties.JwtPro…

Debezium报错处理系列之第114篇:No TableMapEventData has been found for table id:256.

Debezium报错处理系列之第114篇:Caused by: com.github.shyiko.mysql.binlog.event.deserialization.MissingTableMapEventException: No TableMapEventData has been found for table id:256. Usually that means that you have started reading binary log within the logic…

救生拉网的使用方法及注意事项_鼎跃安全

水域救援在夏季尤为重要&#xff0c;随着气温的升高&#xff0c;人们更倾向于参与水上活动&#xff0c;如游泳、划船、垂钓等&#xff0c;这些活动虽然带来了乐趣和清凉&#xff0c;但同时也增加了水域安全事故的风险。救生拉网作为水域安全的重要工具之一&#xff0c;其重要性…

咱迈出了模仿的第一大步!快进来看看~

微信公众号&#xff1a;牛奶Yoka的小屋 有任何问题。欢迎来撩~ 最近更新&#xff1a;2024/06/28 [大家好&#xff0c;我是牛奶。] 这是第一篇模仿文章。咱决定先模仿样式&#xff0c;从外至里&#xff0c;层层递进。于是找了几个大V的公众号&#xff0c;看来看去&#xff0c;发…

swing图书管理系统+源码+讲解+ 报告

本次实训要求使用Java面向对象、MySQL数据库和Swing图形组件简单实现xxxx系统的增删改查操作&#xff08;比如学生信息管理系统&#xff09;。 实训目标 掌握面向对象编程的基本概念&#xff1a;类、对象、继承、封装和多态。学习使用Java进行数据库操作。熟悉MySQL数据库的使…

Instruct-GS2GS:通过用户指令编辑 GS 三维场景

Paper: Instruct-GS2GS: Editing 3D Gaussian Splats with Instructions Introduction: https://instruct-gs2gs.github.io/ Code: https://github.com/cvachha/instruct-gs2gs Instruct-GS2GS 复用了 Instruct-NeRF2NeRF 1 的架构&#xff0c;将基于 NeRF 的三维场景编辑方法迁…

VS Code配置Graphviz和DOT语言环境

目录 Graphviz介绍 下载并安装Graphviz 安装插件 效果展示 Graphviz介绍 Graphviz 是一款开源图形可视化软件。图形可视化是一种将结构信息表示为抽象图形和网络图的方法。它在网络、生物信息学、软件工程、数据库和网页设计、机器学习以及其他技术领域的可视化界面中有着…

展开说说:Android服务之实现AIDL跨应用通信

前面几篇总结了Service的使用和源码执行流程&#xff0c;这里再简单分析一下如果需要Service跨进程通信该怎样做。AIDL&#xff08;Android Interface Definition Language&#xff09;Android接口定义语言&#xff0c;用于实现 Android 两个进程之间进行进程间通信&#xff08…

TensorFlow系列:第二讲:准备工作

1.创建项目&#xff0c;选择虚拟环境 项目结构如下&#xff1a; data中的数据集需要提前准备好&#xff0c;数据分为测试集&#xff0c;训练集和验证集。以下是数据集的下载平台&#xff1a;kaggle 2.随便选择一个和水果相关的数据集&#xff0c;下载到本地&#xff0c;导入的项…

C# Bitmap类型与Byte[]类型相互转化详解与示例

文章目录 一、Bitmap类型转Byte[]类型使用Bitmap类的Save方法使用Bitmap类的GetBytes方法 二、Byte[]类型转Bitmap类型使用MemoryStream将Byte[]数组转换为Bitmap对象使用System.Drawing.Imaging.BitmapImage类 总结 在C#编程中&#xff0c;Bitmap类型和Byte[]类型之间的相互转…

产品原型设计:从概念到实现的完整指南

如果你是一位产品经理&#xff0c;那么你一定会和原型图打交道&#xff0c;产品原型是产品设计方案和底层逻辑的可视化表达&#xff0c;需要完整清晰地表达出产品目的及需求&#xff0c;在整个产品创造的过程中发挥着不可或缺的作用。而对于一些刚入行的产品经理来说&#xff0…

【Linux】多线程_1

文章目录 九、多线程1. 线程概念2. 线程的控制 未完待续 九、多线程 1. 线程概念 我们知道&#xff1a;进程 内核数据结构 进程代码和数据 。那什么是线程呢&#xff1f;线程是进程内部的一个执行分支。一个进程内部可以有多个执行流&#xff08;内核数据结构&#xff09;&…

量产工具一一UI系统(四)

目录 前言 一、按钮数据结构抽象 1.ui.h 二、按键处理 1.button.c 2.disp_manager.c 3.disp_manager.h 三、单元测试 1.ui_test.c 2.上机测试 前言 前面我们实现了显示系统框架&#xff0c;输入系统框架和文字系统框架&#xff0c;链接&#xff1a; 量产工具一一显…

接口测试(2)

单接口测试 CtrlD 复制 因为单接口的时候主要改变测试用例数据 自动判定响应结果 postman断言 //断言响应状态码为200 pm.test("Status code is 200", function () {pm.response.to.have.status(200); }); //断言返回数据中包括&#xff08;成功&#xff09; //预期结…

线程池案例

秒杀 需求 10个礼物20个客户抢随机10个客户获取礼物&#xff0c;另外10无法获取礼物 任务类 记得给共享资源加锁 public class MyTask implements Runnable{// 礼物列表private ArrayList<String> gifts ;// 用户名private String username;public MyTask( String user…

285个地级市出口产品质量及技术复杂度(2011-2021年)

出口产品质量与技术复杂度&#xff1a;衡量国家竞争力的关键指标 出口产品质量是衡量国内企业生产的产品在国际市场上竞争力的重要标准。它不仅要求产品符合国际标准和目标市场的法律法规&#xff0c;而且需要保证产品质量的稳定性和可靠性。而出口技术复杂度则进一步体现了一…

Spring Cloud 引入

1.单体架构&#xff1a; 定义&#xff1a;所有的功能实现都打包成一个项目 带来的后果&#xff1a; ①后端服务器的压力越来越大&#xff0c;负载越来越高&#xff0c;甚至出现无法访问的情况 ②业务越来越复杂&#xff0c;为了满足用户的需求&#xff0c;单体应用也会越来越…

IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)

1. IEC 62056标准体系 IEC 62056标准体系目前共包括六部分&#xff0c;见图1&#xff1a; 第61部分&#xff1a;对象标识系统第62部分&#xff1a;接口类第53部分&#xff1a;COSEM应用层第46部分&#xff1a;使用HDLC&#xff08;High Level Data Link Control&#xff09;协…

HNU小学期BSP软件编程基础十道测试题

http://t.csdnimg.cn/Yv0R1 文章参考了这位大佬的代码&#xff0c;在他的基础上进行了纠错、完善等处理。 配置 编程前的准备工作按大佬的流程即可&#xff0c;稍有不同的是学习通课程网站的资料里没有头文件的整个压缩包了&#xff0c;但我们可以下载某个BSP版的工程文件&am…