电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
手把手教你DIY一款温湿度计
分 享
扫描二维码分享
手把手教你DIY一款温湿度计
温湿度计
单片机
oled
SingleYork
关注
发布时间: 2019-07-17
丨
阅读: 6625
大家好,今天笔者要跟大家分享一款“温湿度计”的制作,一说到温湿度检测,或许大家第一个想到的就是DHT11了吧,单总线接口,操作方便,或者就是SHT2X系列的,IIC总线接口,编程也是比较简单。但是你们可能想错了,笔者今天要介绍的主角不是他们。 我们在设计产品的时候,很多时候不仅仅要考虑到体积,同时也要考虑成本,然而上面两类传感器,DHT11的体积显然是比较大的,SHT2X系列的传感器,成本也会让人望而生畏。那么,有没有一款体积又小,价格又相对比较便宜的温湿度传感器呢?答案自然是肯定的!这不,今天笔者要给大家介绍的这款也是由奥松电子出品的温湿度传感器AHT10,既体积小,价格又相对比较便宜,当然,最重要的是精度也不差! 我们先来看一下这款温湿度传感器的参数基本参数,如下图所示: ![](https://cf02.ickimg.com/bbsimages/201907/1ff9272ebb8d32024d1d9cbf42d51e24.png) 接下来,我们再来看一下它的尺寸和封装,双列扁平无引脚SMD封装,体积仅有5*4*1.6mm,也算的上是非常的小巧了(当然,比SHT20的尺寸3*2.4*1.1来说,还是要大了一点,但是比起DHT11的尺寸15.5*12*5.5mm来说,小了就不是那么一点点了): ![](https://cf02.ickimg.com/bbsimages/201907/b2b91cb6f2ec50b41caf94e79d8a6c34.png) 至于价格方面嘛,DHT11在某宝差异比较大,有2块多的,也有5块多的,在某商城的价格基本在4.5左右(含税),SHT20含税在6块多一点,AHT10在某商城没看到,某宝基本在3.5左右!初步看来,AHT10的性价比似乎要高一些。 好了,关于这几款传感器就简单略过,毕竟他们不是本文的重点,因为今天笔者主要是要跟大家介绍AHT10这款传感器的应用。下图是笔者设计的一款产品,至于产品的用途就不多说了,这款板子上所用到的用于温湿度检测的传感器就是这款AHT10: ![](https://cf02.ickimg.com/bbsimages/201907/c59741f5651a5bf89e6b74d59df7f9ad.png) 为了便于SMT加工,主要元件基本都放置在了板子的背面,我们再来看下板子的正面,是由一个OLED模块和4个按键组成: ![](https://cf02.ickimg.com/bbsimages/201907/84e53c4ba167859f93afa8a692512edd.png) 主控MCU是用的STC8A8K64S4A12这款最新出的单片机,OLED模块用的中景园的IIC接口的0.96寸OLED模块,分辨率是128*64; ![](https://cf02.ickimg.com/bbsimages/201907/2353e0cae5b92234303a3ad20bc5edaa.png) ATH10的控制也很简单,直接IIC接口,除电源线外,另外只需2根线(SCL和SDA)即可,只是这里需要注意几点: 1. 产品在电路使用中主机MCU的供电电压必须与传感器一致; 2. IIC总线上仅能连接单个AHT10,且不能连接其它IIC器件。 ![](https://cf02.ickimg.com/bbsimages/201907/e7029215861e3c10f41a676a47069bcb.png) 好了,硬件部分连线很简单,就不多说了,接下来我们看软体设计部分,我们先来看下OLED界面,即最终我们要显示的效果: ![](https://cf02.ickimg.com/bbsimages/201907/92b7bad2a319cc88d41d0718e37816fc.png) OLED界面设计大致思路是这样的:我们将分辨率为128*64的OLED屏分成8行,其中: - 第0-1行,用来显示“温湿度计”4个16*16的汉字; - 第3-4行,用来显示温度信息; - 第6-7行,用来显示湿度信息; 于是,在程序中我们便可以这样设计: ![](https://cf02.ickimg.com/bbsimages/201907/4fa2798c3c6f29064538fd3d680bebd9.png) 这里用到了三个显示函数, OLED_ShowCHinese()、OLED_ShowNum()和OLED_ShowString(),分别用来显示汉字、数字和字符,其中OLED_ShowCHinese()函数的原型如下,兼容了16*16和32*32两种大小的字体: ![](https://cf02.ickimg.com/bbsimages/201907/c15bfcc8f174859014cbe4e9e709b099.png) 另外,OLED_ShowNum()函数和OLED_ShowString()函数的原型分别如下图所示: ![](https://cf02.ickimg.com/bbsimages/201907/28d618f99969dc102230713583342742.png) 跟OLED相关的驱动,基本都是由中景园提供的例程,然后做了一些不同大小字体匹配的修改,大家要是有什么不明白的地方,可以直接查看官方提供的资料,在此笔者也就不多说什么了。 关于字体取模,笔者也简单说下,利用中景园提供的取模软件,大致操作流程如下: 1、 将取模模式设置为“字符模式”: ![](https://cf02.ickimg.com/bbsimages/201907/4e7959077a0e61470bd19950b2696ed0.png) 2、 设置字模相关的参数: ![](https://cf02.ickimg.com/bbsimages/201907/7722e21b8ba537e237da418dd83e021f.png) 3、 设置字体及字号,然后输入我们要取模的汉字或字符,点击“生成字模”即可: ![](https://cf02.ickimg.com/bbsimages/201907/5b2da6bf4844f045696511dd3fed2ea7.png) 接下来,我们只需要将取模生产的文件复制到oledfont.h这个字库文件中即可: ![](https://cf02.ickimg.com/bbsimages/201907/a9f70b8f5cfb072e6766ba0266ffc06d.png) 当然咯,这个字库文件中本身就给我们提供了不同大小的常用的ASCII表的字库,所以,我们只需要添加其他这个字库中没有的字体即可。大家只要掌握了方法,笔者相信添加字库对大家来说应该是件很简单的事情!最终,笔者的字库文件如下图所示: ![](https://cf02.ickimg.com/bbsimages/201907/20c2d56699a254e05ca824c497793b99.png) 接下来,我们就要来看下ATH10的驱动程序,关于AHT10的驱动,官网也提供了基本的例程,所以,笔者也是基于官网例程,再根据身硬件做了一些小改动,官网例程链接:http://www.aosong.com/class-36.html。 ![](https://cf02.ickimg.com/bbsimages/201907/7989f0d68099f3d5c47c41d21689d58f.png) 接下来,我们就简单分析一下AHT10驱动相关的程序。首先,我们来看下AHT10初始化的指令: ![](https://cf02.ickimg.com/bbsimages/201907/3148308bb16a146b6db963aad64c8320.png) 咋一看,可能有点懵逼,但是,结合手册我们就不难理解,首先,我们从手册上知道ATH10的器件地址为0x38,然后它的读写指令格式就是:设备地址(7bit)+ SDA方向位(1bit),其中方向位读R:1,写W:0,指令构成如下图所示: ![](https://cf02.ickimg.com/bbsimages/201907/bc3dfd5e0f5dfd32baa0fdf4a471cb78.jpg) 在AHT10初始化的时候,我们是要配置系统寄存器的一些参数,所以应该是写,自然,这里首先就应该发送0x70,至于第二条指令0xe1,就是初始化命令了,后面跟着的0x08和ox00也是跟系统配置相关的指令,关于这几条指令的具体含义官方手册上并没有明确说明,因此,我们只需要知道按照这种方式发送指令就好了。 在初始化的时候,我们需要等待“校准是能位”为1时,才表示传感器已经工作正常了,如果没有读到这个“校准使能位”为1,则重新复位,继续发送初始化指令,若复位10次仍读不到改位为1,不再发送初始化指令,并返回0。从手册上我们知道,这个“校准使能位”是状态位中的bit[3]: ![](https://cf02.ickimg.com/bbsimages/201907/38053cf525468bb2f5a9da6c72bbafc4.png) 在初始化OK之后,我们就可以开始测量温湿度的值了,从数据手册上我们可以看到,要触发测量的话,我们需要发送如下四条指令: ![](https://cf02.ickimg.com/bbsimages/201907/7f3ad10a488a47f049db3dd940f09007.png) 也就是,我们程序中的0x70、0xac、0x33和0x00这四条指令: ![](https://cf02.ickimg.com/bbsimages/201907/99b34d863b80e7815930fa7224816fbb.png) 由于传感器在采集时需要时间,所以在主机发出测量指令(0xAC)后,我们需要延时75毫秒以上再读取转换后的数据并判断返回的状态位是否正常。若状态位bit[7]为0表示数据可正常读取,为1时传感器为忙状态,主机需要等待数据处理完成。 ![](https://cf02.ickimg.com/bbsimages/201907/ad5dcf75dbd4248d2afb846c9987dd98.png) 当数据可以正常读取时,我们就可以发送0x71这条指令,开始读取数据了,关于这里为什么是0x71而不是别的值,前面已经介绍过了AHT10读写指令构成了,在此就不做过多解释了。还是一样,我们来看下手册上的读指令说明: ![](https://cf02.ickimg.com/bbsimages/201907/870cc52d4aefeff07f0c8ba376c5531d.png) 从上图中我们可以知道,在主机发送读指令后,从机会返回6个byte的数据,分别是状态(8bit)、湿度数据(8bit)、湿度数据(8bit)、湿度数据(高4bit)、温度数据(低4bit)、温度数据(8bit)、温度数据(8bit),于是,我们在程序中设置了6个变量,用来存储这几个数据,并且,我们将温湿度的原始数据,也分别用一个变量来保存: ![](https://cf02.ickimg.com/bbsimages/201907/539014a9ead9938dfb9302429d7d8ad3.png) 接下来,我们就要根据手册提供的温湿度的转换公式,来对温湿度数据进行转换,首先,我们看下手册上的转换公式: ![](https://cf02.ickimg.com/bbsimages/201907/5962cf1ff6db0bba2c8d4de3658e26a4.png) 根据上述转换公式,我们可以在程序中做如下计算: ![](https://cf02.ickimg.com/bbsimages/201907/2ae99ab5fab8273fc6f86db950a6751f.png) 至此,温湿度的采集和显示,就OK了,我们看下最终的温湿度数据转换并在OLED显示的这部分完整代码: ![](https://cf02.ickimg.com/bbsimages/201907/c52d3fc0bfa0bed3e243a1043c36b7fa.png) 好了,关于这款温湿度计的制作,笔者就简单介绍到这里了,大家如果感兴趣的话,可以某宝买现成的模块,自己DIY一个,站内私信可以向笔者索取源代码,感谢大家的支持,如果喜欢这篇文章的话,欢迎点赞并转发哟!
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
13
)
SingleYork
擅长:消费电子、工控电子、安防电子、光电显示、设计,制造及服务,测试仪器及设备
关注
评论
(3)
登录后可评论,请
登录
或
注册
Coke
219
天前...
666,我弄了好久都没弄好,能吧源码发给我不
0
回复
发布
阿紫
216
天前...
做的非常好
0
回复
发布
b135fc337b3db121
162
天前...
真厉害!
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交