青海建设厅网站通知余杭区高端网站建设
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:54
当前位置: 首页 > news >正文
青海建设厅网站通知,余杭区高端网站建设,电商网页设计师,企业建设厂房需要办哪些证文章目录1- 使能开发板I2C通信接口2- SHT20硬件连接3- 编码实现SHT20温湿度采样思路#xff08;1#xff09;查看sht20从设备地址#xff08;i2cdetect#xff09;#xff08;2#xff09;获取数据大体流程【1】软复位【2】触发测量与通讯时序#xff08;3#xff09;返… 文章目录1- 使能开发板I2C通信接口2- SHT20硬件连接3- 编码实现SHT20温湿度采样思路1查看sht20从设备地址i2cdetect2获取数据大体流程【1】软复位【2】触发测量与通讯时序3返回数据处理4- SHT20温湿度采样编程源码5- 代码难点巩固1ioctl函数讲解2移位、与或处理数据I2C 总线是一种同步、半双工、采用电平信号收发的串行总线。 关于I2C不了解的可以参考写的这篇文章I2C协议介绍以及HAL库实现I2C对SHT30温湿度采样 1- 使能开发板I2C通信接口 在我的开发板上有两路I2C外设 I2C2 — 触摸屏控制器rtc时钟摄像头控制器 I2C1 — 40pin扩展口使用由DToverlay进行开启 GPIO01_IO03 — I2C1_SDA GPIO01_IO03 — I2C1_SCL想要使能40pin扩展口的I2C1的话需要修改开发板上的DTOverlay配置文件添加该管脚对I2C的支持具体修改具体方法为修改 eMMC 启动介质的 boot 分区下的 config.txt 文件将dtoverlay_i2c1的选项修改为yes rootigkboard:~# vi /run/media/mmcblk1p1/config.txt
Enable I2C overlay
dtoverlay_i2c1yes修改完成后重启系统系统启动时将会自动加载 I2C 协议驱动。查看/dev下是否存在I2C设备节点或查看/sys/bus/i2c/devices中设备文件已验证I2C驱动是否加载。
ootigkboard:# ls -l /dev/i2c-*
crw——- 1 root root 89, 0 Mar 1 10:24 /dev/i2c-0
crw——- 1 root root 89, 1 Mar 1 10:24 /dev/i2c-1
rootigkboard:# ls /sys/bus/i2c/devices/
1-006f i2c-0 i2c-1由于驱动是从0开始编写的故实际的I2C1对应的设备节点是i2c-0。 2- SHT20硬件连接
VCC3.3VGNDGNDSCLI2C1_SCLSDAI2C1_SDA 参考图 实物连接图 3- 编码实现SHT20温湿度采样思路
1查看sht20从设备地址i2cdetect
总线上挂载I2C从设备可通过i2cdetect扫描某个I2C总线上的所有设备。可通过控制台输入i2cdetect -y 1或0(确定哪一条总线) 来查看所有设备。
rootigkboard:# i2cdetect -y 00 1 2 3 4 5 6 7 8 9 a b c d e f
00: – – – – – – – –
10: – – – – – – – – – – – – – – – –
20: – – – – – – – – – – – – – – – –
30: – – – – – – – – – – – – – – – –
40: 40 – – – – – – – – – – – – – – –
50: – – – – – – – – – – – – – – – –
60: – – – – – – – – – – – – – – – –
70: – – – – – – – –显示的是以十六进制表示的设备地址的编号4016进制即10000002进制。
2获取数据大体流程
【1】软复位
此命令用于重新启动传感器系统而无需重新上电。一旦接收到该命令传感器系统将重新初始化并根据默认设置开始操作。软复位时间小于15ms。
【2】触发测量与通讯时序
下面右图我们常用红色框选中的命令使用非保持主机模式(no hold master)的命令可以使sht20在测量时候释放i2c总线使得主机可以处理其他从设备的通信任务。 下面左图我们可以看见sht20的通讯时序时序的开始以及停止以及发送数据等的内容可以参考开头的文章。。
Start开始从地址0通知sht30我们将要写入收到ACK相响应成功对sht20写入非保持主机模式(no hold master)的命令即右图的11110101收到ACK响应成功等待Stop然后发送地址1读数据信号返回ACK响应即可后面就可以读取我们需要的数据了。 3返回数据处理
测量的数据温度和湿度均为两个字节。而且无论哪一种传输模式测量的最大分辨率最大14bit数据的第二个字节SDA上最后两位是用来标记相关状态信息。其中bit1表示测量类型0是温度1是湿度
SDA的输出数据被转换成两个字节的数据包高字节MSB在前(左对齐)。每个字节后面都跟随一个应答位。两个状态位即 LSB的后两位在进行物理计算前须置0。
我们上面时序的例子返回了两个字节数据 高字节数据0110 0011 低字节数据0101 0010bit1是1说明返回的是湿度的测量数据 我们需要将我们收到的数据用提供的计算方法计算出相对应的湿度值。 除去最后的2bit就是将最后的2bit换为00也就是0110 0011 0101 00002进制 2542410进制然后代入公式得到数据
RH -6 125*(25424 / 65536) 42.4924 #单位为%4- SHT20温湿度采样编程源码
源码
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include sys/ioctl.h
#include stdint.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include time.h
#include errno.h
#include linux/i2c-dev.h#define SOFTRESET 0xFE;//16进制软复位1111 11110
#define TRIGGER_T_NO_HOLD 0xF3;//16进制温度触发测量1111 0011
#define TRIGGER_RH_NO_HOLD 0xF5;//16进制湿度触发测量1111 0101void mssleep(unsigned long ms);//毫秒级函数实现nanosleep
int sht20_init(char *i2c_dev);//初始化从设备函数
int sht20_softreset(int fd);//sht20命令复位函数
int sht20_get_t_rh(int fd, float *temperature, float *humidity);//buf处理函数int main(int argc, char *argv[])
{int fd;float temperature;float humidity;if(argc ! 2){printf(This project is to obtain the temperature and humidity of sht20.\n);printf(Please input %s /dev/i2c-x\n, argv[0]);return 0;}fd sht20_init(argv[1]);if(fd 0){printf(SHT20 init failure\n);return 1;}//printf(sht20_init success\n);while(1){if(sht20_get_t_rh(fd, temperature, humidity) 0){printf(SHT20 get temperature and humidity failure\n);return 2;}//printf(sht20_get_t_rh success\n);printf(Temperature:%lfC Humidity:%lf%% \n, temperature, humidity);sleep(1);}close(fd);return 0;
}/对buf里面的数据进行处理打印/
static inline void manage_buf(uint8_t *buf, int size )
{int i;for(i 0; i size; i){printf(%02x , buf[i]);//以16进制输出不足2位左边补0}printf(\n);
}/获取sht20温湿度值/
int sht20_get_t_rh(int fd, float *temperature, float *humidity)
{uint8_t buf[4];//一个字节8个位比如buf[0]刚好读取一个字节好操作int rv 0;if(fd 0 || !temperature || !humidity){printf(%s get invalid input arguments\n, FUNCTION);return -1;}/获取温度/memset(buf, 0, sizeof(buf));buf[0] TRIGGER_T_NO_HOLD;//16进制温度触发测量1111 0011if(rv write(fd, buf, 1) 0){printf(Write TRIGGER_T_NO_HOLD error:%s\n, strerror(errno));return -2;}mssleep(85);//等待需要的时间memset(buf, 0, sizeof(buf));//读取数值放在buf中需要将buf清0/读取三个字节数据后面的一个字节数据是CRC校验值/if(rv read(fd, buf, 3) 0){printf(Read temperature error:%s\n, strerror(errno));return -3;}manage_buf(buf, 3);//buf处理函数/需要将读取到的buf[0]和buf[1]合并,buf[0]左移8bit然后加上后面的buf[1],即可但是最后2bit是都需要变成0u于是与1111 1100(0xfc)与()就可以将最后2bit变成0了1010 11111111 1100———–1010 1100/*temperature 175.72 * (((((int)buf[0]) 8) (buf[1] 0xfc)) / 65536.0) - 46.85;//temperature计算℃ /获取湿度/memset(buf, 0, sizeof(buf));buf[0] TRIGGER_RH_NO_HOLD;//16进制湿度触发测量1111 0101if(rv write(fd, buf, 1) 0){printf(Write TRIGGER_RH_NO_HOLD error:%s\n, strerror(errno));return -4;}mssleep(29);//等待需要的时间memset(buf, 0, sizeof(buf));//读取数值放在buf中需要将buf清0if(rv read(fd, buf, 3) 0){printf(Read humidity error:%s\n, strerror(errno));return -5;}//读取三个字节数据后面的一个字节数据是CRC校验值manage_buf(buf, 3);//buf处理函数*humidity 125 * (((((int)buf[0]) 8) (buf[1] 0xfc)) / 65536.0) - 6;//湿度处理函数return 0;
}/初始化sht20,从设备地址位数以及软复位/
int sht20_init(char *i2c_dev)
{int fd;if((fd open(i2c_dev, O_RDWR)) 0){printf(Open %s error: %s\n, i2c_dev, strerror(errno));return -1;}ioctl(fd, I2C_TENBIT, 0);//选择地址长度0为7位地址非0为10位ioctl(fd, I2C_SLAVE, 0x40);//设置从设备的地址if(sht20_softreset(fd) 0){printf(SHT20 softreset failure\n);return -2;}return fd;
}/软复位/
int sht20_softreset(int fd)
{uint8_t buf[4];if(fd 0){printf(%s get invalid input arguments\n, FUNCTION);//无效的参数return -1;}memset(buf, 0, sizeof(buf));buf[0] SOFTRESET;//0xfe二进制1111 1110write(fd, buf, 1);//写入数据执行软复位mssleep(50);return 0;
}/毫秒级别函数实现/
void mssleep(unsigned long ms)
{struct timespec ts {.tv_sec (long int) (ms / 1000),.tv_nsec (long int) (ms % 1000) * 1000000ul};nanosleep(ts, 0);
}
Makefile
CCarm-linux-gnueabihf-gcc
APP_NAMEsht20all:clean\({CC} \){APP_NAME}.c -o \({APP_NAME}clean:rm -f \){APP_NAME}tftp搭建有问题的可以参考这篇文章wpa_supplicant无线网络配置imx6ull以及搭建tftp服务器 tftp服务器下载到开发板运行
rootigkboard:# tftp -gr sht20 192.168.0.172
rootigkboard:# chmod ax sht20
rootigkboard:# ./sht20 /dev/i2c-0
67 7c 7e
67 6e 5f
Temperature:24.182322C Humidity:44.498962%
67 80 81
67 6e 5f
Temperature:24.193047C Humidity:44.498962%
67 84 45
67 6e 5f
Temperature:24.203772C Humidity:44.498962%
67 88 38
67 7e 1c
Temperature:24.214497C Humidity:44.529480%
68 ec de
68 4e 40
Temperature:25.169031C Humidity:44.926208%
69 34 97
7e 5e 37
Temperature:25.362083C Humidity:55.698914%
6b 18 b5
95 aa 1d
Temperature:26.659819C Humidity:67.074341%
6b 68 4d
a6 12 84
Temperature:26.874321C Humidity:75.085205%
6e 14 bf
b2 76 16
Temperature:28.708313C Humidity:81.135315%
6c ac 60
bb 06 2d
Temperature:27.743053C Humidity:85.316223%
6b a0 b3
c0 a6 f0
Temperature:27.024473C Humidity:88.062805% 对着传感器哈气就会看见温湿度的变化。 毫秒级别函数实现可以参考这篇文章C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现 5- 代码难点巩固
1ioctl函数讲解
#include sys/ioctl.h
int ioctl(int fd, unsigned long request, …);在代码中我们使用ioctl函数给初始化sht20的从地址以及设置选择地址的长度为7位地址。 request参数我们用到了
I2C_SLAVE 设置从机地址I2C_TENBIT 选择地址长度0为7位地址非0为10位I2C_RETRIES 设置收不到ACK时的重试次数默认为1没有用到但是可以了解
参数使用就需要调用#include linux/i2c-dev.h头文件了
从时序中我们可以看见如果需要读和写的话需要发送1个字节数据然后等待从设备响应返回ACK但是如果使用ioctl系统调用初始化好i2c设备后设置从设备地址后便可以使用write和read系统调用进行数据的写入和读取方便很多。
2移位、与或处理数据
下面程序帮助理解都有注释实际应用中用多了也就比较熟练了。
#include stdio.h
#include stdlib.h
#include stdint.hint main(int argc, char *argv[])
{uint8_t buf[4];buf[0] 0xFF;//0xFF十六进制1111 1111二进制255十进制buf[1] 0xFC;//0xFC十六进制1111 1100二进制252十进制buf[2] 0xAA;//0xAA十六进制1010 1010二进制170十进制buf[3] 0x0B;//0x0B十六进制0000 0011二进制11 十进制/*其实只需要知道0x 0, 1x x 0|x x1|x 1 */printf(我想要将1111 1111 右移8bit\n);printf(1111 1111 8 : %d (1111 1111 0000 0000)\n\n, buf[0] 8); printf(我想让1010 1010 的最后2bit都变成00\n);printf(1010 1010 1111 1100 : %d (1010 1000)\n\n, buf[2] buf[1]);printf(我想让1010 1010 的最后2bit都变成11\n);printf(1010 1010 | 0000 0011 : %d (1010 1011)\n, buf[2] | buf[3]);return 0;
}
wangdengtaowangdengtao-virtual-machine:/wangdengtao/tftpboot$ gcc shift_and_circuit.c
wangdengtaowangdengtao-virtual-machine:/wangdengtao/tftpboot$ ./a.out
我想要将1111 1111 右移8bit
1111 1111 8 : 65280 (1111 1111 0000 0000)我想让1010 1010 的最后2bit都变成00
1010 1010 1111 1100 : 168 (1010 1000)我想让1010 1010 的最后2bit都变成11
1010 1010 | 0000 0011 : 171 (1010 1011)
- 上一篇: 青海公司网站建设哪家快网络购物网站备案
- 下一篇: 青海媒体网站建设公司可以做动漫的网站有哪些
相关文章
-
青海公司网站建设哪家快网络购物网站备案
青海公司网站建设哪家快网络购物网站备案
- 技术栈
- 2026年03月21日
-
青岛做网站推广公司冀州网站建设代理
青岛做网站推广公司冀州网站建设代理
- 技术栈
- 2026年03月21日
-
青岛做网站价格百度秒收录软件
青岛做网站价格百度秒收录软件
- 技术栈
- 2026年03月21日
-
青海媒体网站建设公司可以做动漫的网站有哪些
青海媒体网站建设公司可以做动漫的网站有哪些
- 技术栈
- 2026年03月21日
-
青海企业网站建设开发管理软件开发
青海企业网站建设开发管理软件开发
- 技术栈
- 2026年03月21日
-
青海省公路建设管理局官方网站搜多多搜索引擎入口
青海省公路建设管理局官方网站搜多多搜索引擎入口
- 技术栈
- 2026年03月21日






