GY39测量温湿度和光照强度用C51单片机实现

2023-11-08 13:20

本文主要是介绍GY39测量温湿度和光照强度用C51单片机实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

c51的GY-39测量温湿度和光照强度

  • 一、GY-39的介绍
    • GY39的命令数据帧格式
    • 接收的数据帧格式
      • 光照值的计算
      • 温度、气压、湿度、海拔数据的计算
  • 二、利用C51计算光照、温度、湿度值
  • 三、实验结果
  • 四、最后

一、GY-39的介绍

我的博客:https://hahaxiong0204.github.io
GY-39 是一款低成本,气压,温湿度,光强度传感器模块。工作电压 3-5v,功耗小,安装方便。其工作原理是, MCU 收集各种传感器数据,统一处理,直接输出计算后的结果。
GY-39模块

在此模块中,有两种方式读取数据,即串口 UART( TTL 电平)或者 IIC( 2 线)。这里就是利用C51的串口采集GY-39的数据。

通信协议
串口通信参数可以有以下两种选择:
1、波特率: 9600 bps 校验位: N 数据位: 8 停止位: 1
2、波特率: 115200 bps 校验位: N 数据位: 8 停止位: 1
我们将使用方式一,用9600的波特率 (如果是stm32可以使用方式二)

GY39的命令数据帧格式

GY39模块是以命令的方式发送数据的,简单来说就是当你发送一个指令,GY39就回复对应的数据给你,如:你发送取光照强度的指令,Gy39就回给你光照的数据。

GY-39模块的所有串口指令格式为:
帧头: 0xa5(固定的)
所以指令格式:帧头+指令+校验和(8bit)
指令的组成部分
发送命令: 0xA5+0x81+0x26,表示连续输出光照强度,掉电后保存该设置,重新上电后将自动连续输出光照强度;
发送命令: 0xA5+0x82+0x27,表示连续输出温度、气压、湿度、海拔,掉电后保存该设置,重新上电后将自动连续输出;

接收的数据帧格式

模块输出格式,每帧包含 8-13 个字节(十六进制)

不是8位就是13位

①.Byte0: 0x5A 帧头标志
②.Byte1: 0x5A 帧头标志
③.Byte2: 0x15 本帧数据类型(参考含义说明)
④.Byte3: 0x04 数据量
⑤.Byte4: 0x00~0xFF 数据前高 8 位
⑤.Byte5: 0x00~0xFF 数据前低 8 位
⑥.Byte6: 0x00~0xFF 数据后高 8 位
⑦.Byte7: 0x00~0xFF 数据后低 8 位
⑧.Byte8: 0x00~0xFF 校验和(前面数据累加和,仅留低 8 位)

其中不管是8为数据还是13位数据:

  • 前面两位都是0xA5
  • 第三位是数据类型
  • 第四位是该数据帧的数据位的长度
  • 最后一位是校验和(可以不用管)

其中第三位和第四位最为重要
第三位
第三位的格式
当第三位的数据位为 “0X15” 表示这个数据帧为带有光照数据的数据帧
当第三位的数据位为 “0X45” 表示这个数据帧为温度、气压、湿度、海拔数据的数据帧

第四位数据
表示该数据帧的数据位的大小
如:0x04 表示后面4个位都是数据位

光照值的计算

光照强度计算方法(当 Byte2=0x15 时,数据:Byte4~Byte7) :
Lux=(前高 8 位<<24) | (前低 8 位<<16) | (后高 8 位<<8) | 后低 8 位 单位 lux

例:一帧数据
<5A- 5A- 15 -04- 00 -00- FE- 40- 0B >
Lux=(0x00<<24)|(0x00<<16)|(0xFE<<8)|0x40
Lux=Lux/100 =650.88 (lux)

温度、气压、湿度、海拔数据的计算

温度、气压、湿度、海拔,计算方法(当 Byte2=0x45 时):

温度: Byte4~Byte5
T=(高 8 位<<8)|低 8 位
T=T/100 单位℃
气压: Byte6~Byte9
P=(前高 8 位<<24) | (前低 8 位<<16) | (后高 8 位<<8) | 后低 8 位
P=P/100 单位 pa
湿度: Byte10~Byte11
Hum=(高 8 位<<8)|低 8 位
Hum=Hum/100 百分制
海拔: Byte12~Byte134
H=(高 8 位<<8)|低 8 位 单位 m

例:一帧数据
< 5A -5A -45 -0A -0B -2D -00 -97 -C4 -3F -12- 77 -00- 9C- FA >
T=(0x0B<<8)|0x2D=2861
温度 T=2861/100=28.61 (℃ )
P=(0x00<<24)|(0x97<<16)|(C4<<8)|3F=9946175
气压 P=9946175/100=99461.75 (pa)
Hum=(0x12<<8)| 77=4727
湿度 Hum=4727/100=47.27 (%)
海拔 H=(0x00<<8)|0x9c=156 (m)

二、利用C51计算光照、温度、湿度值

接线:
TXD -> DR
RXD -> CT
如图:
接线图

因为GY-39是要单片机不断发送命令,才会读取数据发送给我们的51单片机所以我们以采取轮询的方式,不断给单片机发送我们的命令数据帧,这样我们就可以实现一直获取数据。

我们的主函数

while(1){//=====================处理光照强度======================send_buff(buff1,2);delay_ms(10);if(Receive_ok==2){Lux = (raw_data[4]<<24)|(raw_data[5]<<16)|(raw_data[6]<<8)|raw_data[7];LCD_ShowString(2,1,"Lux:");LCD_ShowNum(2,5,Lux/100,3);LCD_ShowString(2,8,".");LCD_ShowNum(2,9,Lux%100,2);Receive_ok = 0;}delay_ms(500);//================处理温度、湿度=========================send_buff(buff1,3);    delay_ms(10);if(Receive_ok==1){HUM = (raw_data[10]<<8)|raw_data[11];LCD_ShowString(1,1,"HU:");LCD_ShowNum(1,4,HUM/100,2);LCD_ShowString(1,6,".");LCD_ShowNum(1,7,HUM%100,2);TE =(raw_data[4]<<8)|raw_data[5];LCD_ShowString(1,9,"TE:");LCD_ShowNum(1,12,TE/100,2);LCD_ShowString(1,14,".");LCD_ShowNum(1,15,TE%100,2);Receive_ok = 0;}delay_ms(500);		// 给个延时}	

C51发送命令数据给GY-39

void send_buff(u8 *tem_buff,u8 buff_size)
{u8 i;for(i=0;i<buff_size;i++){SBUF = tem_buff[i];while(TI==0){};TI = 0;}
}

串口中断函数

void USART_IRQHandler(void)interrupt 4
{static uint8_t i=0,rebuf[15]={0};uint8_t sum=0;if(RI)//接收完成标志{rebuf[i++]=SBUF;RI=0;//清中断接收标志if (rebuf[0]!=0x5a)//帧头不对i=0;	if ((i==2)&&(rebuf[1]!=0x5a))//帧头不对i=0;if(i>3)//i等于4时,已经接收到数据量字节rebuf[3]{if(i!=(rebuf[3]+5))//判断是否接收一帧数据完毕return;	switch(rebuf[2])//接收完毕后处理{case 0x45:if(!Receive_ok)//当数据处理完成后才接收新的数据{memcpy(raw_data,rebuf,15);//拷贝接收到的数据Receive_ok=1;//接收完成标志}break;case 0x15:if(!Receive_ok)//当数据处理完成后才接收新的数据{memcpy(raw_data,rebuf,9);//拷贝接收到的数据Receive_ok=2;//接收完成标志}break;//原始数据接收,可模仿0x45的方式case 0x35:break;}i=0;//缓存清0}}
}

三、实验结果

实验结果

四、最后

代码点这里下载链接

这篇关于GY39测量温湿度和光照强度用C51单片机实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/370104

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4