diff --git a/data_svelte/myProfile.json b/data_svelte/myProfile.json index b0ce54f5..e4450f24 100644 --- a/data_svelte/myProfile.json +++ b/data_svelte/myProfile.json @@ -152,6 +152,10 @@ "path": "src/modules/sensors/IoTWiegand", "active": false }, + { + "path": "src/modules/sensors/ld2410", + "active": false + }, { "path": "src/modules/sensors/Max6675", "active": false diff --git a/myProfile.json b/myProfile.json index b0ce54f5..e4450f24 100644 --- a/myProfile.json +++ b/myProfile.json @@ -152,6 +152,10 @@ "path": "src/modules/sensors/IoTWiegand", "active": false }, + { + "path": "src/modules/sensors/ld2410", + "active": false + }, { "path": "src/modules/sensors/Max6675", "active": false diff --git a/src/modules/sensors/ld2410/ld2410.cpp b/src/modules/sensors/ld2410/ld2410.cpp new file mode 100644 index 00000000..330c9953 --- /dev/null +++ b/src/modules/sensors/ld2410/ld2410.cpp @@ -0,0 +1,432 @@ +#include "Global.h" +#include "classes/IoTItem.h" + +#define MONITOR_SERIAL Serial +#define RADAR_SERIAL Serial1 +// #define RADAR_RX_PIN 32 +// #define RADAR_TX_PIN 33 + +#include +// ld2410 radar; + +ld2410 *radar = nullptr; + +ld2410 *instanceradar(uint8_t _rx, uint8_t _tx) +{ + if (!radar) + { // Если библиотека ранее инициализировалась, т о просто вернем указатель + // Инициализируем библиотеку + radar = new ld2410(); + // radar->begin(); // При необходимости делаем begin библиотеке + + RADAR_SERIAL.begin(256000, SERIAL_8N1, _rx, _tx); // UART for monitoring the radar + + if (radar->begin(RADAR_SERIAL)) + { + SerialPrint("i", "LD2410", "Radar sensor подключен"); + SerialPrint("i", "LD2410", "Connect LD2410 radar TX to GPIO: " + String(_rx)); + SerialPrint("i", "LD2410", "Connect LD2410 radar RX to GPIO: " + String(_tx)); + SerialPrint("i", "LD2410", "LD2410 firmware version: " + String(radar->firmware_major_version)); + SerialPrint("i", "LD2410", "LD2410 firmware version: " + String(radar->firmware_minor_version)); + SerialPrint("i", "LD2410", "LD2410 firmware version: " + String(radar->firmware_bugfix_version)); + } + else + { + SerialPrint("i", "LD2410", "Radar sensor не подключен"); + } + } + return radar; +} + +int presence = 0; +int presence_last = 0; +int movement = 0; +int movement_last = 0; +int distance = 0; +int distance_last = 0; +int energy = 0; +int energy_last = 0; +int err = 0; + +uint32_t lastReadingP = 0; +uint32_t lastReadingM = 0; +uint32_t lastReadingD = 0; +uint32_t lastReadingE = 0; +bool radarConnected = false; + +// датчик присутствия +class ld2410m : public IoTItem +{ +private: + int _ticker; + uint8_t _rx, _tx; + +public: + //======================================================================================================= + // setup() + + ld2410m(String parameters) : IoTItem(parameters) + { + jsonRead(parameters, "ticker", _ticker); + String tmp; + jsonRead(parameters, "RX", tmp); + _rx = tmp.toInt(); + jsonRead(parameters, "TX", tmp); + _tx = tmp.toInt(); + } + + void loop() + { + instanceradar(_rx, _tx)->read(); + if (instanceradar(_rx, _tx)->isConnected() && millis() - lastReadingP > 1000) // Report every 1000ms + { + lastReadingP = millis(); + err = 0; + presence = instanceradar(_rx, _tx)->presenceDetected(); + if (instanceradar(_rx, _tx)->stationaryTargetDetected()) + { + movement = 0; + distance = instanceradar(_rx, _tx)->stationaryTargetDistance(); + energy = instanceradar(_rx, _tx)->stationaryTargetEnergy(); + } + if (instanceradar(_rx, _tx)->movingTargetDetected()) + { + movement = 1; + distance = instanceradar(_rx, _tx)->movingTargetDistance(); + energy = instanceradar(_rx, _tx)->movingTargetEnergy(); + } + + if (presence != presence_last) + { + value.valD = int(presence); + regEvent(value.valD, "ld2410m"); + presence_last = presence; + // SerialPrint("i", "LD2410", "присутствие: " + String(int(presence))); + } + + if (presence && movement != movement_last) + { + value.valD = int(presence); + regEvent(value.valD, "ld2410m"); + } + if (presence && _ticker) + { + value.valD = int(presence); + regEvent(value.valD, "ld2410m"); + presence_last = presence; + } + } + if (!instanceradar(_rx, _tx)->isConnected()) + { + if (err == 0) + { + // value.valD = "Err"; + // regEvent(value.valD, "ld2410m"); + // SerialPrint("E", "LD2410", "Radar sensor ошибка получения данных"); + } + err = 1; + } + } + + IoTValue execute(String command, std::vector ¶m) + { + if (command == "setmaxvalues") + { + if (param[0].isDecimal && param[1].isDecimal && param[2].isDecimal) + { + uint8_t newMovingMaxDistance = param[0].valD; + uint8_t newStationaryMaxDistance = param[1].valD; + uint16_t inactivityTimer = param[2].valD; + if (newMovingMaxDistance > 0 && newStationaryMaxDistance > 0 && newMovingMaxDistance <= 8 && newStationaryMaxDistance <= 8) + { + if (instanceradar(_rx, _tx)->setMaxValues(newMovingMaxDistance, newStationaryMaxDistance, inactivityTimer)) + { + SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик"); + } + else + { + SerialPrint("E", "LD2410", "Ошибка записи параметров."); + } + } + else + { + SerialPrint("E", "LD2410", "Заданы не корректные параметры. Диапазон от 1 до 8 "); + } + } + } + if (command == "setsensitivity") + { + if (param[0].isDecimal && param[1].isDecimal && param[2].isDecimal) + { + uint8_t gate = param[0].valD; + uint8_t motionSensitivity = param[1].valD; + uint16_t stationarySensitivity = param[2].valD; + if (motionSensitivity >= 0 && stationarySensitivity >= 0 && motionSensitivity <= 100 && stationarySensitivity <= 100) + { + if (instanceradar(_rx, _tx)->setGateSensitivityThreshold(gate, motionSensitivity, stationarySensitivity)) + { + SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик"); + } + else + { + SerialPrint("E", "LD2410", "Ошибка записи параметров."); + } + } + else + { + SerialPrint("E", "LD2410", "Заданы не корректные параметры. Диапазон от 1 до 100 "); + } + } + } + if (command == "enableengineeringmode") + { + if (instanceradar(_rx, _tx)->requestStartEngineeringMode()) + { + SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик"); + } + else + { + SerialPrint("E", "LD2410", "Ошибка записи параметров."); + } + } + if (command == "disableengineeringmode") + { + if (instanceradar(_rx, _tx)->requestEndEngineeringMode()) + { + SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик"); + } + else + { + SerialPrint("E", "LD2410", "Ошибка записи параметров."); + } + } + if (command == "restart") + { + if (instanceradar(_rx, _tx)->requestRestart()) + { + SerialPrint("i", "LD2410", "Датчик перезапущен"); + } + else + { + SerialPrint("E", "LD2410", "Ошибка перезапуска датчика."); + } + } + if (command == "readversion") + { + if (instanceradar(_rx, _tx)->requestFirmwareVersion()) + { + SerialPrint("i", "LD2410", (String)instanceradar(_rx, _tx)->firmware_major_version); + SerialPrint("i", "LD2410", (String)instanceradar(_rx, _tx)->firmware_minor_version); + } + else + { + SerialPrint("E", "LD2410", "Ошибка получения версии."); + } + } + if (command == "factoryreset") + { + if (instanceradar(_rx, _tx)->requestFactoryReset()) + { + SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик"); + } + else + { + SerialPrint("E", "LD2410", "Ошибка сброса параметров."); + } + } + } + ~ld2410m(){}; +}; +//--------------------------------------------------------------------------- + +// движение / стационарное - присутствие +class ld2410t : public IoTItem +{ +private: + uint8_t _rx, _tx; + +public: + //======================================================================================================= + // setup() + + ld2410t(String parameters) : IoTItem(parameters) + { + String tmp; + jsonRead(parameters, "RX", tmp); + _rx = tmp.toInt(); + jsonRead(parameters, "TX", tmp); + _tx = tmp.toInt(); + } + + void loop() + { + instanceradar(_rx, _tx)->read(); + if (instanceradar(_rx, _tx)->isConnected() && millis() - lastReadingM > 1000) // Report every 1000ms + { + lastReadingM = millis(); + err = 0; + presence = instanceradar(_rx, _tx)->presenceDetected(); + if (instanceradar(_rx, _tx)->stationaryTargetDetected()) + { + movement = 0; + // distance = instanceradar(_rx, _tx)->stationaryTargetDistance(); + // energy = instanceradar(_rx, _tx)->stationaryTargetEnergy(); + } + if (instanceradar(_rx, _tx)->movingTargetDetected()) + { + movement = 1; + // distance = instanceradar(_rx, _tx)->movingTargetDistance(); + // energy = instanceradar(_rx, _tx)->movingTargetEnergy(); + } + } + if (presence == 0 && movement_last != 0) + { + movement = 0; + } + if (movement != movement_last) + { + value.valD = int(movement); + regEvent(value.valD, "ld2410t"); + movement_last = movement; + } + } + + ~ld2410t(){}; +}; +//--------------------------------------------------------------------------- + +// дистанция +class ld2410d : public IoTItem +{ +private: + uint8_t _rx, _tx; + +public: + //======================================================================================================= + // setup() + + ld2410d(String parameters) : IoTItem(parameters) + { + String tmp; + jsonRead(parameters, "RX", tmp); + _rx = tmp.toInt(); + jsonRead(parameters, "TX", tmp); + _tx = tmp.toInt(); + } + + void loop() + { + instanceradar(_rx, _tx)->read(); + if (instanceradar(_rx, _tx)->isConnected() && millis() - lastReadingD > 1000) // Report every 1000ms + { + lastReadingD = millis(); + err = 0; + presence = instanceradar(_rx, _tx)->presenceDetected(); + if (instanceradar(_rx, _tx)->stationaryTargetDetected()) + { + // movement = 0; + distance = instanceradar(_rx, _tx)->stationaryTargetDistance(); + // energy = instanceradar(_rx, _tx)->stationaryTargetEnergy(); + } + if (instanceradar(_rx, _tx)->movingTargetDetected()) + { + // movement = 1; + distance = instanceradar(_rx, _tx)->movingTargetDistance(); + // energy = instanceradar(_rx, _tx)->movingTargetEnergy(); + } + if (presence == 0 && distance_last != 0) + { + distance = 0; + } + if (distance != distance_last) + { + value.valD = int(distance); + regEvent(value.valD, "ld2410d"); + distance_last = distance; + } + } + } + ~ld2410d(){}; +}; +//--------------------------------------------------------------------------- + +// энергия +class ld2410e : public IoTItem +{ +private: + uint8_t _rx, _tx; + +public: + //======================================================================================================= + // setup() + + ld2410e(String parameters) : IoTItem(parameters) + { + String tmp; + jsonRead(parameters, "RX", tmp); + _rx = tmp.toInt(); + jsonRead(parameters, "TX", tmp); + _tx = tmp.toInt(); + } + + void loop() + { + instanceradar(_rx, _tx)->read(); + if (instanceradar(_rx, _tx)->isConnected() && millis() - lastReadingE > 1000) // Report every 1000ms + { + lastReadingE = millis(); + err = 0; + presence = instanceradar(_rx, _tx)->presenceDetected(); + if (instanceradar(_rx, _tx)->stationaryTargetDetected()) + { + // movement = 0; + // distance = instanceradar(_rx, _tx)->stationaryTargetDistance(); + energy = instanceradar(_rx, _tx)->stationaryTargetEnergy(); + } + if (instanceradar(_rx, _tx)->movingTargetDetected()) + { + // movement = 1; + // distance = instanceradar(_rx, _tx)->movingTargetDistance(); + energy = instanceradar(_rx, _tx)->movingTargetEnergy(); + } + if (presence == 0 && energy_last != 0) + { + energy = 0; + } + if (energy != energy_last) + { + value.valD = int(energy); + regEvent(value.valD, "ld2410e"); + // value = Value; + // regEvent((String)(int)value.valD, F("ld2410e"), false, true); + // SerialPrint("i", "LD2410", "Radar sensor энергия: " + String(energy)); + energy_last = energy; + } + } + } + ~ld2410e(){}; +}; +//--------------------------------------------------------------------------- +void *getAPI_ld2410(String subtype, String param) +{ + if (subtype == F("ld2410m")) + { + return new ld2410m(param); + } + else if (subtype == F("ld2410t")) + { + return new ld2410t(param); + } + else if (subtype == F("ld2410d")) + { + return new ld2410d(param); + } + else if (subtype == F("ld2410e")) + { + return new ld2410e(param); + } + else + { + return nullptr; + } +} diff --git a/src/modules/sensors/ld2410/modinfo.json b/src/modules/sensors/ld2410/modinfo.json new file mode 100644 index 00000000..78b06bc4 --- /dev/null +++ b/src/modules/sensors/ld2410/modinfo.json @@ -0,0 +1,92 @@ +{ + "menuSection": "Сенсоры", + "configItem": [ + { + "global": 0, + "name": "LD2410 Датчик присутствия", + "type": "Reading", + "subtype": "ld2410m", + "id": "ld2410m", + "widget": "anydataDef", + "page": "Сенсоры", + "descr": "Присутствие", + "RX": 32, + "TX": 33, + "val": 0, + "round": 0, + "ticker": 0 + }, + { + "global": 0, + "name": "LD2410 подвижность объета", + "type": "Reading", + "subtype": "ld2410t", + "id": "ld2410t", + "widget": "anydataDef", + "page": "Сенсоры", + "descr": "Движение", + "RX": 32, + "TX": 33, + "val": 0, + "round": 0 + }, + { + "global": 0, + "name": "LD2410 дистанция до объекта", + "type": "Reading", + "subtype": "ld2410d", + "id": "ld2410d", + "widget": "anydataCm", + "page": "Сенсоры", + "descr": "Дистанция", + "RX": 32, + "TX": 33, + "val": 0, + "round": 0 + }, + { + "global": 0, + "name": "LD2410 отраженная энергия", + "type": "Reading", + "subtype": "ld2410e", + "id": "ld2410e", + "widget": "anydataHum", + "page": "Сенсоры", + "descr": "Энергия", + "RX": 32, + "TX": 33, + "val": 0, + "round": 0 + } + ], + "about": { + "authorName": "AVAKS", + "authorContact": "https://t.me/avaks", + "authorGit": "https://github.com/avaksru", + "exampleURL": "https://iotmanager.org/wiki", + "specialThanks": "Mitchel https://t.me/Mit4bmw", + "moduleName": "ld2410", + "moduleVersion": "1.0", + "usedRam": { + "esp32_4mb": 15, + "esp8266_4mb": 0 + }, + "subTypes": [ + "ld2410m", + "ld2410t", + "ld2410d", + "ld2410e" + ], + "title": "Радарный датчик присутствия человека Hi-Link HLK-LD2410", + "moduleDesc": "Умный датчик, который измеряет расстояние, определяет стоит объект или двигается. Умеет разбивать зоны движения (всего можно до 8 зон задать). ", + "propInfo": { + "ticker": "1 - генерирует событие каждую секунду пока обнаружено присутствие, 0 - событие генереруется только один раз когда присутствие обнаружено или когда обьект вышел из поля обнаружения датчика" + } + }, + "defActive": false, + "usedLibs": { + "esp32_4mb": [ + "ncmreynolds/ld2410@^0.1.3" + ] + } +} \ No newline at end of file