传感器介绍: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)
|