2022-01-17 13:42:48 +03:00
# include "Global.h"
2022-02-15 11:37:31 +01:00
# include "classes/IoTItem.h"
2022-01-17 13:42:48 +03:00
# include "DallasTemperature.h"
# include <OneWire.h>
# include <map>
//глобальные списки необходимы для хранения объектов о б активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина
std : : map < int , OneWire * > oneWireTemperatureArray ;
std : : map < int , DallasTemperature * > sensorsTemperatureArray ;
2022-02-06 09:11:07 +03:00
class Ds18b20 : public IoTItem {
2022-01-17 13:42:48 +03:00
private :
//для работы библиотеки с несколькими линиями необходимо обеспечить каждый экземпляр класса ссылками на объекты настроенные на эти линии
2022-02-22 16:40:46 +01:00
OneWire * oneWire ;
DallasTemperature * sensors ;
2022-01-17 13:42:48 +03:00
//описание параметров передаваемых из настроек датчика из веба
2022-02-22 16:40:46 +01:00
String _addr ;
int _pin ;
int _index ;
2022-01-17 13:42:48 +03:00
public :
//=======================================================================================================
// setup()
//это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора.
//Такие как ...begin и подставлять в них параметры полученные из web интерфейса.
//В с е параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции:
// jsonReadStr, jsonReadBool, jsonReadInt
2022-02-22 16:40:46 +01:00
Ds18b20 ( String parameters ) : IoTItem ( parameters ) {
2022-02-01 22:49:18 +03:00
jsonRead ( parameters , " pin " , _pin ) ;
2022-02-22 16:40:46 +01:00
jsonRead ( parameters , " index " , _index , false ) ;
jsonRead ( parameters , " addr " , _addr , false ) ;
2022-01-17 13:42:48 +03:00
//учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась
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 ;
} else {
oneWire = oneWireTemperatureArray [ _pin ] ;
sensors = sensorsTemperatureArray [ _pin ] ;
}
}
//=======================================================================================================
// doByInterval()
//это аналог loop из arduino, но вызываемый каждые int секунд, заданные в настройках. Здесь вы должны выполнить чтение вашего сенсора
//а затем выполнить regEvent - это регистрация произошедшего события чтения
//здесь так же доступны все переменные из секции переменных, и полученные в setup
//если у сенсора несколько величин то делайте несколько regEvent
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить е е на порции
//и выполнить за несколько тактов
void doByInterval ( ) {
//запускаем опрос измерений у всех датчиков на линии
sensors - > requestTemperatures ( ) ;
2022-02-22 16:40:46 +01:00
2022-01-17 13:42:48 +03:00
//Определяем адрес. Если парамтер addr не установлен, то узнаем адрес по индексу
2022-02-22 16:40:46 +01:00
// TODO: понять как лучше. в текущей реализации адрес вычисляется каждый раз при опросе шины, это хорошо при отладке,
2022-02-01 13:03:19 +03:00
// но при постоянном контакте и использовании правильнее генерировать адрес при инициализации модуля. Н о тогда нужно перезагружать устройство при новом датчике
2022-01-17 13:42:48 +03:00
DeviceAddress deviceAddress ;
if ( _addr = = " " ) {
sensors - > getAddress ( deviceAddress , _index ) ;
} else {
string2hex ( _addr . c_str ( ) , deviceAddress ) ;
}
//получаем температуру по адресу
2022-02-22 16:40:46 +01:00
value . valD = sensors - > getTempC ( deviceAddress ) ;
2022-01-17 13:42:48 +03:00
char addrStr [ 20 ] = " " ;
hex2string ( deviceAddress , 8 , addrStr ) ;
2022-02-22 16:40:46 +01:00
if ( value . valD ! = - 127 )
regEvent ( value . valD , " addr: " + String ( addrStr ) ) ; //обязательный вызов для отправки результата работы
else
SerialPrint ( " E " , " Sensor Ds18b20 " , " Error " ) ;
2022-01-17 13:42:48 +03:00
}
//=======================================================================================================
2022-02-25 15:24:03 +03:00
~ Ds18b20 ( ) { } ;
2022-01-17 13:42:48 +03:00
} ;
//после замены названия сенсора, на функцию можно не обращать внимания
//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть
2022-02-01 13:26:34 +03:00
//создание и контроль соответствующих глобальных переменных
void * getAPI_Ds18b20 ( String subtype , String param ) {
if ( subtype = = F ( " Ds18b20 " ) ) {
return new Ds18b20 ( param ) ;
2022-01-17 13:42:48 +03:00
} else {
return nullptr ;
}
}