mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
128 lines
3.5 KiB
C
128 lines
3.5 KiB
C
/*
|
|
* Copyright (C) 2017 Frits Kuipers
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
/**
|
|
* @defgroup drivers_ds18 DS18 temperature sensor driver
|
|
* @ingroup drivers_sensors
|
|
* @ingroup drivers_saul
|
|
* @brief Driver interface for the DS18 temperature sensors
|
|
*
|
|
* This driver provides @ref drivers_saul capabilities.
|
|
* Currently the driver has the following limitations:
|
|
*- Does not allow addressing devices, only supports a single device on the bus.
|
|
*- The 1-Wire bus handling is hardcoded to the driver.
|
|
*- Does not allow configuration of sampling width.
|
|
*
|
|
* @note Due to timing issues present on some boards this drivers features two
|
|
* ways of reading information from the sensor. The optimized uses accurate
|
|
* delays to handle this, while the second way polls the line for changes. If
|
|
* you know that your board can handle ~3us resolution with the xtimer module,
|
|
* then the optimized way is recommended. To used the optimized way add the
|
|
* ds18_optimized module. Also this driver test application has a whitelist of
|
|
* the boards this driver has been tested on and known to work.
|
|
*
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief Driver for Maxim Integrated DS1822 and DS18B20 temperature
|
|
* sensors.
|
|
*
|
|
* @author Frits Kuipers <frits.kuipers@gmail.com>
|
|
*/
|
|
|
|
#ifndef DS18_H
|
|
#define DS18_H
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "periph/gpio.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @name ds18 status return codes
|
|
* @{
|
|
*/
|
|
#define DS18_OK (0)
|
|
#define DS18_ERROR (-1)
|
|
/** @} */
|
|
|
|
/**
|
|
* @brief Device initialization parameters
|
|
*/
|
|
typedef struct {
|
|
gpio_t pin; /**< Pin the sensor is connected to */
|
|
gpio_mode_t out_mode; /**< Pin output mode */
|
|
gpio_mode_t in_mode; /**< Pin input mode (usually deduced from output mode) */
|
|
} ds18_params_t;
|
|
|
|
/**
|
|
* @brief Device descriptor for a ds18 device
|
|
*/
|
|
typedef struct {
|
|
ds18_params_t params; /**< Device Parameters */
|
|
} ds18_t;
|
|
|
|
/**
|
|
* @brief Initialize a ds18 device
|
|
*
|
|
* @param[out] dev device descriptor
|
|
* @param[in] params ds18 initialization struct
|
|
*
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int ds18_init(ds18_t *dev, const ds18_params_t *params);
|
|
|
|
/**
|
|
* @brief Triggers a temperature conversion
|
|
* @note This also triggers a conversion on all devices connected to the bus
|
|
*
|
|
* @param[in] dev device descriptor
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int ds18_trigger(const ds18_t *dev);
|
|
|
|
/**
|
|
* @brief Reads the scratchpad for the last conversion
|
|
*
|
|
* @param[in] dev device descriptor
|
|
* @param[out] temperature buffer to write the temperature in centi-degrees
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int ds18_read(const ds18_t *dev, int16_t *temperature);
|
|
|
|
/**
|
|
* @brief convenience function for triggering a conversion and reading the
|
|
* value
|
|
*
|
|
* @note This function will block for the conversion time. The current
|
|
* implementation of the driver uses 12-bit resolution, so this time is 750 ms.
|
|
*
|
|
* @param[in] dev device descriptor
|
|
* @param[out] temperature buffer to write the temperature in centi-degrees
|
|
*
|
|
* @return 0 on success
|
|
* @return -1 on error
|
|
*/
|
|
int ds18_get_temperature(const ds18_t *dev, int16_t *temperature);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/** @} */
|
|
#endif /* DS18_H */
|