Букеты, живые цветы, комнатные растения
  • Главная
  • Растения
  • Схема барометр на микроконтроллере самодельная. Метро обозначит границы: когда столичный транспорт введет оплату по зонам

Схема барометр на микроконтроллере самодельная. Метро обозначит границы: когда столичный транспорт введет оплату по зонам

Температура
и давление окружающего воздуха оказывают большое влияние на самочувствие
человека. Их важно знать и в походе, и на даче, и дома. Предлагаемый компактный
прибор как нельзя лучше подходит для этого. Его можно использовать также для
приблизительной оценки высоты, например, при подъеме в горы. Уменьшение
давления на 1 мм ртутного столба соответствует увеличению высоты над уровнем
моря приблизи­тельно на 10 м.

Пределы
измерения и погрешность прибора
определяются в основном примененными в нем датчиками тем­пература -55…+125
°С, атмосферное давление 225. 825 мм ртутного столба Прибор питается
напряжением 9 В от гальванической батареи типа “Крона” или сетевого
адаптера Потребляемый ток - 30 мА (при выключенной под­светке ЖКИ). Размеры
корпуса - 118×72 28 мм. Работа прибора была проверена при температуре от -5 до
+25 С Погрешность измерения давле­ния не превысила 4 мм ртутного столба Схема
прибора изображена на рис. 1 причем собранный на отдель­ной плате модуль
измерения давления выделен штрихпунктирной линией.

Необходимые
для работы датчика так­товые импульсы частотой 32768 Гц выра­батывает кварцевый
генератор на эле­ментах микросхемы DD1 В принципе, эти импульсы мог бы
формировать и микро­контроллер DD2 с помощью одного из имеющихся в нем таймеров
Но это по­требовало бы усложнения программы.

Напряжение
3,6 В для питания датчи­ка В1 и микросхемы DD1 получено с помощью стабилитрона VD1
Резисторы R1 -R3 - нагрузочные для линий свя­зывающего датчик с микроконтролле­ром
интерфейса 1С и сигнала XCLR Печатная плата модуля измерения дав­ления показана
на рис. 2

Хотя
датчик HP03SB содержит и встроенный измеритель температуры, его показания
используются програм­мой микроконтроллера DD2 только для уточнения результатов
измерения дав­ления. На ЖКИ HG1 вместе со значени­ем давления выводятся
показания дру­гого датчика температуры - DS1624 (В2) Причина этого проста - он
точнее При необходимости датчик В2 можно сделать выносным и расположить там где
температура представляет наиболь­ший интерес. При установке в корпусе прибора
этот датчик следует вынести на боковую стенку, сделав в ней окно по его
размерам Иначе неизбежна ошибка на 1,5 ..1,8 ‘С, в чем я убедился на практике
Напряжение питания +5 В стабилизи­ровано микросхемой DA1 Подстроеч ным
резистором R8 устанавливают наи­лучшую контрастность изображения на ЖКИ Кнопкой
SB1 включают подсветку его табло. Остальные элементы необхо­димы для работы
микроконтроллера Элементы R7 R9 СЮ VD2 - цепь уста­новки микроконтроллера в
исходное состояние Кварцевый резонатор ZQ2 с конденсаторами С11.С12 - частотозадающая
цепь тактового генератора мик роконтроллера.

На
рис. 3 представлен чертеж ос­новной печатной платы прибора а на рис. 4 -
расположения деталей на ней В переходное отверстие показанное залитыми (плата
на рис. 2), необходимо вставить и пропаять с двух сторон прово­лочную
перемычку. Для микроконтрол­лера DD1 должна быть предусмотрена панель, так как
в процессе налаживания прибора эту микросхему придется из­влекать и вновь
устанавливать.

Остановимся
на некоторых особен­ностях датчика HP03SB. общий вид и га­баритные размеры
показаны на рис. 5 Для определения давления необходимо предварительно прочитать
из памя­ти установленного в приборе экземпля­ра этого датчика двухбайтные
значения коэффициентов С,-С- и однобайтные значения параметров A-D. Все они ин­дивидуальны
для данного экземпляра.

Результаты
измерения представляют собой два двухбайтных числа- D1 - дав­ление D2 -
температура. Прочитав их из памяти
датчика программа должна вычислить вспомогательные значения

Более
подробные сведения о датчике HP03SB имеются в . Однако необ­ходимо отметить
что там указаны невер­но адреса внутренней памяти датчика, по которым хранятся
его индивидуаль­ные константы. Следует пользоваться теми адресами что приведены
в В приборе можно применить и другие дат­чики серии НРОЗ Некоторые из них
име­ют меньшую точность, другие отлича­ются конструктивным оформлением.

Работа
программы начинается с ини­циализации портов микроконтроллера и ЖКИ Успешную
инициализацию под­тверждает вывод на табло надписи “TER- MOBAR” (буква
Н пропущена). Затем инициализируется датчик давления, счи состояние регистра
статуса модуля TW1 микроконтроллера не проверяется.

Для
чтения коэффициентов и пара­метров датчика предназначена специ­альная программа
ReadCC, которую необходимо загрузить в программную память микроконтроллера полностью собранного
прибора (с подключенным модулем измерения давления), вклю­чить его и через
несколько секунд выключить. После этого нужно извлечь микроконтроллер и с
помощью про­грамматора прочитать содержимое его EEPROM. В нем по адресам,
указанным в табл. 1, находятся значения индиви­дуальных коэффициентов и парамет­ров
датчика. Далее необходимо открыть файл рабочей про­граммы баро­метра-термо­метра
BARO-2 asm, найти в нем фрагмент, приведенный в табл. 2, и ис­править значе­ния
объявлен­ных там конс­тант в соответ­ствии с прочи­танными из EEPROM Пара­метр D
в про­грамме не ис­пользуется

Теперь
про­грамма готова к работе с уста­новленным в прибор экзем­пляром датчика
Остается от­транслировать ее с помощью AVR Studio и загрузить полу­ченный НЕХ- файл
в микро­контроллер Уч­тите, что анало­гичный файл, приложенный к статье, рассчи­тан
на работу с датчиком, имев­шимся у автора Если загрузить его в микрокон­троллер
при­бор с другим эк­земпляром дат­чика давления будет работать но давать неточ­ные
показания

В
разработке использованы фрагменты программ из и . Подпро­граммы преоб­разования
чи­сел из шестнадцатеричного формата в дво­ично-десяти­чный перерабо­таны с
учетом разрядности чисел. Подпро­граммы пере­множения и де­ления двух­байтных
чисел, предназначен­ные для микро­контроллеров семейства MCS-51, пере­ведены на
язык ассемблера AVRASM Мень­ше всего под­верглась изме­нениям подпрограмма
управления ЖКИ, учтены лишь особенности индикатора MT-10S1 а для ввода и вывода
сигналов использо­ваны другие порты микроконтроллера.

Подключение мотора постоянного тока к Ардуино (коллекторного двигателя) требуется при сборке машинки или катера на микроконтроллере Arduino. Рассмотрим различные варианты подключения двигателей постоянного тока: напрямую к плате, через биполярный транзистор, а также с использованием модуля L298N. В обзоре размещены схемы подключения и коды программ для всех перечисленных вариантов.

Управление двигателем на Ардуино

Коллекторный моторчик может быть рассчитан на разное напряжения питания. Если двигатель работает от 3-5 Вольт, то можно моторчик подключать напрямую к плате Ардуино. Моторы для машинки с блютуз управлением, которые идут в комплекте с редукторами и колесами рассчитаны уже на 6 Вольт и более, поэтому ими следует управлять через полевой (биполярный) транзистор или через драйвер L298N.


На схеме показано устройство моторчика постоянного тока и принцип его работы. Как видите, для того, чтобы ротор двигателя начал крутиться к нему необходимо подключить питание. При смене полярности питания, ротор начнет крутиться в обратную сторону. Драйвер двигателей L298N позволяет инвертировать направление вращения мотора fa 130, поэтому его удобнее использовать в своих проектах.

Как подключить моторчик к Arduino

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • мотор постоянного тока (Motor DC);
  • транзистор полевой/биполярный;
  • драйвер двигателей L298N;
  • провода «папа-папа», «папа-мама».

Перед выбором способа управления двигателем от Arduino Uno r3 , уточните на какое напряжение рассчитан ваш моторчик. Если питание требуется более 5 Вольт, то следует использовать транзистор или драйвер. Распиновка транзисторов может отличаться от приведенного примера (следует уточнить распиновку для своего типа). Драйвер L298N позволит не только включать мотор, но и изменять направление вращения.

Скетч. Подключение мотора напрямую

Подключение мотора к Ардуино напрямую — самый простой вариант включения вентилятора на Arduino или машинки. Команда для включения двигателя не отличается, от команды при подключении светодиода к микроконтроллеру. Функция digitalWrite включает/выключает подачу напряжения на цифровой порт, к которому подключен двигатель постоянного тока. Соберите схему и загрузите программу.

void setup () { pinMode (12, OUTPUT ); // объявляем пин 12 как выход } void loop () { digitalWrite (12, HIGH ); // включаем мотор delay (1000); // ждем 1 секунду digitalWrite (12, LOW ); // выключаем мотор

Пояснения к коду:

  1. для подключения мотора без драйвера можно использовать любой порт;
  2. если двигатель не включается, то, возможно, не хватает силы тока на цифровом выходе, подключите двигатель через транзистор к порту 3,3V или 5V.

Скетч. Подключение мотора через транзистор

Подключение мотора через транзистор к Ардуино потребуется, если двигатель никак не хочет включаться от платы напрямую, то следует использовать порт 5 Вольт на микроконтроллере или внешний источник питания. Транзистор будет играть роль ключа, замыкая/размыкая электрическую цепь. Сам транзистор управляется цифровым портом. Соберите схему, как на картинке и загрузите программу.

Подключение FA-130 мотора постоянного тока — Motor DC Arduino void setup () { pinMode (13, OUTPUT ); // объявляем пин 13 как выход } void loop () { digitalWrite (13, HIGH ); // включаем мотор delay (1000); // ждем 1 секунду digitalWrite (13, LOW ); // выключаем мотор delay (1000); // ждем 1 секунду }

Пояснения к коду:

  1. при необходимости можно подключить два мотора FA-130 к Ардуино;
  2. в зависимости от характеристик, двигатель подключается к 3,3 или 5 Вольтам.

Скетч. Подключение мотора через драйвер

Подключение мотора к Ардуино через драйвер L298N или Motor Shield L293D позволит менять направление вращения ротора. Но для использования данных модулей потребуется установить соответствующие библиотеки для Ардуино . В примере мы использовали схему подключения двигателя с помощью модуля L298N. Соберите схему, как на картинке ниже и загрузите следующий скетч с использованием.

// задаем имена для портов #define IN1 3; #define IN2 4; #define IN3 5; #define IN4 6; void setup () { pinMode (IN1, OUTPUT ); pinMode (IN2, OUTPUT ); pinMode (IN3, OUTPUT ); pinMode (IN4, OUTPUT ); } void loop () { // вращаем моторчики в одну сторону digitalWrite (IN3, HIGH ); digitalWrite (IN4, LOW ); digitalWrite (IN5, HIGH ); digitalWrite (IN6, LOW ); delay (2000); // ждем 2 секунды digitalWrite (IN3, LOW ); digitalWrite (IN4, LOW ); digitalWrite (IN5, LOW ); digitalWrite (IN6, LOW ); delay (1000); // выключаем на 1 секунду // вращаем моторчики в обратную сторону digitalWrite (IN3, LOW ); digitalWrite (IN4, HIGH ); digitalWrite (IN5, LOW ); digitalWrite (IN6, HIGH ); delay (2000); // ждем 2 секунды digitalWrite (IN3, LOW ); digitalWrite (IN4, LOW ); digitalWrite (IN5, LOW ); digitalWrite (IN6, LOW ); delay (1000); // выключаем на 1 секунду }

Пояснения к коду:

  1. драйвер двигателей позволяет управлять скоростью и направлением вращения мотора, подробнее читайте в обзоре — Подключение драйвера L298N к Arduino;
  2. если моторчики не крутятся, подключите к драйверу источник питания 6-12В.

У здоровых людей смена погоды не оказывает особого влияния на их самочувствие, а вот метеозависимые люди на любую смену погоды или атмосферного давления, реагируют очень болезненно.
Предлагаемый в статье барометр-сигнализатор предназначен для информирования метеозависимых людей в режиме реального времени о текущем значении атмосферного давления, выходе значения атмосферного давления за установленные границы и его резких скачках.
Внешний вид устройства показан на Рисунке 1.

Рисунок 1. Внешний вид устройства

Пользователь самостоятельно задает граничные значения - минимальный и максимальный пороги.
В случаях если атмосферное давление превысит максимальный порог или опустится ниже минимального порога, то устройство будет подавать прерывистые звуковые сигналы и световые сигналы «Порог».
После пятикратного повтора звуковых сигналов звук отключается, при этом световой сигнал будет подаваться до возврата значения атмосферного давления в заданные границы.

Пользователь задает величину контролируемого скачка атмосферного давления за устанавливаемый интервал времени.
В случаях если атмосферное давление в заданный интервал времени отклонилось на величину превышающую контролируемый скачок, то устройство будет подавать прерывистые звуковые сигналы и световые сигналы «Скачок».
После пятикратного повтора звуковых сигналов звук отключается, при этом световой сигнал будет подаваться до возврата значения атмосферного давления в условия, когда скачок считается неконтролируемым.
Значения атмосферного давления представлены в устройстве в «мм рт. ст.».

Демонстрационный ролик

Принципиальная схема устройства.

Схема электрическая принципиальная устройства показана на рисунке (Рисунок 2).
Устройство собрано на микроконтроллере ATmega8.
Резистор R1 и конденсатор C3 обеспечивают аппаратный сброс МК при подаче питания.
Конденсаторы C2 и C1 защищают цепи питания от высокочастотных помех и бросков питания.

Значение атмосферного давления поступает от датчика BMP1 (GY68 BMP180).
Управление датчиком давления осуществляется по интерфейсу TWI (I2C).
Входы датчика подтянуты к напряжению питания резисторами R8 и R10.

Для отображения информации используется жидкокристаллический экран Nokia 5110. На экране отображается информация о текущем атмосферном давлении, а также параметры настройки устройства.
Оперативная индикация состояния атмосферного давления осуществляется с использованием светодиодов VD1..3 («Норма», «Порог», «Скачек»).
Звуковая сигнализация осуществляется с помощью усилителя низкой частоты на транзисторах VT1..2 и громкоговорителя SP1. Громкость звучания может быть отрегулирована с помощью переменного резистора R5.

Настройка устройства осуществляется с использованием кнопок SA2(«Установка»), SA3(«+»), SA4(«-»).
При нажатии на кнопку SA5(«Экран») отображается главный экран с текущим значением атмосферного давления.

Внимание! Фьюзы для настройки МК: HIGH=0xD9, LOW=0xE1.

Рисунок 2. Схема электрическая принципиальная

Программное обеспечение.

Программа для МК написана на языке Си в среде AtmelStudio (Version 7.0.1006).
Код программы приведен в Приложении (SignalBarometer.rar Архив проекта Atmel Studio 7 на Си).
В целях снижения энергопотребления устройства применен метод «засыпания» МК в режиме «power-save». При этом потребляемый ток в режиме сна уменьшается до 20мкА.
По расчетам это позволяет использовать две батареи типа АА по 1.5 Вольт в течение 4 месяцев.
Для пробуждения МК из режима «power-save» используется внутренний асинхронный таймер-счетчик №2, который работает постоянно.
Задающий генератор таймера счетчика использует кварцевый резонатор Y1 с частотой резонанса 32768Гц.

Таймер-счетчик №2 настроен так, что каждые 8 секунд происходит его переполнение и вызов прерывания, которое «будит» МК.
МК после пробуждения от таймера-счетчика №2 выясняет не прошло ли 10 минут с предыдущего пробуждения. Если нет, то МК выдает световой сигнал «Норма», «Порог» или «Скачок» в зависимости от условия, сложившегося после предыдущего измерения, и снова засыпает на 8 секунд.
Если с момента предыдущего измерения прошло 10 минут, то МК подает команду датчику давления на проведение измерений, получает ответ от датчика, обрабатывает данные, сравнивая полученное значение с пороговыми значениями или условиями фиксации скачка, выдает световой сигнал «Норма», «Порог» или «Скачок» и звуковой сигнал, если это необходимо. И снова «засыпает» на 8 секунд.

Вторым источником пробуждения МК является внешнее прерывание на входе INT1, которое возникает при нажатии на кнопку «Экран».
МК, пробудившись и выяснив что его «разбудила» кнопка «Экран», включает жидкокристаллический дисплей Nokia 5110 и высвечивает на нем текущее значение атмосферного давления и другую информацию.
Экран будет отображать информацию до момента отпускания кнопки «Экран». После отпускания кнопки «Экран» МК выключает дисплей путем выдачи ему команды «power-down», затем МК «засыпает» сам.

Третьим, и последним, источником пробуждения МК является внешнее прерывание на входе INT0, которое возникает при нажатии на кнопку «Установка».
МК, пробудившись и выяснив что его «разбудила» кнопка «Установка», включает жидкокристаллический дисплей Nokia 5110 и высвечивает на нем параметры настройки устройства.
Повторное нажатие на кнопку «Установка» приводит к перемещению курсора на следующий параметр. Нажатие кнопок «+» и «-» приводит к изменению значения параметра, на котором установлен курсор.
После нажатия кнопки «Установка» на последнем параметре МК выключает дисплей и «засыпает» до очередного пробуждения.

Конструкция устройства.

Устройство выполнено в корпусе распределительной коробки «Tuco 79х79х32, для открытой проводки, цвет белый (65004)»(Рисунок 3).

Рисунок 3. Коробка распределительная Tyco (65004).

Плата выполнена на одностороннем фольгированном стеклотекстолите. Размер платы 72х72мм. Расположение деталей на плате показано на рисунке 4. На плате сверху проложены 9 (!) перемычек. Они выделены разными цветами. Если использовать двухстороннюю печатную плату, то перемычки могут быть преобразованы в дорожки.

Рисунок 4. Плата. Вид сверху.

Разводка печатной платы показана на рисунке 5. Изображение зеркальное.

Рисунок 5. Разводка печатной платы.

Динамик закрепляется на задней стенке корпуса устройства. Компоненты сборки показаны на рисунке 6.

Рисунок 6. Компоненты устройства.

Батареи питания (два элемента типа AA) размещаются в батарейном отсеке в специализированных держателях-кроватках (Рисунок 7).

Рисунок 7. Размещение батареи.

Настройка устройства.

На рисунке 8 показаны органы управления для настройки устройства.
Для входа в режим нажмите кнопку «Установка». На дисплее отобразятся настраиваемые параметры.
Кнопками «+» и «-» установите требуемое значение параметра.
Для перехода к настройке следующего параметра нажмите кнопку «Установка».
Для выхода из режима настройки нажмите несколько раз кнопку «Установка».
Параметры «Верхний <порог>», «Нижний <порог>» «Скачок» задаются в мм рт. ст., «Интервал» измерения скачка задается в часах. .

Рисунок 8. Органы настройки устройства.

Регулировка громкости звукового сигнала осуществляется потенциометром «Громкость». Для регулировки необходимо использовать миниатюрную крестообразную отвертку.
При необходимости может быть установлен потенциометр с выведенной наружу ручкой для удобства регулировки.

Эксплуатация устройства.

После включения устройство готово к работе и сразу производит первое измерение атмосферного давления. При этом экран погашен, а результаты измерения отображаются с помощью светодиодных индикаторов «Норма», «Порог» или «Скачок».
Индикатор, соответствующий результату измерения и анализа, производит пять коротких вспышек каждые 8 секунд.

При переходе от состояния «Норма» в состояния «Порог» или «Скачок» выдается звуковой сигнал. Сигнал звучит на протяжении пяти 8 секундных интервалов, начиная с интервала, следующего за изменением состояния.
Для детальной оценки текущего состояния необходимо нажать и удерживать кнопку «Экран». При этом будет отображаться информация, представленная на рисунке 9:

Текущее атмосферное давление;
. максимальное и минимальное значение давления, измеренного за интервал времени, указанный в настройках;
. величина скачка в мм рт.ст. как разница между величинами, указанными в предыдущем пункте;
. текстовая характеристика результата измерения: НОРМАЛЬНОЕ, ПОРОГ, СКАЧОК.

После нажатия кнопки «Экран» серия звуковых сигналов будет прервана.

Рисунок 9. Органы управления и индикации при эксплуатации устройства.

После отпускания кнопки «Экран» дисплей погаснет, а устройство продолжит работать в штатном режиме, выводя результат измерения и анализа только на светодиодные индикаторы.

Приложение:

SignalBarometer2.dch Схема электрическая в формате DipTrace
SignalBarometer2.dip Печатная плата в формате DipTrace
SignalBarometer.hex Загрузочный файл
SignalBarometer.rar Архив проекта Atmel Studio 7 на Си

Удачи Вам в творчестве и всего наилучшего!

Скачать архив.

Сегодня хотелось бы рассмотреть устройство, представляющее собой барометр - измеритель атмосферного давления. Применения такого устройства необходимо для мониторинга текущего атмосферного давления выраженного на индикаторе устройства в двух единицах измерения - в международной системе единиц Паскали (Па или Pa) и во внесистемных единицах измерения - миллиметры ртутного столбца. Последнее скорее всего больше привычно для наших стран, так как применяется в прогнозах погоды. Однако функционал данного устройства не ограничивается измерением только атмосферного давления, также реализовано измерение температуры и определение высоты над уровнем моря (альтитуды).

Схема устройства на AVR микроконтроллере ATmega8 представлена ниже:

В качестве датчика атмосферного давления в схеме использован BMP180 производства компании Bosch. По правде говоря, эта компания делает хорошие и качественные вещи, но даташит на этот датчик составлен в сравнении с даташитами других компаний не очень развернуто, без опыта чтения подобной документации разобраться будет трудно. Инженеры Bosch посчитали необходимым дать информацию только по самым основным параметрам, но все что нам нужно все есть, хоть местами и кратко. Датчик атмосферного давления BMP180 может работать как по I2C интерфейсу, так и по SPI интерфейсу (выбирается подключением необходимых выводов датчика). В данной схеме используется I2C интерфейс. Так как датчик требует питания до 3,3 вольт, а микроконтроллер питается от 5 вольт постоянного напряжения, необходимо применить согласование уровней I2C для корректной работы. Для этой цели выбрана микросхема производства компании NXP PCA9517. Сам датчик берет питания от стабилизатора напряжения на 3,3 вольта, это же питание подается на подтягивающие резисторы R6 и R7. Уровни сигналов преобразовываются микросхемой PCA9517 и сигналы от датчика атмосферного давления передаются микроконтроллеру с уровнями до 5 вольт. 5 вольт подключается к подтягивающим резисторам R4 и R5. Эти подтягивающие резисторы (pull-up) необходимы для работы протокола I2C - с их помощью формируются высокие уровни сигнала, а когда микросхема проваливает это напряжение с подтягивающих резисторов в нулевой потенциал, формируется низкий логический сигнал. В данной конфигурации напряжений логических уровней 3,3 и 5 вольт можно обойтись на крайний случай и без согласования уровней, так как согласно стандартам при таких питающих напряжения потенциалы низких уровней у них одинаковые, а высокий уровень совпадает как у 5 вольт, так и у 3,3 вольт, разница заключается только в максимальных значениях. Однако было решено не рисковать и все же применить согласование уровней - сделать все по правилам. Номиналы подтягивающих резисторов можно взять от 4,7 кОм до 10 кОм. Конденсаторы C3 и C4 необходимы для стабильной работы датчика атмосферного давления.

Важной функцией в данном датчике атмосферного давления является калибровка полученных измерений. В памяти датчика есть 11 коэффициентов, предназначенных для улучшения точности измерения параметров. Однако не все так просто - домножить на эти коэффициенты так просто нельзя. для получения конечных результатов в даташите приведен целый пример расчета на странице 15, документация на датчик ниже. В соответствии с этой информацией составляем программу для микроконтроллера на языке Си.

// получить значения температуры и атмосферного давления с учетом калибровочных коэффициентов void BMP180_calculation (int32_t* temperature, int32_t* pressure) { //int8_t i; int32_t ut=0; int32_t up=0; int32_t x1, x2, b5, b6, x3, b3, p; uint32_t b4, b7; BMP180_get_temper(); ut+=temperature_1; BMP180_get_pressure(); up=pressure_1; x1 = ((int32_t)ut - (int32_t)ac6) * (int32_t)ac5 >> 15; x2 = ((int32_t)mc << 11) / (x1 + md); b5 = x1 + x2; *temperature = (b5 + 8) >> 4; b6 = b5 - 4000; x1 = (b2 * ((b6 * b6) >> 12)) >> 11; x2 = (ac2 * b6) >> 11; x3 = x1 + x2; b3 = (((((int32_t) ac1) * 4 + x3)<> 2; x1 = (ac3 * b6) >> 13; x2 = (b1 * ((b6 * b6) >> 12)) >> 16; x3 = ((x1 + x2) + 2) >> 2; b4 = (ac4 * (uint32_t) (x3 + 32768)) >> 15; b7 = ((uint32_t) (up - b3) * (50000 >> OSS)); //p = b7 < 0x80000000 ? (b7 * 2) / b4: (b7 / b4) * 2; if (b7 < 0x80000000) { p = (b7 << 1) / b4; } else { p = (b7 / b4) << 1; } x1 = (p >> 8) * (p >> 8); x1 = (x1 * 3038) >> 16; x2 = (-7357 * p) >> 16; *pressure = p + ((x1 + x2 + 3791) >> 4); }

У каждого датчика калибровочные коэффициенты свои (видимо на заводе их полностью задают в соответствии с какими-то контрольными испытаниями). Перед использованием эти коэффициенты нужно прочитать из регистра хранения датчика.

// получить данные для калибровки void BMP180_Calibration (void) { ac1 = Read(0xAA); ac2 = Read(0xAC); ac3 = Read(0xAE); ac4 = Read(0xB0); ac5 = Read(0xB2); ac6 = Read(0xB4); b1 = Read(0xB6); b2 = Read(0xB8); mb = Read(0xBA); mc = Read(0xBC); md = Read(0xBE); } // чтение регистра 16 бит uint16_t Read(uint8_t address) { uint16_t msb=0; uint16_t lsb=0; uint16_t data; i2c_start_cond(); // запуск i2c i2c_send_byte(BMP180_W); // передача адреса устройства, режим записи i2c_send_byte(address); // передача адреса памяти i2c_stop_cond(); // остановка i2c i2c_start_cond(); // запуск i2c i2c_send_byte(BMP180_R); // передача адреса устройства, режим чтения msb = i2c_get_byte(0); lsb = i2c_get_byte(1); i2c_stop_cond(); // остановка i2c data = (msb << 8) + lsb; return data; }

Для получения значения альтитуды или высоты над уровнем моря используем также формулу, приведенную в даташите и получаем такую функцию:

// функция расчета высоты над уровнем моря (альтитуда) (функция берет очень много памяти из-за математических функций!!!) void bmp180CalcAltitude(int32_t pressure){ float temp; temp = (float) pressure/101325; temp = 1-pow(temp, 0.19029); //altitude = round(44330*temp*10); altitude = 44330*temp*100; //get altitude in dm }

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

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

// прочитать значение атмосферного давления void BMP180_get_pressure(void){ i2c_start_cond(); // запуск i2c i2c_send_byte(BMP180_W); // передача адреса устройства, режим записи i2c_send_byte(0xF4); // передача адреса памяти i2c_send_byte(0x34+(OSS<<6)); // передача разрешения (oss) адреса памяти температуры i2c_stop_cond(); // остановка i2c _delay_ms(26); // время на замер (от 5 до 26 мс в зависимости от разрешения (oss)) i2c_start_cond(); // запуск i2c i2c_send_byte(BMP180_W); // передача адреса устройства, режим записи i2c_send_byte(0xF6); // передача адреса памяти i2c_stop_cond(); // остановка i2c i2c_start_cond(); // запуск i2c i2c_send_byte(BMP180_R); // передача адреса устройства, режим чтения D1=i2c_get_byte(0); // MSB D2=i2c_get_byte(0); // LSB D3=i2c_get_byte(1); // XLSB i2c_stop_cond(); // остановка i2c pressure_1 = ((D1 << 16) + (D2 << 8) + D3) >> (8-OSS); // вычислить давление (в Па) }

При сборке схемы датчик атмосферного давления BMP180 был применен на заводской печатной плате китайской сборки (модуль включает в себя стабилизатор питания на 3,3 вольта с конденсаторами, подтягивающие резисторы для интерфейса I2C и конденсаторы в обвязке самого датчика по питанию, микросхема или просто схема согласования уровней на данной плате отсутствует, поэтому необходимо применять в другом исполнении):

Питается вся схема от простого модуля питания на силовом трансформаторе. Переменное напряжение выпрямляется четырьмя диодами VD1 - VD4 марки 1N4007, пульсации сглаживаются конденсаторами C1 и C2. Номинал конденсатора C2 можно увеличить до 1000 - 4700 мкФ. Четыре выпрямительных диода можно заменить одним диодным мостом. Трансформатор применен марки BV EI 382 1189 - преобразует 220 вольт переменного тока в 9 вольт переменного тока. Мощность трансформатора составляет 4,5 Вт, этого вполне достаточно и еще с запасом. Такой трансформатор можно заменить любым другим силовым трансформатором, подходящим для Вас. Либо данный питающий модуль схемы заменить на импульсный источник напряжения, можно собрать схему обратноходового преобразователя либо применить иже готовый блок питания от телефона, например - все это дело вкусов и потребностей. Выпрямленное напряжение с трансформатора стабилизируется на микросхеме линейного стабилизатора L7805 , ее можно заменить на отечественный аналог пяти вольтового линейного стабилизатора КР142ЕН5А, либо применить другу микросхему стабилизатора напряжения в соответствии с подключением ее в схеме (например LM317 или импульсные стабилизаторы LM2576, LM2596, MC34063 и так далее). Далее 5 вольт стабилизируются другой микросхемой - AMS1117 в исполнении, дающей на выходе 3,3 вольта. Это напряжение используется для питания датчика атмосферного давления BMP180 в соответствии с документацией. Номиналы конденсаторов в обвязках микросхем стабилизаторов напряжения можно варьировать в широких пределах в области взятого порядка.

Ну и сердцем схемы является микроконтроллер Atmega8. данный микроконтроллер можно использовать как в корпусе DIP-28, так и в СМД исполнении в корпусе TQFP-32. Резистор R3 необходим для предотвращения самопроизвольного перезапускания микроконтроллера в случае появления случайных помех на выводе PC6. Резистор R3 подтягивает плюс питания к этому выводу, надежно создавая потенциал на нем. Для индикации измеряемых параметров используется жидко кристаллический (ЖК или LCD) дисплей SC1602. Он имеет 2 строки символов по шестнадцать штук в каждой из них. ЖК дисплей подключается к микроконтроллеру по четырех битной системе. Переменный резистор R2 необходим для регулировки контраста символов на дисплее. Вращением движка этого резистора добиваемся наиболее четких для нас показаний на экране. Подсветка ЖК дисплея организована через вывод "А" и "К" на плате дисплея. Подсветка включается через резистор, ограничивающий ток - R1. Чем больше номинал, тем более тускло будет подсвечиваться дисплей. Однако пренебрегать этим резистором не стоит во избежание порчи подсветки. Мощность всех резисторов постоянного сопротивления составляет 0,25 Вт.

Схема была собрана и отлажена на макетной плате для микроконтроллеров Atmega8:

В итоге данная схема имеет следующий функционал:

  • измерение и отображение атмосферного давления в двух единицах измерения (Паскали и миллиметры ртутного столбца)
  • измерение и отображение температуры окружающей среды
  • подсчет и отображение положения датчика относительно уровня моря (подсчет альтитуды)
  • данные на дисплее обновляются раз в две секунды

В данном устройстве показание положения относительно уровня моря именно высчитывается, а не измеряется. Расчет происходит по рекомендованной формуле из даташита упрощенного расчета положения относительно уровня моря в зависимости от атмосферного давления. Как известно, чем выше мы находимся, тем давление атмосферы меньше. Именно эта зависимость и используется при расчете. Однако, в связи с тем что для любой отдельной территории погода может меняться, а вместе с ней и атмосферное давление будет колебаться. Исходя из этих размышлений, а также опытных наблюдений, положение над уровнем моря будет постоянно плавать в зависимости от колебаний атмосферного давления (по идеи то высота не должна изменяться с такой скоростью). Эта функция рассматривается как дополнительная и не совсем достоверная (уровень над морем в течении дня может плавать плюс минус процентов 5 - а это много, я считаю). Но именно атмосферное давление измеряется данным датчиком вполне точно - совпадение с текущим прогнозом погоды от полного до расхождения не более одного процента. Температура в данном датчике измеряется также весьма точно.

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

Для программирования микроконтроллера Atmega8 необходимо знать конфигурацию фьюз битов (скриншот сделан в программе AVR Studio):

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

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 МК AVR 8-бит

ATmega8

1 В блокнот
IC2 ИС I2C интерфейса

PCA9517

1 В блокнот
IC3 Датчик атмосферного давления BMP180 1 В блокнот
VR1 Линейный регулятор

L7805AB

1 В блокнот
VR2 Линейный регулятор

AMS1117-3.3

1 В блокнот
VD1-VD4 Выпрямительный диод

1N4007

4 В блокнот
HG1 LCD-дисплей SC1602 1 На базе HD44780

Помню, когда совсем маленьким был, то мой дед никогда не слушал по радио прогноз погоды, он всегда смотрел на свой старенький стрелочный барометр, стрелок у него было как минимум две (точно не помню, ведь столько лет прошло), и никогда не ошибался!

Вот и я давно хотел у себя в хозяйстве иметь барометр, да все никак, то дорого, то не попадался, то еще какие-то препятствия. Но вот начал заниматься микроконтроллерами и стало возможным сделать барометр самому.
Поднакопил я в заначке от любимой жены деньжат и приобрел датчики, MPX4115AP(датчик давления) и HIH-4000-004(датчик влажности), почему именно эти? Да просто, потому что в интернете именно по ним есть много информации, да и в продаже они были, хотя и дорогие. Львиная доля стоимости всего устройства пришлась именно на них.
Оба датчика аналоговые, а это значит, что барометр должен представлять из себя двухвходовый вольтметр, с корректировкой показаний АЦП в мм.рт.ст. (миллиметры ртутного столба), и % (проценты влажности воздуха). Сам пересчет показаний АЦП в мм.рт.ст. , и % я добросовестно взял из статьи «Небольшая метеостанция своими руками» - http://www.avispro.com.ua/doc.php?id=1172

Но представленная в статье конструкция показалась мне избыточной, а мне хотелось сделать проще и обязательно на светодиодных индикаторах, так как они светятся и имеют большой размер, а значит, их будет хорошо видно издалека, и при любом освещении, да и ток потребляют они гораздо меньше чем подсветка ЖКИ.
Я применил индикатор ВА56-12SRWA(светодиодный семисегментный, 3 разряда ОА ), 2 штуки. Они сверхяркие, т.е. можно дополнительно снизить потребляемый ток.

О том, как использовать значения атмосферного давления и влажности воздуха в предсказании погоды можно прочитать, например, здесь - http://www.meteopost.com/info/Pressure/

Вот такая в результате получилась схема:

Разводка платы такая:

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

На входе АЦП конденсаторы по 0,33мкф на аналоговую землю, и резистор 750ом к датчикам. Это фильтры для снижения всевозможных помех на входы.

Выводы микроконтроллера AVCC и AREF зашунтированы керамическими конденсаторами по 0,1мкф, и еще по 10,0мкф танталовые (желтенькие со старых материнских плат).

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

Эта программа, конечно не эталон, но как вариант для начинающих вполне сгодится
Безусловно, можно добавить гашение незначащего нуля в индикаторе влажности, это несложно, можно покопаться и что-то еще поправить, ведь совершенству нет предела.
Я предоставляю читателям полную свободу действий по улучшению кода.

Статья рассчитана на людей, которые любят что-то создавать своими руками, именно для души, и морального удовлетворения.

Замечание: Коммерческое использование материалов данной статьи запрещено!

Код написан в CodeWizardAVR V2.04.4a
Плата разведена в Sprint-Layout 5.0
Схема нарисована в Splan7.0.0.8_portable_rus

Лучшие статьи по теме