From bc99538ca82cee08260a4fb589de0693798e217a Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 7 Jan 2023 18:42:38 +0300 Subject: [PATCH] Update UniTemp https://github.com/quen0n/unitemp-flipperzero --- applications/plugins/unitemp/README.md | 4 +- applications/plugins/unitemp/Sensors.c | 34 ++---- applications/plugins/unitemp/Sensors.h | 2 + .../unitemp/interfaces/OneWireSensor.c | 29 ++--- applications/plugins/unitemp/sensors/BMP180.c | 6 +- applications/plugins/unitemp/sensors/BMx280.c | 17 +-- .../plugins/unitemp/sensors/HDC1080.c | 94 ++++++++++++++++ .../plugins/unitemp/sensors/HDC1080.h | 62 +++++++++++ applications/plugins/unitemp/sensors/HTU21x.c | 105 ++++++++++++++++++ applications/plugins/unitemp/sensors/HTU21x.h | 62 +++++++++++ .../plugins/unitemp/sensors/Sensors.xlsx | Bin 12336 -> 12455 bytes applications/plugins/unitemp/unitemp.c | 4 +- applications/plugins/unitemp/unitemp.h | 12 +- .../plugins/unitemp/views/SensorEdit_view.c | 16 +-- 14 files changed, 368 insertions(+), 79 deletions(-) create mode 100644 applications/plugins/unitemp/sensors/HDC1080.c create mode 100644 applications/plugins/unitemp/sensors/HDC1080.h create mode 100644 applications/plugins/unitemp/sensors/HTU21x.c create mode 100644 applications/plugins/unitemp/sensors/HTU21x.h diff --git a/applications/plugins/unitemp/README.md b/applications/plugins/unitemp/README.md index 80a296e9b..817f6f481 100644 --- a/applications/plugins/unitemp/README.md +++ b/applications/plugins/unitemp/README.md @@ -3,9 +3,9 @@ [![GitHub release](https://img.shields.io/github/release/quen0n/unitemp-flipperzero?include_prereleases=&sort=semver&color=blue)](https://github.com/quen0n/unitemp-flipperzero/releases/) [![GitHub](https://img.shields.io/github/license/quen0n/unitemp-flipperzero)](https://github.com/quen0n/unitemp-flipperzero/blob/dev/LICENSE.md) [![Build dev](https://github.com/quen0n/unitemp-flipperzero/actions/workflows/build_dev.yml/badge.svg?branch=dev)](https://github.com/quen0n/unitemp-flipperzero/actions/workflows/build_dev.yml) -[Flipper Zero](https://flipperzero.one/) application for reading temperature, humidity and pressure sensors using Onewire, Singlewire, I2C protocols. +[Flipper Zero](https://flipperzero.one/) application for reading temperature, humidity and pressure sensors like a DHT11/22, DS18B20, BMP280, HTU21 and more. ## List of supported sensors (supplemented) -![image](https://user-images.githubusercontent.com/10090793/210119924-51119deb-f950-40ee-bc27-22b971243527.png) +![image](https://user-images.githubusercontent.com/10090793/211131502-c1560eb5-f59c-4cfa-86f7-27f037490a35.png) ## Installation Copy the contents of the repository to the `applications/plugins/unitemp` folder and build the project. Flash FZ along with resources. [More...](https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/fbt.md) ## Some community photos diff --git a/applications/plugins/unitemp/Sensors.c b/applications/plugins/unitemp/Sensors.c index 33f62b201..87a218fe0 100644 --- a/applications/plugins/unitemp/Sensors.c +++ b/applications/plugins/unitemp/Sensors.c @@ -79,10 +79,12 @@ static const SensorType* sensorTypes[] = { &Dallas, &AM2320_SW, &AM2320_I2C, + &HTU21x, &AHT10, &SHT30, &GXHT30, &LM75, + &HDC1080, &BMP180, &BMP280, &BME280}; @@ -281,9 +283,7 @@ void unitemp_sensors_add(Sensor* sensor) { } bool unitemp_sensors_load(void) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Loading sensors..."); -#endif + UNITEMP_DEBUG("Loading sensors..."); //Выделение памяти на поток app->file_stream = file_stream_alloc(app->storage); @@ -392,9 +392,7 @@ bool unitemp_sensors_load(void) { } bool unitemp_sensors_save(void) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Saving sensors..."); -#endif + UNITEMP_DEBUG("Saving sensors..."); //Выделение памяти для потока app->file_stream = file_stream_alloc(app->storage); @@ -540,15 +538,12 @@ void unitemp_sensor_free(Sensor* sensor) { bool status = false; //Высвобождение памяти под инстанс status = sensor->type->interface->mem_releaser(sensor); - UNUSED(status); -#ifdef UNITEMP_DEBUG if(status) { - FURI_LOG_D(APP_NAME, "Sensor %s memory successfully released", sensor->name); + UNITEMP_DEBUG("Sensor %s memory successfully released", sensor->name); } else { FURI_LOG_E(APP_NAME, "Sensor %s memory is not released", sensor->name); } -#endif free(sensor->name); //free(sensor); } @@ -569,9 +564,7 @@ bool unitemp_sensors_init(void) { //Может пропасть при отключении USB if(furi_hal_power_is_otg_enabled() != true) { furi_hal_power_enable_otg(); -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "OTG enabled"); -#endif + UNITEMP_DEBUG("OTG enabled"); } if(!(*app->sensors[i]->type->initializer)(app->sensors[i])) { FURI_LOG_E( @@ -580,9 +573,7 @@ bool unitemp_sensors_init(void) { app->sensors[i]->name); result = false; } -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Sensor %s successfully initialized", app->sensors[i]->name); -#endif + UNITEMP_DEBUG("Sensor %s successfully initialized", app->sensors[i]->name); } app->sensors_ready = true; return result; @@ -593,9 +584,7 @@ bool unitemp_sensors_deInit(void) { //Выключение 5 В если до этого оно не было включено if(app->settings.lastOTGState != true) { furi_hal_power_disable_otg(); -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "OTG disabled"); -#endif + UNITEMP_DEBUG("OTG disabled"); } //Перебор датчиков из списка @@ -631,10 +620,9 @@ UnitempStatus unitemp_sensor_updateData(Sensor* sensor) { sensor->status = sensor->type->interface->updater(sensor); -#ifdef UNITEMP_DEBUG - if(sensor->status != UT_SENSORSTATUS_OK && sensor->status != UT_SENSORSTATUS_POLLING) - FURI_LOG_D(APP_NAME, "Sensor %s update status %d", sensor->name, sensor->status); -#endif + if(sensor->status != UT_SENSORSTATUS_OK && sensor->status != UT_SENSORSTATUS_POLLING) { + UNITEMP_DEBUG("Sensor %s update status %d", sensor->name, sensor->status); + } if(app->settings.temp_unit == UT_TEMP_FAHRENHEIT && sensor->status == UT_SENSORSTATUS_OK) uintemp_celsiumToFarengate(sensor); diff --git a/applications/plugins/unitemp/Sensors.h b/applications/plugins/unitemp/Sensors.h index 2193ce466..fcbb395fa 100644 --- a/applications/plugins/unitemp/Sensors.h +++ b/applications/plugins/unitemp/Sensors.h @@ -324,4 +324,6 @@ const GPIO* #include "./sensors/DHT20.h" #include "./sensors/SHT30.h" #include "./sensors/BMP180.h" +#include "./sensors/HTU21x.h" +#include "./sensors/HDC1080.h" #endif diff --git a/applications/plugins/unitemp/interfaces/OneWireSensor.c b/applications/plugins/unitemp/interfaces/OneWireSensor.c index 740ba3365..4d5db5d0e 100644 --- a/applications/plugins/unitemp/interfaces/OneWireSensor.c +++ b/applications/plugins/unitemp/interfaces/OneWireSensor.c @@ -58,9 +58,7 @@ OneWireBus* uintemp_onewire_bus_alloc(const GPIO* gpio) { bus->device_count = 0; bus->gpio = gpio; bus->powerMode = PWR_PASSIVE; -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "one wire bus (port %d) allocated", gpio->num); -#endif + UNITEMP_DEBUG("one wire bus (port %d) allocated", gpio->num); return bus; } @@ -84,9 +82,7 @@ bool unitemp_onewire_bus_init(OneWireBus* bus) { return true; } bool unitemp_onewire_bus_deinit(OneWireBus* bus) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "devices on wire %d: %d", bus->gpio->num, bus->device_count); -#endif + UNITEMP_DEBUG("devices on wire %d: %d", bus->gpio->num, bus->device_count); bus->device_count--; if(bus->device_count <= 0) { bus->device_count = 0; @@ -236,15 +232,11 @@ void unitemp_onewire_bus_enum_init(void) { uint8_t* unitemp_onewire_bus_enum_next(OneWireBus* bus) { furi_delay_ms(10); if(!onewire_enum_fork_bit) { // Если на предыдущем шаге уже не было разногласий -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "All devices on wire %d is found", unitemp_gpio_toInt(bus->gpio)); -#endif + UNITEMP_DEBUG("All devices on wire %d is found", unitemp_gpio_toInt(bus->gpio)); return 0; // то просто выходим ничего не возвращая } if(!unitemp_onewire_bus_start(bus)) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Wire %d is empty", unitemp_gpio_toInt(bus->gpio)); -#endif + UNITEMP_DEBUG("Wire %d is empty", unitemp_gpio_toInt(bus->gpio)); return 0; } uint8_t bp = 8; @@ -278,9 +270,8 @@ uint8_t* unitemp_onewire_bus_enum_next(OneWireBus* bus) { if(!not1) { // Присутствует единица next |= 0x80; } else { // Нет ни нулей ни единиц - ошибочная ситуация -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Wrong wire %d situation", unitemp_gpio_toInt(bus->gpio)); -#endif + + UNITEMP_DEBUG("Wrong wire %d situation", unitemp_gpio_toInt(bus->gpio)); return 0; } } @@ -421,9 +412,7 @@ UnitempStatus unitemp_onewire_sensor_update(Sensor* sensor) { unitemp_onewire_bus_send_byte(instance->bus, 0xBE); // Read Scratch-pad unitemp_onewire_bus_read_byteArray(instance->bus, buff, 9); if(!unitemp_onewire_CRC_check(buff, 9)) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Sensor %s is not found", sensor->name); -#endif + UNITEMP_DEBUG("Sensor %s is not found", sensor->name); return UT_SENSORSTATUS_TIMEOUT; } } @@ -462,9 +451,7 @@ UnitempStatus unitemp_onewire_sensor_update(Sensor* sensor) { unitemp_onewire_bus_send_byte(instance->bus, 0xBE); // Read Scratch-pad unitemp_onewire_bus_read_byteArray(instance->bus, buff, 9); if(!unitemp_onewire_CRC_check(buff, 9)) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Failed CRC check: %s", sensor->name); -#endif + UNITEMP_DEBUG("Failed CRC check: %s", sensor->name); return UT_SENSORSTATUS_BADCRC; } int16_t raw = buff[0] | ((int16_t)buff[1] << 8); diff --git a/applications/plugins/unitemp/sensors/BMP180.c b/applications/plugins/unitemp/sensors/BMP180.c index 6fd5f2fa5..d17e78c09 100644 --- a/applications/plugins/unitemp/sensors/BMP180.c +++ b/applications/plugins/unitemp/sensors/BMP180.c @@ -101,9 +101,8 @@ bool unitemp_BMP180_init(Sensor* sensor) { bmp180_instance->bmp180_cal.MC = (buff[18] << 8) | buff[19]; bmp180_instance->bmp180_cal.MD = (buff[20] << 8) | buff[21]; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + +UNITEMP_DEBUG( "Sensor BMP180 (0x%02X) calibration values: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmp180_instance->bmp180_cal.AC1, @@ -117,7 +116,6 @@ bool unitemp_BMP180_init(Sensor* sensor) { bmp180_instance->bmp180_cal.MB, bmp180_instance->bmp180_cal.MC, bmp180_instance->bmp180_cal.MD); -#endif return true; } diff --git a/applications/plugins/unitemp/sensors/BMx280.c b/applications/plugins/unitemp/sensors/BMx280.c index a64daaa1d..d572f09c3 100644 --- a/applications/plugins/unitemp/sensors/BMx280.c +++ b/applications/plugins/unitemp/sensors/BMx280.c @@ -180,22 +180,19 @@ static bool bmx280_readCalValues(I2CSensor* i2c_sensor) { if(!unitemp_i2c_readRegArray( i2c_sensor, TEMP_CAL_START_ADDR, 6, (uint8_t*)&bmx280_instance->temp_cal)) return false; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + + UNITEMP_DEBUG( "Sensor BMx280 (0x%02X) T1-T3: %d, %d, %d", i2c_sensor->currentI2CAdr, bmx280_instance->temp_cal.dig_T1, bmx280_instance->temp_cal.dig_T2, bmx280_instance->temp_cal.dig_T3); -#endif if(!unitemp_i2c_readRegArray( i2c_sensor, PRESS_CAL_START_ADDR, 18, (uint8_t*)&bmx280_instance->press_cal)) return false; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + + UNITEMP_DEBUG( "Sensor BMx280 (0x%02X): P1-P9: %d, %d, %d, %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmx280_instance->press_cal.dig_P1, @@ -207,7 +204,6 @@ static bool bmx280_readCalValues(I2CSensor* i2c_sensor) { bmx280_instance->press_cal.dig_P7, bmx280_instance->press_cal.dig_P8, bmx280_instance->press_cal.dig_P9); -#endif if(bmx280_instance->chip_id == BME280_ID) { uint8_t buff[7] = {0}; @@ -221,9 +217,7 @@ static bool bmx280_readCalValues(I2CSensor* i2c_sensor) { bmx280_instance->hum_cal.dig_H5 = (buff[4] & 0x0F) | ((int16_t)buff[5] << 4); bmx280_instance->hum_cal.dig_H6 = buff[6]; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + UNITEMP_DEBUG( "Sensor BMx280 (0x%02X): H1-H6: %d, %d, %d, %d, %d, %d", i2c_sensor->currentI2CAdr, bmx280_instance->hum_cal.dig_H1, @@ -232,7 +226,6 @@ static bool bmx280_readCalValues(I2CSensor* i2c_sensor) { bmx280_instance->hum_cal.dig_H4, bmx280_instance->hum_cal.dig_H5, bmx280_instance->hum_cal.dig_H6); -#endif } bmx280_instance->last_cal_update_time = furi_get_tick(); diff --git a/applications/plugins/unitemp/sensors/HDC1080.c b/applications/plugins/unitemp/sensors/HDC1080.c new file mode 100644 index 000000000..5f2c59b24 --- /dev/null +++ b/applications/plugins/unitemp/sensors/HDC1080.c @@ -0,0 +1,94 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "HDC1080.h" +#include "../interfaces/I2CSensor.h" + +const SensorType HDC1080 = { + .typename = "HDC1080", + .interface = &I2C, + .datatype = UT_DATA_TYPE_TEMP_HUM, + .pollingInterval = 250, + .allocator = unitemp_HDC1080_alloc, + .mem_releaser = unitemp_HDC1080_free, + .initializer = unitemp_HDC1080_init, + .deinitializer = unitemp_HDC1080_deinit, + .updater = unitemp_HDC1080_update}; + +bool unitemp_HDC1080_alloc(Sensor* sensor, char* args) { + UNUSED(args); + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + //Адреса на шине I2C (7 бит) + i2c_sensor->minI2CAdr = 0x40 << 1; + i2c_sensor->maxI2CAdr = 0x40 << 1; + return true; +} + +bool unitemp_HDC1080_free(Sensor* sensor) { + //Нечего высвобождать, так как ничего не было выделено + UNUSED(sensor); + return true; +} + +bool unitemp_HDC1080_init(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + uint8_t data[2]; + if(!unitemp_i2c_readRegArray(i2c_sensor, 0xFF, 2, data)) return UT_SENSORSTATUS_TIMEOUT; + uint16_t device_id = ((uint16_t)data[0] << 8) | data[1]; + if(device_id != 0x1050) { + FURI_LOG_E( + APP_NAME, + "Sensor %s returned wrong ID 0x%02X, expected 0x1050", + sensor->name, + device_id); + return false; + } + data[0] = 0b0001000; + data[1] = 0; + //Установка режима работы и разрядности измерений + if(!unitemp_i2c_writeRegArray(i2c_sensor, 0x02, 2, data)) return UT_SENSORSTATUS_TIMEOUT; + + return true; +} + +bool unitemp_HDC1080_deinit(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + UNUSED(i2c_sensor); + return true; +} + +UnitempStatus unitemp_HDC1080_update(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + uint8_t data[2] = {0}; + //Запуск измерения + if(!unitemp_i2c_writeArray(i2c_sensor, 1, data)) return UT_SENSORSTATUS_TIMEOUT; + furi_delay_ms(10); + if(!unitemp_i2c_readArray(i2c_sensor, 2, data)) return UT_SENSORSTATUS_TIMEOUT; + + sensor->temp = ((float)(((uint16_t)data[0] << 8) | data[1]) / 65536) * 165 - 40; + + data[0] = 1; + if(!unitemp_i2c_writeArray(i2c_sensor, 1, data)) return UT_SENSORSTATUS_TIMEOUT; + furi_delay_ms(10); + if(!unitemp_i2c_readArray(i2c_sensor, 2, data)) return UT_SENSORSTATUS_TIMEOUT; + sensor->hum = ((float)(((uint16_t)data[0] << 8) | data[1]) / 65536) * 100; + + return UT_SENSORSTATUS_OK; +} diff --git a/applications/plugins/unitemp/sensors/HDC1080.h b/applications/plugins/unitemp/sensors/HDC1080.h new file mode 100644 index 000000000..59ba0673c --- /dev/null +++ b/applications/plugins/unitemp/sensors/HDC1080.h @@ -0,0 +1,62 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef UNITEMP_HDC1080 +#define UNITEMP_HDC1080 + +#include "../unitemp.h" +#include "../Sensors.h" +extern const SensorType HDC1080; +/** + * @brief Выделение памяти и установка начальных значений датчика HDC1080 + * + * @param sensor Указатель на создаваемый датчик + * @return Истина при успехе + */ +bool unitemp_HDC1080_alloc(Sensor* sensor, char* args); + +/** + * @brief Инициализации датчика HDC1080 + * + * @param sensor Указатель на датчик + * @return Истина если инициализация упспешная + */ +bool unitemp_HDC1080_init(Sensor* sensor); + +/** + * @brief Деинициализация датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_HDC1080_deinit(Sensor* sensor); + +/** + * @brief Обновление значений из датчика + * + * @param sensor Указатель на датчик + * @return Статус обновления + */ +UnitempStatus unitemp_HDC1080_update(Sensor* sensor); + +/** + * @brief Высвободить память датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_HDC1080_free(Sensor* sensor); + +#endif \ No newline at end of file diff --git a/applications/plugins/unitemp/sensors/HTU21x.c b/applications/plugins/unitemp/sensors/HTU21x.c new file mode 100644 index 000000000..74fc47d5d --- /dev/null +++ b/applications/plugins/unitemp/sensors/HTU21x.c @@ -0,0 +1,105 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "HTU21x.h" +#include "../interfaces/I2CSensor.h" + +const SensorType HTU21x = { + .typename = "HTU21x", + .interface = &I2C, + .datatype = UT_DATA_TYPE_TEMP_HUM, + .pollingInterval = 250, + .allocator = unitemp_HTU21x_alloc, + .mem_releaser = unitemp_HTU21x_free, + .initializer = unitemp_HTU21x_init, + .deinitializer = unitemp_HTU21x_deinit, + .updater = unitemp_HTU21x_update}; + +static uint8_t checkCRC(uint16_t data) { + for(uint8_t i = 0; i < 16; i++) { + if(data & 0x8000) + data = (data << 1) ^ 0x13100; + else + data <<= 1; + } + return (data >> 8); +} + +bool unitemp_HTU21x_alloc(Sensor* sensor, char* args) { + UNUSED(args); + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + //Адреса на шине I2C (7 бит) + i2c_sensor->minI2CAdr = 0x40 << 1; + i2c_sensor->maxI2CAdr = 0x40 << 1; + return true; +} + +bool unitemp_HTU21x_free(Sensor* sensor) { + //Нечего высвобождать, так как ничего не было выделено + UNUSED(sensor); + return true; +} + +bool unitemp_HTU21x_init(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + UNUSED(i2c_sensor); + return true; +} + +bool unitemp_HTU21x_deinit(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + UNUSED(i2c_sensor); + return true; +} + +UnitempStatus unitemp_HTU21x_update(Sensor* sensor) { + I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance; + + //Датчик может быть всего один, так что норм + static bool temp_hum = false; + + uint8_t data[3]; + + if(sensor->status == UT_SENSORSTATUS_POLLING) { + if(!unitemp_i2c_readArray(i2c_sensor, 3, data)) return UT_SENSORSTATUS_TIMEOUT; + + uint16_t raw = ((uint16_t)data[0] << 8) | data[1]; + if(checkCRC(raw) != data[2]) return UT_SENSORSTATUS_BADCRC; + + if(temp_hum) { + sensor->temp = (0.002681f * raw - 46.85f); + } else { + sensor->hum = ((0.001907 * (raw ^ 0x02)) - 6); + } + temp_hum = !temp_hum; + return UT_SENSORSTATUS_OK; + } + + if(temp_hum) { + //Запрос температуры + data[0] = 0xF3; + if(!unitemp_i2c_writeArray(i2c_sensor, 1, data)) return UT_SENSORSTATUS_TIMEOUT; + } else { + //Запрос влажности + data[0] = 0xF5; + if(!unitemp_i2c_writeArray(i2c_sensor, 1, data)) return UT_SENSORSTATUS_TIMEOUT; + } + + return UT_SENSORSTATUS_POLLING; +} diff --git a/applications/plugins/unitemp/sensors/HTU21x.h b/applications/plugins/unitemp/sensors/HTU21x.h new file mode 100644 index 000000000..ffe062a24 --- /dev/null +++ b/applications/plugins/unitemp/sensors/HTU21x.h @@ -0,0 +1,62 @@ +/* + Unitemp - Universal temperature reader + Copyright (C) 2023 Victor Nikitchuk (https://github.com/quen0n) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef UNITEMP_HTU21x +#define UNITEMP_HTU21x + +#include "../unitemp.h" +#include "../Sensors.h" +extern const SensorType HTU21x; +/** + * @brief Выделение памяти и установка начальных значений датчика HTU21x + * + * @param sensor Указатель на создаваемый датчик + * @return Истина при успехе + */ +bool unitemp_HTU21x_alloc(Sensor* sensor, char* args); + +/** + * @brief Инициализации датчика HTU21x + * + * @param sensor Указатель на датчик + * @return Истина если инициализация упспешная + */ +bool unitemp_HTU21x_init(Sensor* sensor); + +/** + * @brief Деинициализация датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_HTU21x_deinit(Sensor* sensor); + +/** + * @brief Обновление значений из датчика + * + * @param sensor Указатель на датчик + * @return Статус обновления + */ +UnitempStatus unitemp_HTU21x_update(Sensor* sensor); + +/** + * @brief Высвободить память датчика + * + * @param sensor Указатель на датчик + */ +bool unitemp_HTU21x_free(Sensor* sensor); + +#endif \ No newline at end of file diff --git a/applications/plugins/unitemp/sensors/Sensors.xlsx b/applications/plugins/unitemp/sensors/Sensors.xlsx index 9983aeb6ea1201003aa27a9ca54218e19e5f20c7..bd47d4948316b9b3797bc4a39106149a3724db2a 100644 GIT binary patch delta 4348 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 NI5&y=O=biD{11nn_*nn| delta 4251 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 DMKjj{ diff --git a/applications/plugins/unitemp/unitemp.c b/applications/plugins/unitemp/unitemp.c index 9ff108395..31ab057d6 100644 --- a/applications/plugins/unitemp/unitemp.c +++ b/applications/plugins/unitemp/unitemp.c @@ -78,9 +78,7 @@ bool unitemp_saveSettings(void) { } bool unitemp_loadSettings(void) { -#ifdef UNITEMP_DEBUG - FURI_LOG_D(APP_NAME, "Loading settings..."); -#endif + UNITEMP_DEBUG("Loading settings..."); //Выделение памяти на поток app->file_stream = file_stream_alloc(app->storage); diff --git a/applications/plugins/unitemp/unitemp.h b/applications/plugins/unitemp/unitemp.h index 144780968..5947a3e3c 100644 --- a/applications/plugins/unitemp/unitemp.h +++ b/applications/plugins/unitemp/unitemp.h @@ -39,19 +39,25 @@ /* Объявление макроподстановок */ //Имя приложения #define APP_NAME "Unitemp" +//Версия приложения +#define UNITEMP_APP_VER "1.1" //Путь хранения файлов плагина #define APP_PATH_FOLDER "/ext/unitemp" //Имя файла с настройками #define APP_FILENAME_SETTINGS "settings.cfg" //Имя файла с датчиками #define APP_FILENAME_SENSORS "sensors.cfg" -//Версия приложения -#define UNITEMP_APP_VER "1.0" //Размер буффера текста #define BUFF_SIZE 32 -#define UNITEMP_DEBUG +#define UNITEMP_D + +#ifdef FURI_DEBUG +#define UNITEMP_DEBUG(msg, ...) FURI_LOG_D(APP_NAME, msg, ##__VA_ARGS__) +#else +#define UNITEMP_DEBUG(msg, ...) +#endif /* Объявление перечислений */ //Единицы измерения температуры diff --git a/applications/plugins/unitemp/views/SensorEdit_view.c b/applications/plugins/unitemp/views/SensorEdit_view.c index d1660bc2e..f1de4ff11 100644 --- a/applications/plugins/unitemp/views/SensorEdit_view.c +++ b/applications/plugins/unitemp/views/SensorEdit_view.c @@ -63,13 +63,9 @@ bool _onewire_id_exist(uint8_t* id) { static void _onewire_scan(void) { OneWireSensor* ow_sensor = editable_sensor->instance; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, - "devices on wire %d: %d", - ow_sensor->bus->gpio->num, - ow_sensor->bus->device_count); -#endif + + UNITEMP_DEBUG( + "devices on wire %d: %d", ow_sensor->bus->gpio->num, ow_sensor->bus->device_count); //Сканирование шины one wire unitemp_onewire_bus_init(ow_sensor->bus); @@ -101,9 +97,8 @@ static void _onewire_scan(void) { memcpy(ow_sensor->deviceID, id, 8); ow_sensor->familyCode = id[0]; -#ifdef UNITEMP_DEBUG - FURI_LOG_D( - APP_NAME, + + UNITEMP_DEBUG( "Found sensor's ID: %02X%02X%02X%02X%02X%02X%02X%02X", id[0], id[1], @@ -113,7 +108,6 @@ static void _onewire_scan(void) { id[5], id[6], id[7]); -#endif if(ow_sensor->familyCode != 0) { char id_buff[10];