код для датчика температуры ардуино
arduinoLab
Датчик температуры DS18B20, подключение к Arduino.
Подробно про датчики температуры DS18B20 и работу с библиотекой DallasTemperature.
Характеристики датчика:
Схема подключения датчиков:
Назначение выводов:
Также существует герметичная версия DS18B20, в таких датчиках смотрим на цвета проводов.
PIN | Цвет | TO-92 | 8-PIN SOIC | ОПИСАНИЕ |
GND | Черный | 1 | 5 | Масса |
DQ | Желтый, Белый или Синий | 2 | 4 | Линия данных интерфейса 1-Wire. |
VDD | Красный | 3 | 3 | Вход внешнего питания. |
Подключение одного датчика:
Датчик (ногу DQ) можно подключать на любой свободный выход arduino, в данном случаи датчик подключен к аналоговому А1 (он же 15 цифровой). В коде, при необходимости, можно задать любой другой, на котором будет сконфигурирована шина 1-Wire.
Также необходимо притянуть линию данных к питанию резистором на 4,7к. Питание у датчика 5 вольт.
Подключение нескольких датчиков:
Дополнительные датчики подключаются параллельно.
Подключение датчика с фантомным питанием:
Не рекомендуется, без крайней необходимости подключать датчик подобным образом, это плохо сказывается на быстродействии и стабильности работы датчика.
Для работы с датчиками необходима библиотека OneWire, скачать можно тут или тут, благодаря которой можно работать со всей линейкой устройств от Maxim/Dallas с однопроводной шиной (1-Wire), включая DS18B20.
Также, для удобства работы с датчиками DS18B20, рекомендуется использовать библиотеку DallasTemperature, особенно если датчиков на шине несколько, можно скачать тут или тут, она работает поверх библиотеки OneWire. Библиотека обширная, возможно будет тяжела для освоения начинающим, особенно по примерам из комплекта.
Пример работы с одним датчиком, без DallasTemperature:
Открываем пример DS18x20_Temperature.pde из библиотеки OneWire.
Далее в 10 строке указываем пин к которому подключен датчик, изначально там указан 10 пин, а в нашем случаи это A1, то есть, меняем «OneWire ds(10);» на «OneWire ds(A1);» и загружаем в arduino. Открываем «монитор порта» в мониторе каждую секунду приходят следующие данные.
ROM = 28 A8 3E F9 5 0 0 12 — Адрес датчика на шине в HEX формате.
Chip = DS18B20 — Тип датчика, вычисляется из адреса датчика.
Data = 1 C0 1 4B 46 3F FF 10 10 6F CRC=6F — Данные о температуре в HEX формате.
Temperature = 28.00 Celsius, 82.40 Fahrenheit — Температура в двух системах.
Алгоритм получения данных с датчика:
Получение температуры в примере DS18x20_Temperature.pde, происходит в три этапа.
Первым нужно узнать адрес датчика на шине и подключен ли он вообще,
за это отвечает код выше и функция ds.search(addr), которая, если найдет устройство, положит его адрес в массив addr. Можно эту процедуру опустить, если адрес датчика заранее известен.
Вторым отправляется команда на датчик, чтобы он прочитал температуру и положил данные в регистр.
на это датчику требуется относительно много времени, порядка 750мс.
Третьем даем команду на чтение данных из регистра и в цикле считываем ответ в массив
и попутно отправляем его в «монитор порта» для отладки, ниже конвертируем в привычные нам Цельсии или Фаренгейты.
Пример целиком, на всякий случай
Работа с библиотекой DallasTemperature:
Получать температуру с датчиков библиотекой DallasTemperature можно разными методами, у каждого метода есть свои особенности, но по порядку.
Работа с датчиками по индексу:
Родными примерами из библиотеки пользоваться не будем, разберем упрощенную версию, что ниже. Датчик температуры все также подключен ко входу А1.
Пример крайне упрощен и по сути не отличается от кода из примера «DS18x20_Temperature.pde» библиотеки OneWire.
При инициализации просиходит поиск устройств на шине и каждому устройству назначается свой «индекс» по номеру которого, функцией getTempCByIndex(0), можно достать температуру из датчика. Перед считыванием нужно вызвать функцию requestTemperatures() которая дает команды на подключенные датчики считать температуру и положить её в регистр для считвания.
Метод не стабилен при работе с несколькими датчиками, ибо если будут проблемы с обнаружением одного из нескольких датчиков на шине, индексы перестроятся и будем получать ошибочные показания. Также такой метод, не всегда имеет смысл использовать при работе с одним датчиком, зачем использовать тяжелую библиотеку, если достаточно одной функции в коде?
Еще один пример работы с датчиками по индексу, этот пример использоватся в видео. Он отправляет в «монитор порта» температуру со всех подключенных датчиков. Для получения количества подключенных датчиков, вызывается функция getDeviceCount(), которая возвращает значение в переменную qty. В loop, также даем команду датчикам, вызывая функцию requestTemperatures(), а ниже, в цикле for, используя количество подключенных датчиков, отпраляем в монитор порта температуру со всех подключенных датчиков.
Работа с датчиками по ID:
В данном случаи обращаемся к датчику не по назначенному библиотекой «индексу», а по серийному номеру датчика, заданного в коде,
и в данном случаи мы исключаем возможность считать температуру с неправельного датчика, но нужно зарание задать серийный номер. Если задавать его в коде, то устройство будет привязано к конкретному датчику, что осложнит замену датчика при его неисправности.
Еще один пример из видео, работающий по такому принципу ниже. Он отображает полученную температуру с датчика на LCD сшилде.
Работа с ID:
И заключительный простой пример, в данном случаи, при включении микроконтроллера и всего прочего, вызываем функцию getDeviceCount() которая возвращает количество найденых датчиков на шине, это количество отправляем в «монитор порта» но правельее сделать проверку на наличие датчиков и остановку устройства если датчики не найдены.
Следом вызываем функцию getAddress(sensor0, 0), в функцию передаем массив sensor0 который в нашем случаи объявлен в 7 строке кода и индекс датчика, адрес которого функция присвоит в sensor0.
Следом, в цикле for отправляем в монитор порта содержимое массива sensor0, в котором должен содержатся серийный номер датчика, если все прошло успешно
В функции setResolution(sensor0, 11) устанавливаем разрешение получаемой с датчика sensor0 температуры по его серийному номеру, может быть 9, 10, 11, 12 бит, данный параметр не влияет на точность датчика.
в loop, как и в примере выше, отправляем значение температуры с датчика в «монитор порта» по серийному номеру
Зачем нужен этот пример? если с таким же успехом, можно написать ds.getTempCByIndex(0), с одним датчиком так и нужно, а если их много? серийный номер датчика можно записать в EEPROM с привязкой к конкретной задачи, отслеживать получение верных данных с конкретного датчика, все это повышает надежность устройства.
Купить DS18B20:
можно на али, тут, в герметичном исполнении тут.
Видео:
Ардуино термометр на основе датчика температуры DS18B20
Один раз мы уже реализовали проект термометра на основе датчика температуры DS18B20. Сегодня мы сделаем термометр на основе этого датчика другим способом, разберемся с DS18B20 и используем несколько дополнительных библиотек.
Мы сделаем LCD-термометр или, как вариант, Serial-термометр (напечатает данные о температуре на последовательном мониторе Arduino IDE) на основе микроконтроллера Ардуино и цифрового датчика DS18B20, макетов, перемычек. Таким образом, вы сможете измерять температуру воздуха, жидкости, например, воды и температуру земли.
Информация о сенсоре DS18B20
Особенности:
Комплектующие
Чтобы сделать термометр, вам понадобятся следующие детали:
Из программного обеспечения нужно иметь установленную Arduino IDE.
Библиотеки
Прежде чем вы начнете делать термометр, загрузите и распакуйте следующие библиотеки для Arduino в:
/Progam Files (x86)/Arduino/Libraries (по умолчанию):
Все библиотеки вы можете скачать по ссылкам выше или на нашем сайте в разделе Библиотеки.
Термометр через последовательный монитор
Чтобы отобразить данные на последовательном мониторе, подключите датчик DS18B20 к Arduino, используя перемычки и макет, и не забудьте подключить или припаять резистор 4.7k между контактом 2 и 3 датчика.
Если все в порядке, вы должны увидеть измеренную температуру на серийном мониторе Arduino IDE.
Термометр с ЖК-дисплеем
Если вы не хотите измерять температуру через последовательный монитор, то этот шаг для вас.
Подключите ЖК-дисплей I2C к контактам UNO:
Датчики температуры Arduino
В этой статье мы рассмотрим популярные датчики температуры для Arduino ds18b20, dht11, dht22, lm35, tmp36. Как правило, именно эти датчики становятся основой для инженерных проектов начального уровня для Arduino. Мы рассмотрим также основные способы измерения температуры, классификацию датчиков температуры и приведем сравнение различных датчиков в одной таблице.
Описание датчиков температуры
Температурные датчики предназначены для измерения температуры объекта или вещества с помощью свойств и характеристик измеряемой среды. Все датчики работают по-разному. По принципу измерения эти устройства можно разделить на несколько групп:
По области применения можно выделить датчики температуры воздуха, жидкости и другие. Они могут быть как наружные, так и внутренние.
Любой температурный датчик можно описать набором характеристик и параметров, которые позволяют сравнивать их между собой и выбирать подходящий под конкретную задачу вариант. Основными характеристиками являются:
Датчики температуры по типу
Выбор датчика в первую очередь определяется температурным диапазоном измерения. Важно учитывать и точность измерения – для обучения вполне сойдет датчик с малой точностью, а для научных работ и опытов требуется высокая надежность измерения.
Датчики температуры для работы с Ардуино
При работе с микроконтроллером Ардуино наиболее часто используются следующие датчики температуры: DS18B20, DHT11, DHT22, LM35, TMP36.
Датчик температуры DS18B20
DS18B20 – цифровой 12-разрядный температурный датчик. Устройство доступно в 3 вариантах корпусов – 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92, чаще всего используется именно последний. Он же изготавливается во влагозащитном корпусе с тремя выходами. Датчик прост и удобен в использовании, к плате Ардуино можно подключать сразу несколько таких приборов. А так как каждое устройство обладает своим уникальным серийным номером, они не перепутаются в результате измерения. Важной особенностью датчика является возможность сохранять данные при выключении прибора. Также DS18B20 может работать в режиме паразитного питания, то есть без внешнего питания через подтягивающий резистор. Подробная статья о ds18b20.
Датчики температуры DHT
Датчик температуры LM35
Схема подключения к микроконтроллеру Ардуино достаточно проста. Желательно датчик прижимать к контролируемой поверхности, чтобы увеличить точность измерения.
TMP36 – аналоговый термодатчик
Ардуино: датчик температуры LM35
Еще один полезный прибор, который часто используется в современных устройствах — это датчик температуры. Даже в вашем компьютере есть сразу несколько датчиков температуры, с помощью которых система следит за перегревом ключевых компонентов — процессора, видеокарты, блока питания, и прочих узлов. Самый же популярный пример использования датчика температуры дома — термостат. Это устройство, которое постоянно следит за температурой воздуха, и регулирует подачу энергии в систему отопления. Смежный пример — котел для нагрева воды.
В нашем уроке мы используем датчик TMP35. Вместо него можно использовать любой другой похожий датчик: TMP35, TMP37, LM35, LM335 и подобные. Выглядит датчик как обычный транзистор:
Можно легко спутать, так что рекомендую всегда внимательно читать маркировку на таких устройствах (да и вообще сначала всегда читайте, потом подключайте :). Конкретно этот датчик имеет следующие характеристики:
Подключение
Датчик TMP35 имеет три вывода (три ноги). Если посмотреть на датчик со стороны этих выводов и срезом вверх, как показано на рисунке,
то слева будет — положительный контакт питания (+2.7 — 5.5В),
по центру — выход на контроллер,
и справа — отрицательный контакт питания (земля).
Датчик аналоговый, а значит на его выходе мы имеем не 0 или 1, а напряжение в диапазоне от 0 до 5 вольт. Следовательно, мы должны вспомнить раздел про аналого-цифровое преобразование (АЦП) сигналов в Arduino. Держа в уме, что у Ардуино Уно есть шесть аналоговых входов (A0-A5), подключаем наш датчик по следующей схеме:
Внешний вид макета
Принципиальная схема
Вот так должна выглядеть собранная схема.
Программа
Подключив датчик температуры к Ардуино, начинаем писать программу. Первое что мы сделаем, это выведем необработанный сигнал с аналогового входа в последовательный порт, для того чтобы просто понять, как меняется значение на входе A0. Нам понадобится простая программа:
Внимание, математика! В программе можно заметить выражение:
Оно необходимо для того, чтобы преобразовать аналоговый сигнал датчика в градусы Цельсия. Дело тут вот в чем. Все аналоговые датчики имеют важную характеристику — отношение количества вольт к единице измеряемой величины. Например, в спецификации к нашему датчику tmp35 написано, что каждый градус измеряемой температуры, соответствует 10 милливольтам напряжения на выходе. Исходя из этих рассуждений, прочитанное с помощью analogRead значение мы сначала преобразуем к количеству Вольт:
Такая процедура называется нормировкой. Здесь 1023 — максимальное значение, которое может вернуть нам 10-битный АЦП, встроенный в Ардуино Уно.
5 — рабочее напряжение АЦП.
Затем преобразуем эти вольты в градусы Цельсия:
Превращаем вольты в милливольты (*1000), и делим на 10 ( то самое число из спецификации! ).
В общем, даже если ничего не понятно, загружаем программу на Ардуино и наблюдаем за температурой окружающего воздуха. Например, у нас в лаборатории датчик оценил температуру следующим образом:
Работает! Датчик незамедлительно регистрирует снижение температуры.
Делаем термостат
Теперь добавим в программу некое действие, которое будет совершаться если температура упадет ниже заданного нами порога. Пусть этот порог будет равен 15°C. Самое простое, что мы можем сделать — это зажигать на Ардуино штатный светодиод #13. Получается такая вот программа:
Кто-то забыл закрыть окно — температура резко опустилась ниже 15 — светодиод зажигается. Закрываем окно, активно дышим — светодиод гаснет. А теперь представьте, что вы зажигаете не светодиод, а подаете сигнал на реле, которое включает обогреватель в комнате. Получается готовый термостат!
Немного изменив программу можно отслеживать не понижение, а превышение заданного уровня. Например, удобно будет следить за температурой внутри, скажем, серверной, и при увеличении температуры до 40 градусов, включать вытяжку!
К размышлению
В современных устройствах всё чаще применяют цифровые датчики температуры, например, известный в среде DIY датчик DS18B20. Он легко подключается к Ардуино с помощью только одного сигнального провода — one wire. Модуль с таким датчиком есть и у RobotClass:
О том как его подключать и использовать в своих проектах узнаем на уроке про DS18B20.
В предыдущем уроке мы рассмотрели подключения датчика температуры и влажности DHT11 к Arduino. И выяснили что данный датчик не очень точный. Чем же его можно заменить? Одним из распространенных датчиков для измерения температуры являться DS18B20. Рассмотрим в данном уроке варианты подключения датчика, пару примеров программного решения.
Характеристики датчика DS18B20:
Датчик выпускается в открытом корпусе в виде транзистора для измерения температуры воздуха.
Можно купить датчик в виде модуля DS18B20. Распаренный на плате.
Также датчик DS18B20 продеться в закрытом корпусе для измерения температуры жидкости.
Для урока нам понадобиться:
Подключаем датчик DS18B20 к Arduino NANO вот по такой схеме.
Подключение датчика DS18B20 к Arduino UNO будет вот таким.
Для написания программы нам понадобиться библиотека OneWire.
Данную библиотеку можно установить из менеджера библиотек или скачать отсюда.
Код ниже будет выводить показание температуры в монитор порта каждую секунду.
Но данный пример достаточно сложный для понимания. Для упрощения работы с датчиком лучше использовать библиотеку DallasTemperature. Данная библиотека ставиться поверх OneWire. Т.е. для ее роботы должна быть установлена библиотека OneWire.
С библиотекой DallasTemperature устанавливаются примеры. Вы можете воспользоваться любым из них.
Мы рассмотрим более простотой пример.
В данном примере температура выводиться 1 раз в секунду. И при этом выводится температура в Цельсиях и фарингитах.
Как видите данный пример намного меньше и более понятен для новичка.
На одну шину можно подключить до 127 датчиков вот по такой схеме.
С библиотекой DallasTemperature идут примеры которые позволяют получать данные с датчиков при током подключении.
Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.
Спасибо за внимание!
Понравилась статья? Поделитесь ею с друзьями: