Przeglądaj źródła

Started work with single-wire interface DHTxx

Victor 3 lat temu
rodzic
commit
ac72e3c95a
6 zmienionych plików z 215 dodań i 8 usunięć
  1. 2 0
      interfaces/OneWire.c
  2. 16 0
      interfaces/OneWire.h
  3. 58 0
      interfaces/Sensors.c
  4. 74 0
      interfaces/Sensors.h
  5. 53 5
      unitemp.c
  6. 12 3
      unitemp.h

+ 2 - 0
interfaces/OneWire.c

@@ -0,0 +1,2 @@
+#include "OneWire.h"
+#include "Sensors.h"

+ 16 - 0
interfaces/OneWire.h

@@ -0,0 +1,16 @@
+#ifndef UNITEMP_ONE_WIRE
+#define UNITEMP_ONE_WIRE
+
+#include "../unitemp.h"
+
+//Интерфейс One Wire
+typedef struct {
+    //Тип интерфейса подключения датчика
+    Interface interface;
+    //Порт подключения датчика
+    const GPIO* gpio;
+    //Время последнего опроса
+    uint32_t lastPollingTime;
+} OneWireSensor;
+
+#endif

+ 58 - 0
interfaces/Sensors.c

@@ -0,0 +1,58 @@
+#include "Sensors.h"
+
+//Порты ввода/вывода, которые не были обозначены в общем списке
+const GpioPin SWC_10 = {.pin = LL_GPIO_PIN_14, .port = GPIOA};
+const GpioPin SIO_12 = {.pin = LL_GPIO_PIN_13, .port = GPIOA};
+const GpioPin TX_13 = {.pin = LL_GPIO_PIN_6, .port = GPIOB};
+const GpioPin RX_14 = {.pin = LL_GPIO_PIN_7, .port = GPIOB};
+
+//Количество доступных портов ввода/вывода
+#define GPIO_ITEMS (sizeof(GPIOList) / sizeof(GPIO))
+
+//Перечень достуных портов ввода/вывода
+//static
+const GPIO GPIOList[] = {
+    {2, "2 (A7)", &gpio_ext_pa7},
+    {3, "3 (A6)", &gpio_ext_pa6},
+    {4, "4 (A4)", &gpio_ext_pa4},
+    {5, "5 (B3)", &gpio_ext_pb3},
+    {6, "6 (B2)", &gpio_ext_pb2},
+    {7, "7 (C3)", &gpio_ext_pc3},
+    {10, " 10(SWC) ", &SWC_10},
+    {12, "12 (SIO)", &SIO_12},
+    {13, "13 (TX)", &TX_13},
+    {14, "14 (RX)", &RX_14},
+    {15, "15 (C1)", &gpio_ext_pc1},
+    {16, "16 (C0)", &gpio_ext_pc0},
+    {17, "17 (1W)", &ibutton_gpio}};
+
+//Перечень имён датчиков
+static const char* sensorNames[SENSOR_TYPES_COUNT] = {
+    "DHT11",
+    "DHT12 (1 Wire)",
+    "DHT12 (I2C)",
+    "DHT20",
+    "DHT21", //AM2301
+    "DHT22", //AM2302
+    "AM2320 (1W)",
+    "AM2320 (I2C)",
+    "LM75",
+    "DS18B20",
+    "BMP180",
+    "BMP280",
+    "BME280",
+};
+
+const char* unitemp_getSensorTypeName(SensorType st) {
+    if(st >= SENSOR_TYPES_COUNT) return NULL;
+    return sensorNames[st];
+}
+
+const GPIO* unitemp_getGPIOFormInt(uint8_t name) {
+    for(uint8_t i = 0; i < GPIO_ITEMS; i++) {
+        if(GPIOList[i].num == name) {
+            return &GPIOList[i];
+        }
+    }
+    return NULL;
+}

+ 74 - 0
interfaces/Sensors.h

@@ -0,0 +1,74 @@
+#ifndef UNITEMP_SENSORS
+#define UNITEMP_SENSORS
+#include <furi.h>
+#include <input/input.h>
+
+//Типы датчиков
+typedef enum {
+    DHT11,
+    DHT12_1W,
+    DHT12_I2C,
+    DHT20,
+    DHT21, //AM2301
+    DHT22, //AM2302
+    AM2320_1W,
+    AM2320_I2C,
+    LM75,
+    DS18B20,
+    BMP180,
+    BMP280,
+    BME280,
+
+    //Порядок сенсоров сверху не менять!
+    SENSOR_TYPES_COUNT //Общее количество типов датчиков
+} SensorType;
+
+//Типы подключения датчиков
+typedef enum {
+    ONE_WIRE, //Собственный однопроводной протокол датчиков DHTXX и AM23XX
+    DALLAS, //Однопроводной протокол Dallas
+    I2C,
+    SPI,
+
+    CONNECTION_TYPES_COUNT //Общее количество типов подключений
+} Interface;
+
+//Порт ввода/вывода Flipper Zero
+typedef struct {
+    const uint8_t num;
+    const char* name;
+    const GpioPin* pin;
+} GPIO;
+
+//Датчик
+typedef struct {
+    //Имя датчика
+    char* name;
+    //Температура
+    float temp;
+    //Относительная влажность
+    float hum;
+
+    //Тип датчика
+    SensorType type;
+    //Экземпляр датчика
+    void* instance;
+} Sensor;
+
+/**
+ * @brief Получить имя типа датчика
+ * 
+ * @param st Тип датчика
+ * @return Указатель на строку с именем типа датчика
+ */
+const char* unitemp_getSensorTypeName(SensorType st);
+
+/**
+ * @brief Конвертация номера порта на корпусе FZ в GPIO 
+ * 
+ * @param name Номер порта на корпусе FZ
+ * @return Указатель на GPIO при успехе, NULL при ошибке
+ */
+const GPIO* unitemp_getGPIOFormInt(uint8_t name);
+
+#endif

+ 53 - 5
unitemp.c

@@ -1,11 +1,41 @@
 #include "unitemp.h"
 #include "unitemp.h"
+#include "interfaces/OneWire.h"
 
 
 /* Статические переменные */
 /* Статические переменные */
 //Данные приложения
 //Данные приложения
 static Unitemp* app;
 static Unitemp* app;
 
 
 /**
 /**
- * @brief Сохранение настроек
+ * @brief Функция загрузки датчиков с SD-карты
+ * 
+ * @return true Загрузка успешная
+ * @return false Произошла ошибка
+ */
+bool unitemp_loadSensors() {
+    //Сброс количества датчиков
+    app->sensors_count = 0;
+    //Очистка памяти датчиков
+    memset(app->sensors, 0, sizeof(app->sensors));
+
+    //Типа загружен датчик DHT11 на порте 10
+    app->sensors[app->sensors_count] = (Sensor){
+        .name = "DHT11",
+        .type = DHT11,
+        .instance = &(OneWireSensor){.interface = ONE_WIRE, .gpio = unitemp_getGPIOFormInt(10)}};
+    app->sensors_count++;
+
+    //Типа загружен датчик DHT21 на порте 2
+    app->sensors[app->sensors_count] = (Sensor){
+        .name = "DHT21",
+        .type = DHT21,
+        .instance = &(OneWireSensor){.interface = ONE_WIRE, .gpio = unitemp_getGPIOFormInt(2)}};
+    app->sensors_count++;
+
+    return true;
+}
+
+/**
+ * @brief Сохранение настроек на SD-карту
  * 
  * 
  * @return true Если сохранение прошло успешно
  * @return true Если сохранение прошло успешно
  * @return false Если во время сохранения произошла ошибка
  * @return false Если во время сохранения произошла ошибка
@@ -180,6 +210,10 @@ static bool unitemp_alloc(void) {
 
 
     //Уведомления
     //Уведомления
     app->notifications = furi_record_open(RECORD_NOTIFICATION);
     app->notifications = furi_record_open(RECORD_NOTIFICATION);
+
+    //Установка значений по умолчанию
+    app->settings.infinityBacklight = true; //Подсветка горит всегда
+    app->settings.unit = CELSIUM; //Единица измерения - градусы Цельсия
     return true;
     return true;
 }
 }
 
 
@@ -187,6 +221,8 @@ static bool unitemp_alloc(void) {
  * @brief Освыбождение памяти после работы приложения
  * @brief Освыбождение памяти после работы приложения
  */
  */
 static void unitemp_free(void) {
 static void unitemp_free(void) {
+    //Очистка датчиков
+    free(app->sensors);
     //Закрытие уведомлений
     //Закрытие уведомлений
     furi_record_close(RECORD_NOTIFICATION);
     furi_record_close(RECORD_NOTIFICATION);
     //Закрытие хранилища
     //Закрытие хранилища
@@ -210,12 +246,24 @@ int32_t unitemp_app() {
         return 0;
         return 0;
     }
     }
 
 
-    //Установка стандартных значений настроек
-    app->settings.infinityBacklight = true;
-    app->settings.unit = CELSIUM;
-
     //Загрузка настроек из SD-карты
     //Загрузка настроек из SD-карты
     unitemp_loadSettings();
     unitemp_loadSettings();
+    //Загрузка датчиков из SD-карты
+    unitemp_loadSensors();
+
+    while(1) {
+        FURI_LOG_D(APP_NAME, "Sensors values:");
+        for(uint8_t i = 0; i < app->sensors_count; i++) {
+            FURI_LOG_D(
+                APP_NAME,
+                "%s: %2.1f*C/%d%%",
+                app->sensors[i].name,
+                (double)app->sensors[i].temp,
+                (uint8_t)app->sensors[i].hum);
+        }
+
+        furi_delay_ms(1000);
+    }
 
 
     //Освобождение памяти
     //Освобождение памяти
     unitemp_free();
     unitemp_free();

+ 12 - 3
unitemp.h

@@ -4,13 +4,16 @@
 /* Подключение стандартных библиотек */
 /* Подключение стандартных библиотек */
 
 
 /* Подключение API Flipper Zero */
 /* Подключение API Flipper Zero */
-#include "furi.h"
 //Файловый поток
 //Файловый поток
 #include <toolbox/stream/file_stream.h>
 #include <toolbox/stream/file_stream.h>
 //Уведомления
 //Уведомления
 #include <notification/notification.h>
 #include <notification/notification.h>
 #include <notification/notification_messages.h>
 #include <notification/notification_messages.h>
 
 
+/* Внутренние библиотеки */
+//Интерфейсы подключения датчиков
+#include "interfaces/Sensors.h"
+
 /* Объявление макроподстановок */
 /* Объявление макроподстановок */
 //Имя приложения
 //Имя приложения
 #define APP_NAME "Unitemp"
 #define APP_NAME "Unitemp"
@@ -20,10 +23,12 @@
 #define APP_FILENAME_SETTINGS "settings.cfg"
 #define APP_FILENAME_SETTINGS "settings.cfg"
 //Имя файла с датчиками
 //Имя файла с датчиками
 #define APP_FILENAME_SENSORS "sensors.cfg"
 #define APP_FILENAME_SENSORS "sensors.cfg"
+//Максимальное количество датчиков
+#define MAX_SENSORS 5 //Больше на экран не лезет
 
 
 /* Объявление перечислений */
 /* Объявление перечислений */
 //Единицы измерения
 //Единицы измерения
-typedef enum { CELSIUM, FARENGATE } units;
+typedef enum { CELSIUM, FARENGATE } measureUnit;
 
 
 /* Объявление структур */
 /* Объявление структур */
 //Настройки плагина
 //Настройки плагина
@@ -32,13 +37,17 @@ typedef struct {
     bool infinityBacklight;
     bool infinityBacklight;
     //Единица измерения температуры
     //Единица измерения температуры
     //Ложь - градусы Цельсия, истина - Фарeнгейты
     //Ложь - градусы Цельсия, истина - Фарeнгейты
-    units unit;
+    measureUnit unit;
 } UnitempSettings;
 } UnitempSettings;
 
 
 //Основная структура плагина
 //Основная структура плагина
 typedef struct {
 typedef struct {
     //Основные настройки
     //Основные настройки
     UnitempSettings settings;
     UnitempSettings settings;
+    //Список датчиков
+    Sensor sensors[MAX_SENSORS];
+    //Количество загруженных датчиков
+    size_t sensors_count;
 
 
     //SD-карта
     //SD-карта
     Storage* storage; //Хранилище
     Storage* storage; //Хранилище