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

Разрешите представить - цифровой датчик температуры буржуинской фирмы "Dallas semiconductor" DS18B20.

ds1

 Полностью функциональное устройство для точного (до нескольких знаков после запятой) измерения температуры в диапазоне от -55 до +120 градусов Цельсия. Кроме того - имеется даже немного "мозгов" (ячеек памяти) для запоминания чего-нибудь полезного. Но пока что мы ими пользоваться не будем. Как видно на рисунке - выпускается в нескольких вариациях. Самая распространенная и для нас удобная - та, где написано "ТО-92".

Датчик имеет всего 3 вывода, на два из которых подается напряжение питания 5в, а средний вывод - для передачи данных. Все управление датчиком (подача на него команд, считывание измеренной температуры) идет по единственному проводнику, поэтому вся эта технология и протокол приема-передачи называется "1-Wire" или "One-Wire".

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

Каждый сеанс передачи или приема данных начинается с команды инициализации. Опять же не будем вдаваться в подробности общения Ардуины с термометром, за нас это сделали посторонние люди (мысленно скажем им спасибо). Просто передадим ей одну команду - "инициализация", и она сама разберется, что надо сделать.

 Далее, после инициализации,  начинаем подавать управляющие команды. Тут надо заметить, что на одном управляющем проводке, теоретически, может находиться несколько устройств семейства "1-Wire". Причем, не только датчики температуры. Поэтому, есть возможность обращаться к каждому из них по уникальному серийному номеру. Но, поскольку у нас на проводе единственный датчик, то ни к чему другому мы не можем обратиться в принципе. Поэтому эти прелюдии пропускаются командой (передаваемым байтом "0хСС"). Забыл сказать - здесь и далее используется шеснадцатиричная запись двоичных чисел (байтов).

После того, как определились с адресатом - передаем команду "измерить температуру" ("0х44"). После этого нужно оставить датчик в покое примерно на 1 секунду, пока он будет делать свои дела.

За это время "ds-ка" измерит температуру и запишет результаты в два байта, которые нам нужно у нее выудить и привести к человеческому виду. Начинаем, как всегда, с инициализации сеанса связи. Потом снова передаем команду "сброс передачи адреса" ("0хСС"). И тут же следом - сообщаем, что готовы принять результат измерения: ("0хВЕ").

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

Опять же, чтоб не сильно грузиться, определимся с тем, что для нас важно. А именно - в младшем и, частично, в старшем байте находится результат измерения температуры с точностью до 4-го знака после запятой (нам такая точность - излишня). Знак температуры ("+" или "-") определяется значением старшего бита старшего байта. 

Но, довольно слов - пора заняться конструированием. Схема подключения DS18B20 к Ардуине не только проста - а элементарно проста:

ds2

 

 Выводы питания датчика подключены к соответствующим выводам Ардуины, а вывод данных - к цифровому выходу "10". Кроме того, вывод данных подключен к шине +5 вольт через резистор 3 - 5 килоом (так называемый "подтягивающий" резистор). Заметьте, что цифровой выход "10", хотя он будет работать и на выход, и на вход, нам уже не придется настраивать, как в предыдущем примере со светодиодами. Разработчики библиотеки "1-Wire" заботливо освободили нас от всякой черновой работы. Спасибо им за это!

В-общем, у меня получилось, примерно, так:

ds3

 

Да! Совсем забыл! Библиотека "1-Wire" не входит в базовую поставку Arduino IDE, поэтому ее нужно скачать, например, отсюда. Распакуем архив и положим папку с библиотекой в директорию \libraries, которая находится в папке, где установлена Arduino IDE. При следующем запуске среды разработки - библиотека будет доступна для использования. Вот где ее можно найти:

ds4

 

Однако, не будем использовать скетч из "Образцов", там сильно всего наворочено. Лучше скопируем в Arduino IDE вот такой скетч:

#include <OneWire.h>

OneWire  ds(10);  //

void setup(void) {
  Serial.begin(9600);     //настраиваем последовательный порт для вывода результатов
}

void loop() {
  byte data[2];           // объявляем массив из 2-х байт
  ds.reset();             // инициализируем датчик
  ds.write(0xCC);         // пропускаем адресацию к конкретному датчику (у нас он один)
  ds.write(0x44);         // даем команду измерять температуру
  delay(1000);           // ждем 1 секунду, пока измеряется температура
 
  ds.reset();            // снова инициализируем датчик
  ds.write(0xCC);        // снова пропускаем адресацию
  ds.write(0xBE);         // даем команду готовности считывать температуру
  data[0] = ds.read();    //считываем  младший
  data[1] = ds.read();    // и старший байты
  int Temp = (data[1] << 8) + data[0];  // преобразуем считанную информацию
  Temp = Temp >> 4;                     // к нужному виду.
  Serial.println(Temp);                 // выводим результат в последовательный порт.

 
}

 Что мы тут видим... Сначала к скетчу подключается библиотека "OneWire". Указываем, что наш датчик подключен к выводу "10" Ардуины. Затем настраивается последовательный порт для вывода результатов измерения. Все, подготовительные операции закончены, начинаем измерять. Подготавливаем (резервируем и называем) 2 байта, куда будем записывать результат измерения температуры. Затем - подаем команды, как описывалось выше и, наконец, получаем 2 байта с нашей температурой. Затем происходит преобразование считанной информации и удаление лишних знаков после запятой с тем, чтобы получить целое значение температуры, без десятичных дробей. Эта информация и выводится через последовательный порт. Где мы можем ее увидеть? А вот здесь:

ds5

 

Итак, загружаем этот скетч в Ардуину, открываем "Монитор последовательного порта" и наблюдаем каждую секунду измеренную температуру:

ds6

 

Ура! Заработало! Не будем вдаваться в подробности процесс преобразования полученных от датчика 2-х байт в целое число температуры, это тема для отдельной большой статьи. Скажу только, что полученное число - переменная Temp типа integer. То есть, она может принимать как положительные значения, так и отрицательные. Проверим работу нашего устройства на морозце:

ds7

 

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

 

                                                                               Продолжение следует..

 

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