Оглавление:

Термометр для регистрации DIY с 2 датчиками: 3 шага (с изображениями)
Термометр для регистрации DIY с 2 датчиками: 3 шага (с изображениями)

Видео: Термометр для регистрации DIY с 2 датчиками: 3 шага (с изображениями)

Видео: Термометр для регистрации DIY с 2 датчиками: 3 шага (с изображениями)
Видео: Wi-Fi термометр на 2 датчика ds18b20 ESP8266 и blynk 2024, Ноябрь
Anonim
Термометр для регистрации DIY с 2 датчиками
Термометр для регистрации DIY с 2 датчиками
Термометр для регистрации DIY с 2 датчиками
Термометр для регистрации DIY с 2 датчиками

Этот проект является усовершенствованием моего предыдущего проекта «DIY Logging Thermometer». Он записывает измерения температуры на карту памяти micro SD.

Изменения оборудования

Я добавил датчик температуры DS18B20 к модулю часов реального времени, где на печатной плате есть место для этого устройства; и добавил соответствующий провод от контакта "DS" RTC к D2 Arduino.

Изменения программного обеспечения

Затем я добавил и изменил программное обеспечение. Основные изменения:

На ЖК-дисплее отображаются две температуры «In» и «Out».

Файлы журнала, записанные на SD-карту, имеют два температурных поля: «Температура на входе» и «Температура на выходе».

Из-за более длительной записи на SD-карту рабочие буферы для EEPROM были больше, и в результате у меня начались проблемы с конфликтами памяти. Я внес ряд изменений, направленных на сокращение использования динамической памяти, включая использование символьных массивов для всех строк вместо объекта String.

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

Согласно проведенным мною тестам идентификация датчиков температуры и реакция на извлечение и замену SD-карты по-прежнему работают без сбоев.

Шаг 1. Разработка программного обеспечения

Этот шаг дает вам полную версию программного обеспечения для завершенного проекта. Я скомпилировал его с помощью Arduino IDE 1.6.12. Он использует 21 400 байт памяти программ (69%) и 1 278 байт динамической памяти (62%).

Я добавил комментарии в код в надежде, что они прояснят, что происходит.

Шаг 2: Работа с двумя датчиками температуры - подробности

Это программное обеспечение использует библиотеку «OneWire». Он не использует никаких библиотек "DallasTempera" или подобных. Вместо этого команды и данные от датчиков температуры выполняются с помощью эскиза, и их можно довольно легко увидеть и понять. Я нашел полезный список команд библиотеки OneWire на

www.pjrc.com/teensy/td_libs_OneWire.html

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

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

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

Я хотел, чтобы программа автоматически определяла датчики и правильно распределяла их по входам и выходам. Это достаточно просто сделать, поместив их на отдельные контакты Arduino. В этом проекте все A0 – A3 и A6 и A7 не используются, поэтому в данном случае можно было бы использовать один из них. Однако мне удалось настроить автоматическую идентификацию с датчиками на одной шине OneWire.

Это работает вот так.

В библиотеке OneWire есть команда «OneWireObject.search (адрес)», где «адрес» - это массив из 8 байтов, а «OneWireObject» - это имя экземпляра объекта OneWire, который был ранее создан. Он может иметь любое имя. Мой называется «ds». Когда вы вводите эту команду «поиска», библиотека OneWire выполняет некоторую сигнализацию по однопроводной шине. Если он находит отвечающий датчик, он возвращает логическое значение «ИСТИНА» и заполняет массив «адресов» 8-байтовым уникальным идентификатором датчика. Этот идентификатор включает в себя семейный код (в начале) и контрольную сумму (в конце). Между ними находятся 6 байтов, которые однозначно идентифицируют датчик в его семействе.

Один результат (адрес и возврат ИСТИНА) получается каждый раз, когда дается эта команда, циклически проходя через все устройства на шине OneWire. После того, как каждое устройство ответило, в следующий раз, когда будет запущен «поиск», будет возвращено «ЛОЖЬ», что означает, что каждое устройство на шине уже ответило. Если "поиск" выдается снова, первое устройство снова отвечает - и так до бесконечности. Устройства всегда отвечают в одном и том же порядке. Порядок ответов основан на идентификаторах устройств на шине OneWire. Это похоже на двоичный поиск, начинающийся с младших бит идентификаторов устройств. Протокол, используемый для поиска этих идентификаторов, довольно сложен и описан на страницах 51–54 документа «Книга стандартов iButton», который представляет собой документ в формате pdf по адресу https://pdfserv.maximintegrated.com/en/an/AN937.pd …

Я протестировал этот процесс поиска с помощью от 1 до 11 датчиков на одной шине и обнаружил, что порядок ответа для данного набора устройств всегда был одинаковым, но когда я добавил новое устройство в конец шины, не было никакой возможности Я мог предсказать, где в порядке поиска он появится. Например, 11-й датчик, который я добавил, занял позицию № 5; и первый датчик, который я поставил в автобус, всегда был последним в порядке поиска.

В этом проекте с двумя датчиками один из них припаян к модулю RTC; другой подключается с помощью штыревого разъема на плате и штепсельного разъема на кабеле. Его легко отсоединить.

Когда датчик на кабеле (датчик «out») отсоединен, команда «search» выдает поочередно возвращаемое значение «TRUE» и «FALSE».

Когда датчик на кабеле подсоединен, команда «поиск» производит трехэтапный цикл с двумя возвращаемыми значениями «ИСТИНА» и одним «ЛОЖЬ».

Моя процедура состоит в том, чтобы дать 1, 2 или 3 команды "поиска", пока не будет возвращен ЛОЖНЫЙ результат. Затем я выдаю еще 2 команды "поиска". Если второй выходит из строя (то есть ЛОЖЬ), я знаю, что на шине только один датчик, и это датчик «на входе». Идентификационные данные устройства записываются и присваиваются «входящему» датчику.

Позже, если и первый, и второй возврат будут ИСТИНА, я знаю, что на шине есть два датчика. Я проверяю, какой из них идентичен датчику «вход», а другой назначаю датчику «выхода».

Другой второстепенный момент заключается в том, что сбор результатов от двух датчиков осуществляется путем отправки «начать преобразование» так называемой командой «пропустить ПЗУ». У нас есть возможность отправлять команды одному устройству (используя его уникальный идентификатор) или всем устройствам на шине (пропустить ПЗУ). Код выглядит так:

ds.reset (); //

// отправляем команду «пропустить ПЗУ» (чтобы следующая команда работала на обоих датчиках) ds.write (0xCC); // Пропустить команду ПЗУ ds.write (0x44, 0); // запускаем преобразование в обоих датчиках temperature_state = wait_convert; // переходим в состояние задержки

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

if (flag2) {

присутствует = ds.reset (); ds.select (DS18B20_addr_out); ds.write (0xBE); // Считываем из блокнота "исходящие" данные зонда [0] = ds.read (); данные [1] = ds.read (); temperature_out = (данные [1] << 8) + данные [0]; температура_выход = (6 * выход_температуры) + выход_температуры / 4; // умножаем на 6,25} else {// не flag2 - т.е. датчик Out не подключен temperature_out = 30000; // исправляем при 300,00 C, если датчик температуры не работает} // конец if (flag2)

Я разработал большую часть этого программного обеспечения в виде отдельного эскиза, в котором были только датчики температуры, без осложнений, связанных с поддержкой ЖК-дисплея, RTC и SD-карты. Этот эскиз разработки находится в файле ниже.

Шаг 3: предварительные результаты

Предварительные результаты
Предварительные результаты

Этот график представляет собой комбинацию первых двух неполных дней чтений.

Рекомендуемые: