[Arduino] датчик температуры - хрен ли такой долгий опрос?

markyzz

Подрубил очередной датчик (в данном случае - измеритель температуры) к своей ардуинке воспользовавшись очередным Hello world из гугла.
Если конкретно: DS18B20
Мой скетч-код:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <zIndicator.h>

#define ONE_WIRE_BUS 8
zIndicator indicator;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
indicator.defineLeds(52,46,44,43,50,42,47,51,53,48,45,49);
sensors.begin;
}

void loop(void)
{
sensors.requestTemperatures;
int temp = sensors.getTempCByIndex(0);
indicator.showNumber(temp,3333);
}

zИндикатор - моя библиотечка, которая просто на кучке светодиодиков показывает числа.
А теперь вопрос, уважаемые знатоки:
Все датчики у меня опрашивались моментально (в наносекунды, как и положено но именно этот, почему-то, тормозит ощутимо...
То есть, вот этот код:

sensors.requestTemperatures;
int temp = sensors.getTempCByIndex(0);

имеет задержку почти в секунду.
Скорее всего ответ на поверхности и я лох, но подскажите плиз - в чем фигня.
Заранее спасибо!

0000

Подозреваю, что проблема может быть в
1. 1-Wire протокол (1 провод это конечно круто, но видимо есть свои нюансы)
2. Не все, что надо, инициализировал.
А чего I2C не используешь?
P.S. Код getTempCByIndex глянуть так же не мешает, а то может там тупо delay какой стоит.

markyzz

А чего I2C не используешь?
Потому что еще не особо разбираюсь в вопросе :)
Если честно, мне в последней посылке пришел не единичный девайс, а дохрена всего. Поэтому, да, согласен, не тру-метод, но хочется доброму китайцу послать 5 баллов и большое спасибо максимально побыстрее, но для этого надо все проверить, потому и неизучение мною мат-части наблюдается...
Просто тут же много изобретателей терминатора, подумал, может кто уже сталкивался с такой проблемой :) Вот, и, почти наверняка, получил сходу ответ на свой вопрос от тебя. За что спасибо и плюсик! Попробую I2C :)
Еще не знаю, что это, но, попробую сперва его
А так из посылочки еще свето-датчик надо протестить и датчик движения :)

markyzz

Сорри, что нарушаю тайну переписки, но мне потом легче так искать.
Сообщение от Shurick

Предположу, что нужно как-то уменьшить точность преобразования.
1) http://milesburton.com/Dallas_Temperature_Control_Library
там комментарий "Conversion time on the 18B20 at max resolution is something like 1 second IIRC."
2) http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
таблица "AC ELECTRICAL CHARACTERISTICS" в конце и значения времени преобразования

Спасибо большое! Все попробую :)

nemec2707

Все датчики у меня опрашивались моментально (в наносекунды, как и положено но именно этот, почему-то, тормозит ощутимо...
Потому что преобразование внутри датчика ds18b20 длится около секунды.
и видимо либа ардуиновская устроена так, что сначала говорит датчику "дай-ка мне температуру", а потом тупо ждет секунду, пока он начнет выплевывать инфу по 1wire, блокируя при этом выполенение всего остального кода.
Получив такой ответ, я бы на твоем месте задумался, а стоит ли вообще тратить время на ардуино, потому что без понимания, что происходит внутри красивых и удобных ардуино-либ, в более сложных проектах ты просто утонешь в подобных почемучках.
Могу помочь с быстрым стартом программирования авр на си без ардуино-либ)

0000

Давай помогай, я уже почти созрел :D
Где маны почитать и чего поставить надо?
Ардуина отлично подходит для быстрых прототипов, а также у нее большой плюс - не надо для каждого контроллера распиновку смотреть - либы уже настроены под каждый контроллер отдельно. К тому же не всегда хочется/надо писать либы, когда можно готовым воспользоваться, а то запросто можно попасть в ситуацию когда занимаешься программированием ради программирования. Имхо зря на Ардуину матерые МК-щики гонят.

nemec2707

Вот учебный курс ботайте, я с него начинал и очень быстро начал.
http://easyelectronics.ru/category/avr-uchebnyj-kurs/page/5
В частности, что такое микроконтроллер
http://easyelectronics.ru/vvodnaya-ili-chto-takoe-mikrokontr...
Подключение микроконтроллера
http://easyelectronics.ru/podklyuchenie-mikrokontrollera-lik...
О программаторах
http://easyelectronics.ru/avr-uchebnyj-kurs-traktat-o-progra...
Что могу написать от себя.
Надо уловить несколько основных моментов.
1. У AVR есть так называемые FUSE биты. Это как биос у компа. Там настраиваются такие базовые низкоуровненвые параметры мк, как тактовая частота, источник тактирования, включение/выключение отладочного интерфейса, и еще кое-какие фичи, которые редко используются.
FUSE биты нельзя менять из программы, выполняющейся на мк. Им можно только прошить при помощи программатора. Иногда можно напутать там чего-нибудь и "залочить" контроллер
, например выбрав тактирование от внешнего кварца, когда кварца нет под рукой, или выбрав тактирование от внешнего тактового генератора, которого нет. Еще можно отключить пин RESET или вовсе запретить последовательное программирование - тогда тоже дело будет плохо. Но в крайнем случае всегда спасет так называемый высоковольтный программатор, которому срать на фьюзы) Правда он дорогой и редкий.
2. Управление микроконтроллером всегда сводится к записи нужных бит в нужные байты(они называются регистрами). Захотел что-то настроить или изменить состояние ножки - поглядел в даташите регистр этой настройки и записал нужные биты. Подробнее про регистры дерганья ногами и настройки периферии есть в учебном курсе дихальта.
Например, захотел настроить пин 4 порта A на выход - пишешь
 DDRA |= (1 << 4); 

потом захотел выдать туда единицу - пишешь
 PORTA |= (1 << 4); 

захотел выдать ноль - пишешь
 PORTA &= ~(1 << 4); 

Ну и дефайнить конечно надо, например
#define LED_DDR DDRA // регистр, отвечающий за напраления пинов порта, куда повешен диодик
#define LED_PORT PORTA // регистр, задающий состояние пинов порта, куда повешен диодик
#define LED1 4 // Номер пина, куда повесили диодик

LED_DDR |= (1 << LED1); // настроили нужный пин нужного порта на выход
LED_PORT |= (1 << LED1); // зажгли диодик (если он подключен анодом к мк)
_delay_ms(500); // подождали полсекунды
LED_PORT &= ~(1 << LED1); // погасили диодик (если он подключен анодом к мк)

3. Чтобы правильно подключить мк нужно не так уж и много - соеденить с 5В все Vcc и Avcc, соеденить с нулем все GND, подтянуть RESET к 5В резистором на 10кОм. После этого мк должен определяться программатором. Дальше нужно прошить FUSE биты, я обычно пользуюсь вот этим калькулятором http://fusecalc.mirmk.net , как правило у меня для атмеги16 или атмеги32 получаются фьюзы D9 E4. И всё, можно писать код на си)
Для старта можно взять ардуино плату, там уже питание и ресет подключены как надо, только надо будет вывести разъем ISP программатора - это 6 или 10 ножек.
А если обходиться без ардуины
, можно купить пяток атмег16 http://voltmaster.ru/cgi-bin/qwery.pl/id=322550127
Макетную плату http://voltmaster.ru/cgi-bin/qwery.pl/id=6151
Резисторов 10кОм для подтяжек http://voltmaster.ru/cgi-bin/qwery.pl/id=48560
Резисторов 510 Ом для токооганичения диодиков http://voltmaster.ru/cgi-bin/qwery.pl/id=17726
Светодиодиков любых http://voltmaster.ru/cgi-bin/qwery.pl/id=14297
Вот такой разъемчик для программатора http://voltmaster.ru/cgi-bin/qwery.pl/id=62904
Ну и блок питания на 5 вольт какой-нибудь
Плюс разъем для него http://voltmaster.ru/cgi-bin/qwery.pl/id=922269357
Программатор пойдет например такой
http://www.avito.ru/moskva/oborudovanie_dlya_biznesa/program...
Можно и за 200 руб купить, если поискать.
В общем, спрашивайте, с радостью буду помогать чем смогу)

nemec2707

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

0000

Спасибо за ссылки - про сайт знал, но курс по AVR проглядел. Надо будет почитать на досуге.
Всякого барахла у меня уже валом, нет только серв и платформы для них (буду заказывать в ближайшее время).
А с чем связан выбор Atmega16? У меня есть пучок attiny13, но у них ножек маловато, потому думаю взять attiny2313 или attiny88 (что там дешевле будет а может и atmega328.

nemec2707

На примере атмега16 дихальт строит свой учебный курс. Там отличий от 32 и 8 нет почти, да и от тини тоже не особо, но ведь когда ты только начинаешь, эти малюсенькие нюансы очень неочевидны и сбивают с толку. Хочется так - скачал готовый пример с сайта, запустил ничего не меняя - работает, и начинаешь потихоньку там чего-нибудь менять и смотреть чо получается.

0000

Почитал немного статьи. Напрягает меня этот чел своей подачей материала.
Имхо статьи написаны в виде максимальном, чтобы отбить желание что-либо делать, с кучей мест, которые очевидны автору и нифига не очевидны новичкам.

nemec2707

Нифига себе, насколько это оказывается субъективно.
Мне стиль изложения Дихальта очень нравится и легко дается.

0000

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

markyzz

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

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

Plok2008

Если я правильно помню про эти 1-wire датчики температуры, то там действительно "много" времени проходит от момента запроса на начало оцифровки температуры до того, как эти данные будут доступны для чтения.
Когда я работал с этим датчиком в своих игрушечных проектах, то я посылал запрос на оцифровку и запускал внутренний таймер, который через секунду примерно мне вываливался в прерывание по которому я выставлял volatile boolean и в основном цикле программы производил чтение. Таким образом сам МК не зависает на эту секунду, но и данные о температуры становятся доступны не сразу. Это надо учитывать в логике работы остальной программы.
Тебе никто не мешает открыть исходники 1-wire либы в ардуино и посмотреть, как там реализовано всё. Вряд ли там много страниц когда, и на основе неё можешь свой класс сделать, который будет работать, например, предложенным мною способом.
Ну или другие датчики используй. I2C или вообще аналоговый (например LM35 подвешенный на один из ADC портов ардуино. Всё зависит от места применения.

marat1

Тоже сложилось такое ощущение про его стиль. Стиль у него отвратный.
В итоге заботал на edx.org программирование, правда, ARM микроконтроллеров. Прослушал курс, поделал лаб, джаст фо фан. Интересно и понятно.
Оставить комментарий
Имя или ник:
Комментарий: