В общем давно очень собрал прибор для отца для контроля температуры разных узлов холодильного оборудования. По сути логирование на карту памяти значения 5 датчиков температуры и токового датчика, доступ через веб-морду и на дисплее. Всё на ESP32. Схемы не делал, всё из головы.
Сначала использовал аналоговые датчики температуры. Но у них большой шум в измерениях, плюс за 2 года значения "уплыли" непонятно куда.
Сейчас заказал 5 штук DS18B20 и подключил к 32 пину по принципу следующей схемы:
Питается от общей 3.3В.
Библиотеку использую DallasTemperature v.3.9.0
В общем, есть такая проблема: достаточно часто считываются на датчиках -127 градусов и показания одного датчика присваиваются другим.
Что это может быть? Шумы, наводки? Как с этим бороться? Пробовал всякие программные костыли, часть из них помогла, часть нет.
Дальше графическое представление результатов.
Если присмотреться, то пиковые значения "шумов" всегда соответствуют значениям "соседних" датчиков.
Вот еще пример до внедрения фильтрации по адресу (ниже в коде будет пример).
Примеры кода из скетча будут далее. Сразу простите за корявость кода и его оформление - я совсем не программист и Си не изучал. Ранее программировал только на Delphi.
Прошу помощи с борьбой этих выбросов, может что не так делаю, может кто сталкивался с подобным.
Сначала использовал аналоговые датчики температуры. Но у них большой шум в измерениях, плюс за 2 года значения "уплыли" непонятно куда.
Сейчас заказал 5 штук DS18B20 и подключил к 32 пину по принципу следующей схемы:
Питается от общей 3.3В.
Библиотеку использую DallasTemperature v.3.9.0
В общем, есть такая проблема: достаточно часто считываются на датчиках -127 градусов и показания одного датчика присваиваются другим.
Что это может быть? Шумы, наводки? Как с этим бороться? Пробовал всякие программные костыли, часть из них помогла, часть нет.
Дальше графическое представление результатов.
Если присмотреться, то пиковые значения "шумов" всегда соответствуют значениям "соседних" датчиков.
Вот еще пример до внедрения фильтрации по адресу (ниже в коде будет пример).
Примеры кода из скетча будут далее. Сразу простите за корявость кода и его оформление - я совсем не программист и Си не изучал. Ранее программировал только на Delphi.
Инициализация датчиков::
...
// Шина данных подключена к выводу
#define ONE_WIRE_BUS 32
#define USE_HSPI_PORT
// настройка объекта oneWire для связи с любым устройством OneWire
OneWire oneWire(ONE_WIRE_BUS);
// передать ссылку на oneWire библиотеке DallasTemperature
DallasTemperature sensors(&oneWire);
int deviceCount = 0;
float tempC;
float Temp1, Temp2, Temp3, Temp4, Temp5; // рабочие значения температур
float LTemp1, LTemp2, LTemp3, LTemp4, LTemp5; // предыдущие значения температур
DeviceAddress AT1, AT2, AT3, AT4, AT5; // адреса датчиков
...
void setup() {
...
sensors.begin(); // запустить библиотеку
for (int i = 0; i < deviceCount; i++) // перечисляет все найденные датчики, но использует только первые 5
{
if (i==0) sensors.getAddress(AT5, i); // один из адресов нужен на последнем месте (с коротким шнуром)
if (i==1) sensors.getAddress(AT2, i);
if (i==2) sensors.getAddress(AT3, i);
if (i==3) sensors.getAddress(AT4, i);
if (i==4) sensors.getAddress(AT1, i);
}
sensors.setWaitForConversion(false); // асинхронный режим
...
}
Код считывания с датчиков. Выполняется в цикле веб-сервера раз в секунду:
...
if ((P2 >= 1000)and(Disp < 9)) { // прошла ли секунда с предыдущего захода в эту часть кода
DeviceAddress DevAddr;
for (int i = 0; i < deviceCount; i++) // считать температуру с каждого датчика
{
tempC = sensors.getTempCByIndex(i); // получаем значение температуры на датчике
sensors.getAddress(DevAddr, i); // и его адрес
if (memcmp(DevAddr, AT1, 8) == 0) Temp1 = tempC; // проверяем на соответствие конкретного адреса
if (memcmp(DevAddr, AT2, 8) == 0) Temp2 = tempC;
if (memcmp(DevAddr, AT3, 8) == 0) Temp3 = tempC;
if (memcmp(DevAddr, AT4, 8) == 0) Temp4 = tempC;
if (memcmp(DevAddr, AT5, 8) == 0) Temp5 = tempC;
}
sensors.requestTemperatures(); // запрос на преобразование уже после считывания, чтобы было время на этот процесс к следующему опросу.
if (Temp1> -100) LTemp1 = Temp1; else Temp1 = LTemp1; //фильтрация от случайных значений в -127, подставляется предыдущее значение
if (Temp2> -100) LTemp2 = Temp2; else Temp2 = LTemp2;
if (Temp3> -100) LTemp3 = Temp3; else Temp3 = LTemp3;
if (Temp4> -100) LTemp4 = Temp4; else Temp4 = LTemp4;
if (Temp5> -100) LTemp5 = Temp5; else Temp5 = LTemp5;
}
...