From d3fb354a1edb7cb03abcecbde5ff89413d877dbf Mon Sep 17 00:00:00 2001 From: biver Date: Wed, 5 Oct 2022 20:31:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=B5=D0=BD=D1=8F=D0=B5=D0=BC=20=D0=B0?= =?UTF-8?q?=D0=BB=D0=B3=D0=BE=D1=80=D0=B8=D1=82=D0=BC=20=D1=87=D1=82=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20Ds18b20=20=D0=B4=D0=BB=D1=8F=20=D1=83?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=98?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D1=8F=D0=B5=D0=BC=20=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=B0=D0=B4=D1=80=D0=B5=D1=81=D0=B0=20=D0=B4=D0=B0=D1=82=D1=87?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0.=20=D0=9D=D0=B5=20=D1=83=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81,=20=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=D1=82=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20=D0=BF=D0=BE=20index=20=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B8=D0=BC=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D1=80=D1=82=D0=B5=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=81=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/sensors/Ds18b20/Ds18b20.cpp | 100 ++++++++++++------------ 1 file changed, 48 insertions(+), 52 deletions(-) diff --git a/src/modules/sensors/Ds18b20/Ds18b20.cpp b/src/modules/sensors/Ds18b20/Ds18b20.cpp index 1845a16e..e6518e03 100644 --- a/src/modules/sensors/Ds18b20/Ds18b20.cpp +++ b/src/modules/sensors/Ds18b20/Ds18b20.cpp @@ -5,88 +5,84 @@ #include #include -//глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина +// глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина std::map oneWireTemperatureArray; -std::map sensorsTemperatureArray; + class Ds18b20 : public IoTItem { private: //для работы библиотеки с несколькими линиями необходимо обеспечить каждый экземпляр класса ссылками на объекты настроенные на эти линии - OneWire* oneWire; - DallasTemperature* sensors; - - //описание параметров передаваемых из настроек датчика из веба - String _addr; - int _pin; - int _index; + OneWire* _oneWire; + DallasTemperature* _sensor; + DeviceAddress _deviceAddress; public: //======================================================================================================= // setup() - //это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора. - //Такие как ...begin и подставлять в них параметры полученные из web интерфейса. - //Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: + // это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора. + // Такие как ...begin и подставлять в них параметры полученные из web интерфейса. + // Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: // jsonReadStr, jsonReadBool, jsonReadInt Ds18b20(String parameters) : IoTItem(parameters) { - jsonRead(parameters, "pin", _pin); - jsonRead(parameters, "index", _index, false); - jsonRead(parameters, "addr", _addr, false); + int index, pin; + String addr; + + jsonRead(parameters, "pin", pin); + jsonRead(parameters, "index", index, false); + jsonRead(parameters, "addr", addr, false); //учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась - if (oneWireTemperatureArray.find(_pin) == oneWireTemperatureArray.end()) { - oneWire = new OneWire((uint8_t)_pin); - sensors = new DallasTemperature(); - sensors->setOneWire(oneWire); - sensors->begin(); - sensors->setResolution(12); - - oneWireTemperatureArray[_pin] = oneWire; - sensorsTemperatureArray[_pin] = sensors; + if (oneWireTemperatureArray.find(pin) == oneWireTemperatureArray.end()) { + _oneWire = new OneWire((uint8_t)pin); + oneWireTemperatureArray[pin] = _oneWire; } else { - oneWire = oneWireTemperatureArray[_pin]; - sensors = sensorsTemperatureArray[_pin]; + _oneWire = oneWireTemperatureArray[pin]; + } + + _sensor = new DallasTemperature(_oneWire); + _sensor->begin(); + //sensors->setResolution(12); + + //Определяем адрес. Если параметр addr не установлен, то узнаем адрес по индексу + if (addr == "") { + _sensor->getAddress(_deviceAddress, index); + char addrStr[20] = ""; + hex2string(_deviceAddress, 8, addrStr); + SerialPrint("I", "Sensor " + (String)_id, "index: " + (String)index + " addr: " + String(addrStr)); + } else { + string2hex(addr.c_str(), _deviceAddress); } } //======================================================================================================= // doByInterval() - //это аналог loop из arduino, но вызываемый каждые int секунд, заданные в настройках. Здесь вы должны выполнить чтение вашего сенсора - //а затем выполнить regEvent - это регистрация произошедшего события чтения - //здесь так же доступны все переменные из секции переменных, и полученные в setup - //если у сенсора несколько величин то делайте несколько regEvent - //не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции - //и выполнить за несколько тактов + // это аналог loop из arduino, но вызываемый каждые int секунд, заданные в настройках. Здесь вы должны выполнить чтение вашего сенсора + // а затем выполнить regEvent - это регистрация произошедшего события чтения + // здесь так же доступны все переменные из секции переменных, и полученные в setup + // если у сенсора несколько величин то делайте несколько regEvent + // не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции + // и выполнить за несколько тактов void doByInterval() { //запускаем опрос измерений у всех датчиков на линии - sensors->requestTemperatures(); + _sensor->requestTemperatures(); - //Определяем адрес. Если парамтер addr не установлен, то узнаем адрес по индексу - // TODO: понять как лучше. в текущей реализации адрес вычисляется каждый раз при опросе шины, это хорошо при отладке, - // но при постоянном контакте и использовании правильнее генерировать адрес при инициализации модуля. Но тогда нужно перезагружать устройство при новом датчике - DeviceAddress deviceAddress; - if (_addr == "") { - sensors->getAddress(deviceAddress, _index); - } else { - string2hex(_addr.c_str(), deviceAddress); - } //получаем температуру по адресу - value.valD = sensors->getTempC(deviceAddress); + value.valD = _sensor->getTempC(_deviceAddress); - char addrStr[20] = ""; - hex2string(deviceAddress, 8, addrStr); - - if (value.valD != -127) - regEvent(value.valD, "addr: " + String(addrStr)); //обязательный вызов для отправки результата работы + if (value.valD != DEVICE_DISCONNECTED_C) + regEvent(value.valD, ""); //обязательный вызов для отправки результата работы else SerialPrint("E", "Sensor Ds18b20", "Error"); } //======================================================================================================= - ~Ds18b20() {}; + ~Ds18b20() { + if (_sensor) delete _sensor; + }; }; -//после замены названия сенсора, на функцию можно не обращать внимания -//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть -//создание и контроль соответствующих глобальных переменных +// после замены названия сенсора, на функцию можно не обращать внимания +// если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть +// создание и контроль соответствующих глобальных переменных void* getAPI_Ds18b20(String subtype, String param) { if (subtype == F("Ds18b20")) { return new Ds18b20(param);