上一篇介绍了i2c协议,SHT20是使用标准的i2c接口的温湿度传感器,我们首先要完成树莓派与SHT20传感器的连接:

使能内核I2C驱动模块:

liruiyan@cloud-ubuntu18:~$  sudo raspi-config


重启树莓派,系统启动之后会自动安装i2c的相关驱动:

liruiyan@cloud-ubuntu18:~$  sudo reboot
liruiyan@cloud-ubuntu18:~$  sudo apt-get install i2c-tools
liruiyan@cloud-ubuntu18:~$  lsmod | grep i2c
i2c_bcm2835         16384 0
i2c_dev             16384 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

使用i2cdetect命令可以查看到SHT21温湿度传感器设备地址0x40。
i2c设备驱动有两种模式:一种是用户模式设备驱动,这种驱动依赖于i2c子系统中i2c-dev驱动,这种驱动对应用程序员的要求很高,要
求应用程序员了解硬件的一些东西,了解时序、地址等;另一种是普通的设备驱动,应用程序员在使用的时候就像读写文件
一样,不过这里的read()和write()函数只能对应一条消息。
liruiyan@cloud-ubuntu18:~$ vim sht20.c

  1 #include <stdio.h>2 #include <fcntl.h>3 #include <unistd.h>4 #include <sys/ioctl.h>5 #include <linux/types.h>6 #include <sys/stat.h>7 #include <linux/i2c.h>8 #include <linux/i2c-dev.h>9 #include <stdio.h>10 #include <stdlib.h>11 #include <sys/types.h>12 #include <string.h>13 #include <stdint.h>14 #include <time.h>15 #include <errno.h>16 #include <string.h>17 #define SOFTRESET                        0xFE 18 #define TRIGGER_TEMPERATURE_NO_HOLD      0xF3   //监测温度19 #define TRIGGER_HUMIDITY_NO_HOLD         0xF5   //监测湿度20 //#define I2C_API_IOCTL  /* Use I2C userspace driver ioctl API */21 #define I2C_API_RDWR  /* Use I2C userspace driver read/write API */22 static inline void msleep(unsigned long ms);23 static inline void dump_buf(const char *prompt, uint8_t *buf, int size);24 int sht2x_init(void); int sht2x_softreset(int fd);25 int sht2x_get_serialnumber(int fd, uint8_t serialnumber, int size);26 int sht2x_get_temp_humidity(int fd, float temp, float *rh);27 28 29 static inline void msleep(unsigned long ms)30 {31     struct timespec cSleep;32     unsigned long ulTmp;33     cSleep.tv_sec = ms / 1000;34 35     if (cSleep.tv_sec == 0)36     {37         ulTmp = ms * 10000;38         cSleep.tv_nsec = ulTmp * 100;39     }40     else41     {42         cSleep.tv_nsec = 0;43     }44     nanosleep(&cSleep, 0);45 }46 47 static inline void dump_buf(const char *prompt, uint8_t *buf, int size)48 {49     int          i;50     if( !buf )51     {52         return ;53     }54     if( prompt )55     {56         printf("%s ", prompt);57     }58     for(i=0; i<size; i++)59     {60         printf("%02x ", buf[i]);61     }62     printf("\n");63     return ;64 }65      /*设备初始化*/66 int sht2x_init(void)67 {68     int     fd;69     if( (fd=open("/dev/i2c-1", O_RDWR)) < 0)70     {71         printf("i2c device open failed: %s\n", strerror(errno));72         return -1;73     }74     /* set I2C mode and SHT2x slave address */75     ioctl(fd, I2C_TENBIT, 0);    /* Not 10-bit but 7-bit mode */76     ioctl(fd, I2C_SLAVE, 0x40); /* 我的sht20设备地址 */77     return fd;78 }79 80       /* 软复位 */81 int sht2x_softreset(int fd)82 {83     uint8_t           buf[4];84     if( fd<0 )85     {86         printf("%s line [%d] %s() get invalid input arguments\n", __FILE__, __LINE__, __func__ );87         return -1;88     }89     /* software reset SHT2x */90     memset(buf, 0, sizeof(buf));91     buf[0] = SOFTRESET;92     write(fd, buf, 1);93     msleep(50);94 95     return 0;96 }97 98     /*获取温湿度*/99 int sht2x_get_temp_humidity(int fd, float *temp, float *rh)    //获取温湿度
100 {101     uint8_t           buf[4];
102     if( fd<0 || !temp || !rh )
103     {104         printf("%s line [%d] %s() get invalid input arguments\n", __FILE__, __LINE__, __func__ );
105         return -1;
106     }
107
108     /* send trigger temperature measure command and read the data */
109     memset(buf, 0, sizeof(buf));
110     buf[0]=TRIGGER_TEMPERATURE_NO_HOLD;
111     write(fd, buf, 1);  //发送监测温度命令
112
113     msleep(85); /* datasheet: typ=66, max=85 */
114     memset(buf, 0, sizeof(buf));
115     read(fd, buf, 3);  //读取温度
116     dump_buf("Temperature sample data: ", buf, 3);
117     *temp = 175.72 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 46.85;
118
119     /* send trigger humidity measure command and read the data */
120
121     memset(buf, 0, sizeof(buf));
122     buf[0] = TRIGGER_HUMIDITY_NO_HOLD;
123     write(fd, buf, 1);  //发送湿度监测命令
124     msleep(29); /* datasheet: typ=22, max=29 */
125     memset(buf, 0, sizeof(buf));
126     read(fd, buf, 3);
127     dump_buf("Relative humidity sample data: ", buf, 3);
128     *rh = 125 * (((((int) buf[0]) << 8) + buf[1]) / 65536.0) - 6;
129
130     return 0;
131 }
132                  /*获取序列号*/
133 int sht2x_get_serialnumber(int fd, uint8_t *serialnumber, int size)
134 {135     uint8_t buf[4];
136     if( fd<0 || !serialnumber || size!=8 )
137     {138         printf("%s line [%d] %s() get invalid input arguments\n", __FILE__, __LINE__, __func__ );
139         return -1;
140     }
141     memset(buf, 0, sizeof(buf));
142     buf[0] = 0xfa;
143     buf[1] = 0x0f;
144     write(fd, buf, 2);
145
146     memset(buf, 0, sizeof(buf));
147     read(fd, buf, 4);
148
149     serialnumber[5]=buf[0]; /*  Read SNB_3 */
150     serialnumber[4]=buf[1]; /*  Read SNB_2 */
151     serialnumber[3]=buf[2]; /*  Read SNB_1 */
152     serialnumber[2]=buf[3]; /*  Read SNB_0 */
153
154     memset(buf, 0, sizeof(buf) );
155     buf[0]=0xfc; /*  command for readout on-chip memory */
156     buf[1]=0xc9; /*  on-chip memory address */
157     write(fd, buf, 2);
158
159     memset(buf, 0, sizeof(buf) );
160     read(fd, buf, 4);
161     serialnumber[1]=buf[0]; /*  Read SNC_1 */
162     serialnumber[0]=buf[1]; /*  Read SNC_0 */
163     serialnumber[7]=buf[2]; /*  Read SNA_1 */
164     serialnumber[6]=buf[3]; /*  Read SNA_0 */
165     dump_buf("SHT2x Serial number: ", serialnumber, 8);
166
167     return 0;
168 }
169 int main(int argc, char **argv)
170 {171     int fd;
172     float temp;
173     float rh;
174     uint8_t serialnumber[8];
175     fd = sht2x_init();
176     if(fd < 0)
177     {178         printf("SHT2x initialize failure\n");
179         return 1;
180     }
181     if( sht2x_softreset(fd) < 0 )
182     {183         printf("SHT2x softreset failure\n");
184         return 2;
185     }
186     if( sht2x_get_serialnumber(fd, serialnumber, 8) < 0)
187     {188         printf("SHT2x get serial number failure\n");
189         return 3;
190     }

运行结果:

SHT2x Serial number: 40 01 7c 38 da 3e 00 c9
Temperature sample data: 72 28 dd
Relative humidity sample data: 9e 66 3d
Temperature=31.507563 ℃ relative humidity=71.342987%

基于树莓派SHT20温湿度采样相关推荐

  1. 树莓派环境处理_一种基于树莓派的便携式的环境监测系统的制作方法

    本发明涉及通讯技术领域,尤其涉及一种基于树莓派的便携式的环境监测系统. 背景技术: 树莓派是尺寸仅有信用卡大小的一个小型电脑,可以将树莓派连接电视.显示器.键盘鼠标等设备使用.树莓派能替代日常桌面计算 ...

  2. python与室内设计_基于树莓派和Python的智能家居系统设计

    基于树莓派和 Python 的智能家居系统设计 许礼捷 葛华 陈红 [摘 要] 介绍树莓派第 3 代开发平台,融合 Python 开发技术和 OneNET 云 平台通信技术等先进技术,设计一款智能化的 ...

  3. 基于树莓派的智能家居控制系统设计论文参考

    完整论文咨询可WX联系:gyf1842965496 智能家居控制系统功能实现详细介绍:基于树莓派的智能家居控制系统设计https://blog.csdn.net/G1842965496/article ...

  4. 基于树莓派的智能家居控制系统设计

    基于树莓派的智能家居控制系统设计 完整文件下载 基于树莓派的智能家居控制系统设计 https://download.csdn.net/download/G1842965496/85802405 一.功 ...

  5. 基于 树莓派4 + STM32H7 构建支持云端应用的嵌入式系统平台 【一】

    基于 树莓派4 + STM32H7 构建支持云端应用的嵌入式系统平台 [一] 一. 想法概述 1. 想法由来 2. 系统架构 3. 系统选型 4. 开发语言 5. 涉及到的框架 6. 开发工具 7. ...

  6. 基于树莓派的空气监测系统(1)项目介绍

    基于树莓派的空气监测系统(1)项目介绍 项目开发使用的知识点包括:Qt程序设计,Python编程,文件编程,串口编程,树莓派驱动程序开发. 嵌入式系统学习 视频地址 嵌入式学习资料 资料地址 项目参考 ...

  7. 基于树莓派实现平菇栽培种 自动种植系统的设计和实现

     基于树莓派实现平菇栽培种 自动种植系统的设计和实现 徐征宇 韩佳辰 摘 要:本文从树莓派实现温湿度和二氧化碳浓度远程监测控制系统的搭建.平菇种植的特点.远程控制支持三个层次介绍了基于树莓派实现平菇栽 ...

  8. 基于树莓派+传感器+阿里云IoT的智能家居管理(代码实现)

    视频教程已经放在B站 请大家狠狠地三连我 虽然我没有稚晖君那么强 教程!基于树莓派+传感器+阿里云IoT的智能家居管理(2) 主文件 #!/usr/bin/python3import aliLink, ...

  9. 基于树莓派的智能垃圾桶

    基于树莓派的智能垃圾桶项目 预计所需要实现的功能 通过感应能够实现垃圾桶盖子的自动开关. 垃圾桶上装载OLED屏,屏幕上需要显示,温度,时间. 远程控制通过电脑端实现控制垃圾桶的移动. 功能模块: 1 ...

  10. 树莓派云音乐c语言,基于树莓派的红外遥控版网易云音乐播放器

    基于树莓派的红外遥控版网易云音乐播放器.下面是遥控键盘示意图: CH- CH CH+ << >> || - + EQ 0 100+ 200+ 1 2 3 4 5 6 7 8 9 ...

最新文章

  1. python和R对dataframe的拼接、采样、链式操作:dplyr、tidyr、concat、rbind、cbind、sample、sample_n、set.seed、mutate、filter
  2. Linux日志系统-06:案例2-实现httpd的日志滚动分割
  3. js laypage mysql_layui中的分页laypage
  4. Mysql5.6.21源码安装
  5. 【C++学习笔记二】C++继承
  6. chrome介绍与用法
  7. gpl2 gpl3区别_GPL的下降?
  8. 42Exchange 2010升级到Exchange 2013-证书申请配置
  9. 有什么优质的计算机专业书籍?操作系统、计算机网络、计算机组成、数据结构、数据库.....
  10. 成都理工大学计算机考研资料汇总
  11. poi-tl导出word出错
  12. mysql 赋权_《MySQL数据库》MySQL用户赋权
  13. 特斯拉因辅助驾驶发生致命车祸;APUS发布AiLMe大模型;欧洲成立人工智能研究中心来监督大型平台丨每日大事件...
  14. 如何用两台虚拟机搭建LAMP架构访问qq农场
  15. 中间件小师妹 de 年度工作总结
  16. 浅谈“双平面”冗余架构
  17. 开源阅读书源_最好用的阅读软件之一
  18. 用Swift做个游戏Lecture04 —— 仙人掌的狙击
  19. dcdc电源 拓扑 分析
  20. 数据恢复陶工西数500GWD5000AAKX-08U6AA0摔敲盘不认紫色线圈磁头开盘恢复数据

热门文章

  1. reportviewer动态加载报表的实现以及动态控制报表,套打,存折打印模式等的一些探讨,欢迎批评指正!
  2. android 自定义控件实现3D画廊效果
  3. js实现table中td单元格合拼并求和
  4. ThinkPad Tablet2升级Windows10(各种故障及解决方案)
  5. 不同内核浏览器的差异以及浏览器渲染简介
  6. SLIC 超像素分割(C++)
  7. LeapFTP 使用指南
  8. 比鲁大师好的测试电脑软件,电脑跑分软件哪个好?好用的电脑跑分软件盘点
  9. 软件项目管理--软件工作量估算
  10. 项目中报Assign array to a variable before exporting as module default 这个错