Требуется помощь в подключении термистора NTC к esp 32

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@PavelStrike, лет 8 -9 назад мне доводилось разрабатывать полностью автоматическую систему управления инкубатором, был заказ от фирмы, которая малой серией их производила. С управлением вентиляторами, механизмами переворачивания яиц и всеми положенными плюшками. Небольшой агрегат в виде шкафа, вмещалось туда до 1000 куриных яиц. И на основе подобных таблиц писалась программа управления.
Но там в чём фокус. Прецизионная точность поддержания температуры и влажности, в общем-то, совсем не требуется. Десятые доли ловить точно не надо. Вся фишка в том, что эмбрион в яйце имеет свою терморегуляцию, причём, довольно совершенную. Так что температура яйца вполне себе поддерживается самостоятельно, а потому датчик на нём - это совсем лишнее. Тут главное снаружи его не заморозить и не поджарить.
Но это я так, из собственного опыта.
для каких видов яиц нужны сотые градуса ?
Ни для каких не нужны, да и в инкубаторе такая точность недостижима.
 
Изменено:

Брякомякс

★✩✩✩✩✩✩
14 Янв 2023
95
20
Есть smd датчики температуры с i2c. Там корпус мелкий. Название забыл, но в чипе они есть и они немного поменьше 18б20
 

PavelStrike

✩✩✩✩✩✩✩
16 Окт 2023
33
4
как писал выше
Требуется помощь в подключении термистора NTC к esp 32
режимы инкубации и програмно все прекрасно работает)) + выводит графики и управление настройками на телефон )Зачем? потому что могу и почему бы и нет)А вот с АЦП ESP не получилось как хотелось))
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
для того и собирается контроллер чтоб с градусниками вручную не заморачиватся.
Так здесь никто и не говорил, что не нужен контроллер. Просто вы заложили такие требования к точности, которые излишни, да и к тому же, труднодостижимы.

Да и когда точность была лишний?
Так в вашем случае. Чем точнее устройство, тем оно дороже. Причём стоимость растёт не линейно, а по экспоненте. И дело тут не столько в цене датчиков или чипов. Это определяется самой конструкцией, принципом работы и исполнением. Но у вас-то не установка для выращивания свехчистых полупроводниковых кристаллов, а банальный инкубатор.:)
Я вовсе не собираюсь вас в чём-то убеждать и такое прочее. Просто смотрите на вещи реально.
А вот с АЦП ESP не получилось как хотелось
Так вроде бы разобрали этот вопрос. Код с таблицей коррекции у вас есть. Попробуйте собрать макет и посмотреть, чего будет.
 
Изменено:

PavelStrike

✩✩✩✩✩✩✩
16 Окт 2023
33
4
таблица с гигхаб не вариант ,переодически выдает рандомные значения(
после коректировки таблицы ситуация особо не изменилась...
 

Вложения

Изменено:

AZM

✩✩✩✩✩✩✩
17 Сен 2023
22
5
@Старик Похабыч, кроме того в инкубаторах сотые доли градуса не нужны.. Прецизионных кур не бывает. Температура в инкубаторе в разных местах разная, может и на полградуса различаться. Яйца куры закаливают, то есть иногда охлождают, тогда цыплята здоровые получаются. Кроме того нужна влажность и ворочить яйца обязательно. Короче технология. И освещение нужно в инкубаторе.
Куры знают свое дело..
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
61
13
Если ещё актуально. У меня тоже была поставлена задача: высокодинамичный датчик температуры с высокой точностью. После испытаний оказалось, что наиболее актуален в этом смысле обычный копеечный датчик thermistor 10KOM. Библиотеку Гайвера использовать не стоит (увы, сам был удивлён). Код с github с коррекцией оказался глючной ерундой.
Коррекцию производить элементарно: испытываем датчик и к формуле добавляем линейный коэффициент. В диапазоне +-20 градусов работает идеально, быстро и непринуждённо добился за пару минут точности в 0.1 градус Цельсия. Первое приближение: берём термистор в руку, крепко сжимаем, смотрим, какую поправку давать на 36.6 :). Схема: 3.3В -резистор на 10КОМ -Thermistor на пин 34- второй вывод термистора: на GND
Использовать провода не менее 1кв. мм, длина не более 2 метров, перекалибровать при изменении параметров провода. В код для отладки включён вывод в serial и delay(1000), их потом убрать! Код включения реле, разумеется, обязан быть сложней + контроль правильности датчика.
Делается примерно как во втором примере.


Код:
Термистор NTC:
const float BETA = 3950; // should match the Beta Coefficient of the thermistor

void setup() {
  Serial.begin(115200);
  analogReadResolution(10);
  pinMode(34,INPUT);
  pinMode(14,OUTPUT);
}
void loop() {
  int analogValue = analogRead(34); // ПИН подключения термистора
  float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;
  Serial.print("Temperature: ");
  Serial.print(celsius);
  Serial.println(" ℃");
  if(celsius>=35)
    digitalWrite(14, HIGH);
  else
    digitalWrite(14, LOW);
  delay(1000);
}
контроль термостата:
void TempControl(){
static uint32_t tmr2;
  if (millis() - tmr2 >= 2000) {
    tmr2 = millis();


termostatFlag1 = (thermistor > (20)) ? true : false  ;///если температура thermistor больше (20), то true (проверка исправности датчика)thermistor
termostatFlag2 = (thermistor < (40)) ? true : false  ;///если thermistor меньше (40), то true.
termostatFlag3 =(((w.sldHeater1 - w.sldHysteresis1) - thermistor) >= 0) ? true : false;
termostatFlag4 = (w.swHeater1 == 1) ? true : false;

if (termostatFlag1 && termostatFlag2 && termostatFlag3 && termostatFlag4)
{digitalWrite (Heater1Relay, 0);}  //включение
else digitalWrite (Heater1Relay, 1);
  }
}
 
Изменено:
  • Лойс +1
Реакции: PavelStrike

gidiara666

★✩✩✩✩✩✩
5 Май 2023
61
13
1. Я писал: "определить поправку в первом приближении возможно методом крепкого сжимания пальцами датчика". + :).
2. С гитхаб тупо скопировал код именно для моего датчика. Ничего своего не добавлял. Результат был очень с большими погрешностями, в отличии от приведенного мною простейшего метода. Выяснять почему не стал, просто констатировал факт. С нетерпением ожидаю Вашего кода, обеспечивающего лучшую точность.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942

@gidiara666, во-первых, отвечали не Вам и не на "Ваш" код. Во-вторых, с каких пор github стал эталоном кода? Там большинство кода - это эксперименты, часто заброшенные и не развивающиеся, неверно написанные и т.п.
А писать код только ради того, чтобы доказать работу давно разработанного алгоритма, большинству здесь неинтересно. Хотя я не исключаю, что кто-то скинет что-то подобное из реализованного.
 

PavelStrike

✩✩✩✩✩✩✩
16 Окт 2023
33
4
Оформи код соответствующим тэгом
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / BETA + 1.0 / 298.15) - 273.15;


Судя по значению АЦП 1023 этот код написан под ардуино или Esp 8266)у Esp 32 значение 4095 )C адуино проблем нет. Хоть с библиотеками хоть без них ,АЦП работает отлично)

const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // the 'other' resistor
const float beta = 3950; // Beta value (Typical Value)
const float nominalTemperature = 22; // Nominal temperature for calculating the temperature coefficient
const float nominalResistance = 10000; // Resistance value at nominal temperature

void setup(void) {

Serial.begin(9600);

//ads.begin();

}

void loop(void) {

int adcValue = analogRead(34); // Read ADC value
float voltage = (adcValue * referenceVoltage) / 4095.0; // Calculate voltage
float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // Calculate thermistor resistance with updated configuration

// Calculate temperature using the Beta parameter equation
float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));

float tempC = tempK - 273.15; // Get temperature in Celsius


//Print temperature
Serial.println(tempC);
// Serial.println(ads.readADC_SingleEnded(0));
delay(500); // Change how often the sketch outputs reading
}

Код для ESP 32

Частично удалось решить проблемму с рандомными показаниями с АЦП ESP 32 установкой конденсатора на входе питания термистора и изменением значения nominalTemperature .(Думаю вся проблемма в опорном напряжении)
 
  • Лойс +1
Реакции: gidiara666

gidiara666

★✩✩✩✩✩✩
5 Май 2023
61
13
О, а вот теперь плавно подходим к вопросу, почему
"Использовать провода не менее 1кв. мм". 3.3V DC очень лихо теряются на тонких и длинных проводах. Прикиньте! А дискретизацию все же лучше использовать 1023. Прекрасно работает на ESP32, кстати. Как раз этот параметр напрямую влияет на рандомные "вылеты" значений. Это компромисс ненужной точности измерений и скорости и точности обработки сигнала.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
3.3V DC очень лихо теряются на тонких и длинных проводах
Кому то нужно подучить физику.

Допустим, подключаем напрямую к 3.3 В сопротивление (датчик) 10 кОм через провода AWG28 (0.08 кв.мм.) длинной 2м.
Общее сопротивление проводов будет примерно 10 Ом.
При этом на проводах потеряется примерно 3.3 мВ. Это некритичная потеря, т.к. сопротивление проводов постоянно, а сопротивление нагрузки меняется не так сильно, что с легкостью компенсируется если уж нужны суперточные показания.
 
Изменено:

gidiara666

★✩✩✩✩✩✩
5 Май 2023
61
13
Кому-то надо меньше умничать. Ибо расстояние подключения датчика в 1 метр (2 метра провода) сложно назвать длинной дистанцией. Это - макет на столе. А вот у меня, к примеру, из коридора в ванную ушло 18 метров провода (всего-навсего 9 метров до объекта) и 80 Ом просадили напряжение, что стало видно по погрешности показаний теплого пола на 2.5 градуса... А сейчас заказчиком поставлена задача более точных измерений, поэтому надо очень внимательно подходить к выбору проводников. Кстати, из опыта: я лично убедился, что регулирование термоголовки на радиаторе лично мне необходимо с точностью не менее 0.5 градуса. Вот так вот...
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
@gidiara666, На длинную дистанцию уже стоит думать над другой схемой передачи данных, например токовой петлей или 1-wire, если принципиально по двум проводам передача данных. А использовать толстенные провода - это костыль. Вы же не будете увеличивать площадь проводов каждый раз когда вам поставят задачу увеличить расстояние?
 

PavelStrike

✩✩✩✩✩✩✩
16 Окт 2023
33
4
Оформи код соответствующим тэгом, см. Правила
С разрешением 10 и 12 бит
analogReadResolution();
периодически есть рандомные показания в 2 гр +-)Но показания 12 бит намного лучше )в общем подключив по схеме с конденсатором , расширением 12 бит и библиотекой Гувера удалось достигнуть колебаний всего 0,05 гр)На данный момент это лучшие показания из предложенных вариантов
Скриншот 29-10-2023 212011.jpg
#include <GyverNTC.h>
GyverNTC therm(34, 10000, 3950, 22, 10000, 12);
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println(therm.getTempAverage());
delay(1000)
}
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
61
13
@Геннадий П
Глупости какие, на длинной дистанции я буду применять только цифровые датчики. К примеру, у меня на балконе Dallas датчик имеет около 18 метров до контроллера по стенам, это 36 м кабеля. Но. Иногда необходима очень быстрая реакция на изменение температуры, и вот здесь термистор незаменим. Точность в 0.05 градусов цифровой датчик выдать не способен по определению. Различные цели имеют различные инструменты, все как обычно. От Dallas температуру в сжатых пальцах около 36.6 стоит ожидать около 5 минут. Терморезистор выдает это значение за 4-5 секунд. В промышленности применяют трехпроводную схему с термокомпенсацией, но для pt100 надо заморачиваться с преобразователем и т.д. и т.п.
PavelStrike, а почему не используете среднеквадратичное значение из выборки каждые 2 сек? Реально заморочился и выяснил, что флуктуации выходящие за 3 сигмы появляются при частоте измерений в 0.2 секунды. У вас 1 сек, в коде, что для инкубатора тоже овердофига. Это где оно такое надо при измерении температуры??
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,237
942

@gidiara666, Вы бы, кроме себя, ещё кого-нибудь слушали. По какому интерфейсу "Dallas" передаёт? Сможете сравнить с тем, что предложил
@Геннадий П, или времени тратить не стоит?
Падение напряжения на длинных проводах можно учесть одним числом, а если применяется токовая петля, то смысла этого делать вообще нет. Изучите уж матчасть, а то алгоритм "рандомные броски" даёт, для тока в несколько миллиампер провода с палец...
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
@gidiara666, Токовой петле пофиг на сопротивление проводов, поэтому ее и применяют на длинных дистанциях, "учите физику".
Скорость реакции зависит исключительно от размеров датчика.
Под цифровой передачей я имел в виду цифровую передачу данных, а точность замеров зависит от используемого АЦП.
В промышленности применяют 4-проводную систему, чтобы исключить влияние сопротивления проводки. Но вы почему то решили использовать увеличение площади сечения проводов чтобы нивелировать этот эффект.
Под "среднеквадратичным" вы наверное имели в виду среднее значение, что функция getTempAverage() и делает усредняя значение из 20(по умолчанию) выборок.
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
61
13
А ну-ка, продемонстрируйте мне, плиз, "четырехпроводную схему соединения термистора" с термокомпенсацией. Там надо 4 операционных усилителя. :). Итого, приходим к выводу, что флуктуации за пределами скольких угодно процентов на выбор можно сделать простой математикой при обработке. И не умничать. Просто не включать в выборку значения, отличные от... скажем, среднего арифметического выборки из 20 значений на 20% и более. Но проще не маяться дурью и измерять температуру, скажем, каждые 2 сек, как я и предлагал. Вероятность того, что в единичной выборке будет "вылет" крайне мала. Что и требовалось для реального измерения.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942

@gidiara666, в гугле забанили? Прочитай про кельвиновское измерение и не путай ж... с пальцем.