Arduino датчик температуры

Считываем показания датчика DS18B20 (DS18S20)

Рассмотрим как при помощи Arduino считывать показания с цифрового датчика температуры DS18B20 или DS18S20. В настоящий момент м/с DS18B20 фирмы Dallas является наиболее распространенным и доступным цифровым датчиком температуры. Работает по протоколу 1-wire. Даташит датчика: DS18B20

Датчик может запитываться двумя способами - внешним питанием (3 провода) или паразитным (питание от шины, 2 провода). Расписывать эти режимы не буду, все есть в документации. Отмечу лишь то, что в данном проекте мы будем использовать нормальное (внешнее) питание датчика.

Схема подключения датчика DS18B20 к Arduino приведена ниже. Подтягивающий Pull-Up резистор номиналом 4.7 кОм (5 кОм) включается между выводом DQ (Data) и питанием датчика Vdd.

Рабочий скетч представлен ниже. Необходима библиотека OneWire, последнюю версию которой можно скачать здесь .

После установки библиотеки, в меню появиться рабочий пример, которым и можно воспользоваться.

Мониторинг температуры на Arduino и Cosmo GSM Connect

Разберем пример устройства позволяющего удаленно отслеживать показания сенсоров, например — датчиков температуры. В качестве аппаратной части устройства будем использовать — Arduino (Uno или другие версии), GSM-шилд «Cosmo GSM Connect », датчики температуры.

Основные возможности системы.

  • Получать СМС при понижении/повышении температуры, причем индивидуально для каждого датчика.
  • Получать СМС при возвращении температуры в заданный интервал.
  • Запрашивать по дозвону текущие показания всех датчиков.

При превышении заданного порогового значения температуры произойдет отправка тревожного СМС-сообщения. При возвращении показаний датчика в нормальный температурный диапазон — отправка соответствующее СМС уведомление. Также реализуем возможность получения показания датчиков по запросу.

Для получения точных значений температуры будем использовать цифровой температурный датчик DS18B20. Его диапазон измерений от –55°C до +125°C и точность 0.5°C в диапазоне от –10°C до +85°C. DS18B20 обменивается данными по 1-Wire шине в 9-12 битном (программируется пользователем) коде с ценой младшего разряда от 0.5°C до 0.0625°C и при этом датчик может быть как единственным устройством, так и работать в группе.

Питание датчика возможно двумя способами — внешнее и паразитное питание. При паразитном питании максимально измеряемая температура составляет + 100 °C. Для расширения диапазона температур до + 125 °C необходимо использовать внешнее питание.

Сенсор DS18B20 отличается наличием во внутренней энергонезависимой памяти (EEPROM) программируемых установок по превышению температуры (TH) и по понижению температуры (TL). Внутренний регистр флага будет выставлен, когда измеренная температура больше чем TH или меньше чем TL.

Итак, возьмем два датчика DS18B20 и подключим их по паразитной схеме питания к 8 пину Ардуино.

Воспользуемся функциональной возможностью встроенной в датчик EEPROM и укажем для каждого сенсора свой диапазон температур. При пересечении этого диапазона, как в большую, так и в меньшую сторону — произойдет срабатывание регистра и в этом случае будем производить отправку тревожного СМС.

Реализуем, чтобы по возвращению температуры в заданные параметры, также отправлялось сообщение о нормализации пареметров.

Для работы с датчиками DS18B20 скачайте и установите библиотеку DallasTemperature .

Для работы с шилдом «Cosmo GSM Connect » скачайте и установите библиотеку GSM

Итак, запускаем Arduino IDE, копируем в него следующий скетч.

Редактируем номер телефона (const char RemoteID[]), с которого можно будет производить дозвон и на который будут приходить СМС. При необходимости можно убрать проверку на номер и тогда на все входящие вызовы шилд будет отправлять смс со значениями датчиков.

Задание температурного диапазона для датчика "sensor_1" от +30 до -10 градусов цельсия, выглядит следующим образом:

Arduino датчик температуры arduino

Аналогичным способом задаем диапазон срабатывания и для второго датчика. Уже в том случае, как будет зафиксировано значение вне заданного диапазона сработает Alarm.

Таким образом, получилась несложная система мониторинга температуры, позволяющая устанавливать каждому температурному датчику свой диапазон срабатываний.

Аналоговые датчики температуры и Arduino

В предыдущей статье я уже упоминал о том, как устроена аналоговая микросхема-датчик температуры, а сейчас предлагаю перейти к практике.

Обычно, мы получаем сенсор в корпусе 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

Одно маленькое замечание к тексту скетча: значение опорного напряжения надо писать именно "5.0". чтобы компилятор случаем не решил разделить 5 на 1024 целочисленным делением и не получил пожизненный ноль в итоге.

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

Рекомендуем также прочитать
Датчик температуры и давления наддува для двигателя марки Cummins модели L, QSL, ISLe для автомобилей Газель семейства «Бизнес»; заводские артикулы детали: 4921322, 4903286
Датчик температуры и влажности DFRobot v2 на DHT11 (цифровой)
Форум Mitsubishi Lancer Club SPb Не прогревается!! Менять термостат. павел3 08 дек 2009
Надежные японские двигатели (Toyota серия A) Надежные японские двигатели
RAYSTAT-EX-03 Электронный термостат с регулированием по температуре обогреваемой поверхности