Как стать автором
Обновить

Комментарии 35

Странно видеть такую страну на GT тут помоему больше для Хабра.
Спасибо, давно не читал статей где так всё поробно и хорошо описано.
Возможно, лучше было опубликовать там, сам думал перед публикацией. Но все же тут много уделено именно программированию, а схемотехника практически как в Arduino — соединить все проводками )
У меня чето dht22 в связке с raspberry примерно раз в месяц перестает отвечать, питание передернул и еще месяц работает. Никто не сталкивался?
У меня пока что термометр включен только неделю, за неделю датчик ни разу не "повисал". Если такое действительно имеет место, можно питать датчик от соседнего выхода МК (raspberry в вашем случае) через небольшой резистор (конденсатор параллельно датчику следует оставить), т.к. заявленное потребление датчика в рабочем состоянии — меньше миллиампера. В этом случае, если датчик перестанет отвечать, можно будет его "перезапустить" программно.
Иногда его глючит от наводок, мне помогли конденсаторы нф и мкф поближе к его пинанию.
DHT22 в связке с BananaPi M1+ трудится с осени.
Последняя перезагрузка системы была где-то в январе, но не по вине датчика.
Подключен даже без резистора.
Любой более-менее сложный датчик может себя так повести. Тот же DS18b20 может начать выдавать +125 градусов.
В правильной системе нужно иметь возможность отключать питание периферии, особенно если она подключается по длинному кабелю и ловит помехи.
125 градусов он выдает потому что отпадывает провод данных, и контроллер читает кучу единиц, и контроллер интерпретирует это как +125
А датчик разве не выдаёт контрольную сумму? По идее должен (по аналогии с DS18B20), и глупо её не проверять.
У него странная контрольная сумма, когда все нули или единицы данные проходят как валидные. Может мои программы направильно что-то считают, но при отключении датчика они показывали что-то вроде 80.0 градусов.
У него контрольная сумма считается XOR'ом между битами данных и сдвиговым регистром CRC, который изначально установлен в нули. Если все данные равны нулю, то результирующий CRC тоже получается ноль, т.е. в этом случае он валиден. Надо отдельно проверять это в программе.
Упс, не заметил, речь как раз про DS18B20. Ну тогда +125 это радиус изгиба рук программера :)
А не пробовали написать аналогичную программу на С, насколько она больше получится?

Сам когда-то начинал программировать AVR c ассемблера. Но сейчас посмотрел ваш листинг и приуныл. Программа практически не читаема. И дело не в том как она оформлена, с этим все отлично, а в том, что бизнес-логика скрыта ассемблером.
Вот именно. И название уже не соответствует «Простой цифровой термометр/гигрометр», код уже ни как не простой, а очень специфический. Всё это просто было бы собрать на Arduino Uno. И breadboard бы не понадобился. Arduino Uno мне нравится тем, что там есть поддержка Watch Dog Timer прямо в стандартном ядре (3 строчки кода только добавить, библиотека, конфигрурация и wdtReset), о чем часто ардуинщики забывают, и компрометируют тем, надежную в целом плату.
Не согласен. Специфической была задача написать этот ассемблерный код, но теперь он готов и чтобы повторить устройство, достаточно просто собрать схему. Под "простой" в названии понимается "минимум деталей, минимум расходов".

Arduino Uno — это отличная плата, но вам не будет жалко отдавать целую плату ради одного термометра? Если это не эксперимент, не устройство, которое потом будет дорабатываться и расширяться, а единовременная разработка, которая потом будет просто стоять на столе и выполнять свою функцию. Да даже если взять ATmega328p отдельно, все равно она чрезмерна для такого простого устройства, функции которого вполне может выполнить и tiny13. В tiny13, кстати, тоже есть watchdog timer)

А вот почему выбран именно ассемблер — здесь скорее увлечение. Это был первый язык программирования, который я выучил (тогда для Z-80), поэтому мне всегда приятно лишний раз написать на нем что-то стоящее. Кроме того, если программист знает и понимает ассемблер — он будет лучше писать программы на всех остальных языках, правильней выделять память под данные и т.д., т.к. все это в конечном счете компилируется все равно в машинные коды. Поэтому целью данной статьи, кроме, конечно, готового решения, также является желание помочь тем, кто изучает ассемблер сейчас, кто только начал его изучать.
А у вас breadboard на картинке отдана под конструкцию, что дороже Arduino Uno. И цена Arduino не так велика, стоит копейки при том что на борту блок питания, гребенка контактов, кварц, и USB, и отдавать её не жалко, так как из-за массовости производства плата стоит дешевле, чем компоненты по отдельности, удобства перевешивают минусы. Стоит 3$, куда дешевле, если на борту полный фарш, всё готово? Программировать далее можно хоть на ассеблере, Bascom AVR, Codevision, Atmel studio, micro (pascal, basic, c), iar и прочем, почти все среды поддерживают загрузчик ардуиновский.
Attiny13 программировал на Bascom AVR (basic), что интересно, почти всё ПО делает код в демоверсии с ограничениями, но эти ограничения перекрывают возможности Attiny13a )
Тоже выбрал из-за DIP корпуса и цены (нужно было 20 штук), удобнее в отладке.
Макетная плата отдана под временную конструкцию, потом ее заменит обычная печатная или же просто (в данном случае) спаяю все проводами, т.к. паять особо нечего. А стоит она, кстати всего $0.35 )

Даже если взять Uno за $3, это все равно в шесть больше, чем tiny13 (около $0.5). А представьте, что потом появляется задача сделать 10 таких часов или 100? И размер у ардуины немаленький — моя задумка встроить этот термометр в электронные часы, чтобы они сразу показывали три параметра. Ардуина туда просто не влезет. И, кстати, Uno не содержит блока питания, только стабилизатор на 5 вольт.

Ну и главное, я хотел показать, что arduino не обязательна для всех задач. Что более простые задачи можно решить на более простом, маленьком и дешевом МК.
НЛО прилетело и опубликовало эту надпись здесь
Разница в цене имеет значение везде, вопрос в самой разнице) Соглашусь, что в данном случае непринципиально, $0.5 или $3, но тут вступает в дело факт наличия деталей — tiny13 у меня была, а ту же nano надо было бы покупать и ждать доставки. Плюс размер — в часах, куда я собираюсь встроить данный термометр, не так много свободного места, Uno туда точно не влезет, nano — возможно, но не уверен.

А опубликовал я статью с двумя целями — во-первых, если кто-то будет искать самое простое схемное решение для отображения температуры на основе DHT22 — вот оно, на минимальном МК. Бывает, что такие МК просто лежат у людей без дела годами, поэтому собрать схему и зашить программу (писать-то ее больше уже не надо) будет очень просто. А во-вторых, если кто-то программирует на ассемблере из спортивного или любого другого интереса, данная статья может оказать ему практическую помощь. В этом случае он может, например, взять код опроса датчика и использовать его в другом проекте.
Вообще, при программировании подобных устройств, ассемблер знать, безусловно, надо. Но реально писать на ассемблере имеет смысл только в самых крайних случаях.

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

Другое дело, если просто хочется на ассемблере. Это уже вполне нормальный аргумент. В конце концов, надо же получать удовольствие от того что делаешь!
В данном случае все началось с того, что просто потребовался гигрометр) Вспомнил про DHT22 (были в наличии), почитал даташит, стало интересно, возможно ли сделать функциональный прибор на самом маленьком МК, который был (tiny13). Поэтому сразу же выбрал ассемблер, т.к. ресурсов у МК немного, плюс действительно получил удовольствие, вспомнив те времена, когда серьезные программы можно было писать только на нем (ZX-Spectrum).

Кстати, большую часть времени потратил не на сам код, а на изучение протокола DTH22 (ведь писалось с нуля) по даташиту и осциллографу. Писать на ассемблере AVR в целом легко, т.к. у него много регистров, на Z-80 было намного сложнее)
Для Watchdog не нужен ни Arduino Uno, ни ассемблер. На С в IAR, например, сброс делается встроенной командой __watchdog_reset() которая при компиляции развернется в одну ассемблерную инструкцию. Конфигурация также предельно простая.
Я не думаю, что будет все очень плохо (касаемо размера кода на С) — возможно, в данном функционале в 1К уместить его получится (т.к. еще есть запас 25%), однако gcc (из состава Atmel Studio 7) иногда выдает не очень логичные конструкции.
Что касается читабельности программы на ассемблере — она всегда ниже, чем на других языках. Прежде всего потому, что для полного понимания действия каждой команды необходимо помнить, какие данные находятся в каких регистрах процессора. Здесь регистров много (32), помнить приходится больше, поэтому читабельность кода для AVR ниже.
В pure basic сталкивался со странностями при работе со стеком, при прерываниях, вызове подпрограмм крошечного стека ATtiny13 могло не хватать, компиляторам «тяжело» с таким маленьким стеком. Для более старших контроллеров, такой проблемы уже нет.
В IAR по умолчанию стек 16 байт, что уже довольно мало. Вся тяжесть у компилятора связана с количеством локальных переменных. Если их немного, а в данной задаче это так, то и стека нужно ровно столько же.
Также можно резервировать часть регистров под хранение переменных.
gcc в Atmel Studio настоятельно не рекомендую. Он по какой-то причине выкидывал из программы целые блоки, даже если выключить оптимизацию. Прочитали переменную из регистра, но нигде не используем — выкинуть нафиг, и чтение из регистра тоже. А то что я таким образом пытаюсь отлаживать программу его не волнует. При пошаговом выполнении порядок того, что написано на экране и того, что выполняется разный!
Зато IAR настоятельно рекомендую. Никогда не было с ним проблем, код получается компактным, все очень гибко настраивается.
С IAR пока не работал, но часто слышу хорошие отзывы. Единственный минус, как я понимаю — она платная?
Платность побеждается кряками.
Самый большой недостаток — очень устаревший встроенный текстовый редактор. Я код пишу в Qt Creator, а компилирую и отлаживаю в IAR.
На STM32 тоже сначала попробовал Eclipse + GCC. Есть специальная сборка даже именно под STM32. Как-то не пошло, постоянно какие-то проблемы, какие-то конфиги надо править, JTAG отваливается… При каждом обновлении этой студии новые сюрпризы.
Перешел на IAR, все сразу из коробки работает.

К чему такой частый опрос датчика, не вносит ли это погрешность в виде нагрева?
Не думаю. Датчик потребляет меньше миллиампера в активном режиме (когда его опрашивают), т.е. это до 5mW при питании от 5В. Опрос занимает до 6 миллисекунд, остальное время датчик бездействует, потребляя десятки микроампер. Такая рассеиваемая мощность не внесет погрешность даже на 0.1 градуса.
А опрашиваю часто просто по причине, чтобы быстрей показания менялись на индикаторе) Если наоборот хочется, чтобы помедленнее, внутри программы можно увеличить задержку.
А какое отклонение дает датчик АМ2302 по температуре и влажности в реальности
просто лежат рядом два DHT11 Так в одном влажность 34% в другом 25%
понятно что АМ2302 точнее но насколько реальна заявленная в даташит погрешность?
У меня два DHT22 (заказаны были вместе, т.е. из одной партии) показывают оба параметра примерно одинаково (в пределах одного градуса температуры и процента влажности). Разница между DHT22 и старым жидкостным комнатным термометром — где-то 0.5 градуса. Влажность сравнить не с чем.
Всё конечно замечательно, но мне не понятно зачем Вы пишите комментарии в коде на иностранном языке? Для понимания начинающего, для них и рассчитана эта статья, можно было описать всё на родном языке, тогда и будет понятно.
Согласен, вот об этом не подумал) Пишу на английском по привычке, чтобы не переключать раскладку. С другой стороны, разработчику английский все равно надо знать, т.к. большинство даташитов именно на нем.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории