mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 03:49:13 +03:00
Добавил ds2423
This commit is contained in:
178
src/modules/sensors/Ds2423/Ds2423.cpp
Normal file
178
src/modules/sensors/Ds2423/Ds2423.cpp
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
|
||||||
|
#include "Global.h"
|
||||||
|
#include "classes/IoTItem.h"
|
||||||
|
|
||||||
|
#include <DS2423.h>
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
typedef uint8_t DeviceAddressDS2423[8];
|
||||||
|
// глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина
|
||||||
|
std::map<int, OneWire *> oneWireDS2423Array;
|
||||||
|
|
||||||
|
// Функция инициализации библиотечного класса, возвращает Единстрвенный указать на библиотеку
|
||||||
|
OneWire *instanceOneWire_DS2423(uint8_t ONE_WIRE_PIN)
|
||||||
|
{
|
||||||
|
// учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась
|
||||||
|
if (oneWireDS2423Array.find(ONE_WIRE_PIN) == oneWireDS2423Array.end())
|
||||||
|
oneWireDS2423Array[ONE_WIRE_PIN] = new OneWire((uint8_t)ONE_WIRE_PIN);
|
||||||
|
return oneWireDS2423Array[ONE_WIRE_PIN];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Определяем адрес.
|
||||||
|
bool getDeviceAddressDS2423(uint8_t pin, uint8_t *deviceAddress, int index)
|
||||||
|
{
|
||||||
|
OneWire *_wire = instanceOneWire_DS2423(pin);
|
||||||
|
uint8_t depth = 0;
|
||||||
|
_wire->reset_search();
|
||||||
|
while (depth <= index && _wire->search(deviceAddress))
|
||||||
|
{
|
||||||
|
if (depth == index && _wire->crc8((uint8_t *)deviceAddress, 7) == deviceAddress[7])
|
||||||
|
return true;
|
||||||
|
depth++;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Ds2423a : public IoTItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
// описание параметров передаваемых из настроек датчика из веба
|
||||||
|
String _addr;
|
||||||
|
int _pin;
|
||||||
|
int _index;
|
||||||
|
DS2423 *ds2423;
|
||||||
|
DeviceAddressDS2423 _deviceAddress;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Ds2423a(String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
|
|
||||||
|
jsonRead(parameters, "pin", _pin);
|
||||||
|
jsonRead(parameters, "index", _index, false);
|
||||||
|
jsonRead(parameters, "addr", _addr, false);
|
||||||
|
|
||||||
|
// Определяем адрес. Если параметр addr не установлен, то узнаем адрес по индексу
|
||||||
|
if (_addr == "")
|
||||||
|
{
|
||||||
|
if (getDeviceAddressDS2423(_pin, _deviceAddress, _index))
|
||||||
|
{
|
||||||
|
char addrStr[20] = "";
|
||||||
|
hex2string(_deviceAddress, 8, addrStr);
|
||||||
|
SerialPrint("I", "Sensor " + (String)_id, "index: " + (String)_index + " addr: " + String(addrStr));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "Sensor " + (String)_id, "index: " + (String)_index + " addres not search");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string2hex(_addr.c_str(), _deviceAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
ds2423 = new DS2423(instanceOneWire_DS2423(_pin), _deviceAddress);
|
||||||
|
ds2423->begin(DS2423_COUNTER_A | DS2423_COUNTER_B);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void doByInterval()
|
||||||
|
{
|
||||||
|
ds2423->update();
|
||||||
|
if (ds2423->isError())
|
||||||
|
{
|
||||||
|
Serial.println("Error reading counter");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value.valD = ds2423->getCount(DS2423_COUNTER_A);
|
||||||
|
// if (value.valD != -127)
|
||||||
|
regEvent(value.valD, "Ds2423a"); // обязательный вызов для отправки результата работы
|
||||||
|
// else
|
||||||
|
// SerialPrint("E", "Sensor Ds2423a", "Error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//=======================================================================================================
|
||||||
|
|
||||||
|
~Ds2423a(){};
|
||||||
|
};
|
||||||
|
|
||||||
|
class Ds2423b : public IoTItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
// описание параметров передаваемых из настроек датчика из веба
|
||||||
|
String _addr;
|
||||||
|
int _pin;
|
||||||
|
int _index;
|
||||||
|
DS2423 *ds2423;
|
||||||
|
DeviceAddressDS2423 _deviceAddress;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Ds2423b(String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
|
jsonRead(parameters, "pin", _pin);
|
||||||
|
jsonRead(parameters, "index", _index, false);
|
||||||
|
jsonRead(parameters, "addr", _addr, false);
|
||||||
|
|
||||||
|
// Определяем адрес. Если параметр addr не установлен, то узнаем адрес по индексу
|
||||||
|
if (_addr == "")
|
||||||
|
{
|
||||||
|
if (getDeviceAddressDS2423(_pin, _deviceAddress, _index))
|
||||||
|
{
|
||||||
|
char addrStr[20] = "";
|
||||||
|
hex2string(_deviceAddress, 8, addrStr);
|
||||||
|
SerialPrint("I", "Sensor " + (String)_id, "index: " + (String)_index + " addr: " + String(addrStr));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "Sensor " + (String)_id, "index: " + (String)_index + " addres not search");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string2hex(_addr.c_str(), _deviceAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
ds2423 = new DS2423(instanceOneWire_DS2423(_pin), _deviceAddress);
|
||||||
|
ds2423->begin(DS2423_COUNTER_A | DS2423_COUNTER_B);
|
||||||
|
}
|
||||||
|
|
||||||
|
void doByInterval()
|
||||||
|
{
|
||||||
|
ds2423->update();
|
||||||
|
|
||||||
|
if (ds2423->isError())
|
||||||
|
{
|
||||||
|
Serial.println("Error reading counter");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// запускаем опрос измерений у всех датчиков на линии
|
||||||
|
value.valD = ds2423->getCount(DS2423_COUNTER_B);
|
||||||
|
// if (value.valD != -127)
|
||||||
|
regEvent(value.valD, "Ds2423b"); // обязательный вызов для отправки результата работы
|
||||||
|
// else
|
||||||
|
// SerialPrint("E", "Sensor Ds2423b", "Error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//=======================================================================================================
|
||||||
|
|
||||||
|
~Ds2423b(){};
|
||||||
|
};
|
||||||
|
|
||||||
|
void *getAPI_Ds2423(String subtype, String param)
|
||||||
|
{
|
||||||
|
if (subtype == F("Ds2423a"))
|
||||||
|
{
|
||||||
|
return new Ds2423a(param);
|
||||||
|
}
|
||||||
|
else if (subtype == F("Ds2423b"))
|
||||||
|
{
|
||||||
|
return new Ds2423b(param);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
72
src/modules/sensors/Ds2423/modinfo.json
Normal file
72
src/modules/sensors/Ds2423/modinfo.json
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"menuSection": "Сенсоры",
|
||||||
|
"configItem": [
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "DS2423 счетчик 1",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "Ds2423a",
|
||||||
|
"id": "dscounta",
|
||||||
|
"widget": "anydataDef",
|
||||||
|
"page": "Счетчики",
|
||||||
|
"descr": "DS1 V",
|
||||||
|
"plus": 0,
|
||||||
|
"multiply": 1,
|
||||||
|
"pin": 4,
|
||||||
|
"index": 0,
|
||||||
|
"addr": "",
|
||||||
|
"int": 10,
|
||||||
|
"round": 0,
|
||||||
|
"needSave": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "DS2423 счетчик 2",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "Ds2423b",
|
||||||
|
"id": "dscountb",
|
||||||
|
"widget": "anydataDef",
|
||||||
|
"page": "Счетчики",
|
||||||
|
"descr": "DS2 V",
|
||||||
|
"plus": 0,
|
||||||
|
"multiply": 1,
|
||||||
|
"pin": 4,
|
||||||
|
"index": 0,
|
||||||
|
"addr": "",
|
||||||
|
"int": 10,
|
||||||
|
"round": 0,
|
||||||
|
"needSave": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"about": {
|
||||||
|
"authorName": "Serghei Crasnicov",
|
||||||
|
"authorContact": "https://t.me/Serghei63",
|
||||||
|
"authorGit": "https://github.com/Serghei63",
|
||||||
|
"specialThanks": "Bubnov Mikhail @Mit4bmw",
|
||||||
|
"moduleName": "Ds2423",
|
||||||
|
"moduleVersion": "1.0",
|
||||||
|
"usedRam": {
|
||||||
|
"esp32_4mb": 15,
|
||||||
|
"esp8266_4mb": 15
|
||||||
|
},
|
||||||
|
"title": "Cчетчик ds2423",
|
||||||
|
"moduleDesc": "Позволяет получить значения с Ds2423.",
|
||||||
|
"propInfo": {
|
||||||
|
"pin": "GPIO номер, к которому подключена шина данных датчиков.",
|
||||||
|
"index": "Порядковый номер датчика на шине.",
|
||||||
|
"addr": "Адрес датчика на шине для точной идентификации. Если оставить пустым, то попробует найти по индексу и пину и Можно скопировать из консоли.",
|
||||||
|
"int": "Количество секунд между опросами датчика."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defActive": true,
|
||||||
|
"usedLibs": {
|
||||||
|
"esp32_4mb": [
|
||||||
|
"https://github.com/jbechter/arduino-onewire-DS2423",
|
||||||
|
"paulstoffregen/OneWire @ ^2.3.7"
|
||||||
|
],
|
||||||
|
"esp8266_4mb": [
|
||||||
|
"https://github.com/jbechter/arduino-onewire-DS2423",
|
||||||
|
"paulstoffregen/OneWire @ ^2.3.7"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user