Еще один полезный прибор, который часто используется в современных устройствах — это датчик температуры. Даже в вашем компьютере есть сразу несколько датчиков температуры, с помощью которых система следит за перегревом ключевых компонентов — процессора, видеокарты, блока питания, и прочих узлов. Самый же популярный пример использования датчика температуры дома — термостат. Это устройство, которое постоянно следит за температурой воздуха, и регулирует подачу энергии в систему отопления. Смежный пример — котел для нагрева воды.
В нашем уроке мы используем датчик TMP35. Вместо него можно использовать любой другой похожий датчик: TMP35, TMP37, LM35, LM335 и подобные. Выглядит датчик как обычный транзистор:
Можно легко спутать, так что рекомендую всегда внимательно читать маркировку на таких устройствах (да и вообще сначала всегда читайте, потом подключайте :). Конкретно этот датчик имеет следующие характеристики:
- напряжение питания: от 2,7 до 5,5 В;
- погрешность: 2 градуса;
- измеряемая температура: от 10°C до 125°C
- потребляемый ток: 50 мкА.
Список необходимых компонентов
Для выполнения простого примера с датчиком LM35, кроме самого датчика, потребуется Ардуино-совместимый контроллер, макетная плата и немного проводов. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
Подключение
Датчик TMP35 имеет три вывода (три ноги). Если посмотреть на датчик со стороны этих выводов и срезом вверх, как показано на рисунке,
то слева будет — положительный контакт питания (+2.7 — 5.5В),
по центру — выход на контроллер,
и справа — отрицательный контакт питания (земля).
Датчик аналоговый, а значит на его выходе мы имеем не 0 или 1, а напряжение в диапазоне от 0 до 5 вольт. Следовательно, мы должны вспомнить раздел про аналого-цифровое преобразование (АЦП) сигналов в Arduino. Держа в уме, что у Ардуино Уно есть шесть аналоговых входов (A0-A5), подключаем наш датчик по следующей схеме:
Внешний вид макета
Принципиальная схема
Вот так должна выглядеть собранная схема.
Программа
Подключив датчик температуры к Ардуино, начинаем писать программу. Первое что мы сделаем, это выведем необработанный сигнал с аналогового входа в последовательный порт, для того чтобы просто понять, как меняется значение на входе A0. Нам понадобится простая программа:
int raw = 0;
float temp = 0;
void setup() {
Serial.begin(9600);
pinMode( A0, INPUT );
}
void loop() {
raw = analogRead(A0);
temp = ( raw/1023.0 )*5.0*1000/10;
Serial.println(temp);
delay(1000);
}
Внимание, математика! В программе можно заметить выражение:
temp = ( raw/1023.0 )*5.0*1000/10;
Оно необходимо для того, чтобы преобразовать аналоговый сигнал датчика в градусы Цельсия. Дело тут вот в чем. Все аналоговые датчики имеют важную характеристику — отношение напряжения в Вольтах к единице измеряемой величины. Например, в спецификации к нашему датчику tmp35 написано, что каждый градус измеряемой температуры, соответствует 10 милливольтам напряжения на выходе. Исходя из этих рассуждений, прочитанное с помощью analogRead значение мы сначала преобразуем к количеству Вольт:
вольты = (значение АЦП / 1023) * 5
Такая процедура называется нормировкой. Здесь 1023 — максимальное значение, которое может вернуть нам 10-битный АЦП, встроенный в Ардуино Уно.
5 — рабочее напряжение АЦП.
Затем преобразуем эти вольты в градусы Цельсия:
градусы = (вольты * 1000) / 10
Превращаем вольты в милливольты (*1000), и делим на 10 ( то самое число из спецификации! ).
В общем, даже если ничего не понятно, загружаем программу на Ардуино и наблюдаем за температурой окружающего воздуха. Например, у нас в лаборатории датчик оценил температуру следующим образом:
Вполне себе правдивое значение. А теперь поднесем прибор к открытому окну (на улице зима -10°C):
Работает! Датчик незамедлительно регистрирует снижение температуры.
Делаем термостат
Теперь добавим в программу некое действие, которое будет совершаться если температура упадет ниже заданного нами порога. Пусть этот порог будет равен 15°C. Самое простое, что мы можем сделать — это зажигать на Ардуино штатный светодиод #13. Получается такая вот программа:
int raw = 0;
float temp = 0;
void setup() {
pinMode( A0, INPUT );
}
void loop() {
raw = analogRead(A0);
temp = ( raw/1023.0 )*5.0*1000/10;
if (temp < 15)
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
delay(1000);
}
Кто-то забыл закрыть окно — температура резко опустилась ниже 15 — светодиод зажигается. Закрываем окно, активно дышим — светодиод гаснет. А теперь представьте, что вы зажигаете не светодиод, а подаете сигнал на реле, которое включает обогреватель в комнате. Получается готовый термостат!
Немного изменив программу можно отслеживать не понижение, а превышение заданного уровня. Например, удобно будет следить за температурой внутри, скажем, серверной, и при увеличении температуры до 40 градусов, включать вытяжку!
К размышлению
В современных устройствах всё чаще применяют цифровые датчики температуры, например, известный в среде DIY датчик DS18B20. Он легко подключается к Ардуино с помощью только одного сигнального провода — one wire. Модуль с таким датчиком есть и у RobotClass:
О том как его подключать и использовать в своих проектах узнаем на уроке про DS18B20.
В какой программе Вы рисуете ардуино? (рисунок 3)
Fritzing
Собрал все согласно схеме. Вроде работает, но если подключить светодиод к выходу 13 он светит тускло и при подключении реле оно не срабатывает. Подскажите что не так?
Разобрался. Вот рабочий скетч на подключение реле
int raw = 0;
int Relay = 13;
float temp = 0;
void setup() {
pinMode( A0, INPUT );
pinMode(Relay, OUTPUT);
}
void loop() {
raw = analogRead(A0);
temp = ( raw/1023.0 )*5.0*1000/10;
if (temp < 15)
digitalWrite(Relay, HIGH);
else
digitalWrite(Relay, LOW);
delay(1000);
}
int raw=0
int Relay= 13 это придназночение пинов ?
int raw = 0;
float temp = 0;
void setup() {
pinMode( A0, INPUT );
pinMode ( 13, OUTPUT );
}
void loop() {
raw = analogRead(A0);
temp = ( raw/1023.0 )*5.0*1000/10;
if (temp < 15)
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
delay(1000);
}
а как написать чтобы эта температура виводилась на lcd 16×02?
Посмотрите вот этот урок: Ардуино: вывод текста на ЖК дисплей 1602
как можно добавить еще гистерезис к этому коду
Добрый день! сколько максимально можно использовать темп.датчиков+реле?
Если это Arduino Uno, то на ней всего 20 выводов общего назначения, к которым можно подключить реле или любые другие цифровые устройства. Из этих 20, 6 умеют считывать аналоговый сигнал, в том числе и с аналоговых датчиков.
Виталий, можно использовать АЦП плату с I2C интерфейсом, тогда появляется возможность подвесить дополнительные датчики.
Так же можно воспользоваться сдвиговым регистром для многократного увеличения цифровых выходов.
При использовании термодатчика DS18b20 нужно корректировать формулу?
DS18B20 цыфровой датчик/
У меня почему то постоянно разные цифры скачут, то не так?, Raw выдает:
1023
1023
1023
1023
892
745
574
389
134
0
0
0
0
0
0
0
Возможно датчик неверно подключен, или битый. На датчик нужно смотреть со стороны ног! Картинка с распиновкой в уроке именно для этого угла обзора. Кстати, если датчик сильно греется — это еще один показатель того, что он неверно подключен.
Странное название у данной статьи «датчик температуры LM35», при этом сам датчик там не упоминается, хотя является очень удобным:
«Серия LM35 это прецизионные интегральные датчики температуры, у которых выходное напряжение пропорционально температуре по шкале Цельсия.»
т.е. это означает, что нет необходимости что-то там пересчитывать после измерения (я про это — temp = ( raw/1023.0 )*5.0*1000/10;).
Ничего странного здесь нет. LM35 и TMP35 — аналоги. Оба датчика действительно дают напряжение пропорциональное температуре.
Формула же служит для преобразования значения АЦП (0..1024) в градусы Цельсия. В статье популярно написано, откуда она берется.
Вопрос, как правильно считать температуру при использовании питания 3,3В ??
Геннадий, воспользуйтесь функцией map.
Как вывести данные с датчика на oled дисплей 128*64?
#include
#include
#include
#include
// If using software SPI (the default case):
#define OLED_MOSI 11
#define OLED_CLK 12
#define OLED_DC 9
#define OLED_CS 8
#define OLED_RESET 10
Adafruit_SSD1306 OLED(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
int raw = 0;
float temp = 0;
float t = 0;
void setup() {
Serial.begin(9600);
OLED.begin(SSD1306_SWITCHCAPVCC);
OLED.clearDisplay();
pinMode( A0, INPUT );
}
float temperature() {
raw = analogRead(A0);
temp = ( raw/1023.0 )*5.0*1000/10;
return temp;
}
void loop() {
t = temperature();
// text display tests
OLED.setTextSize(1);
OLED.setTextColor(WHITE);
OLED.setCursor(35,15);
OLED.print(«Temp: «);
OLED.print(t);
OLED.print(» C;»);
OLED.display();
OLED.clearDisplay();
delay(1000);
}
Доброго времени суток, попробовал повторить проект но столкнулся с проблемкой. В порт передаются значения в в районе 400°С (напряжение — 4..4,1 В) хотя на комнатном термометре +25. На изменение внешней температуры не реагирует. Использую датчик LM335Z купленный в магазине. В описание к нему дана другая распиновка (вид снизу: ADJ, V+, V-), попробовал подключить его по данной схеме — данные стали нормальные (ближе к нормальным) но очень сильно греется и очень вяло реагирует на смену температуры (прижимал к эмалированной чашке с кипятком и кусками льда колебания не более 5°С)
Такая проблема, при подключении как в первом варианте, стабильно выводит значение 500(т.е. максимальное значение АЦП — 1023). значит ли это что Датчик неисправен? или проблема в другом?
Проверьте подключение, ноги не перепутали? Датчик сам не греется?
здравствуйте! у меня на мониторе порта выходит следующее:
64,3
0
0
0
не подскажите в чем проблема?
спасибо
Сделал все четко по речепту, но мне датчик выдает непонятные данные
181.33
168.13
160.80
156.40
153.96
150.54
147.12
145.65
144.67
143.21
143.21
142.72
142.23
141.25
141.74
Плата Arduino UNO, датчик LM35DT, при подключении крайних контактов к 5V и земле плата выключается, как и при коротком замыкании, от 3.3 V или с резистором работает нормально, но показания с выхода разнятся в зависимости от падения напряжения на датчике. Бракованный датчик?
Проверьте полярность подключения. На схеме изображен вид датчика снизу, со стороны откуда ноги торчат.
Arduino uno,датчик LM35DZ из старого набора arduino.Делал всё по инструкции пробывал 3 разных скетча,но суть у них одна и везде одно и тоже датчик выдает какие то случайные значения не имеющие отношения к температуре <> Меня местами плюс и минус ничего не меняется датчик не греется как проверить датчик?))
The LM35 device is rated to operate over a −55°C to 150°C temperature range
* — LM35 Precision Centigrade Temperature Sensors
Как быть с отрицательной температурой?
Приемник на Arduino Nano совместно с nRF24L01 отсылает телеметрию, датчик LM35DZ. На А3 измеряется напряжение 12в через делитель. На А2 измеряется температура . Почему при подаче на пин А3 напряжения, показания температуры начинают хаотически расти? При отключенном напряжении на делителе температура в норме. Милливольтметр, подключенный к пину А2, показывает, что напряжение не растет. В чем может быть проблема? Подскажите пожалуйста.
Попробуйте поставить конденсатор 100нф между A3 и землей. Вероятно на линии 12В у вас какой то вч шум, может от импульсника.
Поставил. Подключил к делителю на А3 аккумуляторы 4, 9 и 12 В. Картина та же. Пока на делитель ничего не подается — показания температуры стабильны. Как подключаю на делитель напряжение-начинается хаос. И чем большее напряжение, тем больше разброс термометра.
Все. Поставил цифровой датчик DS18B20.