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 градусов цельсия, выглядит следующим образом:
Аналогичным способом задаем диапазон срабатывания и для второго датчика. Уже в том случае, как будет зафиксировано значение вне заданного диапазона сработает 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. Из этого следует, кстати, забавный метрологический вывод: дробную часть можно отбрасывать ;)