找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3004|回复: 1
打印 上一主题 下一主题
收起左侧

基于SHT31的温湿度液晶显示变送器(含完整程序代码)

[复制链接]
跳转到指定楼层
楼主

         传感器介绍:SHT-31是一款低成本环境温湿度检测模块。
         工作电压 2.4-5.5v 功耗小,体积小,采用DFN封装工艺。
         其工作原理,是通过单片机读取温度湿度数据,IIC通信方式输出。
         特点:体积小,高性价比,IIC通信。
         主要应用:远程遥测装置,通风和空调系统,温控器,恒湿器等。

         显示器:产品上常用的LCD12864液晶显示屏:JLX12864G-086-PN

根据本资料可以设计制作出一个高精度的温湿度计,程序里面有算法补偿处理。另外本人将模块温湿度值与标准表对比,数值几乎一致,温度相差±0.1℃,相对湿度相差±0.2%RH,说明设计的精度还是很不错的。
先看下硬件接线图和原理图:



使用到的显示器LCD12864是 JLX12864G-086-PN;资料介绍:(某一个宝搜索 晶联讯电子 找到12864G-086-PC)
下面看下程序部分:
主函数部分:

c
#include "system.h"
#include "sht3x.h"
#include "math.h"
#include "i2c_hal.h"
#include "lcd12864.h"
#include <intrins.h>

ft temperature; // 温度 [°C]
ft humidity; // 湿度 [%RH]

unsigned char datas[7]={ 0,0,0,0,0,0,0,};
void Delay100us(unsigned int j);
void SHT3X_Init(u8t i2cAddress);
void SHT3X_SetI2cAdr(u8t i2cAddress);
etError SHT3X_GetTempAndHumi(ft* temperature, ft* humidity,
                             etRepeatability repeatability, etMode mode,
                             u8t timeout);
void Write_IIC_Byte(unsigned char IIC_Byte);     //显示静态字符函数

void Display_Init()
{
                display_char(1,32,16,16,10);       //显示:温湿度计
                display_char(1,48,16,16,11);
                display_char(1,64,16,16,12);
                display_char(1,80,16,16,13);
        
          display_char(4,43,8,16,15);           //默认符号为正   8*16
                display_char(4,0,16,16,10);       //显示: 温度:
                display_char(4,16,16,16,12);
                display_char(4,32,9,16,14);
                display_char(4,108,16,16,17);    //显示   ℃

                display_char(7,0,16,16,11);                         //显示:  湿度:
                display_char(7,16,16,16,12);
                display_char(7,32,9,16,14);
          display_char(7,98,9,16,18);                         //显示:  %RH
                display_char(7,107,9,16,19);
                display_char(7,116,9,16,20);
}

void Display_TH(int a,int b)            //显示动态值:温湿度值
{        
          if(a<0)
                {
                                 display_char(4,43,8,16,21);           //符号为正   8*16
                           a=abs(a);                                                                                               //取绝对值
                }
                else
                {
                                        display_char(4,43,8,16,15);           //符号为正   8*16
                }
          datas[0]=a/1000;      //温度
                datas[1]=a%1000/100;
                datas[2]=a%1000%100/10;
                datas[3]=a%1000%100%10;
               
                datas[4]=b/100;    //湿度
                datas[5]=b%100/10;
                datas[6]=b%100%10;
        
                display_char(4,53,11,16,datas[0]);    //温度值xx.xx
                display_char(4,64,11,16,datas[1]);
                display_char(4,75,8,16,16);           //小数点
                display_char(4,83,11,16,datas[2]);
                display_char(4,94,11,16,datas[3]);
               
                display_char(7,53,11,16,datas[4]);          //湿度值xx.x
                display_char(7,64,11,16,datas[5]);
                display_char(7,75,8,16,16);         
                display_char(7,83,11,16,datas[6]);        
}



int main(void)
{
    SHT3X_Init(0x44) ;           //传感器初始化,IIC地址默认为0x44
                initial_lcd();
                delay(100);
                clear_screen();                  //清屏
          Display_Init();           //显示静态字符,“温湿度计”等
        
                while(1)
           {
          int a,b;
                etError error;
                I2c_StartCondition();                //iic通信开始信号
                if(SHT_SDA != 0){}                   // 错误,一直等待
                //50:等待时钟扩展的等待时间
            error =SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_CLKSTRETCH, 50);               
                I2c_StopCondition();
                        
                a=floor(temperature*100);              //温度值放大100倍,显示2未小数         
                b=floor(humidity*10) ;                //温度值放大10倍
    Display_TH(a,b);                      //lcd刷新显示温湿度值
                delay(1000);    //延时2s
                }
}
```
   上面的display_char(4,53,11,16,datas[0]);是我经过多次调试得到的最佳显示效果:既要字体大充分利用显示区域,又要排版美观合理,还是花了一点时间。                                   
   通过这次设计,对个人能力又有了一定程度的提高;后续考虑做一个便携式的温湿度计,在日常生活和工作中都会有用处:采用CR2032电池和USB供电共存的供电方式,显示器采用双排8字段式液晶屏QYT12429,可用1621芯片驱动。芯片采用STC8H1K08即可,因为使用到的硬件资源并不多。
最后把设计完整的程序代码奉上:[点此获取](https://download.csdn.net/download/weixin_43412560/17952889)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:337280 发表于 2022-8-3 15:30 | 只看该作者
能在这个论坛分享程序吗?没有C币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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