【GD32F427开发板试用】+DHT11温湿度监测

news2024/11/17 6:03:07

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:四季的温度

在完成所有项目后会开源,本次依旧是想做一个通过DHT11采集信息,OLED显示,ESP8266上传,可通过小程序查看的简易智能家居事例。

MDK环境准备

这里遇到了不少坑,到时候专门开一篇来讲

DHT11工作原理

具体可看csdn这篇文章https://blog.csdn.net/m0_5678…
简单来说就是

/*
数据格式:
湿度整数 湿度小数 温度整数 温度小数 校验位
00000000 00000000 00000000 00000000 00000000
1 看原理图确认GPIO引脚
2、 输出模式, 输出起始信号 :输出低电平18~30ms, 20ms
3、 IO口配置浮空输入模式,准检测响应信号
传感器把数据总线( SDA)拉低 83μs, 再接高 87μs 以响应主机的起始信号。
4、 40 个位的数据,高位先发;
一位一位的收,数据0: 54us低电平 + 23~27高电平 数据1: 54us低电平 + 68~74高电平 注意高位先发的(每个字节)
5、校验数据
前4个字节,求和,把和值的末八位和校验位对比 相同数据正确、否则数据异常
*/

接下来就开始写代码了

由于官方库的systick是ms级别的,需要改写成us级别或者另外实现,我这里都做了,各位可以按需使用~~

第一种基于官方库systick修改为us级别

systick.c
void systick_config(void)
{
    /* setup systick timer for 1000Hz interrupts */
    /*1000u是ms,1000000是us*/
    if(SysTick_Config(SystemCoreClock / 1000000U)) {
        /* capture error */
        while(1) {
        }
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
}

第二种,自己重新写
下边写的是delay_us,如果需要ms则*1000就可以了

delay.c
 void delay_us(uint32_t nus)
{
    int i;
    uint32_t temp;    
    for(i=0;i<8;i++)
    {
             
    SysTick->LOAD= nus *25;                     //时间加载               
    SysTick->VAL=0x00;                            //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;    //开始倒数      
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));        //等待时间到达   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;    //关闭计数器
    SysTick->VAL =0X00;                           //清空计数器    
}
}

接下来开始写DHT11的代码了,主要是调用库,开发难度很低

dht11.c
#include "dht11.h"

void dht11_gpio_input(void)
{
    rcu_periph_clock_enable(RCU_GPIOB);
    /*配置输入*/
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_12);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
    
}

void dht11_gpio_output(void)
{

    rcu_periph_clock_enable(RCU_GPIOB);
    /*配置下拉输出*/
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_12);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
    
}


void dht11_reset(void)//复位
{
    
    dht11_gpio_output();
    DHT11_OUT_L;
    delay_us(19000);
    DHT11_OUT_H;
    delay_us(30);
    dht11_gpio_input();
}

uint16_t dht11_scan(void)//判断总线状态
{
    return DHT11_IN;
}

uint16_t dht11_read_bit(void)//读取一个bit
{
    while (DHT11_IN == RESET);
    delay_us(40);
    if (DHT11_IN == SET)
    {
        while (DHT11_IN == SET);
        return 1;
    }
    else
    {
        return 0;
    }
}

uint16_t dht11_read_byte(void)//读取一个字节
{
    uint16_t i;
    uint16_t data = 0;
    for (i = 0; i < 8; i++)
    {
        data <<= 1;
        data |= dht11_read_bit();
    }
    return data;
}
uint8_t checksum;
uint16_t dht11_read_data(uint8_t buffer[5])//读取数据
{
    uint16_t i = 0;
    
    dht11_reset();
    if (dht11_scan() == RESET)
    {
        
        while (dht11_scan() == RESET);
        while (dht11_scan() == SET);
        for (i = 0; i < 5; i++)
        {
            buffer[i] = dht11_read_byte();
        }
        
        while (dht11_scan() == RESET);
        dht11_gpio_output();
        DHT11_OUT_H;
        
         checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];
        if (checksum != buffer[4])
        {
            // checksum error
            return 1;
        }
    }
    
    return 0;
}
dht11.h
#ifndef __DHT11_H__
#define __DHT11_H__

//#include "timer.h"
#include "gd32f4xx.h"
#include "gd32f427v_start.h"
#include "systick.h"

#define DHT11_GPIO_TYPE  GPIOB
#define DHT11_GPIO_PIN   GPIO_PIN_12
#define DHT11_RCC        RCC_APB2Periph_GPIOB

#define DHT11_OUT_H gpio_bit_set(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)
#define DHT11_OUT_L gpio_bit_reset(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)
#define DHT11_IN    gpio_input_bit_get(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)

/*如果使用的是重新写delay_us,不需要下面的宏,如果是改官方的就需要*/
#define delay_us delay_1ms

#define RESET 0
#define SET   1

void dht11_gpio_input(void);
void dht11_gpio_output(void);
uint16_t dht11_scan(void);
uint16_t dht11_read_bit(void);
uint16_t dht11_read_byte(void);
uint16_t dht11_read_data(uint8_t buffer[4]);

#endif

写完了DHT11的代码,接下来验证下
在main里调用下

while (1)
    {
        if (dht11_read_data(buffer) == 0)
        {
            hum = buffer[0] + buffer[1] / 10.0;
            temp1 = buffer[2] + buffer[3] / 10.0;
            printf("hum:%f,temp:%f\r\n",hum,temp1);    
        }
        delay_1ms(1000000);/*因为改了systick,没在delay_1ms所以要把它单us用*/
    }

看下结果

总结

GD32F427使用库开发体验还行,不过像systick这个库少了delay_us得自己写或者改,要是更完善点会更好,现在已经完成了DHT11,下一步是OLED,加油

下篇预告

下一篇我会整理下从安装pack到跑起LED工程到写DHT11遇到的问题,给各位参考参考

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

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

相关文章

第二十四章《学生信息管理系统》第1节:学生信息管理系统简介

学生信息管理系统用于管理学生基本信息,该系统除能够大大的帮助学籍管理人员提高工作效率。本小节将从软件功能、数据库系统设计和项目结构几个方面介绍该软件系统的设计方案。 24.1.1系统功能简介 学生信息管理系统集信息展示、查询、增删和修改多种功能为一体,该系统的主…

1552_AURIX_TC275_时钟分发

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这一页文件我没写什么批注&#xff0c;但是还是留下来了。从这个图中能够看到各个模块的时钟源是可以来自于什么地方。 1. CCU的输入主要是来自于两个PLL、备份时钟以及晶振。 2. 对大多数…

SpringBoot引入外部jar包,项目打包成war包发布(亲测有效) - 第453篇

历史文章&#xff08;文章累计450&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 利用Spring扩展点对敏感信息加密解密&a…

【小f的刷题笔记】(JS)数组 - 前缀和 LeetCode303 LeetCode34

【数组】 前缀和&#xff1a; &#x1f31f; 原始数组不会被修改的情况下&#xff0c;频繁查询某个区间的累加和 ✔ 一次把所有从一开始到本数的累加值计算出来存在一个新数组里&#xff0c;区间的累加值通过减法得出 LeetCode303 链接&#xff1a; 303.区域和检索 - 数组…

刷爆力扣之至少是其它数字两倍的最大数

刷爆力扣之至少是其它数字两倍的最大数 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷…

一文带你了解【深度学习】中CNN、RNN、LSTM、DBN等神经网络(图文解释 包括各种激活函数)

觉得有帮助请点赞关注收藏~~~ 一、深度学习概述 深度学习算法属于机器学习算法的范畴&#xff0c;深度学习一般具有自主学习能力 基于深度学习的自然语言处理基本操作步骤包括&#xff1a; 将原始信息输入神经网络模型&#xff0c;通过自主学习算法识别输入特征&#xff1b;…

Redis 发布订阅

Redis 发布订阅 Redis 发布/订阅 (publish/subscribe) 是一种消息通信模式&#xff1a;发送者 (publish) 发送消息&#xff0c;订阅者 (subscribe) 接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1&#xff0c;以及订阅这个频道的三个客户端 ——…

李沐论文精度系列之八:视频理解论文串讲

文章目录一 、前言二、 DeepVideo&#xff08;IEEE 2014&#xff09;2.1 模型结构2.2 实验结果2.3 总结三、双流网络及其变体3.1 Two-Stream&#xff08;NeurIPS 2014&#xff09;3.1.1 简介3.1.2 改进工作3.2 Two stream LSTM&#xff08;CVPR 2015 &#xff09;3.2.1 模型结构…

Django的学习笔记

Django初笔记一、认识Django1.基本原理2.框架二、建立一个简单的项目1.建立一个HelloWord&#xff08;1&#xff09;进入虚拟环境&#xff08;2&#xff09;建立项目三、基本应用结构&#xff08;1&#xff09;配置文件setting&#xff08;2&#xff09;URL&#xff08;路由系统…

【C语言进阶(NEW)】一、数据储存详解|数据类型介绍|整形在内存中的存储|浮点型在内存中的存储

目录 一、数据类型介绍 1.1 基本内置类型 1.2 类型的基本归类 1.3 有符号&#xff08;signed&#xff09;与无符号&#xff08;unsigned&#xff09;的区别 二、整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端 2.2.1 什么是大小端 2.2.2 为什么有大端和小端 2.…

Dubbo(分布式框架·上)

Dubbo上一、导入1、基础知识1.1、什么是分布式系统1.2、发展演变1.2.1 单一应用架构1.2.2分布式应用架构1.2.3 流动计算架构1.3 RPC1.3.1 什么是RPC1.3.2 RPC核心模块二、Dubbo概念三、设计架构四、环境搭建4.1 Zookeeper注册中心4.2 测试Zookeeper4.1 监控中心五、测试5.1 需求…

论文阅读-ATLAS: A Sequence-based Learning Approach for Attack Investigation

论文代码&#xff1a; https://github.com/purseclab/ATLAS 代码预处理写的太乱了&#xff0c;很多预处理过程都不是特别合理。不过这篇论文思想还是挺合理的&#xff0c;相比其实溯源图工作在路径上的处理更加合理一些。 背景简介 高级可持续威胁攻击&#xff08;Advanced P…

AXI VDMA回环测试

Block Design 搭建如下图所示的硬件系统&#xff1a; 该硬件系统的数据流向为&#xff1a; DDR–>AXI VDMA–>AXI DATA FIFO–>AXI VDMA–>DDR 即将一幅图像由一段地址空间搬运至另一段地址空间。 其中&#xff0c;AXI VDMA配置如下&#xff1a; 地址位宽32&…

[附源码]Python计算机毕业设计SSM健身房管理系统 (程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

认识3dmax 轴心

轴心&#xff0c;pivot&#xff1b; 资料对轴心的说明如下&#xff0c; 物体轴心 每个物体有且仅有一个轴心&#xff0c; 轴心位置确定了物体的位置&#xff0c; 物体旋转是围绕轴心旋转的; 轴心&#xff0c;我没看到说是一个点或一条线&#xff1b;在三维空间应…

什么样的护眼灯适合孩子用?真正适合孩子的护眼台灯

在现在这个时代&#xff0c;科技的更新迭代&#xff0c;我们生活水平得到提高&#xff0c;在灯具行业也是越来越多样化了&#xff0c;作为家长的&#xff0c;希望能买到适合孩子的护眼灯&#xff0c;那么在那么多种类的台灯中&#xff0c;什么样的适合孩子呢&#xff1f;这次主…

虹科方案|用Western Digital和ATTO技术优化SMR存储解决方案的负载

​ 一、引言 Western Digital 与 ATTO Technology 的长期合作基于对当今复杂企业环境的存储和数据基础设施需求的共同洞察。我们正在共同为用户准备迎接下一波性能挑战。 二、背景 随着动态数据过渡到静态数据&#xff0c;存储成为关键基础架构组件之一。然而&#xff0c;以…

【教学类-21-01】20221205《青花茶杯-A4纸插入式纸盒》(大班主题《我是中国人》)

展示效果&#xff1a; 单张效果 多张效果 隐藏的部分 信息&#xff1a; 1.右侧第1列&#xff1a;幼儿园名字&#xff1b; 2.右侧第3列&#xff0c;幼儿名字 &#xff08;1&#xff09;3个名字印 &#xff08;为了统一4字&#xff09; &#xff08;2&#xff09;2个名字印…

初识多线程编程

文章目录一、线程线程与进程的区别二、多线程编程Thread创建线程的方法一、线程 我们开始引入进程&#xff0c;最主要的目的是去解决"并发编程"的问题&#xff0c;电脑进入了多核心&#xff0c;想要提高程序执行速度&#xff0c;就得将这些核心用起来。 我们在每次…

【vue3】代码格式化和volar卡顿问题解决

一、格式化策略 用eslint做代码检查和格式化是很方便的东西&#xff1b; 这里我们使用vscode完成这些操作&#xff1b; 在代码保存的时候&#xff0c;顺便完成格式化操作 1)装上eslint和prettier插件 2)装完插件之后&#xff0c;我们需要配置一下 打开 文件 > 首选项 >…