DTH11驱动实例稳定修改补充

    技术2023-06-15  91

    由于DTH11 器件的稳定性不是很好,所以 在初始化的阶段 ,应该使用 上拉电阻,维持稳定的高电平状态,在长期运行试验的时候,也证明 使用上拉电阻有很好的效果

    #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<stdlib.h> #include<wiringPi.h> #define TempPath "/sys/class/thermal/thermal_zone0/temp" #define MaxSize 20 #define TMDMoneDatalen 40 void waitDTH11bitTime(unsigned int data) { while(digitalRead(data)); while(!digitalRead(data)); } int initHardWare(void) { int ret = 0; ret = wiringPiSetup(); if (ret < 0) { printf("error wiringPiSetup\n"); return ret; } printf("initHardWare is ok!\n"); return 0; } int GetCenterCpuTemp(void) { int fd; float Temp; char buf[MaxSize]; fd=open(TempPath,O_RDONLY); if(fd < 0){ printf("error with open temp file\n"); return fd; } if(!read(fd,buf,MaxSize)) { printf("error with read file with temp\n"); return -1; } int datefortemp; datefortemp=strtol(buf,NULL,10); Temp = (double)datefortemp/1000.0; printf("设备温度 Temp = %.2f摄氏度\n",Temp); return 0; } int GpIoSetHigh(unsigned int pin) { digitalWrite(pin,HIGH); return 0; } int GpIoSetLow(unsigned int pin) { digitalWrite(pin,LOW); return 0; } unsigned char DTH11readBit(unsigned int bit) { unsigned char value; waitDTH11bitTime(bit); delayMicroseconds(32); value = digitalRead(bit); return value; } unsigned char DTH11ReadByte(unsigned int bit) { unsigned char i = 0; unsigned char value = 0; for( i = 0 ; i < 8 ; i ++) { value |= DTH11readBit(bit)<<(7-i); } return value; } int DTH11DataRecord(unsigned int data,unsigned char *buf) { int ret = 0; //pinMode(data,OUTPUT); 由于器件的不稳定性不再使用 gpio的输出模式 pullUpDnControl(data,PUD_UP); //而使用上拉电阻 GpIoSetLow(data); delay(25); GpIoSetHigh(data); pinMode(data,INPUT); delayMicroseconds(27); ret = digitalRead(data); if(ret != LOW) //check data with error { printf("TMDM is Busy\nwait ... ... retry ret=%d\n",ret); return -1; } int i; unsigned char temp; while(!digitalRead(data)); for (i = 0 ; i < 5 ; i++){ buf[i] = DTH11ReadByte(data); } int rc; rc = buf[0] + buf[1] + buf[2] + buf[3]; if (rc != buf[4]) { printf("error:%d\n",__LINE__); } return 0; } int main(void) { unsigned char buf[4]; initHardWare(); pinMode(1,OUTPUT); digitalWrite(1,HIGH); DTH11DataRecord(1,buf); printf("RH:%d.%d%%\nTEMP:%d.%d%%\n",buf[0],buf[1],buf[2],buf[3]); }
    Processed: 0.015, SQL: 9