В
предыдущей статье я уже упоминал о том, как устроена аналоговая микросхема-датчик температуры, а сейчас предлагаю перейти к практике.
Обычно, мы получаем сенсор в корпусе TO-92 (не перепутайте с транзистором):

На фото - популярный датчик
TMP36 от Analog Devices. Как видите, выводов три, и если смотреть в положении "надписью к нам, ножками вниз", то получается (слева направо): питание (Vs), выход (Vout), земля (GND). Главная особенность таких датчиков - значение напряжения на выходе однозначно определяет температуру, независимо от напряжения питания (!). Последнее может варьироваться от 2,7 до 5,5 Вольт.
Это очень удобно, и позволяет нам выполнить проверку датчика вне схемы, если под рукой есть элемент питания 3В, хотя бы даже и
батарейка CR2032. В активном состоянии датчик потребляет не более 50 мкА, для проверки в течение двух-трех минут вполне хватает. Собираем схему:

Теперь, подключая мультиметр к выходу датчика (разумеется, в режиме измерения напряжения), мы будем наблюдать напряжение около 0,78 В, что соответствует 28 °С.

Чтобы убедиться в работоспособности датчика, его надо слегка нагреть, отлично подойдут:
- пальцы рук (температура вашего тела - 36,6 °С)
- дующий горячим возухом фен (можно довести и до 50 °C)
- кошка (температура 38-39 °C)
Показания мультиметра должны расти при нагревании и уменьшаться при охлаждении.
Конечно, даже простого пальца будет достаточно, чтобы увидеть результат:

Теперь подключим датчик к Arduino. Пусть выход будет подключаться к analog0, а питание - к стабилизированному питанию +5В Arduinio:

Для чтения придется использовать АЦП, а ему, как известно, требуется опорное напряжение, надо выбрать один из трех вариантов: питание, внешнее на AREF или внутреннее.
Напряжение на выходе датчика TMP36 меняется от 100 мВ до 2В, так что использовать внутренний источник опорного напряжения 1,1В не получится. Хотя, такое значение у источника МК ATmega168/328, а вот в ATmega8 это будет уже 2,56 В. Гораздо проще ориентироваться на стабилизированные +5 В, которые поступают от USB.
Чтобы правильно перевести показания датчика в температуру, надо сначала понять, какое напряжение мы прочитали. АЦП возвращает число от 0 до 1023, при этом 0 = 0В, 1023 = 5В для нашего случая. Поэтому:
voltage = 5 В / 1024 * sensor
Заглянем в документацию на датчик: там оговаривается, что изменение на один градус цельсия соответствует изменению на 10 мВ, при этом 500 мВ будет соответствовать температуре 0°C. Получаем формулу:
tempC = (voltage - 0.5) * 100
void setup() {
Serial.begin(38400);
}
void loop() {
float voltage = 5.0 / 1024.0 * analogRead(0);
Serial.print(voltage);
Serial.println(" B");
float tempC = ( voltage - 0.5 ) * 100;
Serial.print(tempC);
Serial.println(" C");
delay(1000);
}
Одно маленькое замечание к тексту скетча: значение опорного напряжения надо писать именно
"5.0", чтобы компилятор случаем не решил разделить 5 на 1024 целочисленным делением и не получил пожизненный ноль в итоге.

Вернемся к вопросу о точности. Наш АЦП имеет шаг измерения 4,9 мВ, в то время как сам датчик имеет погрешность ±1°C, или ±10 мВ. Таким образом, даже если мы понизим опорное напряжение, например, до 3,3 В и получив таким образом шаг преобразования 3,3 / 1024 = 3,2 мВ, это повышение точности не спасет нас от ошибки самого сенсора. С другой стороны, напряжение питания +5 В тоже может запросто "гулять" ±5%, но в итоге это порождает ту же самую ошибку ±10 мВ. Таким образом, как ни крути, для данной схемы погрешность измерения будет не менее ±2°C. Из этого следует, кстати, забавный метрологический вывод: дробную часть можно отбрасывать ;)
(в статье использованы материалы из статьи про измерение температуры by ladyada)