From eeff84201dcd4f629780a327efa66d2b5d7e6308 Mon Sep 17 00:00:00 2001 From: Mit4el Date: Tue, 25 Apr 2023 22:41:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20A02Distance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_svelte/widgets.json | 7 ++ .../sensors/A02Distance/A02Distance.cpp | 99 +++++++++++++++++++ src/modules/sensors/A02Distance/modinfo.json | 40 ++++++++ 3 files changed, 146 insertions(+) create mode 100644 src/modules/sensors/A02Distance/A02Distance.cpp create mode 100644 src/modules/sensors/A02Distance/modinfo.json diff --git a/data_svelte/widgets.json b/data_svelte/widgets.json index 4c681bff..1354e09d 100644 --- a/data_svelte/widgets.json +++ b/data_svelte/widgets.json @@ -230,6 +230,13 @@ "after": "mWt", "icon": "speedometer" }, + { + "name": "anydataCm", + "label": "Сантиметры", + "widget": "anydata", + "after": "cm", + "icon": "speedometer" + }, { "name": "nil", "label": "Без виджета" diff --git a/src/modules/sensors/A02Distance/A02Distance.cpp b/src/modules/sensors/A02Distance/A02Distance.cpp new file mode 100644 index 00000000..a3a9ac33 --- /dev/null +++ b/src/modules/sensors/A02Distance/A02Distance.cpp @@ -0,0 +1,99 @@ + +#include "Global.h" +#include "classes/IoTItem.h" + +#include "modules/sensors/UART/Uart.h" + +#define READ_TIMEOUT 100 + +class A02Distance : public IoTItem +{ +private: +public: + A02Distance(String parameters) : IoTItem(parameters) + { + if (myUART) + { + } + } + +//Периодическое выполнение программы, в int секунд, которые зададим в конфигурации + void doByInterval() + { + if (myUART) + { + static uint8_t data[4]; + + if (recieve(data, 4) == 4) + { + if (data[0] == 0xff) + { + int sum; + sum = (data[0] + data[1] + data[2]) & 0x00FF; + if (sum == data[3]) + { + float distance = (data[1] << 8) + data[2]; + if (distance > 30) + { + value.valD = distance / 10; + //SerialPrint("i", F("A02Distance"), "distance = " + String(value.valD) + "cm"); + regEvent(value.valD, "A02Distance"); + } + else + { + SerialPrint("E", "A02Distance", "Below the lower limit"); + regEvent(NAN, "A02Distance"); + } + } + else + { + regEvent(NAN, "A02Distance"); + SerialPrint("E", "A02Distance", "Distance data error"); + } + } + } else { + regEvent(NAN, "A02Distance"); + SerialPrint("E", "A02Distance", "Recieve data error"); + } + } else + { + regEvent(NAN, "A02Distance"); + SerialPrint("E", "A02Distance", "Not find UART"); + } + + } + + + //Приём данных из COM порта + uint16_t recieve(uint8_t *resp, uint16_t len) + { + ((SoftwareSerial *)myUART)->listen(); // Start software serial listen + unsigned long startTime = millis(); // Start time for Timeout + uint8_t index = 0; // Bytes we have read + while ((index < len) && (millis() - startTime < READ_TIMEOUT)) + { + if (myUART->available() > 0) + { + uint8_t c = (uint8_t)myUART->read(); + resp[index++] = c; + } + } + return index; + } + + ~A02Distance(){}; +}; + + +//Функиця ядра, чтобы нашел наш модуль +void *getAPI_A02Distance(String subtype, String param) +{ + if (subtype == F("A02Distance")) + { + return new A02Distance(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/sensors/A02Distance/modinfo.json b/src/modules/sensors/A02Distance/modinfo.json new file mode 100644 index 00000000..4e6d2368 --- /dev/null +++ b/src/modules/sensors/A02Distance/modinfo.json @@ -0,0 +1,40 @@ +{ + "menuSection": "Сенсоры", + "configItem": [ + { + "name": "A02 Дальность", + "type": "Reading", + "subtype": "A02Distance", + "id": "dist", + "widget": "anydataCm", + "page": "Сенсоры", + "descr": "Дальность", + "int": 5, + "round": 1 + } + ], + "about": { + "authorName": "Bubnov Mikhail", + "authorContact": "https://t.me/Mitchel", + "authorGit": "https://github.com/Mit4el", + "exampleURL": "https://iotmanager.org/wiki", + "specialThanks": "", + "moduleName": "A02Distance", + "moduleVersion": "0.1", + "moduleDesc": "A0221AU, A02YYUW Ультразвуковой датчик. Позволяет получить дальность с ультрозвуковых датчиков A0221AU, A02YYUW", + "propInfo": { + "int": "Количество секунд между опросами датчика." + } + }, + "defActive": true, + "usedLibs": { + "esp32_4mb": [], + "esp8266_4mb": [], + "esp8266_1mb": [], + "esp8266_1mb_ota": [], + "esp8285_1mb": [], + "esp8285_1mb_ota": [], + "esp8266_2mb": [], + "esp8266_2mb_ota": [] + } +} \ No newline at end of file