/* Вывод температуры с 16 NTC резисторов в UART
* Питание терморезисторов с пина 2 (D2)
* АЦП NTC резисторов с мультиплексора (HP4067) на пин A0
* Управление мультиплексором через пины 3 4 5 6 (D3 D4 D5 D6)
* NTC резистор 49.9 кОм
* 28.10.2023
* ver 1.0
*/
#define sens_power 2 // Указываем пин подачи питания для датчиков температуры (D2)
#define DELAYSWITCHSENS 10 // Задержка в милисикундах перед измерением АЦП
#define TEMPERATURENOMINAL 25 // Температура при номинальном сопротивлении (обычно 25С)
#define THERMISTORNOMINAL 50000 // Сопротивление терморезистора при +25 С
#define SERIESRESISTOR 50500 // Сопротивление опорного резистора
#define BCOEFFICIENT 3950 // Бетта коэф. терморезистора (обычно 3000-4000) есть в даташитах (4150 для протеуса, 3950 для NTC с али)
#define COM A0 // пин А0 на аналоговый вход с терморезисторов
float average;
const uint8_t controlPins[] = { 18, 17, 16, 15 }; // Пины для управления мультиплексором (A4 A3 A2 A1)
float readMux(int channel)
{
for(int i = 0; i < 4; i ++)
{
digitalWrite(controlPins[i], channel >> i & 1);
}
delay(DELAYSWITCHSENS);
return analogRead(COM);
}
void setup()
{
Serial.begin(9600); // Запускаем вывод данных на серийный порт
for (int i = 0; i < 4; ++i)
{
pinMode(controlPins[i], OUTPUT);
}
pinMode(sens_power, OUTPUT); // Определяем пин подачи питания датчиков температуры
}
void ReadSensor() // Измеряем температуру
{
float steinhart;
digitalWrite(sens_power, HIGH); // Включаем питание датчиков температуры
delay(DELAYSWITCHSENS); // Задержка для переключений
for(int i = 0; i < 16; ++i)
{
average = readMux(i); // Читаем АЦП необходимого датчика температуры
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
steinhart = average / THERMISTORNOMINAL; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15; // convert to C
Serial.print("T");
Serial.print(i+1); // Выводим порядковый номер измеренного датчика температуры
Serial.print("=");
Serial.print(steinhart,1); // Выводим текущее значение температуры датчика в UART, округленное до десятых
Serial.print("; ");
}
Serial.println();
digitalWrite(sens_power, LOW); // Отключаем питание датчиков температуры
delay(DELAYSWITCHSENS); // Задержка для переключений
}
void loop() {
ReadSensor();
delay(5000);
}