Исправляем ошибку в модуле далласа, возникающую при использовании нескольких шин для разных датчиков.

This commit is contained in:
2021-12-20 09:42:07 +03:00
parent cfa8fc4212
commit 203ceafb19
2 changed files with 24 additions and 9 deletions

View File

@@ -32,6 +32,10 @@ class SensorDallas {
String _addr; String _addr;
unsigned int _pin; unsigned int _pin;
unsigned int _index; unsigned int _index;
//для работы библиотеки с несколькими линиями необходимо обеспечить каждый экземпляр класса ссылками на объекты настроенные на эти линии
OneWire* oneWire;
DallasTemperature* sensors;
}; };
extern MySensorDallasVector* mySensorDallas2; extern MySensorDallasVector* mySensorDallas2;

View File

@@ -6,12 +6,13 @@
#include "Global.h" #include "Global.h"
#include "DallasTemperature.h" #include "DallasTemperature.h"
#include "Utils/StringUtils.h" #include "Utils/StringUtils.h"
#include <map>
#include <Arduino.h> #include <Arduino.h>
//ИНТЕГРИРУЮ: переменные необходимые для работы интегрируемой библиотеки. Аналог Arduino //ИНТЕГРИРУЮ: переменные необходимые для работы интегрируемой библиотеки. Аналог Arduino
OneWire* oneWire; std::map<int, OneWire*> oneWireTemperatureArray;
DallasTemperature sensors; std::map<int, DallasTemperature*> sensorsTemperatureArray;
//ИНТЕГРИРУЮ: //ИНТЕГРИРУЮ:
//Для каждого датчика указанного в конфигурации вызывается конструктор для настройки перед запуском. Аналог функции setup() в Arduino. //Для каждого датчика указанного в конфигурации вызывается конструктор для настройки перед запуском. Аналог функции setup() в Arduino.
@@ -26,10 +27,20 @@ SensorDallas::SensorDallas(unsigned long interval, unsigned int pin, unsigned in
//ИНТЕГРИРУЮ: //ИНТЕГРИРУЮ:
//вызываем необходимые инициирующие функции интегрируемой библиотеки //вызываем необходимые инициирующие функции интегрируемой библиотеки
oneWire = new OneWire((uint8_t)_pin); //учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась
sensors.setOneWire(oneWire); if (oneWireTemperatureArray.find(_pin) == oneWireTemperatureArray.end()) {
sensors.begin(); oneWire = new OneWire((uint8_t)_pin);
sensors.setResolution(12); sensors = new DallasTemperature();
sensors->setOneWire(oneWire);
sensors->begin();
sensors->setResolution(12);
oneWireTemperatureArray[_pin] = oneWire;
sensorsTemperatureArray[_pin] = sensors;
} else {
oneWire = oneWireTemperatureArray[_pin];
sensors = sensorsTemperatureArray[_pin];
}
} }
//ИНТЕГРИРУЮ: оставляем как есть или развиваем, если нужно правильно завершить работу с интегрируемой библиотекой после отключения датчика //ИНТЕГРИРУЮ: оставляем как есть или развиваем, если нужно правильно завершить работу с интегрируемой библиотекой после отключения датчика
@@ -48,18 +59,18 @@ void SensorDallas::loop() {
//ИНТЕГРИРУЮ: вызывается из цикла loop каждый установленный временно интервал в параметрах датчика. Необходимо изменить для чтения данных из датчика. //ИНТЕГРИРУЮ: вызывается из цикла loop каждый установленный временно интервал в параметрах датчика. Необходимо изменить для чтения данных из датчика.
void SensorDallas::readDallas() { void SensorDallas::readDallas() {
//запускаем опрос измерений у всех датчиков на линии //запускаем опрос измерений у всех датчиков на линии
sensors.requestTemperatures(); sensors->requestTemperatures();
//Определяем адрес. Если парамтер addr не установлен, то узнаем адрес по индексу //Определяем адрес. Если парамтер addr не установлен, то узнаем адрес по индексу
DeviceAddress deviceAddress; DeviceAddress deviceAddress;
if (_addr == "") { if (_addr == "") {
sensors.getAddress(deviceAddress, _index); sensors->getAddress(deviceAddress, _index);
} else { } else {
string2hex(_addr.c_str(), deviceAddress); string2hex(_addr.c_str(), deviceAddress);
} }
//получаем температуру по адресу //получаем температуру по адресу
float value = sensors.getTempC(deviceAddress); float value = sensors->getTempC(deviceAddress);
//ИНТЕГРИРУЮ: блок генерации уведомлений в ядре системы. Стоит обратить внимание только на формат выводимого сообщения в консоли. //ИНТЕГРИРУЮ: блок генерации уведомлений в ядре системы. Стоит обратить внимание только на формат выводимого сообщения в консоли.
eventGen2(_key, String(value)); eventGen2(_key, String(value));