[Arduino] датчик температуры - хрен ли такой долгий опрос?
1. 1-Wire протокол (1 провод это конечно круто, но видимо есть свои нюансы)
2. Не все, что надо, инициализировал.
А чего I2C не используешь?
P.S. Код getTempCByIndex глянуть так же не мешает, а то может там тупо delay какой стоит.
А чего I2C не используешь?Потому что еще не особо разбираюсь в вопросе
Если честно, мне в последней посылке пришел не единичный девайс, а дохрена всего. Поэтому, да, согласен, не тру-метод, но хочется доброму китайцу послать 5 баллов и большое спасибо максимально побыстрее, но для этого надо все проверить, потому и неизучение мною мат-части наблюдается...
Просто тут же много изобретателей терминатора, подумал, может кто уже сталкивался с такой проблемой Вот, и, почти наверняка, получил сходу ответ на свой вопрос от тебя. За что спасибо и плюсик! Попробую I2C
Еще не знаю, что это, но, попробую сперва его
А так из посылочки еще свето-датчик надо протестить и датчик движения
Сообщение от 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" в конце и значения времени преобразования
Спасибо большое! Все попробую
Все датчики у меня опрашивались моментально (в наносекунды, как и положено но именно этот, почему-то, тормозит ощутимо...Потому что преобразование внутри датчика ds18b20 длится около секунды.
и видимо либа ардуиновская устроена так, что сначала говорит датчику "дай-ка мне температуру", а потом тупо ждет секунду, пока он начнет выплевывать инфу по 1wire, блокируя при этом выполенение всего остального кода.
Получив такой ответ, я бы на твоем месте задумался, а стоит ли вообще тратить время на ардуино, потому что без понимания, что происходит внутри красивых и удобных ардуино-либ, в более сложных проектах ты просто утонешь в подобных почемучках.
Могу помочь с быстрым стартом программирования авр на си без ардуино-либ)
Где маны почитать и чего поставить надо?
Ардуина отлично подходит для быстрых прототипов, а также у нее большой плюс - не надо для каждого контроллера распиновку смотреть - либы уже настроены под каждый контроллер отдельно. К тому же не всегда хочется/надо писать либы, когда можно готовым воспользоваться, а то запросто можно попасть в ситуацию когда занимаешься программированием ради программирования. Имхо зря на Ардуину матерые МК-щики гонят.
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 руб купить, если поискать.
В общем, спрашивайте, с радостью буду помогать чем смогу)
К тому же не всегда хочется/надо писать либы, когда можно готовым воспользоваться, а то запросто можно попасть в ситуацию когда занимаешься программированием ради программирования.Либы бывают не только ардуиновские, а еще и нормальные)
Всякого барахла у меня уже валом, нет только серв и платформы для них (буду заказывать в ближайшее время).
А с чем связан выбор Atmega16? У меня есть пучок attiny13, но у них ножек маловато, потому думаю взять attiny2313 или attiny88 (что там дешевле будет а может и atmega328.
На примере атмега16 дихальт строит свой учебный курс. Там отличий от 32 и 8 нет почти, да и от тини тоже не особо, но ведь когда ты только начинаешь, эти малюсенькие нюансы очень неочевидны и сбивают с толку. Хочется так - скачал готовый пример с сайта, запустил ничего не меняя - работает, и начинаешь потихоньку там чего-нибудь менять и смотреть чо получается.
Имхо статьи написаны в виде максимальном, чтобы отбить желание что-либо делать, с кучей мест, которые очевидны автору и нифига не очевидны новичкам.
Мне стиль изложения Дихальта очень нравится и легко дается.
Вполне возможно, что ты начинал не с нуля или тебе требуется по работе настолько глубоко копать.
Получив такой ответ, я бы на твоем месте задумался, а стоит ли вообще тратить время на ардуино, потому что без понимания, что происходит внутри красивых и удобных ардуино-либ, в более сложных проектах ты просто утонешь в подобных почемучках.
Да я пока не особо-то и стремлюсь в серьезные проекты. Ардуино - это просто такая игрушка-конструктор. Ну, на данном этапе уж точно.
А так-то да, Дэн, у меня пока домохозяичный подход, руки дойдут - полистаю твои книжки обязательно
Когда я работал с этим датчиком в своих игрушечных проектах, то я посылал запрос на оцифровку и запускал внутренний таймер, который через секунду примерно мне вываливался в прерывание по которому я выставлял volatile boolean и в основном цикле программы производил чтение. Таким образом сам МК не зависает на эту секунду, но и данные о температуры становятся доступны не сразу. Это надо учитывать в логике работы остальной программы.
Тебе никто не мешает открыть исходники 1-wire либы в ардуино и посмотреть, как там реализовано всё. Вряд ли там много страниц когда, и на основе неё можешь свой класс сделать, который будет работать, например, предложенным мною способом.
Ну или другие датчики используй. I2C или вообще аналоговый (например LM35 подвешенный на один из ADC портов ардуино. Всё зависит от места применения.
В итоге заботал на edx.org программирование, правда, ARM микроконтроллеров. Прослушал курс, поделал лаб, джаст фо фан. Интересно и понятно.
Оставить комментарий
markyzz
Подрубил очередной датчик (в данном случае - измеритель температуры) к своей ардуинке воспользовавшись очередным Hello world из гугла.Если конкретно: DS18B20
Мой скетч-код:
zИндикатор - моя библиотечка, которая просто на кучке светодиодиков показывает числа.
А теперь вопрос, уважаемые знатоки:
Все датчики у меня опрашивались моментально (в наносекунды, как и положено но именно этот, почему-то, тормозит ощутимо...
То есть, вот этот код:
имеет задержку почти в секунду.
Скорее всего ответ на поверхности и я лох, но подскажите плиз - в чем фигня.
Заранее спасибо!