找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7782|回复: 23
收起左侧

单片机SHT20+BH1750+BMP180温湿度、气压、光照度三合一设计

  [复制链接]
ID:479446 发表于 2019-2-22 18:37 | 显示全部楼层 |阅读模式
  最近一直想做一个可以检测温湿度的,光照强度,还有气压检测的仪表。而且要精度高反应快的传感器,在网上找了一圈,看的眼花缭乱,符合要求的价格都不低,无意中看到某宝看到一个温湿度、气压、光照度三合一的传感模块,最重要的是模块上面集成的温湿度芯片是我首选的SHT20,还有光照强度传感器BH1750. ,都符合自己的要求,这2款芯片在大学的时候就有所了解,算是温度检测和光照检测领域里,精度高,体积非常小,性价比很高的一款。气压传感器一般都是采用BMP180或者BMP085,这2个芯片也差不多的,现在用BMP180的感觉要多一些。非常符合设计需要。 再加上这个模块是串口输出,直接就可以读取数据啦。哈哈哈,根本不需要自己去进行3个传感器的驱动代码编程,。(其实之前我也买个单独的模块回来,本来打算3个模块并联使用,,奈何程序花了好几天时间都没有调试通过,后来模块直接都不知道丢哪里去了。)。于是果断重新就此准备自己重新制作一个。        因为是模块,没有相关的显示屏,硬着头皮问卖家能不能拿送个显示屏................结果和预想的一样。需要单独购买。好吧,又买了一块单片机的板子,到手拼接后,开始查资料制作,于是出现了此贴。

     从单片机板子和模块到手后 到制作完成总共花了1天时间!附实物图与相关程序,留给需要的人吧!其实还可以通过气压大小,有相应来计算出海拔高度。过段时间更新的时候我在上传上来。。。。3合1模块上的传感器:CMCU-01 SHT20+BMP180+BH1750FVI

2.jpg 1.jpg
各传感器的参数介绍:
================================================
SHT20是瑞士Sensirion 数字温湿度传感器。 SHT20数字温湿度传感器是众多温湿度传感器中一款性价比高的产品,配有4C 代CMOSens®芯片。除了配有电容式相对湿度传感器和能隙温度传感器外,该芯片还包含一个放大器、A/D 转换器、OTP 内存和数字处理单元。用量以百万计,且应用领域广泛。该类传感器适用于对成本极其敏感但又注重品质的大批量生产的行业。 同时具有很高的温度精度和湿度精度。 SHT20系列模块专为低功耗小体积应用设计,具有良好的品质、快的响应速度、抗干扰能力强、性价比高等优点、极低的功耗。懂行的人都知道它的优点。传感器重要参数:                   湿度测量范围:0—100%RH
湿度精度范围(10%RH to 95%RH): ±3%RH温度测量范围: -40℃—125℃  (-40 - +257°F)温度精度范围:±0.3℃湿度迟滞:±1%RH测量时间:50ms年漂移量:-0.5%RH/year响应时间:5 s
=================================================
BMP180是一款高精度、小体积、超低能耗的压力传感器,可以应用在移动设备中
它的性能卓越,绝对精度最低可以达到0.03hPa,并且耗电极低,只有3μA,采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总线直接与各种微处理器相连
主要特点:
压力范围:300~1100hPa(海拔9000米~-500米),从这里可以看出来,该模块还可以通过公式计算海拔高度哦~
低功耗:5μA,在标准模式
高精度:低功耗模式下,分辨率为0.06hPa(0.5米)
高线性模式下,分辨率为0.03hPa(0.25米)

======================================================BH1750FVI
采用ROHM原装BH1750FVI芯片
光照度范围:0-65535 lx   (有没有发现比光敏电阻强N倍?)
传感器内置16bitAD转换器
直接数字输出,省略复杂的计算,省略标定
不区分环境光源
接近于视觉灵敏度的分光特性
可对广泛的亮度进行1勒克斯的高精度测定

===============================================

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include"LCD1602.h"

  4. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  5. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替


  6. uchar rxfalg=1;
  7. uchar Byte1,Byte2,Byte3,Byte4,Byte5,Byte6,Byte7,Byte8,Byte9,Byte10,Byte11,Byte12,Byte13,Byte14,Byte15,Byte15,Byte16;

  8. uint Light,Pressure,Temp; //定义的光照强度,气压,温度。
  9. uchar Humi; //湿度
  10. /*********************************************************/
  11. // 毫秒级的延时函数,time是要延时的毫秒数
  12. /*********************************************************/
  13. void DelayMs(uint time)
  14. {
  15.         uint i,j;
  16.         for(i=0;i<time;i++)
  17.                 for(j=0;j<112;j++);
  18. }



  19. /*********************************************************/
  20. // 串口初始化
  21. /*********************************************************/
  22. void UartInit()
  23. {
  24.         SCON = 0x50;        // 配置串口寄存器
  25.         TMOD = 0x20;        // 配置定时器寄存器
  26.         TH1  = 0xfd;        // 计算波特率的值为9600
  27.         TL1  = 0xfd;        // 计算波特率的值为9600
  28.         EA   = 1;                        // 打开总中断
  29.         ES   = 1;                        // 打开串口中断
  30.         TR1  = 1;                        // 启动定时器
  31. }


  32. /*********************************************************/
  33. // 主函数
  34. /*********************************************************/
  35. void main(void)
  36. {

  37.   LCDInt(); //液晶初始化
  38.         UartInit();                                                        // 串口初始化
  39.   DelayMs(500);

  40.              SetXY(0,0); // 光照
  41.                          LCDWriteDate('L');
  42.                          LCDWriteDate(':');
  43.              SetXY(0,7);
  44.              LCDWriteDate('L');
  45.              LCDWriteDate('x');
  46.        
  47.              SetXY(1,0); // 气压
  48.                          LCDWriteDate('P');
  49.                          LCDWriteDate(':');
  50.              SetXY(1,8);
  51.              LCDWriteDate('K');
  52.              LCDWriteDate('p');
  53.           
  54.             
  55.              SetXY(0,10); // 温度
  56.                          LCDWriteDate('T');
  57.                          LCDWriteDate(':');
  58.             // SetXY(0,15); //
  59.                         // LCDWriteDate(0XDF);
  60.                        
  61.              SetXY(1,11); //湿度
  62.                          LCDWriteDate('H');
  63.                          LCDWriteDate(':');
  64.                          SetXY(1,15); //
  65.        LCDWriteDate('%');
  66.                        
  67.        
  68.         while(1)
  69.         {
  70.                
  71.                  
  72.                 if(rxfalg==0)
  73.                 {
  74.                          rxfalg=1;
  75.                  
  76.                   //光照强度
  77.                    SetXY(0,2); //
  78.        LCDWriteDate(Light/10000+0x30);
  79.                          LCDWriteDate(Light%10000/1000+0x30);
  80.                          LCDWriteDate(Light%1000/100+0x30);
  81.                          LCDWriteDate(Light%100/10+0x30);
  82.                          LCDWriteDate(Light%10+0x30);
  83.                        
  84.                          //气压强度
  85.                    SetXY(1,2); //
  86.        LCDWriteDate(Pressure/10000+0x30);
  87.                          LCDWriteDate(Pressure%10000/1000+0x30);
  88.                          LCDWriteDate(Pressure%1000/100+0x30);
  89.                          LCDWriteDate('.');
  90.                          LCDWriteDate(Pressure%100/10+0x30);
  91.                          LCDWriteDate(Pressure%10+0x30);
  92.                        
  93.                          //温度
  94.                    SetXY(0,12); //
  95.        LCDWriteDate(Temp/100+0x30);
  96.                          LCDWriteDate(Temp%100/10+0x30);
  97.                          LCDWriteDate('.');
  98.        LCDWriteDate(Temp%10+0x30);
  99.                          
  100.                          //湿度
  101.                    SetXY(1,13); //
  102.        LCDWriteDate(Humi/10+0x30);
  103.        LCDWriteDate(Humi%10+0x30);
  104.                        
  105.                 }
  106.                
  107.            DelayMs(500);
  108. }

  109. }

  110. /*********************************************************/
  111. // 串口中断服务程序
  112. /*********************************************************/
  113. void UartInt(void) interrupt 4
  114. {
  115.       ES = 0;                           //关串口中断,防止中断嵌套

  116.                         while(!RI);                        // 固定位0XAA
  117.                         Byte1=SBUF;
  118.                         RI=0;

  119.                         while(!RI);                        // Byte2 预留
  120.                         Byte2=SBUF;
  121.                         RI=0;
  122.                        
  123.                         while(!RI);                        // Byte3 预留
  124.                         Byte3=SBUF;
  125.                         RI=0;
  126.                        
  127.                         while(!RI);                        // Byte4 预留
  128.                         Byte4=SBUF;
  129.                         RI=0;
  130.        
  131.                   while(!RI);                        // Byte5 预留
  132.                         Byte5=SBUF;
  133.                         RI=0;
  134.                        
  135.                         while(!RI);                        // Byte6 光照强度高8位
  136.                   Byte6=SBUF;
  137.                         RI=0;
  138.                        
  139.                         while(!RI);                        // Byte7 光照强度低8位
  140.                         Byte7=SBUF;
  141.                         RI=0;
  142.                        
  143.                         while(!RI);                        // Byte8  气压高8位
  144.                         Byte8=SBUF;
  145.                         RI=0;
  146.                        
  147.                         while(!RI);                        // Byte9  气压低8位
  148.                         Byte9=SBUF;
  149.                         RI=0;
  150.                        
  151.                         while(!RI);                        // Byte10 温度正负标志位
  152.                         Byte10=SBUF;
  153.                         RI=0;
  154.                        
  155.                         while(!RI);                        // Byte11 温度高8位
  156.                         Byte11=SBUF;
  157.                         RI=0;
  158.                        
  159.                         while(!RI);                        // Byte12  温度低8位
  160.                         Byte12=SBUF;
  161.                         RI=0;
  162.                        
  163.                         while(!RI);                // Byte13  湿度
  164.                         Byte13=SBUF;
  165.                         RI=0;
  166.                        
  167.                         while(!RI);                        // Byte14 校验和 高8位
  168.                         Byte14=SBUF;
  169.                         RI=0;
  170.                        
  171.                         while(!RI);                        // Byte15  校验和 低8位
  172.                         Byte15=SBUF;
  173. ……………………

  174. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
程序,相关文档资料测试通过.zip (3.78 MB, 下载次数: 305)

评分

参与人数 2黑币 +115 收起 理由
perfect123 + 15 共享资料的黑币奖励!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:403916 发表于 2019-2-22 20:26 | 显示全部楼层
谢谢楼主分享经验哦,互相进步!
回复

使用道具 举报

ID:403916 发表于 2019-2-22 20:30 | 显示全部楼层
问一下这个单片机板子叫什么啊?可以从网上买到吗?
回复

使用道具 举报

ID:479446 发表于 2019-2-22 21:33 | 显示全部楼层
1061897836 发表于 2019-2-22 20:30
问一下这个单片机板子叫什么啊?可以从网上买到吗?

单片机板子可以在网上买的,卖模块的那里一般就有,我就是懒得焊接,所以买了一个现成的板子。  其实可以自己焊接一个最小系统板,另外加一块液晶显示屏LCD1602就可以了。程序里面都有液晶显示屏的IO口注释。测出来的数据非常准确。
回复

使用道具 举报

ID:82854 发表于 2019-2-25 19:41 来自手机 | 显示全部楼层
请问Tx Rx 分别接单片机什么端口?谢谢。。
回复

使用道具 举报

ID:479446 发表于 2019-2-26 17:37 | 显示全部楼层
tclgx 发表于 2019-2-25 19:41
请问Tx Rx 分别接单片机什么端口?谢谢。。

单片机的串口。就是P3.0(RXD) 和P3.1(TXD)
回复

使用道具 举报

ID:245466 发表于 2019-3-6 23:38 | 显示全部楼层
太棒了,好资料。
回复

使用道具 举报

ID:130345 发表于 2019-3-7 11:04 | 显示全部楼层
楼主买得是50块一个的那种串口输出的模块吗?记得那家淘宝有分三种价位。
回复

使用道具 举报

ID:479446 发表于 2019-3-9 18:39 | 显示全部楼层
持勤补拙 发表于 2019-3-7 11:04
楼主买得是50块一个的那种串口输出的模块吗?记得那家淘宝有分三种价位。

嗯。是的。串口的。好像是40块钱吧
回复

使用道具 举报

ID:461137 发表于 2019-3-14 17:45 | 显示全部楼层
LZ,能说说BMP180+BH1750的各个接口都接单片机的哪个接口吗?
回复

使用道具 举报

ID:479446 发表于 2019-3-16 18:53 | 显示全部楼层
lml0508 发表于 2019-3-14 17:45
LZ,能说说BMP180+BH1750的各个接口都接单片机的哪个接口吗?

单片机串口
回复

使用道具 举报

ID:461137 发表于 2019-3-16 21:27 | 显示全部楼层

那BMP1750有个ADDR引脚接单片机哪个端口呢?
回复

使用道具 举报

ID:479446 发表于 2019-3-19 19:42 | 显示全部楼层
lml0508 发表于 2019-3-16 21:27
那BMP1750有个ADDR引脚接单片机哪个端口呢?

不用接。
回复

使用道具 举报

ID:340738 发表于 2019-4-28 19:04 | 显示全部楼层
请问大神,用stm32f103rct6,iic模式下,可以传送三个传感器的数据吗?

回复

使用道具 举报

ID:261045 发表于 2019-5-17 22:34 | 显示全部楼层
谢谢,很好的东东,正需要它,下载看看,谢谢啦!!!!
回复

使用道具 举报

ID:261045 发表于 2019-5-17 22:35 | 显示全部楼层
谢谢,正需要这个东东,就不知道程序能不能用,下载来看看再说啦!!!!
回复

使用道具 举报

ID:261045 发表于 2019-5-17 22:44 | 显示全部楼层
SHT20+BH1750+BMP180,这几个传感器都在那个小板上面吗?谢谢
回复

使用道具 举报

ID:585365 发表于 2019-9-11 20:28 | 显示全部楼层
正在学习这方面的知识,谢谢
回复

使用道具 举报

ID:92810 发表于 2019-10-29 14:34 | 显示全部楼层
太棒了,好资料。
回复

使用道具 举报

ID:165363 发表于 2019-11-21 17:00 | 显示全部楼层
感谢楼主分享资料和例程。
回复

使用道具 举报

ID:214276 发表于 2020-3-13 17:01 | 显示全部楼层
下载来试试看。我也有个BMP180的模块调试好了。
回复

使用道具 举报

ID:105771 发表于 2020-5-13 08:46 | 显示全部楼层
多谢分享,正好在找
回复

使用道具 举报

ID:65237 发表于 2020-5-14 21:21 | 显示全部楼层
谢谢分享 收下了
回复

使用道具 举报

ID:85508 发表于 2022-12-11 18:12 | 显示全部楼层
温度、湿度、气压、照度,功能强大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表