温湿度传感器一直显示一个值,把线重新接一下又显示实际值了,用几天又坏了,怎么解决?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了温湿度传感器一直显示一个值,把线重新接一下又显示实际值了,用几天又坏了,怎么解决?相关的知识,希望对你有一定的参考价值。
我猜你用的是温湿度变送器,而且温湿度传感元件是数字元件。一直显示一个值,说明传感器本身或者负责变送的MCU死机了。重新接线又能恢复正常,然后过几天又坏了,更加证实了我的说法。这是很典型的数字传感器死机现象。
死机的原因有很多,主要有一下几种:
1、温湿度传感器附近有变频器、大功率电器或者动力电缆。
2、温湿度传感器的导线本身质量不好。
3、数字传感器本身老化,内部接触不良。
第一种可能性最大。解决办法就是把传感器的导线换成屏蔽导线,并把屏蔽层接地。同时,尽可能让传感器原理变频器、大功率电器或者动力电缆。第二种问题也可以用第一种解决方案。如果换了导线以后还是不定期死机,就只能换新的传感器了。 参考技术A 高湿度下长期工作,对传感器造成了很严重的损伤.
C51 温湿度显示
温湿度传感器介绍
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用于专用数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能八位单片机相连接。采用单线制串口行接口,信号传输距离可达20M以上。
应用于通暖空调,汽车,自动控制设备,气象站家电
湿度调节器,医疗,除湿器等等。
温湿度传感器介绍
供电电压:3.3 - 5.5V直流电
输出为单总线数字信号
温度测量范围0-50度(精度正负2度,分辨率1度)
湿度测量范围为20-90%RH(精度为正负5%,分辨率1%)
模块的+ 接单片机的5V
模块的- 接单片机的GND
模块的OUT 接单片机定义的引脚
vcc和gnd之间可以加一个电容,用于去耦滤波
采用单总线双向串行通信协议,每次采集都要由单片机发起开始信号,然后DHT11会向单片机发送响应并开始传输40位数据帧,高位在前。
数据格式为:
第一二个字节: 8bit湿度整数数据+8bit湿度小数数据
第三四个字节: 8bit温度整数数据+8bit温度小数数据
第五个字节 : 8bit校验位(它是前四个数据相加后八位的数值)
温湿度小数部分默认为0,即单片机采集的数据都是整数,校验位为4个字节的数据相加取结果的低8位数据作为校验和;
示例一:
湿度高八位:0011 0101
湿度低八位:0000 0000
温度高八位:0011 1000
温度低八位:0000 0000
检验位:0110 1101
计算 :
0011 0101 (相加)
0011 1000
结果: 01101101
湿度为0011 0101 = 35H = 53%RH
温度为0011 1000 = 18H = 24°
示例二:
湿度高八位:0011 0101
湿度低八位:0000 0000
温度高八位:0001 1000
温度低八位:0000 0000
检验位:0110 1001
计算 :
0011 0101 (相加)
0001 1000
结果: 0100 1101 不等于 01101001 本次接收数据不正确,重新接收数据
温湿度传感器时序介绍
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号,主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
DHT11输出0时时序
DHT11输出1时时序
代码
main.c
#include <REGX52.H>
#include "LCD1602.h"
#include "DHT11.h"
#include <stdio.h>
extern unsigned int rec_dat[4];
extern unsigned char rec_dat_lcd0[6];
extern unsigned char rec_dat_lcd1[6];
extern unsigned char rec_dat_lcd2[6];
extern unsigned char rec_dat_lcd3[6];
/**
*¹¦ÄÜ£ºÑÓʱ500ms
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*/
void Delay500ms(void) //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
LCD_Init();
InitUART();
LCD_ShowString(1,0,"Humi:");
LCD_ShowString(2,1,"Temp:");
while(1)
{
DHT11_delay_ms(150);
DHT11_receive();
sprintf(rec_dat_lcd0,"%d",rec_dat[0]);
sprintf(rec_dat_lcd1,"%d",rec_dat[1]);
sprintf(rec_dat_lcd2,"%d",rec_dat[2]);
sprintf(rec_dat_lcd3,"%d",rec_dat[3]);
DHT11_delay_ms(100);
//ÏÔʾʪ¶È
LCD_ShowString(1,6,rec_dat_lcd0);
LCD_ShowString(1,8,".");
LCD_ShowString(1,9,rec_dat_lcd1);
LCD_ShowString(1,10,"%");
//ÏÔʾζÈ
LCD_ShowString(2,6,rec_dat_lcd2);
LCD_ShowString(2,8,".");
LCD_ShowString(2,9,rec_dat_lcd3);
LCD_ShowString(2,10,"C");
}
}
DHT11.h
#ifndef _DHT11_H_
#define _DHT11_H_
void DHT11_START();
unsigned char DHT11_rec_byte();
void DHT11_receive();
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void InitUART(void);
#endif
DHT11.c
#include <REG52.H>
#include "DHT11.h"
sbit Temp_data = P2^0;
unsigned int rec_dat[4];
unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];
//DHT11ÆðʼÐźÅ
void DHT11_START()
{
Temp_data = 1; //¸ßµçƽ
DHT11_delay_us(2); //¸ßµçƽά³Ö2us
Temp_data = 0; //µÍµçƽ
DHT11_delay_ms(20);//ÖÁÉÙ¸ø18ms
Temp_data = 1; //¸ßµçƽ
DHT11_delay_us(13); //¸ßµçƽά³Ö13us
}
//½ÓÊÕÒ»¸ö×Ö½Úº¯Êý
unsigned char DHT11_rec_byte()
{
unsigned char i,dat;
for(i=0;i<8;i++)
{
while(!Temp_data);//µÈ´ýdht11 µÍµçƽ¹ýÈ¥
DHT11_delay_us(8);//ÑÓʱ´ó¸Å8us£¬ÈçºÎ»¹ÊǸߵçƽÔòΪ1
dat<<=1;
if(Temp_data == 1)
{
dat += 1;
}
while(Temp_data); //µÈ´ýdht11ÀµÍ£¬×¼±¸ÏÂһλ
}
return dat;
}
//½ÓÊÕÎÂʪ¶ÈÊý¾Ý
void DHT11_receive()
{
unsigned int R_H,R_L,T_H,T_L;
unsigned char RH,RL,TH,TL,revise;
DHT11_START();//Ö÷»ú·¢¿ªÊ¼ÐźÅ
Temp_data = 1;
if(Temp_data == 0)//ÅжÏDHT11 ÊÇ·ñ½øÈëÏìÓ¦
{
while(Temp_data == 0);//µÈ´ý¸ßµçƽÏìÓ¦ÐźÅ
DHT11_delay_us(40); //À¸ßºóÑÓʱ40us
R_H = DHT11_rec_byte();//½ÓÊÕʪ¶È¸ß°Ëλ
R_L = DHT11_rec_byte();//½ÓÊÕʪ¶ÈµÍ°Ëλ
T_H = DHT11_rec_byte();//½ÓÊÕζȸ߰Ëλ
T_L = DHT11_rec_byte();//½ÓÊÕζȵͰËλ
revise = DHT11_rec_byte();//½ÓÊÕУÑéλ
DHT11_delay_us(25);
if((R_H+R_L+T_H+T_L) == revise)//УÑéλÊý¾ÝÊÇ·ñÕýÈ·
{
RH = R_H;
RL = R_L;
TH = T_H;
TL = T_L;
}
rec_dat[0] = RH;
rec_dat[1] = RL;
rec_dat[2] = TH;
rec_dat[3] = TL;
}
}
//ÑÓʱus
void DHT11_delay_us(unsigned char n)
{
while(--n);
}
//ÑÓʱms
void DHT11_delay_ms(unsigned int z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void InitUART(void)//ʹÓö¨Ê±Æ÷1 ×÷Ϊ´®¿Ú²¨ÌØÂÊ·¢ÉúÆ÷
{
SCON = 0X40;//´®¿ÚͨÐŹ¤×÷·½Ê½Ò»
REN = 1; //ÔÊÐí´®¿Ú½ÓÊÕ
TMOD = 0X20;//¶¨Ê±Æ÷1µÄ¹¤×÷·½Ê½
TH1 = 0XF3;//ÅäÖô®¿ÚµÄ²¨ÌØÂÊ
TL1 = 0XF3;
TI = 1; //ÖжÏ
TR1 = 1;
}
LCD1602.h
#ifndef _LCD1602_H_
#define _LCD1602_H_
void LCD_WriteCommand(unsigned char Command);
void LCD_WriteDate(unsigned char Date);
void LCD_Init(void);
void LCD_SetCursor(unsigned char Line,unsigned char Columu);
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char);
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char *String);
int LCD_Pow(int x,int y);
int LCD_getNumberSize(int Number);
void LCD_ShowNumber(unsigned char Line,unsigned char Columu,unsigned int Number);
#endif
LCD1602.c
#include <REGX52.h>
#include "LCD1602.h"
#include <INTRINS.H>
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_E = P2^7;
#define LCD_DataPort P0
/**
*¹¦ÄÜ£ºÑÓʱ1ms
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*/
void LCD_Delay1ms(void) //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
/**
*¹¦ÄÜ£ºÐ´Ö¸ÁÊý
*²ÎÊý£ºCommand Ö¸Áî
*·µ»ØÖµ£ºvoid
*²ÎÕÕ£ºÐ´²Ù×÷ʱÐòͼ
*/
void LCD_WriteCommand(unsigned char Command)
{
LCD_RS = 0; //ÉèÖÃÖ¸Áîģʽ
LCD_RW = 0; //ÉèÖÃдģʽ
LCD_DataPort = Command; //дָÁî
LCD_E = 1;
LCD_Delay1ms();
LCD_E = 0;
LCD_Delay1ms();
}
/**
*¹¦ÄÜ£ºÐ´Êý¾Ýº¯Êý
*²ÎÊý£ºDate Êý¾Ý
*·µ»ØÖµ£ºvoid
*²ÎÕÕ£ºÐ´²Ù×÷ʱÐòͼ
*/
void LCD_WriteDate(unsigned char Date)
{
LCD_RS = 1; //ÉèÖÃÊý¾Ýģʽ
LCD_RW = 0; //ÉèÖÃдģʽ
LCD_DataPort = Date; //дָÁî
LCD_E = 1;
LCD_Delay1ms();
LCD_E = 0;
LCD_Delay1ms();
}
/**
*¹¦ÄÜ£ºLCD³õʼ»¯º¯Êý
*²ÎÊý£ºvoid
*·µ»ØÖµ£ºvoid
*/
void LCD_Init(void)
{
LCD_WriteCommand(0X38);//ÅäÖðËλÊý¾Ý½Ó¿Ú
LCD_WriteCommand(0X0c);//ÏÔʾ¿ª£¬¹â±ê¹Ø£¬ÉÁ˸¿ª
LCD_WriteCommand(0X06);//¹â±ê+1£¬»Ãæ²»¶¯
LCD_WriteCommand(0X01);//ÇåÆÁ
}
/**
*¹¦ÄÜ£ºÏÔʾ¹â±ê
*²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ
*·µ»ØÖµ£ºvoid
*/
void LCD_SetCursor(unsigned char Line,unsigned char Columu)
{
if(Line == 1){
//µÚÒ»ÐеØÖ·
LCD_WriteCommand(0x80 | (Columu - 1));
}else{
//µÚ¶þÐеØÖ·
LCD_WriteCommand(0x80 | (Columu - 1) + 0x40);
}
}
/**
*¹¦ÄÜ£ºÏÔʾ×Ö·ûº¯Êý
*²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ £¬Char ÒªÏÔʾµÄ×Ö·û
*·µ»ØÖµ£ºvoid
*/
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char)
{
LCD_SetCursor(Line,Columu);
LCD_WriteDate(Char);
}
/**
*¹¦ÄÜ£ºÏÔʾ×Ö·û´®º¯Êý
*²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ £¬String ÒªÏÔʾµÄ×Ö·û´®
*·µ»ØÖµ£ºvoid
*/
void LCD_ShowString(unsigned char Line,unsigned char Columu,unsigned char *String)
{
unsigned char i;
LCD_SetCursor(Line,Columu);
for(i=0;String[i]!='\\0';i++)
{
LCD_WriteDate(String[i]);
}
}
/**
*¹¦ÄÜ£ºÏÔʾ´Î·½º¯Êý(xµÄy´Î·½)
*²ÎÊý£ºx µ×Êý y ´Î·½
*·µ»ØÖµ£ºResult xµÄy´Î·½½á¹û
*/
int LCD_Pow(int x,int y)
{
unsigned char i;
int Result = 1;
for(i=0;i<y;i++)
{
Result *=x;
}
return Result;
}
/**
*¹¦ÄÜ£º»ñÈ¡Êý×Ö³¤¶È
*²ÎÊý£ºNumber ÐèÒª»ñÈ¡³¤¶ÈµÄÊý×Ö
*·µ»ØÖµ£ºSize Êý×ÖNumberµÄ³¤¶È
*/
int LCD_getNumberSize(int Number)
{
unsigned int Size = 0;
while(Number > 0)
{
Number /= 10;
Size++;
}
return Size;
}
/**
*¹¦ÄÜ£ºÏÔʾÊý×Öº¯Êý
*²ÎÊý£ºLine ÐÐ £¬Columu ÁÐ £¬Number ÒªÏÔʾµÄÊý×Ö
*·µ»ØÖµ£ºvoid
*/
void LCD_ShowNumber(unsigned char Line,unsigned char Columu,unsigned int Number)
{
unsigned int i;
LCD_SetCursor(Line,Columu);
for(i=LCD_getNumberSize(Number);i>0;i--)
{
LCD_WriteDate('0'+Number/LCD_Pow(10,i-1)%10);
}
}
以上是关于温湿度传感器一直显示一个值,把线重新接一下又显示实际值了,用几天又坏了,怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章
STM32F103使用DHT11采集温湿度通过软件I2C驱动OLED显示