воскресенье, 5 июля 2015 г.

Адресная работа с несколькими датчиками температуры DS18B20 с выводом на графический дисплей - Contrlol Multiple 18b20 Arduino GLCD

Когда-то я уже отписывался о работе с тремя датчиками температуры от компании Dallas 18B20. Но на одном из форумов снова встретил обсуждение работы 10 датчиков. Так вот там утверждалось, что десять датчиков будут опрашиваться по секунде на каждого, те десять секунд на все. Меня это слегка смутило, не помню я такого, поэтому решил перепроверить все вживую. Тем более, что в прошлый раз я не доработал до ума код, тк те датчики не привязывались по адресам к объектам, а выбирались наугад, по очереди.
В общем поставил я 6 датчиков, хотел 9, но не нашел столько сходу. Так что пока только шесть. Но это не принципиально, код написал более менее универсальный, так что можно использовать под любое количество датчиков.
Для этого мне понадобилось:
  • Blockduino - 1 шт
  • CleClo-18B20 - 6 шт (1 - с резистором, 5 - без резистора)
  • PlugDIO (mama) - 1 шт
  • Blockproto2 с запаяным GLCD (в будущем PlugGLCD) - 1 шт
  • Провода стандарта GVS - 6 шт
Подключил последовательно датчики температуры в порт D10 (можно любой другой свободный). Самый первый (с конца ;) датчик должен быть с резистором, я слегка промазал, и у меня с резистором второй по счету, но ничего - и так работает.
Первым делом запустил код из предыдущего поста и убедился, что видит все датчики, и что скорость считывания гораздо выше чем утверждалось на форуме.
Затем немного модифицировал код - добавил вывод времени, чтобы увидеть и документально подтвердить скорость считывания и получил такой результат:
Dallas Temperature IC Control Library Demo
Locating devices...Found 6 devices.
Parasite power is: OFF
Device #0 - Address: 28140758030000E8 Resolution: 9
Device #1 - Address: 2882DB3C020000A1 Resolution: 9
Device #2 - Address: 2822E85803000002 Resolution: 9
Device #3 - Address: 288A2F6C060000FF Resolution: 9
Device #4 - Address: 2853265F030000AB Resolution: 9
Device #5 - Address: 28C7EC3C020000EA Resolution: 9
Requesting temperatures...#0 DONE: 0:00:01
Device Address: 28140758030000E8 Temp C: 22.50 Temp F: 72.50
Device Address: 2882DB3C020000A1 Temp C: 23.00 Temp F: 73.40
Device Address: 2822E85803000002 Temp C: 24.00 Temp F: 75.20
Device Address: 288A2F6C060000FF Temp C: 23.00 Temp F: 73.40
Device Address: 2853265F030000AB Temp C: 23.00 Temp F: 73.40
Device Address: 28C7EC3C020000EA Temp C: 22.50 Temp F: 72.50
Requesting temperatures...#1 DONE: 0:00:01
Device Address: 28140758030000E8 Temp C: 22.50 Temp F: 72.50
Device Address: 2882DB3C020000A1 Temp C: 23.00 Temp F: 73.40
Device Address: 2822E85803000002 Temp C: 24.00 Temp F: 75.20
Device Address: 288A2F6C060000FF Temp C: 23.00 Temp F: 73.40
Device Address: 2853265F030000AB Temp C: 23.00 Temp F: 73.40
Device Address: 28C7EC3C020000EA Temp C: 22.50 Temp F: 72.50
Requesting temperatures...#2 DONE: 0:00:02

...

Requesting temperatures...#99 DONE: 0:00:52
Device Address: 28140758030000E8 Temp C: 22.50 Temp F: 72.50
Device Address: 2882DB3C020000A1 Temp C: 22.50 Temp F: 72.50
Device Address: 2822E85803000002 Temp C: 23.50 Temp F: 74.30
Device Address: 288A2F6C060000FF Temp C: 22.50 Temp F: 72.50
Device Address: 2853265F030000AB Temp C: 22.50 Temp F: 72.50
Device Address: 28C7EC3C020000EA Temp C: 22.50 Temp F: 72.50
Requesting temperatures...#100 DONE: 0:00:53
Device Address: 28140758030000E8 Temp C: 22.50 Temp F: 72.50
Device Address: 2882DB3C020000A1 Temp C: 22.50 Temp F: 72.50
Device Address: 2822E85803000002 Temp C: 23.50 Temp F: 74.30
Device Address: 288A2F6C060000FF Temp C: 22.50 Temp F: 72.50
Device Address: 2853265F030000AB Temp C: 22.50 Temp F: 72.50
Device Address: 28C7EC3C020000EA Temp C: 22.50 Temp F: 72.50
Requesting temperatures...#101 DONE: 0:00:54
Т.е. как видно, что сто считываний температуры с шести датчиков были выполнены за 52 секунды. Это при: Resolution: 9, а при 11, тоже будет уже за 0:01:21, т.е. за 80 секунд.

Дальше, так как все уже собрано, решил вывести эти показания красиво на графический экран. Но, как и предполагал, столкнулся с проблемкой - датчики опрашиваются не последовательно по расположению, а в некотором зафиксированном, но случайном порядке. Ну в смысле, если я грею первый по счету датчик, а выводится он пятым в списке, второй - третьим, третий - шестым. Бардак вобщем.
Чтоб избавиться от такой проблемки нужно опрашивать датчики не по порядку, а по адресу датчика. Напомню: каждый датчик имеет свой уникальный адрес, который вшит в его чип.
А чтоб опрашивать по адресам, нужно их сначала считать и записать куда-нибудь.
Для этого я написал код, который выдает в Serial список адресов в удобном к использованию формате. Для этого нужно (после загрузки кода ессно) дотрагиваться в нужной Вам последовательности к датчикам и код выдает такой текст:

This sketch help find and print adresses of all 18B20 themperature sensors
Sensors should be connected to port: 10
Init
Found 6 sensors
Requiest temperatures...
22.69 oC
22.87 oC
23.50 oC
22.81 oC
22.62 oC
22.56 oC
Ready to locate adresses.
Touch sensors in sequinces to heat plus one degree

DeviceAddress myAddress[] = {
{0x28, 0x53, 0x26, 0x5F, 0x03, 0x00, 0x00, 0xAB},
{0x28, 0xC7, 0xEC, 0x3C, 0x02, 0x00, 0x00, 0xEA},
{0x28, 0x14, 0x07, 0x58, 0x03, 0x00, 0x00, 0xE8},
{0x28, 0x22, 0xE8, 0x58, 0x03, 0x00, 0x00, 0x02},
{0x28, 0x82, 0xDB, 0x3C, 0x02, 0x00, 0x00, 0xA1},
{0x28, 0x8A, 0x2F, 0x6C, 0x06, 0x00, 0x00, 0xFF}
};

DONE!!!
Остается только скопировать сформированный массив (все от слова 'degree' до слова 'DONE!!!') и вставить в Ваш код.
Вот код для поиска адресов и для вывода шести датчиков на графический дисплейчик.

Код

Поиск и вывод адресов


Вывод шести датчиков температуры поадресно на графический экран


Фото

Датчик температуры 18B20 - CleClo_18B20

Дотрагиваюсь до левого верхнего - там же и выводится

Дотрагиваюсь до правого нижнего - там же и выводится... Зашибись! :)

Здесь был использован файл с русским шрифтом SystemRus5x7.h взятый на mk90.ru