RT-Thread与CPK-RA2L1采集DHT11温湿度数据

时间:2025-08-03  作者:Diven  阅读:0

一、准备
本篇文章主要介绍使用RT-Thread Studio 和瑞萨 CPK-RA2L1评估板,使用大佬的轮子采集温湿度

RT-Thread与CPK-RA2L1采集DHT11温湿度数据

二、硬件准备
CPK-RA2L1评估板, 这个板子的芯片型号是 R7FA2L1AB2DFM,DHT11 温湿度传感器

1.jpg

三、新建工程

1、总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

1.jpg

2、总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态

1.jpg

3、数字0信号

1.jpg

4、数字1信号

1.jpg

四、驱动代码


int split_int(const int num, int *integer, int *decimal, const rt_uint32_t times)
{
int flag = 0;
if (num < 0) flag = 1;
int anum = num<0 ? -num : num;
integer = anum / times;
decimal = anum % times;
return flag;
}
/

  • This function will convert temperature in degree Celsius to Kelvin.
  • @param c the temperature indicated by degree Celsius
  • @return the result
    /
    float convert_c2k(float c)
    {
    return c + 273.15;
    }
    /
    *
  • This function will convert temperature in degree Celsius to Fahrenheit.
  • @param c the temperature indicated by degree Celsius
  • @return the result
    /
    float convert_c2f(float c)
    {
    return c * 1.8 + 32;
    }
    /
    *
  • This function will convert temperature in degree Fahrenheit to Celsius.
  • @param f the temperature indicated by degree Fahrenheit
  • @return the result
    /
    float convert_f2c(float f)
    {
    return (f - 32) * 0.55555;
    }
    /
    *
  • This function will read a bit from sensor.
  • @param pin the pin of Dout
  • @return the bit value
    /
    static uint8_t dht_read_bit(const rt_base_t pin)
    {
    uint8_t retry = 0;
    while(rt_pin_read(pin) && retry < DHTxx_REPLY_TIME)
    {
    retry++;
    rt_hw_us_delay(1);
    }
    retry = 0;
    while(!rt_pin_read(pin) && retry < DHTxx_REPLY_TIME)
    {
    retry++;
    rt_hw_us_delay(1);
    }
    rt_hw_us_delay(MEASURE_TIME);
    return rt_pin_read(pin);
    }
    /
    *
  • This function will read a byte from sensor.
  • @param pin the pin of Dout
  • @return the byte
    */
    static uint8_t dht_read_byte(const rt_base_t pin)
    {
    uint8_t i, byte = 0;
    for(i=0; i<8; i++)
    {
    byte <<= 1;
    byte |= dht_read_bit(pin);
    }
    return byte;
    }

    for(i=0; i {
    sum += dev->data[i];
    }
    if(sum != dev->data[4]) return RT_FALSE;
    return RT_TRUE;
    }

    rt_err_t dht_init(struct dht_device dev, const rt_base_t pin)
    {
    if(dev == NULL)
    return -RT_ERROR;
    dev->type = DHT_TYPE;
    dev->pin = pin;
    rt_memset(dev->data, 0, DHT_DATA_SIZE);
    rt_pin_mode(dev->pin, PIN_MODE_INPUT_PULLUP);
    return RT_EOK;
    }
    // 1、初始化类型
    dht_device_t dht_create(const rt_base_t pin)
    {
    dht_device_t dev;
    dev = rt_calloc(1, sizeof(struct dht_device));
    if (dev == RT_NULL)
    {
    LOG_E("Can't allocate memory for dhtxx device");
    return RT_NULL;
    }
    dev->type = DHT_TYPE;
    dev->pin = pin;
    rt_memset(dev->data, 0, DHT_DATA_SIZE);
    rt_pin_mode(dev->pin, PIN_MODE_INPUT_PULLUP);
    return dev;
    }
    void dht_delete(dht_device_t dev)
    {
    if (dev)
    rt_free(dev);
    }
    /

    Copyright (c) 2006-2021, RT-Thread Development Team
  • SPDX-License-Identifier: Apache-2.0

    Change Logs:
    Date Author Notes
    2023-03-01 DYC the first version
    /
    #ifndef SRC_DHT11_H_
    #define SRC_DHT11_H_
    #include
    #include
    #include
    #include
    #include
    #define DHTLIB_VERSION "0.9.0"
    #define DHT_DATA_SIZE 5
    /
    sensor model type */
    #define DHT11 0
    #define DHT_TYPE DHT11
    struct dht_device
    {
    rt_base_t pin;
    rt_uint8_t type;
    rt_uint8_t data[DHT_DATA_SIZE];
    rt_mutex_t lock;
    };
    typedef struct dht_device *dht_device_t;
    dht_device_t dht_create(const rt_base_t pin);
    void dht_delete(dht_device_t dev);
    rt_err_t dht_init(struct dht_device *dev, const rt_base_t pin);
    rt_bool_t dht_read(dht_device_t dev);
    rt_int32_t dht_get_humidity(dht_device_t dev);
    rt_int32_t dht_get_temperature(dht_device_t dev);
    float convert_c2k(float c);//将摄氏温度转为开氏温度
    float convert_c2f(float c);//将摄氏温度转为华氏温度
    float convert_f2c(float f);//将华氏温度转为摄氏温度
    rt_int32_t split_int(const rt_int32_t num, rt_int32_t *integer,
    rt_int32_t *decimal, const rt_uint32_t times);
    rt_err_t rt_hw_dht_init(const char *name, struct rt_sensor_config cfg);
    #endif /
    SRC_DHT11_H_ */

    这里DHT11 使用的是 GPIO 0208,所以需要把这个引脚配置为输入模式

    1.jpg

    五、烧录验证

    1.jpg

    猜您喜欢

    陶瓷电阻是应用于电子电路中的被动元件,优良的绝缘性能和稳定的电气特性而受到青睐。在电子设备中,陶瓷电阻的温度特性对其性能和可靠性有着重要影响。本文将深入探讨陶瓷...
    2025-04-14 03:31:40

    砂轮、砂轮片和云石片是常见的磨削工具,但在用途和结构上有所不同。砂轮是圆形工具,通常由磨料和粘合剂制成,应用于金属加工、木材打磨等领域。其主要功能是通过高速旋转...
    2014-05-02 00:00:00

    NTC热敏电阻,即负温度系数热敏电阻,是一种电阻值随温度升高而降低的元件。由于其敏感的温度响应,NTC热敏电阻应用于温度测量、温度控制和温度补偿等领域。本文将对...
    2025-03-18 20:00:02

    分流器作为网络信号分配的重要设备,越来越受到关注。正邦(JPCON)作为知名的分流器品牌,其产品在市场上享有良好声誉。本文将围绕“正邦(JPCON)分流器大小规...
    2019-08-15 22:23:30

    电源管理芯片,简称PMIC,看似低调地隐藏在各种电子设备内部,却是维持设备正常运转的幕后英雄。就像是一位精明的能量管家,负责管理和分配电能,确保设备每个部件都能...
    2024-11-15 00:00:00

    现代电子产品中,贴片电阻作为一种重要的元器件,应用于各种电路设计中。了解贴片电阻的读法不仅有助于工程师和电子爱好者正确选择和使用电阻器,还能提升产品的整体性能。...
    2025-03-16 19:01:38

    贴片电阻上的标注R300并不是直接表示阻值为300欧姆。实际上,采用的是一种数字编码方式来表示阻值。R代表小数点,300则表示有效数字。具体来说,R300表示阻...
    2024-11-29 10:26:06

    V/F和F/V转换芯片应用于多个领域,主要用于信号处理和数据转换。在工业自动化中,这些芯片用于将模拟信号转换为数字信号,便于监控和控制系统的实时性能。例如,在温...
    2012-06-12 00:00:00

    现代科技飞速发展的今天,各种设备的配件越来越受到用户的关注。特别是在工业和电子设备领域,优质的配件不仅能提升设备的性能,还能延长其使用寿命。本文将重点介绍“Ac...
    2025-03-05 09:26:23

    转换器和电平移位器在现代电子设备中是举足轻重的配件,其应用领域而多样。在通信领域,这些设备可以实现不同电压和信号标准之间的转换,确保数据在各种设备间的顺畅传输。...
    2016-10-24 00:00:00