Кремниевый диод в прямом включении — это практически линейный температурный датчик, падение напряжения на кремниевом диоде линейно зависит от температуры, причем температурный коэффициент практически одинаков для любых типов диодов и составляет около −2 мВ/°С (т. е. с ростом температуры напряжение уменьшается).
Диапазон измерения температуры при помощи кремниевого диода может находится в пределах от -30 до 120 ºС.
Схема датчика температуры достаточно проста, на понадобится плата Arduino Nano (UNO), индикатор для вывода информации и кремниевый диод 1N4148.
Микроконтроллер ATmega в Arduino имеет внутренние подтягивающие резисторы (резисторы, подключенные к питанию внутри микросхемы), которыми можно управлять. В скетче активируется этот режим и диод питается от напряжения 5 В через внутренний подтягивающий резистор 20 кОм, одновременно на этом же аналоговом входе измеряем прямое напряжение диода, которое будет немного меняться от температуры.
Так как диоды имеют разброс в параметрах, то необходима калибровка. Для этого необходимо иметь точные данные о температуре, для этого может понадобится точный градусник, чтобы замерить температуру окружающей среды или лед с талой водой для калибровки по 0 гр. Цельсия. Можно также произвести калибровку по температуре кипящей воды.
В моем случае я поступил просто, измерив окружающую температуру ртутным лабораторным градусником (погрешность 0,1ºС), я указал ее в скетче (первоначально необходимо загрузить скетч, а потом калибровать), а так же указал цифровое значение напряжения при этой температуре (см.монитор порта). Дополнительно (что было необязательно) диод был погружен в лед с талой водой и показания температуры были около нуля градусов.
Тестируя несколько диодов 1N4148, я убедился, что значения температуры отличались от калиброванного диода не более чем на 0,5 ºС, но все диоды были с одной партии, поэтому возможно мои калибровочные числа Вам не подойдут.
#include <LiquidCrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7 int n = 30;// кол-во измерений для среднего значения int t; // 0,022 мВ на 1 гр.Цельсия или 2 ед.значения А5 на 1 гр.Цельсия) const float t0 = 26.0; // калибровка const float t0_analog = 545; /* По показаниям эталонного градусника задайте свое значение температуры t0, далее посмотрите значение t0_analog в мониторе порта и укажите его */ float t_sum,t_iz,t_iz_analog,t_analog; void setup() { analogReference(INTERNAL);// опорное 1,1 В lcd.begin(16, 2);// LCD 16X2 pinMode(A5, INPUT_PULLUP); Serial.begin(9600); } void loop() { lcd.clear(); lcd.setCursor(0,0); lcd.print("temp = "); lcd.print(t_iz,1); lcd.print(" C "); Serial.println(t_analog,0); t_sum = 0; for (int i = 0; i < n; i++) { t = analogRead(A5);// 545 при 26 гр t_sum = t_sum + t; delay(33);// общее время измерения 999 мс } t_analog = t_sum / n;// среднее значение t_iz_analog = (t_analog-t0_analog) / 2;// отклонение гр.Цельсия от t0 t_iz = t0 - t_iz_analog;// вычисление температуры }
На основе датчика температуры, можно собрать простой терморегулятор, схема которого показана на рисунке:
Кнопками регулировки можно установить необходимую температуру, как только температура датчика превысит температуру регулировки на цифровом выходе 13 появится лог. ноль. Так же в код добавлен гистерезис в 0,2 градуса.
#include <LiquidCrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7 int n = 30;// кол-во измерений для среднего значения int t; // 0,022 мВ на 1 гр.Цельсия или 2 ед.значения А5 на 1 гр.Цельсия) const float t0 = 26.0; // калибровка const float t0_analog = 545; /* По показаниям эталонного градусника задайте свое значение температуры t0, далее посмотрите значение t0_analog в мониторе порта и укажите его */ float t_sum,t_iz,t_iz_analog,t_analog; int kn,t_reg = 25; const float g = 0.2;// гистерезис void setup() { analogReference(INTERNAL);// опорное 1,1 В lcd.begin(16, 2);// LCD 16X2 pinMode(A5,INPUT_PULLUP); pinMode(5,INPUT_PULLUP); pinMode(4,INPUT_PULLUP); pinMode(13,OUTPUT); Serial.begin(9600); } void loop() { lcd.clear(); lcd.setCursor(0,0); lcd.print("temp = "); lcd.print(t_iz,1); lcd.print(" C "); Serial.println(t_analog,0); if(digitalRead(5) == 0){t_reg++;} if(digitalRead(4) == 0){t_reg--;} if(t_reg <= -30){t_reg = -30;} if(t_reg >= 120){t_reg = 120;} lcd.setCursor(0,1); lcd.print("reg = "); lcd.print(t_reg); lcd.print(" C "); if(t_reg >= t_iz + g){digitalWrite(13,HIGH);} if(t_reg <= t_iz - g){digitalWrite(13,LOW);} if(digitalRead(13) == HIGH){lcd.setCursor(14,1);lcd.print("*");} else{lcd.setCursor(14,1);lcd.print(" ");} t_sum = 0; for (int i = 0; i < n; i++) { t = analogRead(A5);// 545 при 26 гр t_sum = t_sum + t; delay(33);// общее время измерения 999 мс } t_analog = t_sum / n;// среднее значение t_iz_analog = (t_analog-t0_analog) / 2;// отклонение гр.Цельсия от t0 t_iz = t0 - t_iz_analog;// вычисление температуры }