【elfboard linux开发板】7.i2C工具应用与aht20温湿度寄存器读取

本文主要是介绍【elfboard linux开发板】7.i2C工具应用与aht20温湿度寄存器读取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. I2C工具查看aht20的温湿度寄存器值

1.1 原理图

传感器通过IIC方式进行通信,连接的为IIC1总线,且设备地址为0x38,实际上通过后续iic工具查询,这个设备是挂载在iic-0上

在这里插入图片描述

1.2 I2C工具

通过i2c工具可以实现查询i2c总线、以及上面挂载的设备以及设备的寄存器值。
a. 下载安装:

可以通过IIC工具地址进行下载,或以下命令下载(慢):

git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git
  1. 下载后,复制到相关文件夹下,按ctrl+alt+t打开终端,通过tar -zxvf 解压缩
  2. cd i2c-tools-4.3目录下,下载版本不同,名称可能不一样
  3. vi Makefile将下列三行改写为:

前–>后
CC ?= gcc -->#CC ?= gcc
AR ?= ar–> #AR ?= ar
STRIP ?= strip -->#STRIP ?= strip

  1. make 编译后会在 ./tools/下生成可执行文件

在这里插入图片描述

  1. 将i2cdetect、i2cdump、i2cget、i2cset、i2ctransfer等工具拷贝到开发板的/usr/bin目录下
    在这里插入图片描述
    在这里插入图片描述
  2. 并且将对应的i2c工具依赖的库拷贝到开发板的/usr/lib下
    在这里插入图片描述

i2c工具介绍:

i2cdetect

-V 输出版本
-y 接i2c序号,检测挂载在i2c总线上的器件
-l 打印i2c总线
-F MODE_FUNC
-r MODE_READ
-q MODE_QUICK
-a 设置扫描的地址从0x00到0x7F
iic1上有在0x1a位置上有挂载设备和驱动;UU表示既有设备也有驱动;
在这里插入图片描述

i2cdump:

i2cdump -f -y 1 0x1a 查看挂载在i2c1的设备0x1a的寄存器的值

i2ctransfer

格式为:i2ctransfer -f -y iic序号 w[number]@设备地址 命令 参数 r[number2]
number 为写入的字节数,number2为读取的字节数

AHT20的命令介绍:

初始化 0xBE(1011’ 1110)
触发测量 0xAC
软复位 0xBA

状态字用来判断寄存器的状态,具体对应如下:

bit[7]bit[6]bit[5]bit[4]bit[3]bit[2]bit[1]bit[0]
1-测量中 0-休眠1-已校准 0- 未校准

传感器读取流程:

  • 上电后等待40ms, 通过0x71命令查看状态字的bit[3]是否为1,如果不为1,初始化(发送0xBE命令,命令有两个参数,分别为0x08与0x00,然后,等待10ms
  • 启动测量(发送0xAC命令,有两个参数,分别为0x33与0x00)
  • 等待80ms, 通过0x71命令读取状态字,bit[7]处于休眠态,说明测量完成,然后读取6个字节;如果bit[7]处于测量中,则继续等待;
  • 发送应答位
  • 接收数据,通过下列公式计算温湿度

V a l u e 湿度 = v a l u e r e g 1 2 20 100 Value_{湿度}=\frac{value_{reg1}}{2^{20}}100 Value湿度=220valuereg1100
V a l u e 温度 = v a l u e r e g 2 2 20 200 − 50 Value_{温度} = \frac{value_{reg2}}{2^{20}}200-50 Value温度=220valuereg220050

应用

1.初始化
i2ctransfer -f -y 0 w3@0x38 0xbe 0x08 0x00
2. 开始测量:
i2ctransfer -f -y 0 w3@0x38 0xAC 0x33 0x00
3. 读取值
i2ctransfer -f -y 0 w1@0x38 0x71 r7
在这里插入图片描述

补充说明:
Makefile的四种赋值运算符

= 赋值,可以使用后面定义的变量
:= 就地直接解析,只能使用前面定义好的变量
?=没有被赋值则进行赋值,赋值过则忽略
+=追加赋值

2. 使用安装好的驱动读取温湿度传感器的值

通过进程的方式获取iic总线挂载的设备,与iic设备寄存器的值后(实际上可以不用前面这些,直接循环读取就行),循环读取并计算温湿度传感器的值
注意:
execlp执行完,后续的将不会执行,因此,交给子进程单独执行该命令,在父进程中等待回收完子进程后,执行后续指令

#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>#define read_len 2
int main(int argc,char*argv[]){printf("i2c-1 的 寄存器\n");unsigned int buf[read_len];float hum,temp;float hum1,temp1;int h1,t1;int ret = 0;pid_t pid = fork();if(pid<0){perror("fork error");exit(1);}else if(pid == 0){execlp("i2cdetect","i2cdetect","-y","0",NULL);}else{  waitpid(-1,NULL,0);if(argc<2||strncmp(argv[1],"/dev/",5)){printf("参数错误,请输入/dev/");exit(1);}int fd = open(argv[1],O_RDWR);if(fd<0){perror("open error");exit(1);}pid_t pid2 = fork();if(pid2 == 0){ execlp("i2cdump","i2cdump","-f","-y","0","0x38",NULL);}               else if(pid2 > 0){waitpid(-1,NULL,0);while(1){if((ret=read(fd,buf,sizeof(buf)))==0){h1 = (buf[0]*1000)>>20;t1 = ((buf[1]*2000)>>20)-500;hum = buf[0]*1000./1024/1024/10;temp = (buf[1]*200.*10/1024/1024-500)/10;printf("湿度为%0.2f, 温度为%0.2f \n",hum,temp);printf("hum:%0.2f, temp:%0.2f \n",(float)h1/10.0,(float)t1/10.0);sleep(1);}}close(fd);}}}

在这里插入图片描述

这篇关于【elfboard linux开发板】7.i2C工具应用与aht20温湿度寄存器读取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal