В общем давно очень собрал прибор для отца для контроля температуры разных узлов холодильного оборудования. По сути логирование на карту памяти значения 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;
}
...