基于LORA的一主多从监测系统_AHT20温湿度传感器

1)AHT20温湿度传感器

这个传感器,网上能找到的资料还是比较多的,我们使用的是HAL硬件i2c,相比于模拟i2c,我们不需要过于关注时序问题,我们只需要关心如何获取数据以及数据如何处理,下面以数据手册为主:

上图来源与数据手册

通过上述截图我们可以看出需要获取温湿度值,我们需要先给传感器发送0x70 0xAC 0x33 0x00四个字节的测量命令字段,然后读取总线数据,返回的数据格式为Status+20位相对湿度+20位温度数据以及CRC校验值一共就是7个字节,不过实际使用的时候可以不用管这个CRC

这个是传感器的状态字说明表格通过这个,我们可以判断当前传感器的状态,也就是我们读到的七个字节的第一个字节

通过手册,我们可以知道当传感器上电后需要等到五ms才能读取,这个一般可以不用管,但是再发送完测量命令后需要等待80ms测量完成,我们需要做一些延时操作

当然,最重要的是我们如何将获取的数据转换为实际的温度和湿度,通过查看手册,我们可以得到转换的具体公式

//为了能将数据传递到AHT20——Read函数的调用方,需要将数据定义为指针类型
void AHT20_Read(float *Temperature, float *Humidity)
{
    uint8_t sendBuffer[3] = { 0xAC, 0x33, 0x00};
    //要触发测量,需要直接发送0xAC命令,此命令参数有两个字节:0x33,0x00
    uint8_t readBUffer[6];

    HAL_I2C_Master_Transmit(&hi2c2,AHT20_ADDRESS,sendBuffer,3,HAL_MAX_DELAY);
    HAL_Delay(75);
    //等待75ms待测量完成
    HAL_I2C_Master_Receive(&hi2c2,AHT20_ADDRESS,readBUffer,6,HAL_MAX_DELAY);
    //读取六个字节(发送0x71可以读取)

    if((readBUffer[0] & 0x80) == 0x00)
        //如果第0字节的第7位位0,就说明获取的数据确实是刚刚测量完成的数据,就可以开始温湿度的计算
    {
        //AHT20的数据手册指出温度数据和湿度数据各占两个半字节,定义data用于数据拼接
        uint32_t data = 0;
        //第3字节的高4位是湿度数据,低4位是温度数据;第2字节和第1字节为湿度数据

        // 0000 xxxx + xxxx xxxx 0000+ xxxx xxxx 0000 0000 0000
        data = ((uint32_t)readBUffer[3] >> 4) + ((uint32_t)readBUffer[2] << 4) + ((uint32_t)readBUffer[1] << 12);
        //要将uint8_t的数据改为uint32_t,否则会出现溢出而导致数据丢失
        *Humidity = data * 100.0f / (1 << 20);
        //相对湿度(%)=(SDA输出的相对湿度信号/2的20次方)*100%,转换为浮点数计算,避免丢失掉小数部分

        //xxxx 0000 0000 0000 0000 + xxxx xxxx 0000 0000 + xxxx xxxx
        data = (((uint32_t)readBUffer[3] & 0x0F) << 16) + ((uint32_t)readBUffer[4] << 8) + (uint32_t)readBUffer[5];
        *Temperature = data * 200.0f / (1 << 20) - 50;
        // 温度 = (温度输出信号 / 2的20次方)* 200 - 50
    }
}

通过简单的代码测试后,我们在debug下可以看到已经能正常读到数据了,其中0x1C为状态字节 00011100,通过第4个bit为1表示OTP 存储器数据完整性测试(CRC)通过,说明我们温湿度数据获取成功

这个实际数据值看着也差不多,说明获取无误

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus之Pushgateway使用

Pushgateway属于整个架构图的这一部分 The Pushgateway is an intermediary service which allows you to push metrics from jobs which cannot be scraped. The Prometheus Pushgateway exists to allow ephemeral and batch jobs to expose their metrics to Prometheus. S…

MATLAB APPdesigner中的日期选择器怎样实时显示时间

文章目录 1.问题描述2.代码设置代码示例解释 1.问题描述 我们在做MATLAB的时候&#xff0c;一般需要在APP界面中加上时间显示&#xff0c;像下图中的右上角&#xff0c;在组件中有日期选择器&#xff0c;但是这个并不是实时显示的&#xff0c;我们还需要自己进行设置。 2.代码…

(11)MATLAB莱斯(Rician)衰落信道仿真2

文章目录 前言一、莱斯衰落信道仿真模型二、仿真代码与结果1.仿真代码2.仿真结果画图 三、后续&#xff1a;四、参考文献&#xff1a; 前言 首先给出莱斯衰落信道仿真模型&#xff0c;该模型由直射路径分量和反射路径分量组成&#xff0c;其中反射路径分量由瑞利衰落信道模型构…

力扣之603.连续空余座位

文章目录 1. 603.连续空余座位1.1 题干1.2 准备数据1.3 思路分析1.4 解法1.5 结果截图 1. 603.连续空余座位 1.1 题干 表: Cinema ----------------- | Column Name | Type | ----------------- | seat_id | int | | free | bool | ----------------- Seat_id 是该表的自动递…

宏队列和微队列

1、javascript是一个单线程语言。 javascript 语言的目的&#xff08;待补充&#xff09; 2、主线程执行完成之后&#xff0c;再执行微队列&#xff0c;微队列执行完成后再执行宏队列 3、promise的构造函数传入的回调函数是同步执行 4、promise的then函数会直接加入微队列&…

zookeeper选举kafka集群的controller

zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker&#xff0c;负责整个kafka集群的…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态&#xff1a;READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换&#xff1a;点击开始游戏&#xff08;从READY变为RUNNING&am…

Nginx06-静态资源部署

零、文章目录 Nginx06-静态资源部署 1、静态资源概述 静态资源&#xff1a;是在Web开发中不经常改变的文件&#xff0c;比如图片、CSS样式表、JavaScript脚本文件等。这些资源通常是预先编译好的&#xff0c;不需要服务器端的动态处理。动态资源&#xff1a;是在Web开发中需…

前端编程艺术(3)---JavaScript

目录 1.JavaScript 1.输出 2.变量和数据类型 3.运算符 4.数组 5.函数 6.面向对象 7.ES6面向对象 2.BOM 1.document对象 3.DOM 4.JSON 1.JavaScript JavaScript是一种脚本编程语言&#xff0c;通常用于为网页增加交互性和动态效果。它是一种高级语言&#xff…

面试(十)

目录 一. 单元测试 二. FreeRTOS和裸机哪个实时性好&#xff1f; 三. 怎么判断某个程序的运行时间 四. 函数指针 五. 全局变量被线程使用冲突 5.1 使用互斥锁 5.2 使用读写锁 5.3 使用原子操作 六. 局部变量没有初始化是什么值 七. uint_8 n 255 , n等于多少 八. …

【springboot】简易模块化开发项目整合Swagger2

接上一项目【springboot】简易模块化开发项目整合MyBatis-plus&#xff0c;进行拓展项目 1.新建模块 右键项目→New→Module&#xff0c;新建一个模块 父项目选择fast-demo&#xff0c;命名为fast-demo-config&#xff0c;用于存放所有配置项 添加后&#xff0c;项目结构如图…

计算机网络:物理层 —— 信道复用技术

文章目录 信道信道复用技术信道复用技术的作用基本原理常用的信道复用技术频分复用 FDM时分复用 TDM波分复用 WDM码分复用 CDM码片向量基本原理 信道 信道是指信息传输的通道或介质。在通信中&#xff0c;信道扮演着传输信息的媒介的角色&#xff0c;将发送方发送的信号传递给…

Flink 03 | 数据流基本操作

Flink数据流结构 DataStream 转换 通常我们需要分析的业务数据可能存在如下问题&#xff1a; 数据中包含一些我们不需要的数据 数据格式不方面分析 因此我们需要对原始数据流进行加工&#xff0c;比如过滤、转换等操作才可以进行数据分析。 “ Flink DataStream 转换主要作…

PHP变量(第④篇)

本栏目教学是php零基础到精通&#xff0c;如果你还没有安装php开发工具请查看下方链接&#xff1a; Vscode、小皮面板安装-CSDN博客 今天来讲一讲php中的变量&#xff0c;变量是用于存储信息的"容器"&#xff0c;这些数据可以在程序执行期间被修改&#xff08;即其…

nginx配置https加密

安装nginx 官网&#xff1a; https://nginx.org/ yum安装&#xff1a; https://nginx.org/en/linux_packages.html /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 …

(C语言贪吃蛇)15.贪吃蛇吃食物

目录 前言 注意事项⚠️ 效果预览 实现方法 运行效果 新的问题&#x1f64b; 最终效果 总结 前言 我们上一节实现了解决了贪吃蛇不合理走位的情况&#xff0c;不理解的再回去看看(传送门&#xff1a;解决贪吃蛇不合理走位)&#xff0c;那么贪吃蛇自然是要吃食物的啊&…

【GEE学习第三期】GEE常用函数总结

【GEE学习第三期】GEE常用函数总结 数据统计类ee.List.sequence函数 图像处理类ee.Geometry类‌defaultVisualizationVis函数 数据输入输出数值与绘图导出影像 参考 数据统计类 ee.List.sequence函数 用法如下&#xff1a; ee.List.sequence &#xff08;开始&#xff0c;结…

windows C++-创建图像处理的异步消息(二)

创建图像处理网络 此部分介绍如何创建对给定目录中的每个 JPEG (.jpg) 图像执行图像处理的异步消息块网络。 网络执行以下图像处理操作&#xff1a; 对于 Tom 创作的任何图像&#xff0c;转换为灰度。 对于任何以红色作为主色的图像&#xff0c;移除绿色和蓝色分量&#xff0…

提升开机速度:有效管理Windows电脑自启动项,打开、关闭自启动项教程分享

日常使用Windows电脑时&#xff0c;总会需要下载各种各样的办公软件。部分软件会默认开机自启功能&#xff0c;开机启动项是指那些在电脑启动时自动运行的程序和服务。电脑开机自启太多的情况下会导致电脑卡顿&#xff0c;开机慢&#xff0c;运行不流畅的情况出现&#xff0c;而…

Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出

各个操作功能 部分功能 几种操作游戏物体的方式&#xff1a; Center:有游戏物体父子关系的时候&#xff0c;中心点位置 Global/Local:世界坐标系方向/自身坐标系方向 &#xff1a;调试/暂停/下一帧 快捷键 1.Alt鼠标左键&#xff1a;可以实现巡游角度查看场景 2.鼠标滚轮…