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

Подробнее?

Сразу скажу, на оригинальность и новаторство не претендую, подобных проектов в сети навалом. Но на этом ресурсе ничего подобного поиском не обнаружил, потому и решил опубликовать, вдруг кому-то пригодится.
Код опять же писал сам, потому, если там сплошная индусятина - не судите строго =) Я пока только учусь. Последний раз контроллеры программировал на 4-м курсе института больше 10 лет назад =) Грамотная и конструктивная критика приветствуется!
Постараюсь доступно и подробно объяснить как собрать такое устройство, справится человек с почти любым уровнем подготовки, я думаю.

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

Функции устройства:
- Измерение текущей высоты и вывод ее на светодиодный дисплей.
- Запоминание максимального значения высоты имевшей место с момента включения питания.
- Вывод максимальной высоты на дисплей посредством нажатия кнопки.
- Запись максимального значения высоты в энергонезависимую память (EEPROM) контроллера (сохраняется после отключения питания).
- Чтение сохраненной максимальной высоты из EEPROM и вывод ее на дисплей.

За нулевую точку отсчета принимается высота на которой было включено питание устройства.

Что понадобится (в скобках ключевые слова для поиска на всяких там ебаях и т.п.)
- микроконтроллер ардуино, в принципе подойдет почти любой, если код даптировать, но собиралось и проверялось все на базе (Arduino Nano).

- барометрический датчик высоты с шиной I2C (BMP085).

- трехразрядный семисегментный светодиодный дисплей с общим анодом (7-Segment LED Display).

- провода для соединения всего этого в единое целое, я использовал готовые и с разъемами, но это совсем не обязательно (Dupont Wire).

- кнопка, подойдет любая без фиксации положения (Tact Switch Push Button). Например такая:

- резистор от 1КОм до 10КОм.
- три резистора 100Ом.
- паяльник со всеми гобулями и умение им пользоваться.
- Arduino Software.

Опционально:
- макетная плата для распайки дисплея.

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

Сначала немного о дисплее.
Семисегментный светодиодный дисплей с общим анодом представляет из себя вот такую сборку из светодиодов (на картинке обведено красным):

Если повнимательней посмотреть на схему, то станет понятно, что одновременно может светиться только один из разрядов, т.е. чтобы отобразить трехразрядное число, нужно по очереди зажигать и гасить каждый разряд, причем делать это очень быстро. Поэтому цифры как ни крути будут мерцать, главное, чтобы это мерцание было достаточно частым и не воспринималось глазом как мерцание. А это значит, что ардуино будет работать в том числе и в качестве контроллера этого дисплея, по сути рисуя по очереди цифры составляющие число равное текущей высоте.
Сразу оговорюсь, можно купить и готовое решение, со встроенным контроллером, но стоит оно в 5 раз дороже, да и мне не попалось подходящей реализации при поиске, т.к. хотелось именно 3 разрядный, а в продаже все больше 4-х разрядные.
Кстати, учитывая что дисплей трехразрядный, максимальная высота, которую он в состоянии отобразить = 999м. В принципе устройство может быть легко адаптировано для 4-х разрядного дисплея, но программу при этом придется немного модифицировать. Кто разберется в коде для 3-х разрядов, тот легко сможет его адаптировать и для 4-х.
В итоге не смотря на всплывшие проблемы с этим самым мерцанием, удалось добиться более-менее приемлимых результатов, об этом ниже, т.к. проблемы возникли из-за датчика высоты.
Подробней о датчике.
Датчик барометрический, т.е. определяет изменение высоты по изменению атмосферного давления. Фактически датчик измеряет только атмосферное давление, вычислением высоты как функции от давления занимается уже код библиотеки для датчика. При этом датчик имеет встроенный АЦП и интерфейс I2C, т.е. выдает измеренную величину уже в цифровом виде, что несомненно является плюсом. Для работы с датчиком существует готовая библиотка. Я использовал именно первую версию, она менее ресурсоемка и проще встраивается в код. Функционал библиотеки позволяет настраивать точность измерений по шкале от 0 - наименьшая точность, до 3 - наибольшая точность (см. код). Хотя если честно я не заметил особенной разницы между уровнями выше 0. Погрешность измерений составляет около 1 метра, что в общем-то вполне приемлимо. Результат измерений - это абсолютная высота над уровнем моря при нормальном атмосферном давлении. Но это как раз совсем неинтересно. С другой стороны при помощи ардуино и простейших математических операций легко можно вычислить относительную высоту, что и было проделано.
Но не обошлось и без ложки дегтя: опрос датчика при помощи стандартной функции происходит достаточно длительное время, а учитывая, что ардуино еще и контроллер семисегментного дисплея, получились достаточно забавные спецэффекты, т.е. во время опроса датчика вывод на дисплей само собой останавливался и поэтому цифра, которая отображалась на тот момент горела чуть дольше других. В итоге получалась такая типа гирлянда из трех элементов.
В конечном итоге поигравшись с задержками и подобрав оптимальный период опроса датчика удалось добиться практически полного отсутствия мерцания. Тем более, что в опросе датчика каждый цикл программы необходимости нет никакой, высота все же меняется с ограниченной скоростью. А вот мельтешение первого разряда из-за погрешности и слишком частых опросов датчика смотрится не красиво.
В принципе будь у меня скилл покруче, можно было бы переписать библиотеку датчика, но пока не готов. Да и в такой реализации функции свои вполне выполняет, остальное лирика.
Вывод цифр был переведен на прерывание, мерцание ликвидировано, скетч обновлен.
На этом краткий экскурс по элементам устройства пожалуй закончу и перейду к сборке.

Схема соединения элементов устройства (кликабельно):


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



Что касется питания устройства: ардуино в первозданном виде способен нормально пережить от 7В до 16В, в крайнем случае от 6В до 20В. Но, учитывая, что у меня был китайский клон, гнусных опытов я ставить не стал, но от батареи LiPo 3S работает без проблем.
Датчик желательно упаковать таким образом, чтобы доступ воздуха был свободный, но при этом исключить прямой обдув потоками воздуха отверстия в датчике, например, прикрыть его пороллоном.
С платы ардуино рекомендую удалить светодиоды RX и TX, т.к. они включены параллелльно 0 и 1 цифровым выводам, из-за чего сегменты подключенные к этим выводам будут светиться с меньшей яркостью.

Код для Aduino IDE:
(Altimeter_v1.01.ino)
Комментирован очень подробно, но если все же возникнут вопросы - не стесняйтесь.

Об интерфейсе:
Ну и что, что весь интерфейс - одна кнопка и три символа?! Описать все равно надо =)
При нажатии и удержании кнопки на дисплей выводится максимальная высота, зафиксированная с момента включения питания.
Если продолжить удерживать кнопку в течении 2 секунд на дисплей будет выведено значение высоты записанное в EEPROM.
Если продолжить удерживать кнопку в течении 4 секунд, в EEPROM будет записана текущая максимальная высота и на дисплее загорится буква "S", которая на самом деле цифра "5" =)
Дальше кнопку держать смысла нет, можно отпускать.
Отрицательная высота не выводится, т.к. знак минус рисовать некуда, поэтому в таком случае на дисплей выводятся три буквы "L".
Скетч обновлен. Отрицательная высота выводится на первые два разряда, т.е. минимальное значение -99.
Если высота больше 999 метров на дисплей выводится три горизонтальных черты. При этом устройство продолжает функционировать. Но нужно иметь ввиду, что при попытке вывести максимальную высоту путем нажития кнопки, получим те же черточки на дисплее.
Еще один нюанс: запись в EEPROM происходит побайтно, то есть в одну ячейку можно записать число не больше 255. С одной стороны можно было реализовать разбиение на байты, писать побайтно, а при чтении склеивать обратно. С другой стороны, учитывая, что максимальное значение 999, проще, как мне показалось перед записью делить значение высоты на 4, а при чтении умножать записанное на 4 перед выводом на дисплей. В сумме с погрешностью датчика максимальная высота после записи\чтения из EEPROM может врать в пределах 5м, что я посчитал приемлимым.
Скетч обновлен, реализована побайтная запись, таким образом высота записывается как есть и восстанавливается из памяти точно такая же.

Девайс планирую использовать на учебном FPV пепелаце, на который ОСД ставить жаба душит, а эту штуку вполне можно разместить в поле зрения камеры. В теории в этот же агрегат можно встроить датчик напряжения батареи и переключать вывод на дисплей того или другого параметра используя для этого канал РУ, но для этого у меня отдельный вольтметр имеется и заморачиваться не стал.

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

Дисплей распаял на макетке, не люблю платы травить, да и лень =)

При подключении дисплея не забываем про токоограничивающие резисторы!

Собрал всю лапшу в кучку.

Упаковал.

Общий вид.


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

Вес в сборе около 20гр.

Проверял девайс катаясь на лифте до 12 этажа, показывает вполне адекватно.

На этом все. Спасибо за внимание! Еще раз напомню, грамотная критика, отзывы и предложения приветствуются!

Мои предыдущие записи:

FPV. От начинающего начинающим. Часть 2. Маленький и шустрый.
FPV. От начинающего начинающим. Часть 1. Близко и низко.
Внедрение джойстика от PS2 в аппаратуру Turnigy 9X
Увеличиваем максимальный угол отклонения стандартной сервомашинки.
Отдельностоящий (выносной ретранслятор) модуль РУ для FPV.