Orangepi Zero2 全志H616(DHT11温湿度检测)

news2024/11/23 19:48:49

最近在学习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 high

        for (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 output
    digitalWrite(dht, HIGH); // output a high level

    printf("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) && (S>=15))
         {
                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 high

        for (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 output
    digitalWrite(dht, HIGH); // output a high level

    printf("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) && (S>=15))
         {
                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

  1. gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt

  2. //shell 脚本处理参数,可以通过 $?来处理,这里的$1后面是要编译的文件

  3. //脚本运行没有权限,需加运行权限 (chmod +x build.sh)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/481336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode1376. 通知所有员工所需的时间

【LetMeFly】1376.通知所有员工所需的时间 力扣题目链接&#xff1a;https://leetcode.cn/problems/time-needed-to-inform-all-employees/ 公司里有 n 名员工&#xff0c;每个员工的 ID 都是独一无二的&#xff0c;编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。…

QML动画分组(Grouped Animations)

通常使用的动画比一个属性的动画更加复杂。例如你想同时运行几个动画并把他们连接起来&#xff0c;或者在一个一个的运行&#xff0c;或者在两个动画之间执行一个脚本。动画分组提供了很好的帮助&#xff0c;作为命名建议可以叫做一组动画。有两种方法来分组&#xff1a;平行与…

SNAP + StaMPS 处理Sentinel-1哨兵1 时间序列

SNAP StaMPS 处理Sentinel-1哨兵1 时间序列 Step0: 文件准备及路径设置 0.1 前往GitHub下载snap2stamps: Github snap2stamps 0.2 新建工作路径&#xff0c;用来进行数据处理&#xff0c;并将下载的snap2stamps解压到该文件夹下&#xff0c;并新建两个文件夹&#xff0c;ma…

二叉搜索树的最小绝对差

1题目 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] 输出&#xff1a;1示例 2&#xff1a; 输入&#xff1a;r…

证券从业资格证-考前复习

备考2023年6月证券从业资格证&#xff0c;每章思维导图及相关概念&#xff0c;用于考前复习 1. 金融市场基础知识 1.1 第一章 金融市场体系 #mermaid-svg-XEPZZTVBmo6nGm2Y {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

【14.HTML-移动端适配】

移动端适配 1 布局视口和视觉视口1.1 设置移动端布局视口宽度 2 移动端适配方案2.1 rem单位动态html的font-size&#xff1b;2.2 vw单位2.3 rem和vw对比2.4 flex的弹性布局 1 布局视口和视觉视口 1.1 设置移动端布局视口宽度 避免布局视口宽度默认980px带了的缩放问题,并且禁止…

周赛343(模拟、网格图求最短路、贪心)

文章目录 周赛343[6341. 保龄球游戏的获胜者](https://leetcode.cn/problems/determine-the-winner-of-a-bowling-game/)模拟 技巧 [2661. 找出叠涂元素](https://leetcode.cn/problems/first-completely-painted-row-or-column/)模拟 [2662. 前往目标的最小代价](https://lee…

给jar包编写start和stop脚本

文章目录 前言一、编写脚本1.start.sh2.stop.sh3.restart.sh 二、展示总结 前言 springboot项目内置tomcat,一般都是以jar包形式对外发布服务,我们不能每次都去kill pid,抽到脚本里来做这个事会方便许多。 一、编写脚本 1.start.sh #!/bin/bash APP_NAME"springboot2.3…

基于深度学习的水果检测与识别系统(Python界面版,YOLOv5实现)

摘要&#xff1a;本博文介绍了一种基于深度学习的水果检测与识别系统&#xff0c;使用YOLOv5算法对常见水果进行检测和识别&#xff0c;实现对图片、视频和实时视频中的水果进行准确识别。博文详细阐述了算法原理&#xff0c;同时提供Python实现代码、训练数据集&#xff0c;以…

QT 中的多线程之 moveToThread

文章目录 1. 概述2. 方法描述3. 代码&#xff1a;4. 运行结果及说明5. 注意事项6. 结语 1. 概述 ​QThread 类提供了一个与平台无关的管理线程的方法。一个 QThread 对象管理一个线程。 QThread 的执行从 run() 函数的执行开始&#xff0c;在 Qt 自带的 QThread 类中&#xf…

GraalVM编译SpringBoot程序

GraalVM 提供了一个名为 “Native Image” 的工具&#xff0c;它能够将 Java 应用程序预编译成本机可执行文件。这种方法的优点是启动速度快&#xff0c;内存占用少&#xff0c;因为程序运行时不需要 JVM 和类加载。 然而这种方式也存在一些弊端&#xff0c;如预编译的 GraalV…

扩展ACL配置

扩展ACL配置 【实验目的】 掌握扩展ACL的配置。认识扩展ACL的作用。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 R1 S0/3/0 192.168.1.1 255.255.255.252 N/A Fa0/0/0 …

操作系统:文件系统基础

文件系统基础 ​ 文件是以硬盘为载体的存储在计算机上的信息集合&#xff0c;文件可以是文档、图片、程序等。在系统运行时&#xff0c;计算机以进程为基本单位进行资源的调度和分配&#xff1b;而在用户的输入和输出中&#xff0c;则以文件为基本单位 文件控制块和索引节点 …

【Python基础练习100题--第二篇:文件篇】

前言 这些题都是在B站的练习题&#xff0c;链接在这 对于刚学python的新手来说十分的适合&#xff0c; 可以加强和巩固我们的基础。 嘿嘿 一起噶油吧&#xff01;&#x1f349; &#x1f349;1.对学生成绩排序 # 这里对字典进行排序&#xff0c;同事使用到了sorted函数 # 这…

stm32F103 WIFIESP8266模块连接阿里云平台

(43条消息) ESP8266 AT MQTT 透传指令接入阿里云物联网平台笔记&#xff1b;_安信可科技的博客-CSDN博客 这里这篇博客提到的固件是错误的 我用的固件是这个&#xff0c;刷固件之后&#xff0c;可以连上阿里云。 ATMQTTCLIENTID0,"ClienId"//clientId第二个参数注…

权限提升:烂土豆 || DLL 劫持.

权限提升&#xff1a;烂土豆 || DLL 劫持. 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动的&#xff0c;因此通…

数字化转型:如何利用文件管理系统提高制造业的工作效率

对于制造行业的企业用户&#xff0c;在日常企业文件管理中会遇到怎样的问题呢&#xff1f;制造业又该该如何高效管理文件呢&#xff1f; 这些问题困扰着机械制造行业客户…… 1&#xff09;项目多、文件杂&#xff0c;统一管理不便 2&#xff09;文档资料在公司内部流转不畅 …

14-5-进程间通信-信号

一、信号的基本概述 1.什么是信号&#xff1f; &#xff08;1&#xff09;对于linux来说&#xff0c;信号是软中断。比如在终端输入ctrlc来中断正在运行的程序&#xff0c;原理是linux通过信号机制来停止一个程序。 &#xff08;2&#xff09;每一个信号都有一个名字和编号&…