12#define DS18B20_CMD_CONVERT_T 0x44U
13#define DS18B20_CMD_READ_SCRATCHPAD 0xBEU
20 for (index = 0U; index < length; ++index) {
21 uint8_t current_byte = data[index];
22 for (uint8_t bit_index = 0U; bit_index < 8U; ++bit_index) {
23 const uint8_t mix = (uint8_t) ((crc ^ current_byte) & 0x01U);
107 int16_t* raw_temperature)
112 if ((bus == 0) || (raw_temperature == 0) || (rom_code == 0) || !bus->
initialized) {
128 *raw_temperature = (int16_t) (((uint16_t) scratchpad[1] << 8U) | scratchpad[0]);
134 if ((driver == 0) || (pin_config == 0)) {
153 if ((driver == 0) || (pin_config == 0) || (rom_code == 0)) {
179 uint8_t raw_count = 0U;
180 uint8_t valid_count = 0U;
183 if ((pin_config == 0) || (rom_codes == 0) || (max_devices == 0U)) {
187 if (max_devices > 16U) {
197 for (index = 0U; index < raw_count; ++index) {
276 float* temperature_celsius)
290 if ((driver == 0) || (scratchpad == 0)) {
307 if ((driver == 0) || (raw_temperature == 0)) {
326 int16_t raw_temperature = 0;
328 if ((driver == 0) || (temperature_celsius == 0)) {
336 *temperature_celsius = (float) raw_temperature / 16.0f;
342 if ((driver == 0) || (pin_config == 0)) {
362 uint8_t raw_count = 0U;
363 uint8_t valid_count = 0U;
373 for (index = 0U; index < raw_count; ++index) {
377 raw_rom_codes[index],
415 switch (driver->
state) {
428 int16_t raw_temperature = 0;
487 int16_t* raw_temperature)
489 if ((driver == 0) || (raw_temperature == 0) || !driver->
initialized
500 float* temperature_celsius)
void driver_delay_ms(uint32_t milliseconds)
Realiza una espera bloqueante expresada en milisegundos.
Interfaz comun de delays bloqueantes basada en stopwatch de LPCOpen.
uint8_t ds18b20_bus_get_device_count(const ds18b20_bus_driver_t *driver)
Devuelve la cantidad de sensores actualmente descubiertos.
bool ds18b20_init(ds18b20_driver_t *driver, const onewire_pin_config_t *pin_config)
Inicializa el driver DS18B20 sobre el pin indicado.
static uint8_t ds18b20_crc8(const uint8_t *data, uint8_t length)
uint8_t ds18b20_bus_discover(ds18b20_bus_driver_t *driver)
Descubre sensores DS18B20 y actualiza la tabla interna del bus.
bool ds18b20_bus_get_latest_raw(const ds18b20_bus_driver_t *driver, uint8_t index, int16_t *raw_temperature)
Obtiene la ultima temperatura cruda cacheada de un sensor del bus.
bool ds18b20_is_present(ds18b20_driver_t *driver)
Verifica si hay un dispositivo presente en el bus del sensor.
bool ds18b20_init_with_rom(ds18b20_driver_t *driver, const onewire_pin_config_t *pin_config, const uint8_t rom_code[ONEWIRE_ROM_CODE_SIZE])
Inicializa un sensor DS18B20 concreto identificado por su ROM.
bool ds18b20_bus_get_rom_code(const ds18b20_bus_driver_t *driver, uint8_t index, uint8_t rom_code[ONEWIRE_ROM_CODE_SIZE])
Copia el codigo ROM de un sensor descubierto en el bus.
bool ds18b20_read_raw(ds18b20_driver_t *driver, int16_t *raw_temperature)
Lee la temperatura cruda del sensor en forma bloqueante.
#define DS18B20_CMD_READ_SCRATCHPAD
static bool ds18b20_finish_conversion(ds18b20_driver_t *driver)
void ds18b20_bus_process(ds18b20_bus_driver_t *driver, uint16_t elapsed_ms)
Avanza la maquina de estados multi-sensor del bus.
void ds18b20_process(ds18b20_driver_t *driver, uint16_t elapsed_ms)
Avanza la maquina de estados no bloqueante del sensor.
bool ds18b20_is_busy(const ds18b20_driver_t *driver)
Indica si hay una conversion en curso.
static void ds18b20_reset_state(ds18b20_driver_t *driver)
static bool ds18b20_crc8_is_valid(const uint8_t *data, uint8_t length)
bool ds18b20_bus_is_busy(const ds18b20_bus_driver_t *driver)
Indica si el bus esta ocupado convirtiendo o leyendo sensores.
bool ds18b20_bus_init(ds18b20_bus_driver_t *driver, const onewire_pin_config_t *pin_config)
Inicializa un bus compartido para varios sensores DS18B20.
bool ds18b20_bus_has_valid_sample(const ds18b20_bus_driver_t *driver, uint8_t index)
Indica si un sensor del bus tiene una muestra valida disponible.
uint8_t ds18b20_discover(const onewire_pin_config_t *pin_config, uint8_t rom_codes[][ONEWIRE_ROM_CODE_SIZE], uint8_t max_devices)
Busca sensores DS18B20 presentes en el bus indicado.
bool ds18b20_start_conversion(ds18b20_driver_t *driver)
Inicia una conversion de temperatura.
static bool ds18b20_begin_command(ds18b20_driver_t *driver, uint8_t command)
bool ds18b20_read_scratchpad(ds18b20_driver_t *driver, uint8_t scratchpad[DS18B20_SCRATCHPAD_SIZE])
Lee el scratchpad completo del sensor.
bool ds18b20_has_valid_sample(const ds18b20_driver_t *driver)
Indica si el driver dispone de una ultima muestra valida.
#define DS18B20_CMD_CONVERT_T
static bool ds18b20_bus_read_raw(const onewire_driver_t *bus, const uint8_t rom_code[ONEWIRE_ROM_CODE_SIZE], int16_t *raw_temperature)
bool ds18b20_get_latest_temperature_celsius(const ds18b20_driver_t *driver, float *temperature_celsius)
Obtiene la ultima temperatura valida en grados Celsius.
bool ds18b20_read_temperature_celsius(ds18b20_driver_t *driver, float *temperature_celsius)
Lee la temperatura del sensor en grados Celsius en forma bloqueante.
bool ds18b20_bus_get_latest_temperature_celsius(const ds18b20_bus_driver_t *driver, uint8_t index, float *temperature_celsius)
Obtiene la ultima temperatura cacheada de un sensor del bus en Celsius.
bool ds18b20_bus_start_conversion(ds18b20_bus_driver_t *driver)
Inicia una conversion global para todos los sensores del bus.
bool ds18b20_get_latest_raw(const ds18b20_driver_t *driver, int16_t *raw_temperature)
Obtiene la ultima temperatura cruda ya convertida.
static bool ds18b20_bus_begin_command(const onewire_driver_t *bus, const uint8_t rom_code[ONEWIRE_ROM_CODE_SIZE], uint8_t command)
Interfaz del driver para sensor de temperatura DS18B20.
#define DS18B20_FAMILY_CODE
Codigo de familia 1-Wire del DS18B20.
@ DS18B20_BUS_STATE_READING
@ DS18B20_BUS_STATE_ERROR
@ DS18B20_BUS_STATE_CONVERTING
@ DS18B20_STATE_CONVERTING
@ DS18B20_STATE_DATA_READY
#define DS18B20_CONVERSION_TIME_MS
Tiempo maximo de conversion del DS18B20 a 12 bits.
#define DS18B20_MAX_DEVICES
Cantidad maxima de sensores DS18B20 por bus en esta implementacion.
#define DS18B20_SCRATCHPAD_SIZE
Tamano del scratchpad del DS18B20.
bool onewire_init(onewire_driver_t *driver, const onewire_pin_config_t *pin_config)
Inicializa un bus 1-Wire sobre el pin indicado.
void onewire_write_byte(const onewire_driver_t *driver, uint8_t value)
Escribe un byte en el bus 1-Wire.
bool onewire_reset(const onewire_driver_t *driver)
Emite un reset 1-Wire y detecta presencia de dispositivos.
uint8_t onewire_search_roms(const onewire_driver_t *driver, uint8_t rom_codes[][ONEWIRE_ROM_CODE_SIZE], uint8_t max_devices)
Busca dispositivos presentes en el bus mediante el comando Search ROM.
uint8_t onewire_read_byte(const onewire_driver_t *driver)
Lee un byte desde el bus 1-Wire.
void onewire_skip_rom(const onewire_driver_t *driver)
Emite el comando Skip ROM sobre el bus.
void onewire_match_rom(const onewire_driver_t *driver, const uint8_t rom_code[ONEWIRE_ROM_CODE_SIZE])
Selecciona un dispositivo concreto por su codigo ROM.
#define ONEWIRE_ROM_CODE_SIZE
Tamano del codigo ROM de un dispositivo 1-Wire.
Estado del driver para multiples sensores DS18B20 sobre un mismo bus.
ds18b20_bus_state_t state
ds18b20_device_t devices[DS18B20_MAX_DEVICES]
uint16_t conversion_elapsed_ms
Datos cacheados de un sensor DS18B20 descubierto en un bus compartido.
uint8_t rom_code[ONEWIRE_ROM_CODE_SIZE]
int16_t last_raw_temperature
Estado del driver DS18B20 para un sensor individual.
int16_t last_raw_temperature
uint16_t conversion_elapsed_ms
uint8_t rom_code[ONEWIRE_ROM_CODE_SIZE]
Estado del driver 1-Wire para un bus individual.
Configuracion fisica del pin usado por el bus 1-Wire.