mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
579a67be03
The DHT11/DHT21/DHT22 cannot be sampled more than once a second. Previously, a global cache was added to the SAUL adaption of the dht driver to answer with stored values for one second after the last read. This however had two disadvantages: - The global cache was shared for all DHTXX devices connected. As a result incorrect values were delivered when reading out multiple sensors over SAUL with less than 1 second delay in between - A user of the low level API will had to implement the same caching strategy, resulting in code duplication By moving the hold logic to the driver, both limitations can be overcome.
65 lines
1.5 KiB
C
65 lines
1.5 KiB
C
/*
|
|
* Copyright (C) 2016 Freie Universität Berlin
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License v2.1. See the file LICENSE in the top level
|
|
* directory for more details.
|
|
*/
|
|
|
|
/**
|
|
* @ingroup drivers_dht
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief SAUL adaption for DHT devices
|
|
*
|
|
* The values exported to SAUL for DHT devices are buffered, meaning that new
|
|
* values will only be read from the device, if the buffered values are older
|
|
* then 1 second (being exactly the maximum sampling time for DHT devices).
|
|
*
|
|
* This buffering does further introduce a coupling between both SAUL endpoints,
|
|
* meaning that if you read from both endpoints after each other, both values
|
|
* are from the same sensor reading.
|
|
*
|
|
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
|
*
|
|
* @}
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include "saul.h"
|
|
#include "dht.h"
|
|
|
|
static int read_temp(const void *dev, phydat_t *res)
|
|
{
|
|
if (dht_read((dht_t *)dev, &res->val[0], NULL)) {
|
|
return -ECANCELED;
|
|
}
|
|
res->unit = UNIT_TEMP_C;
|
|
res->scale = -1;
|
|
return 1;
|
|
}
|
|
|
|
static int read_hum(const void *dev, phydat_t *res)
|
|
{
|
|
if (dht_read((dht_t *)dev, NULL, &res->val[0])) {
|
|
return -ECANCELED;
|
|
}
|
|
res->unit = UNIT_PERCENT;
|
|
res->scale = -1;
|
|
return 1;
|
|
}
|
|
|
|
const saul_driver_t dht_temp_saul_driver = {
|
|
.read = read_temp,
|
|
.write = saul_notsup,
|
|
.type = SAUL_SENSE_TEMP
|
|
};
|
|
|
|
const saul_driver_t dht_hum_saul_driver = {
|
|
.read = read_hum,
|
|
.write = saul_notsup,
|
|
.type = SAUL_SENSE_HUM
|
|
};
|