Merge pull request #280 from avaksru/ver4dev

Радарный датчик присутствия человека Hi-Link HLK-LD2410
This commit is contained in:
2023-06-25 19:08:52 +03:00
committed by GitHub
4 changed files with 532 additions and 0 deletions

View File

@@ -160,6 +160,10 @@
"path": "src/modules/sensors/IoTWiegand",
"active": false
},
{
"path": "src/modules/sensors/ld2410",
"active": false
},
{
"path": "src/modules/sensors/Max6675",
"active": false

View File

@@ -160,6 +160,10 @@
"path": "src/modules/sensors/IoTWiegand",
"active": false
},
{
"path": "src/modules/sensors/ld2410",
"active": false
},
{
"path": "src/modules/sensors/Max6675",
"active": false

View File

@@ -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.h>
// 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<IoTValue> &param)
{
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;
}
}

View File

@@ -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"
]
}
}