南京中天园林建设网站,wordpress 迁站,室内设计效果图及文字介绍,网站搜索框设计最近在学习Linux应用和安卓开发过程中#xff0c;打算把Linux实现的温湿度显示安卓app上#xff0c;于是在此之前先基于Orangepi Zero2 全志H616下的wiringPi库对DHT11进行开发#xff0c;本文主要记录开发过程的一些问题和细节#xff0c;主要简单通过开启线程来接收温湿度…最近在学习Linux应用和安卓开发过程中打算把Linux实现的温湿度显示安卓app上于是在此之前先基于Orangepi Zero2 全志H616下的wiringPi库对DHT11进行开发本文主要记录开发过程的一些问题和细节主要简单通过开启线程来接收温湿度数据代码还有优化空间仅供参考。
一、DHT11时序图
数据传送逻辑 模块一次完整的数据传输为40bit,高位在前
数据格式 8bit湿度整数数据8bit 湿度小数数据 8bi 温度整数数据 8bit 温度小数数据 8bit 校验和 通讯过程时序图 具体DHT11时序分析可以查看主页(4条消息) 51单片机DHT11温湿度传感器_51单片机温湿度传感器代码_zoacyf的博客-CSDN博客 二、代码模块
温湿度DHT11初始化
int readSensorData(void) //温湿度初始化
{char i;pinMode(dht, OUTPUT); // 将模式设置为输出digitalWrite(dht, LOW); // 输出高电平delay(25);digitalWrite(dht, HIGH); // 输出低电平pinMode(dht, INPUT); // 将模式设置为输入pullUpDnControl(dht, PUD_UP);delayMicroseconds(27);if (digitalRead(dht) 0){while (!digitalRead(dht)); // wait to highfor (i 0; i 32; i){while (digitalRead(dht)); // 数据时钟启动while (!digitalRead(dht)); //数据开始delayMicroseconds(40);databuf * 2;if (digitalRead(dht) 1) // 1{databuf;}}return 1;}else{return 0;}}温湿度读取线程
void *dht11_thread(void *datas) //温湿度线程
{int W 0, w 0;int S 0, s 0;printf(Use GPIO7 to read data!\n);pinMode(dht, OUTPUT); // set mode to outputdigitalWrite(dht, HIGH); // output a high levelprintf(Enter OS-------\n);while (1){if (readSensorData()){W (databuf 8) 0xff;w databuf 0xff;S (databuf 24) 0xff;s (databuf 16) 0xff;}delay(2000);if ((W 15) (W 35) (S 85) (S15)){printf(此时的温湿度为\n);printf(温度%d.%d\n, W, w); //温度printf( 湿度%d.%d\n, S, s); //湿度databuf 0;}else{printf(Sorry! Sensor dosent ans!\n);databuf 0;continue;}}
}三、整体代码
开发过程中遇到的主要问题
1、温度或湿度数据会出现极端的现象我们可以做代码优化丢弃极端数据。2、程序运行卡住只出现几组数据这个问题非常头疼。刚开始分析是while里面用sleep造成经过验证发现并不是给线程加互斥锁也无法解决问题最后发现把校验位去掉程序就正常运行因此盲猜是数据存储的问题导致程序跑飞大家可以用数组尝试处理这里我就直接把校验位去掉一直收集温湿度数据了若需要指令收集温湿度数据可以参考下面博文本人觉得该大佬写得不错。
(4条消息) 【香橙派DHT11】香橙派全志H616 DHT11温湿度传感器的驱动教程_RIO小哥的博客-CSDN博客
整体代码
#include stdio.h
#include wiringPi.h
#include pthread.h
#include unistd.h
#define dht 7 //引脚接口
unsigned long databuf; //温湿度数据保存区int readSensorData(void) //温湿度初始化
{char i;pinMode(dht, OUTPUT); // 将模式设置为输出digitalWrite(dht, LOW); // 输出高电平delay(25);digitalWrite(dht, HIGH); // 输出低电平pinMode(dht, INPUT); // 将模式设置为输入pullUpDnControl(dht, PUD_UP);delayMicroseconds(27);if (digitalRead(dht) 0){while (!digitalRead(dht)); // wait to highfor (i 0; i 32; i){while (digitalRead(dht)); // 数据时钟启动while (!digitalRead(dht)); //数据开始delayMicroseconds(40);databuf * 2;if (digitalRead(dht) 1) // 1{databuf;}}return 1;}else{return 0;}}void *dht11_thread(void *datas) //温湿度线程
{int W 0, w 0;int S 0, s 0;printf(Use GPIO7 to read data!\n);pinMode(dht, OUTPUT); // set mode to outputdigitalWrite(dht, HIGH); // output a high levelprintf(Enter OS-------\n);while (1){if (readSensorData()){W (databuf 8) 0xff;w databuf 0xff;S (databuf 24) 0xff;s (databuf 16) 0xff;}delay(2000);if ((W 15) (W 35) (S 85) (S15)){printf(此时的温湿度为\n);printf(温度%d.%d\n, W, w); //温度printf( 湿度%d.%d\n, S, s); //湿度databuf 0;}else{printf(Sorry! Sensor dosent ans!\n);databuf 0;continue;}}
}int main()
{int ret;pthread_t dht11Thread;if (-1 wiringPiSetup()){printf(Setup wiringPi failed!);}ret pthread_create(dht11Thread,NULL,dht11_thread,NULL);//启动线程不断获取温湿度数据if(ret 0){printf(dht11Thread create success!\n);}pthread_join(dht11Thread,NULL);//等待线程退出return 0;
}运行shell编译
bulid.sh gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt //shell 脚本处理参数可以通过 $来处理这里的$1后面是要编译的文件 //脚本运行没有权限需加运行权限 (chmod x build.sh)