【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

相关文章

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

基于Python打造一个全能文本处理工具

《基于Python打造一个全能文本处理工具》:本文主要介绍一个基于Python+Tkinter开发的全功能本地化文本处理工具,它不仅具备基础的格式转换功能,更集成了中文特色处理等实用功能,有需要的... 目录1. 概述:当文本处理遇上python图形界面2. 功能全景图:六大核心模块解析3.运行效果4. 相

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文