Датчик температуры для arduino

Здесь мы просто рассматриваем идею устройства и будем собирать его только на макетной плате. Для подключения платы Arduino Mega подключите радиочастотный модуль и ЖК-дисплей в соответствии с обозначением на схеме. Сначала данные считываются в переменную в виде целых чисел, затем целые числа преобразуются в массив символов, после чего они соединяются друг с другом. На приемной стороне данные будут разделены на отдельные символы.

Делая это, я ограничиваюсь двумя цифрами градусов. Но, как мы все помним из школы, чем нагляднее эксперимент, тем он интереснее. Я продолжу развивать проект из предыдущих серий, и сегодня мы присоединим зонд 1-Wire для мониторинга температуры вашего многострадального холодильника. <Очень скоро у вас может появиться умный холодильник. В предыдущих сериях Поскольку я продолжаю повествование с какого-то момента, а не с начала, я расскажу о том, что у меня уже есть.

Прошивка позволяет мигать светодиодом L на плате в разных последовательностях в зависимости от "аварийного" или "нормального" состояния, а также "плеваться" грязными ругательствами в консоль, ведь именно это вы и выбрали, верно? Последовательность может быть изменена с консоли. Исходный код проекта можно найти на GitHub.

Вдохновляющая новизна Идея прикрутить датчик температуры пришла мне в голову еще до того, как я начал этот проект. Концепция последовательности - то есть то, что вы делаете, последовательно, не пытаясь опередить себя - требовала времени, и я не особо задумывался о деталях.

Но время пришло. Так в чем же была проблема? Проблема вот в чем: можно было взять обычный резистивный термистор и использовать встроенный АЦП микропроцессора. Я начал этот проект, руководствуясь правилом: минимум паяльника и дополнительного нестандартного оборудования, все из коробки. С резистивным датчиком температуры, с другой стороны, необходимо собрать делитель напряжения, что означает минимальное, но погружение в схему.

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

Так что этот вариант отпадает. Остается второй вариант - цифровой датчик температуры. Однако и здесь возникает проблема. Цифровой датчик температуры подключается по 1-Wire, а такого интерфейса на плате нет. Но есть возможность сделать программную эмуляцию этого интерфейса с минимальными усилиями. Дополнительный бонус такого решения - на одну проводную линию можно посадить целый парник температурных датчиков, в отличие от резистивного датчика температуры, естественно, рекомендуется ознакомиться с матрицей, так как есть ограничения на длину линии, общее сопротивление и так далее.

Немного о самом 1-Wire 1-Wire - это так называемый однопроводной интерфейс. Он примечателен тем, что для связи с устройствами по этому интерфейсу требуется только один сигнальный провод и один провод заземления. Еще более примечательно то, что устройства разработаны таким образом, что они используют один и тот же сигнальный провод для "питания" устройств, то есть один и тот же сигнальный провод используется для питания устройств, и этот режим называется "паразитным питанием".

Для реализации такого типа питания в устройствах используется достаточно большой конденсатор. Для того чтобы начать сеанс обмена данными, необходимо сгенерировать сигнал "сброса". Для этого ведущий посылает 0 на линию данных в течение не менее мкс. Затем ведущий освобождает линию данных и начинает прослушивать линию. Благодаря подтягивающему резистору линия данных будет установлена в 1. Если на линии присутствует сенсорное устройство, оно посылает ведущему подтверждение сброса, для чего удерживает линию данных в 0 в течение времени 60 мкс.

После считывания состояния линии ведущий узнает, что на шине присутствуют устройства, готовые к обмену. Другие статьи в выпуске: Хакер Подписка 1-Wire имеет еще одну особенность: Биты передаются не по уровням сигналов, а по временным задержкам. Так, для передачи 1 необходимо установить линию в 0 и удерживать его в течение 15 мкс, а затем отпустить линию, которая, благодаря подтягивающему резистору, перейдет на уровень 1.

Для передачи 0 необходимо установить линию в 0 на 15 мкс, а затем удерживать 0 на линии еще 60 мкс. Передача данных по 1-Wire Предложенная реализация 1-Wire имеет один недостаток.

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

Что такое дискретизация? Допустим, бит 1 передается за 6 мкс. Чтобы быть уверенным, что это именно 1, а не какие-то наводки, нужно несколько раз за эти 6 мкс измерить состояние входного сигнала. Чем больше измерений вы проведете, тем точнее будет результат и уверенность в том, что данные верны. Однако 6 мкс - это очень мало, и здесь возникает вопрос разумности и возможностей аппаратного обеспечения.

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

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

С учетом оптимизации и других накладных расходов на SI, сделать это практически нереально. Единственный выход - использовать аппаратную микросхему 1-Wire интерфейса, которую можно подключить, например, через SPI интерфейс. Если вы загуглите, я вас сразу предупрежу: Подавляющее большинство примеров использования температурных датчиков с Arduino основаны на DS18B. Он немного отличается, но в нашем проекте разницы нет.

Для знакомства с термометром по 1-Wire нужно сделать как минимум три вещи: начать измерение; подождать время, необходимое АЦП термометра для получения показаний; и считать показания из памяти термометра. Как и в обычных АЦП, чем выше точность, тем больше времени требуется для проведения измерения, тем больше задержка перед попыткой считывания показаний.

Термосенсор имеет два режима работы: непрерывное питание или паразитное питание. Я буду использовать режим паразитного питания. В этом режиме термодатчик питается через подтягивающий резистор 4,7 кОм на линии 1-Wire, когда линия "свободна" или передается высокий уровень.

В этом режиме термодатчик питается через подтягивающий резистор 4,7 кОм на линии 1-Wire.

Вот вторая часть, которую вам нужно найти - резистор 4,7 кОм. Если вы не разбираетесь в этом, попросите хорошего друга припаять проводки за вас, в этом нет ничего страшного :) Читайте также: Создание датчика движения на ардуино с микроконтроллером Схема подключения датчика температурыФото подключения датчика температуры. Теперь, когда вы более или менее разобрались с подключением, давайте перейдем ко второй части нашего захватывающего триллера.

Нам нужно было написать программное обеспечение. Я, как и большинство программистов, существо ленивое, поэтому я спросил у всезнающего Google, что уже было придумано раньше и нужно ли изобретать колесо. Самое толковое, что я нашел, - это библиотека OneWire, рекомендованная ардуинцами. Также полезна работа еще одного товарища из сообщества Arduino - библиотека, реализующая протокол для связи с датчиком температуры. Вы можете просто взять все это и собрать в простой скетч, а затем загрузить его в микроконтроллер и на этом закончить.

Но помните ли вы о холодильнике? Итак, мы собираемся подключить это добро к нашему проекту. Я начал с простого: я хотя бы заставил библиотеки работать вместе. Обе библиотеки используют функции arduino, поэтому мне пришлось внести некоторые изменения. А именно: OneWire построен таким образом, что когда вы создаете экземпляр объекта, ему скармливается номер ноги, на которой будет проходить линия 1-Wire. Это навевает немного мрака из недр библиотек Arduino, поэтому я пошел простым путем и жестко закодировал нужные ножки в конструкторе класса OneWire.

Конечно, мы теряем в количестве ножек.

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

Это означает, что разумно немного разбавить включение прерываний, чтобы случайно не потерять контекст выполнения на неопределенное время. Именно здесь имеет смысл использовать вызов функции ОС, особенно учитывая размер этих задержек. Как убедиться, что это работает?

Элементарно: создать экземпляр класса OneWire, затем DallasTemperature с параметром шины, к которой подключены датчики температуры, и начать активно использовать все это. В проекте уже есть простой терминал, добавляем команду, которая будет опрашивать датчик температуры и выводить значение в терминал. Для удобства я добавил еще одну команду - поиск датчика температуры. С помощью этой команды опрашивается линия, отвечающие датчики температуры помещаются в "кэш" библиотеки, после чего можно получить адреса найденных датчиков температуры и отобразить их в терминале.

Поиск устройств на линии - увлекательный процесс, подробно описанный в документации iButton, в разделе Network Capabilities. Первый запуск Помещение в отдельный поток Теперь вы убедились, что библиотека работает и что датчик температуры что-то измеряет, в данном случае температуру в помещении. Теперь давайте подключим все это к нашей системе сигнализации. Для этого нам нужно создать отдельный поток, в котором датчик температуры будет периодически опрашиваться, и в случае тревоги будет отправлено сообщение.

Подумав немного, я решил, что лучше сделать целый класс - движок для работы с датчиками температуры, унаследовав его от класса process, чтобы собрать все в одном месте: сделать реализацию функции-потока, дать этой функции доступ к членам класса, выставить основные функции для работы с датчиками температуры. Однако здесь я наткнулся на жадность. Я хотел оставить возможность опрашивать температурные датчики из консоли и иметь сигнал тревоги.

Сразу же возникает необходимость разделить общие ресурсы, поскольку теперь два потока будут тянуть один и тот же температурный датчик, а точнее, шину 1-Wire. Вот тут-то и становится интересно. У нас есть мьютекс, но использовать его внутри класса нецелесообразно, потому что библиотека операций с датчиком температуры написана очень сильно интегрированным способом и на лету вытягивает функции побайтно, а не пакетно по 1-Wire.

.

Для локализации массовых вызовов я создал два метода: open и close для шины 1-Wire. Реализация функции потока чтения данных с датчика температуры очень проста.

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


Навигация

thoughts on “Датчик температуры для arduino

  1. Охотно принимаю. Вопрос интересен, я тоже приму участие в обсуждении. Я знаю, что вместе мы сможем прийти к правильному ответу.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *