Использовал данные для датчика от сюда
https://kipia.xyz/resistance_thermomete ... /pt1000/10
Использовал кусочно- линейную аппроксимацию от Айдара
#include <driver/adc.h>
#include "esp_adc_cal.h"
// Конфигурация пинов и параметров
#define PT1000_ADC_PIN ADC1_CHANNEL_3 // GPIO39 (Sens.VN)
#define R_REF 1000.0f // Эталонное сопротивление (Ом)
#define V_SUPPLY 3.348f // Напряжение питания (В)
#define SAMPLES 500 // Количество выборок для усреднения
// Таблица зависимости температуры от сопротивления для PT1000
// Формат: {сопротивление (Ом), температура (°C)}
const float pt1000_table[][2] = {
{ 803.06, -50 }, { 822.9, -45 }, { 842.71, -40 }, { 862.48, -35 }, { 882.22, -30 },
{ 901.92, -25 }, { 921.6, -20 }, { 941.24, -15 }, { 960.86, -10 }, { 980.44, -5 },
{ 1000, 0 }, { 1019.53, 5 }, { 1039.03, 10 }, { 1058.49, 15 }, { 1077.94, 20 },
{ 1097.35, 25 }, { 1116.73, 30 }, { 1136.08, 35 }, { 1155.41, 40 }, { 1174.7, 45 },
{ 1193.97, 50 }, { 1213.21, 55 }, { 1232.42, 60 }, { 1251.6, 65 }, { 1270.75, 70 },
{ 1289.87, 75 }, { 11308.97, 80 }, { 1328.03, 85 }, { 1347.07, 90 }, { 1366.08, 95 },
{ 11385.06, 100 }, { 1404, 105 }, { 1422.93, 110 }, { 1441.82, 115 }, { 1460.68, 120 },
{ 1479.51, 125 }, { 1498.32, 130 }, { 1517.1, 135 }, { 1535.84, 140 }, { 1554.56, 145 },
{ 1573.25, 150 }, { 1591.91, 155 }, { 1610.54, 160 }, { 1629.15, 165 }, { 1647.72, 170 },
{ 1666.27, 175 }, { 1684.78, 180 }, { 1703.27, 185 }, { 1701.8, 190 }, { 1721.73, 195 },
{ 1758.56, 200 }, { 1776.93, 205 }, { 1795.28, 210 }, { 1813.59, 215 }, { 1831.88, 220 },
{ 1850.13, 225 }, { 1868.36, 230 }, { 1886.56, 235 }, { 1904.73, 240 }, { 1922.87, 245 },
{ 1940.98, 250 }, { 1959.06, 255 }, { 1977.12, 260 }, { 1995.14, 265 }, { 2013.14, 270 },
{ 2031.11, 275 }, { 2049.05, 280 }, { 2066.96, 285 }, { 2084.84, 290 }, { 2102.69, 295 },
{ 2120.52, 300 }
};
const int pt1000_table_size = sizeof(pt1000_table) / sizeof(pt1000_table[0]);
// Характеристики для калибровки АЦП
esp_adc_cal_characteristics_t adc_chars;
// Функция для поиска температуры в таблице по сопротивлению
float lookup_temperature(float resistance) {
// Если сопротивление вне диапазона таблицы
if (resistance <= pt1000_table[0][0]) {
return pt1000_table[0][1];
}
if (resistance >= pt1000_table[pt1000_table_size - 1][0]) {
return pt1000_table[pt1000_table_size - 1][1];
}
// Поиск в таблице
for (int i = 0; i < pt1000_table_size - 1; i++) {
if (resistance >= pt1000_table
[0] && resistance <= pt1000_table[i + 1][0]) {
// Линейная интерполяция между точками таблицы
float resistance_low = pt1000_table[0];
float resistance_high = pt1000_table[i + 1][0];
float temp_low = pt1000_table[1];
float temp_high = pt1000_table[i + 1][1];
return temp_low + (temp_high - temp_low) *
(resistance - resistance_low) / (resistance_high - resistance_low);
}
}
return NAN; // Если не найдено (не должно происходить)
}
// Функция для чтения усредненного значения АЦП
uint32_t read_avg_adc() {
uint32_t sum = 0;
for (int i = 0; i < SAMPLES; i++) {
sum += adc1_get_raw(PT1000_ADC_PIN);
delayMicroseconds(100);
}
return sum / SAMPLES;
}
void setup() {
Serial.begin(115200);
// Инициализация АЦП
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(PT1000_ADC_PIN, ADC_ATTEN_DB_11);
// Калибровка АЦП
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars);
Serial.println("PT1000 Temperature Sensor with Marlin-style Table");
}
void loop() {
// Получение откалиброванного значения АЦП
uint32_t adc_value = read_avg_adc();
uint32_t voltage_mv = esp_adc_cal_raw_to_voltage(adc_value, &adc_chars);
float voltage_v = voltage_mv / 1000.0f;
// Расчет сопротивления PT1000
float resistance = R_REF * voltage_v / (V_SUPPLY - voltage_v);
// Поиск температуры в таблице
float temperature = lookup_temperature(resistance);
// Вывод результатов
Serial.print("ADC: ");
Serial.print(adc_value);
Serial.print(", Resistance: ");
Serial.print(resistance);
Serial.print(" Ω, Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
delay(2);
}
получил при сопротивлении датчика 1000ом -
► Показать
Снимок экрана 2025-08-30 150148.png