Ардуино скетч с датчиком температуры

Arduino и термометр DS18B20

Описание

DS18B20 – высокоточный цифровой датчик температуры. Основные характеристики:

  • Диапазон: -55.. 125 °C
  • Точность: 0.5 °C
  • Разрешение: 9.. 12 бит (0.48.. 0.06 °C)
  • Питание: 3-5.5V
  • Период выдачи результата:
    • 750 мс при точности 12 бит
    • 94 мс при точности 9 бит
  • Интерфейс связи: 1-Wire (OneWire)
  • Корпус: TO-92, SOIC-8 или герметичное исполнение

В наборе идёт датчик в герметичном исполнении со стандартным гнездом (шаг 2.54 мм) для подключения

Подключение

Датчик имеет следующие назначения пинов:

Датчик подключается к любому цифровому пину Arduino, но пин должен быть подтянут к питанию резистором 4.7 кОм. На один пин можно подключить несколько датчиков DS18B20.

В рамках набора GyverKIT резистор на 4.7 кОм можно заменить двумя резисторами на 10 кОм (есть в комплекте), подключенными параллельно:

Библиотеки

Для этого датчика есть несколько библиотек:

  • “Официальная” библиотека DallasTemperature.h, для работы которой также понадобится библиотека OneWire.h.
  • Наша библиотека microDS18B20

В примерах на этом сайте мы будем использовать microDS18B20, так как она в несколько раз легче и проще в использовании, чем официальная. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию microDS18B20. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

Работа с microDS18B20

Без адресации

В этом режиме на один пин МК подключается один датчик, для работы с ним не требуется предварительного чтения адреса и записи его в программу. Можно подключить несколько датчиков, каждому указать свой пин, см. пример one_pin_one_sensor.

С адресацией

В этом режиме можно подключить сколько угодно датчиков на один пин МК, но для работы с ними понадобится занести в программу уникальные адреса датчиков. В момент чтения адреса к пину должен быть подключен только один датчик! Пример – address_read. Для дальнейшей работы адреса хранятся в массивах на стороне программы и передаются датчикам при инициализации, пин указывается один и тот же:

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

Чтение температуры

Чтение температуры делится на два этапа – запрос и получение данных. Запрос делается функцией requestTemp() . После получения запроса датчик начинает измерение температуры, которое длится от 90 до 750 мс в зависимости от настроенной точности (по умолчанию точность максимальная, преобразование длится 750 мс). Если прочитать температуру до окончания преобразования – датчик вернёт результат предыдущего измерения, поэтому в примерах используется задержка или опрос по таймеру на 1 секунду. Получить температуру можно при помощи getTemp() [float] или getTempInt() [int]. Если принятые данные повреждены или датчик отсутствует на линии – функция вернёт предыдущее успешно прочитанное значение температуры.

Примечание: при повторных вызовах getTemp() не запрашивает с датчика новую температуру (долгое выполнение функции), вместо этого она просто возвращает предыдущий результат до тех пор, пока не будет сделан новый запрос requestTemp().

В версии библиотеки 3.5 появилась возможность отдельно запросить температуру и определить корректность полученных данных, чтобы только после этого их прочитать и применить в программе – функция readTemp() . Также это позволяет определить состояние подключения и всё ли в порядке с датчиком. Для чтения температуры рекомендуется использовать конструкцию вида:

где readTemp() запрашивает данные с датчика и возвращает true , если они прочитаны корректно. После этого можно забрать текущую температуру из getTemp() , которая уже не запрашивает температуру с датчика, а отдаёт прочитанный в readTemp() результат.

Примеры

Библиотека позволяет работать по схеме “один датчик – один пин”, в которой адрес датчика получать не нужно. Достаточно подключить и использовать:

Источник

Вывод с DS18B20 на LCD дисплей

Задача

  • Вывести показания с датчика температуры DS18B20 на LCD дисплей 1602
  • Усложнить задачу, вывести изменение температуры с момента перезагрузки
  • Вывести температуру с двух датчиков и разницу между ними

Базовые уроки

Подключение

  • Дисплей подключается к питанию и шине I2C
  • Датчик подключается на любой цифровой пин
    • Можно подключить несколько датчиков на один пин

Библиотеки

Программа 1

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

Программа 2

Теперь будем выводить такую строку: “температура с момента запуска программы” -> “текущая температура”. Может быть полезным для исследования изменения температуры. Нам нужно завести переменную для хранения первого значения, назовём её prevT . При запуске программы запросим температуру с датчика, подождём, запишем результат в переменную и будем выводить на дисплей как в предыдущем примере:

Также можно вывести время, прошедшее с момента запуска программы, например в формате часы:секунды.

  • У нас есть функция millis() , которая возвращает время работы программы в миллисекундах.
  • millis() / 1000 даст нам секунды, запишем в переменную sec .
  • Чтобы получить количество секунд в пределах одной минуты, разделим секунды на 60: sec / 60
  • Чтобы получить количество минут из общего количества секунд – нужно выполнить операцию остаток от деления, опять же на 60: sec % 60
  • Чтобы выводить значения с ведущим нулём (например 03 вместо 3), сделаем простое условие: if (минуты
  • Обернём вывод времени в функцию для лучшей читаемости кода

Программа 3

Следующая задача – опросить два термометра и вывести их текущие показания и разность.

  • Для начала прошьём пример address_read из библиотеки microDS18B20
  • Поочерёдно подключим два датчика, увидим их адреса и скопируем в блокнот

Далее аналогично примеру one_pin_many_sensors записываем полученные адреса в массивы и создаём два датчика. Дальнейшая работа ведётся с двумя датчиками:

Домашнее задание

  • Избавиться от delay() , использовать асинхронную конструкцию с millis()
  • Выводить на дисплей сообщение, если температура выше заданного “порога”
  • Подключить два датчика без адресации (на разные пины)

Полезный пример?

25 Комментариев

Простой проект. Более того, мой первый. Чуть не наложил себе в руки из-за того что сделал всё чётко по инструкции, но на экране ничего не отображалось. Не буду описывать свои ухищрения, дело оказалось в настроечной крутилке позади экрана. Подкрутил и всё высветилось.

Именно поэтому в самом начале статьи дана ссылка на базовый урок по дисплею

Да мне ж быстрее-быстрее начать хотелось)

б….. Ты мой герой. Чуть не прослезился. Спасибо родной.

Мужики, значиться так. С Библиотекой microDS18B20 не хочет работать. Показывает температуру 0 градусов. С onewire (примеры) все хорошо. Причем месяц назад собирал, все работало. Подскажите, где косячу. Единственное что поменялось из условий – ядро и другой пк. Поставил gyvercor. Гугл говорит ставь резистор если 0, понятное дело ставил. Мультиметром тыкался все ок, напруга наваливает, все проходит и все контачит. Библа не отрабатывает.

попробуй на стандартном ядре, вдруг гуверкор слишком быстрый. Микродс18б20 актуальной версии работает отлично, даже на есп8266

microDS18B20 не работает на GyverCore!

починили, нужно обновить ядро и библу

плохой контакт с подтягивающим резистором (у меня тоже такое было)

на уно не работает пробовал перезагружать

поэтому паять надо

Алекс, почему в 1 примере 2 значения?

потому что первое запрос температуры а второе получение

Спасибо за подробный урок! Все сработало вместе с деталями из GyverKit PRO. Единственное, было бы классно для совсем новичков поизучать основы электрических законов. Что такое эти подтягивающие резисторы, почему они располагаются в схеме. Может быть добавлять в уроки принципиальную схему? Или ссылку на какой-то пакет с симуляцией электро деталей?

базовые уроки по электронике будут. А резисторы – требование из документации к датчику =)

Не понимаю в чём проблема. Упираюсь в это..

Скетч использует 5978 байт (19%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 272 байт (13%) динамической памяти, оставляя 1776 байт для локальных переменных. Максимум: 2048 байт.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xad
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xad
Problem uploading to board. See https://support.arduino.cc/hc/en-us/sections/360003198300 for suggestions.
Неверная библиотека найдена в D:\Arduino\libraries\firmware: нет заголовочных файлов (.h), найденных в D:\Arduino\libraries\firmware
Неверная библиотека найдена в D:\Arduino\libraries\libraries: нет заголовочных файлов (.h), найденных в D:\Arduino\libraries\libraries
Неверная библиотека найдена в D:\Arduino\libraries\schemes: нет заголовочных файлов (.h), найденных в D:\Arduino\libraries\schemes
Неверная библиотека найдена в C:\Users\holod\OneDrive\Документы\Arduino\libraries\firmware: нет заголовочных файлов (.h), найденных в C:\Users\holod\OneDrive\Документы\Arduino\libraries\firmware
Неверная библиотека найдена в C:\Users\holod\OneDrive\Документы\Arduino\libraries\libraries: нет заголовочных файлов (.h), найденных в C:\Users\holod\OneDrive\Документы\Arduino\libraries\libraries
Неверная библиотека найдена в C:\Users\holod\OneDrive\Документы\Arduino\libraries\schemes: нет заголовочных файлов (.h), найденных в C:\Users\holod\OneDrive\Документы\Arduino\libraries\schemes

библиотеку переустанови и проверь точка запятые поставлены везде

У меня такая штука была, при чём на одних картинках было нормально, на других сбой синхронизации (так вроде это называется, где-то нагуглил). Помогло заменой загрузчика на “Old Bootloader”

Alex помоги прикрутить датчик без i2c. СПАСИБО.

Как к этому скетчу прикрутить HC-SR04 чтоб работали в паре

В примере 1 и 2 выводит температуру 2.00 вместо 20.00 или 24.00 в чем проблема?

Разобрался сам, надо использовать библиотеку вместо

Источник

Ардуино: датчик температуры LM35

Еще один полезный прибор, который часто используется в современных устройствах — это датчик температуры. Даже в вашем компьютере есть сразу несколько датчиков температуры, с помощью которых система следит за перегревом ключевых компонентов — процессора, видеокарты, блока питания, и прочих узлов. Самый же популярный пример использования датчика температуры дома — термостат. Это устройство, которое постоянно следит за температурой воздуха, и регулирует подачу энергии в систему отопления. Смежный пример — котел для нагрева воды.

В нашем уроке мы используем датчик TMP35. Вместо него можно использовать любой другой похожий датчик: TMP35, TMP37, LM35, LM335 и подобные. Выглядит датчик как обычный транзистор:

Можно легко спутать, так что рекомендую всегда внимательно читать маркировку на таких устройствах (да и вообще сначала всегда читайте, потом подключайте :). Конкретно этот датчик имеет следующие характеристики:

  • напряжение питания: от 2,7 до 5,5 В;
  • погрешность: 2 градуса;
  • измеряемая температура: от 10°C до 125°C
  • потребляемый ток: 50 мкА.

Подключение

Датчик TMP35 имеет три вывода (три ноги). Если посмотреть на датчик со стороны этих выводов и срезом вверх, как показано на рисунке,

то слева будет — положительный контакт питания (+2.7 — 5.5В),
по центру — выход на контроллер,
и справа — отрицательный контакт питания (земля).

Датчик аналоговый, а значит на его выходе мы имеем не 0 или 1, а напряжение в диапазоне от 0 до 5 вольт. Следовательно, мы должны вспомнить раздел про аналого-цифровое преобразование (АЦП) сигналов в Arduino. Держа в уме, что у Ардуино Уно есть шесть аналоговых входов (A0-A5), подключаем наш датчик по следующей схеме:

Внешний вид макета

Принципиальная схема

Вот так должна выглядеть собранная схема.

Программа

Подключив датчик температуры к Ардуино, начинаем писать программу. Первое что мы сделаем, это выведем необработанный сигнал с аналогового входа в последовательный порт, для того чтобы просто понять, как меняется значение на входе A0. Нам понадобится простая программа:

Внимание, математика! В программе можно заметить выражение:

Оно необходимо для того, чтобы преобразовать аналоговый сигнал датчика в градусы Цельсия. Дело тут вот в чем. Все аналоговые датчики имеют важную характеристику — отношение количества вольт к единице измеряемой величины. Например, в спецификации к нашему датчику tmp35 написано, что каждый градус измеряемой температуры, соответствует 10 милливольтам напряжения на выходе. Исходя из этих рассуждений, прочитанное с помощью analogRead значение мы сначала преобразуем к количеству Вольт:

Такая процедура называется нормировкой. Здесь 1023 — максимальное значение, которое может вернуть нам 10-битный АЦП, встроенный в Ардуино Уно.
5 — рабочее напряжение АЦП.

Затем преобразуем эти вольты в градусы Цельсия:

Превращаем вольты в милливольты (*1000), и делим на 10 ( то самое число из спецификации! ).

В общем, даже если ничего не понятно, загружаем программу на Ардуино и наблюдаем за температурой окружающего воздуха. Например, у нас в лаборатории датчик оценил температуру следующим образом:

Вполне себе правдивое значение. А теперь поднесем прибор к открытому окну (на улице зима -10°C):

Работает! Датчик незамедлительно регистрирует снижение температуры.

Делаем термостат

Теперь добавим в программу некое действие, которое будет совершаться если температура упадет ниже заданного нами порога. Пусть этот порог будет равен 15°C. Самое простое, что мы можем сделать — это зажигать на Ардуино штатный светодиод #13. Получается такая вот программа:

Кто-то забыл закрыть окно — температура резко опустилась ниже 15 — светодиод зажигается. Закрываем окно, активно дышим — светодиод гаснет. А теперь представьте, что вы зажигаете не светодиод, а подаете сигнал на реле, которое включает обогреватель в комнате. Получается готовый термостат!

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

К размышлению

В современных устройствах всё чаще применяют цифровые датчики температуры, например, известный в среде DIY датчик DS18B20. Он легко подключается к Ардуино с помощью только одного сигнального провода — one wire. Модуль с таким датчиком есть и у RobotClass:

О том как его подключать и использовать в своих проектах узнаем на уроке про DS18B20.

Источник

Adblock
detector