components/esp32-ds18b20/include/ds18b20.h

Sat, 06 Jun 2020 13:28:46 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 06 Jun 2020 13:28:46 +0200
changeset 77
66c77497d86d
parent 1
ad2c8b13eb88
permissions
-rw-r--r--

Changed the recipe database so that it is expandable, version 2. More mash fields and allow 16 steps. Allow 20 Additions. Removed separate mash steps from the state machine, the steps are moved to the runtime data. There is no fixed step number for mashout anymore. There is no fixed step for mash-in anymore, just use the first step and heat to the infusion temperature. After malt add, switch to the normal step temperature. Implemented decoction steps.

/*
 * MIT License
 *
 * Copyright (c) 2017 David Antliff
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

/**
 * @file ds18b20.h
 * @brief Interface definitions for the Maxim Integrated DS18B20 Programmable
 *        Resolution 1-Wire Digital Thermometer device.
 *
 * This component provides structures and functions that are useful for communicating
 * with DS18B20 devices connected via a Maxim Integrated 1-Wire® bus.
 */

#ifndef DS18B20_H
#define DS18B20_H

#include "owb.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Success and error codes.
 */
typedef enum
{
    DS18B20_ERROR_UNKNOWN = -1,
    DS18B20_OK = 0,
    DS18B20_ERROR_DEVICE,  ///< A device error occurred
    DS18B20_ERROR_CRC,     ///< A CRC error occurred
    DS18B20_ERROR_OWB,     ///< A One Wire Bus error occurred
    DS18B20_ERROR_NULL,    ///< A parameter or value is NULL
} DS18B20_ERROR;

/**
 * @brief Symbols for the supported temperature resolution of the device.
 */
typedef enum
{
    DS18B20_RESOLUTION_INVALID = -1,  ///< Invalid resolution
    DS18B20_RESOLUTION_9_BIT   = 9,   ///< 9-bit resolution, LSB bits 2,1,0 undefined
    DS18B20_RESOLUTION_10_BIT  = 10,  ///< 10-bit resolution, LSB bits 1,0 undefined
    DS18B20_RESOLUTION_11_BIT  = 11,  ///< 11-bit resolution, LSB bit 0 undefined
    DS18B20_RESOLUTION_12_BIT  = 12,  ///< 12-bit resolution (default)
} DS18B20_RESOLUTION;

/**
 * @brief Structure containing information related to a single DS18B20 device connected
 * via a 1-Wire bus.
 */
typedef struct
{
    bool init;                     ///< True if struct has been initialised, otherwise false
    bool solo;                     ///< True if device is intended to be the only one connected to the bus, otherwise false
    bool use_crc;                  ///< True if CRC checks are to be used when retrieving information from a device on the bus
    const OneWireBus * bus;        ///< Pointer to 1-Wire bus information relevant to this device
    OneWireBus_ROMCode rom_code;   ///< The ROM code used to address this device on the bus
    DS18B20_RESOLUTION resolution; ///< Temperature measurement resolution per reading
} DS18B20_Info;

/**
 * @brief Construct a new device info instance.
 *        New instance should be initialised before calling other functions.
 * @return Pointer to new device info instance, or NULL if it cannot be created.
 */
DS18B20_Info * ds18b20_malloc(void);

/**
 * @brief Delete an existing device info instance.
 * @param[in] ds18b20_info Pointer to device info instance.
 * @param[in,out] ds18b20_info Pointer to device info instance that will be freed and set to NULL.
 */
void ds18b20_free(DS18B20_Info ** ds18b20_info);

/**
 * @brief Initialise a device info instance with the specified GPIO.
 * @param[in] ds18b20_info Pointer to device info instance.
 * @param[in] bus Pointer to initialised 1-Wire bus instance.
 * @param[in] rom_code Device-specific ROM code to identify a device on the bus.
 */
void ds18b20_init(DS18B20_Info * ds18b20_info, const OneWireBus * bus, OneWireBus_ROMCode rom_code);

/**
 * @brief Initialise a device info instance with the specified GPIO as a solo device on the bus.
 *
 * This is subject to the requirement that this device is the ONLY device on the bus.
 * This allows for faster commands to be used without ROM code addressing.
 *
 * NOTE: if additional devices are added to the bus, operation will cease to work correctly.
 *
 * @param[in] ds18b20_info Pointer to device info instance.
 * @param[in] bus Pointer to initialised 1-Wire bus instance.
 */
void ds18b20_init_solo(DS18B20_Info * ds18b20_info, const OneWireBus * bus);

/**
 * @brief Enable or disable use of CRC checks on device communications.
 * @param[in] ds18b20_info Pointer to device info instance.
 * @param[in] use_crc True to enable CRC checks, false to disable.
 */
void ds18b20_use_crc(DS18B20_Info * ds18b20_info, bool use_crc);

/**
 * @brief Set temperature measurement resolution.
 *
 * This programs the hardware to the specified resolution and sets the cached value to be the same.
 * If the program fails, the value currently in hardware is used to refresh the cache.
 *
 * @param[in] ds18b20_info Pointer to device info instance.
 * @param[in] resolution Selected resolution.
 * @return True if successful, otherwise false.
 */
bool ds18b20_set_resolution(DS18B20_Info * ds18b20_info, DS18B20_RESOLUTION resolution);

/**
 * @brief Update and return the current temperature measurement resolution from the device.
 * @param[in] ds18b20_info Pointer to device info instance.
 * @return The currently configured temperature measurement resolution.
 */
DS18B20_RESOLUTION ds18b20_read_resolution(DS18B20_Info * ds18b20_info);

/**
 * @brief Read 64-bit ROM code from device - only works when there is a single device on the bus.
 * @param[in] ds18b20_info Pointer to device info instance.
 * @return The 64-bit value read from the device's ROM.
 */
OneWireBus_ROMCode ds18b20_read_rom(DS18B20_Info * ds18b20_info);

/**
 * @brief Start a temperature measurement conversion on a single device.
 * @param[in] ds18b20_info Pointer to device info instance.
 * @return True if successfull.
 */
bool ds18b20_convert(const DS18B20_Info * ds18b20_info);

/**
 * @brief Start temperature conversion on all connected devices.
 *
 * This should be followed by a sufficient delay to ensure all devices complete
 * their conversion before the measurements are read.
 * @param[in] bus Pointer to initialised bus instance.
 */
void ds18b20_convert_all(const OneWireBus * bus);

/**
 * @brief Wait for the maximum conversion time according to the current resolution of the device.
 * @param[in] ds18b20_info Pointer to device info instance. Must be initialised first.
 * @return An estimate of the time elapsed, in milliseconds. Actual elapsed time may be greater.
 */
float ds18b20_wait_for_conversion(const DS18B20_Info * ds18b20_info);

/**
 * @brief Read last temperature measurement from device.
 *
 * This is typically called after ds18b20_start_mass_conversion(), provided enough time
 * has elapsed to ensure that all devices have completed their conversions.
 * @param[in] ds18b20_info Pointer to device info instance. Must be initialised first.
 * @param[out] value Pointer to the measurement value returned by the device, in degrees Celsius.
 * @return DS18B20_OK if read is successful, otherwise error.
 */
DS18B20_ERROR ds18b20_read_temp(const DS18B20_Info * ds18b20_info, float * value);

/**
 * @brief Convert, wait and read current temperature from device.
 * @param[in] ds18b20_info Pointer to device info instance. Must be initialised first.
 * @param[out] value Pointer to the measurement value returned by the device, in degrees Celsius.
 * @return DS18B20_OK if read is successful, otherwise error.
 */
DS18B20_ERROR ds18b20_convert_and_read_temp(const DS18B20_Info * ds18b20_info, float * value);

#ifdef __cplusplus
}
#endif

#endif  // DS18B20_H

mercurial