Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Барометр на Arduino

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

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

Немного предыстории и актуализации самоделки. Думаю, что такое "барометр" и "давление" объяснять не нужно, перейду сразу к делу. В продаже на сегодняшний день имеется много моделей различных барометров: электронных, механических, или их комбинации. Но многие из них имеют один существенный недостаток. Дело в том, что сама по себе абсолютная величина атмосферного давления, в отличие от температуры, например, не так важна и интересна, как направление и скорость ее изменения. Поэтому, говоря о давлении, гораздо важней знать, насколько оно поменялось за определенный интервал времени. В классическом барометре-анероиде эта проблема решается посредством дополнительной стрелки, с помощью которой можно вручную засечь предыдущие показания прибора и при следующем наблюдении уже делать выводы об их изменении. Что не очень удобно и не слишком информативно. В электронных и гибридных барометрах эта проблема решена построением графика изменения давления, и вроде все хорошо, но есть один нюанс - это их цена. Те, что я видел в продаже, стоили от 5-6 тыс рублей, что на мой взгляд необоснованно дорого. Ну и конечно самый главный аргумент в пользу самостоятельного изготовления - этот барометр будет сделан своими руками, что несомненно будет греть душу, ради чего мы, собственно, здесь все и собрались. Итак, поехали!

 

Технические характеристики:

  • Измеряемое давление: от 225 мм.рт.ст. до 825 мм.рт.ст. (График на экране строится по умолчанию от 730 до 760, можно изменить в скетче) 
  • Буфер измерений: последние 24 часа. 
  • Переключаемый период отображения на экране: 3ч, 6ч, 12ч, 24ч.
  • Периодичность обновления текущих данных: 11,25 минут.
  • Сохранение в данных в памяти (предотвращение потери накопленного массива в случае кратковременного отключения питания устройства) с возможностью сброса.

 

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

  • Экран LCD 2004 (с модулем I2C PCF8574)
  • Плата Arduino Nano/Uno или что то похожее (ATmega 328, 168 будет маловато)
  • Датчик давления BME280 (Можно BMP280)
  • Кнопка тактовая, 1 штука
  • Провода, корпус, источник питания на 5 вольт (По вкусу, кому как удобней, благо вариантов корпусов в продаже много).

Схема подключения:

Вкратце опишу словами. Я использовал текстовый дисплей 20*4 с припаянным переходником на I2C (PCF8574). Переходник дисплея и датчик BME280 подключаются к шине I2С, к одним и тем же пинам соответcтвенно (SDA - A4, SCL - A5). Программно обрабатываемая кнопка подключена к пину 3 (D3) и к земле, она отвечает за переключение периода времени измерений, выводимого на экран. Вторая кнопка включает подсветку, при необходимости, замыкая непосредственно ее цепь.

Теперь немного о логике работы программы. Сам код очень подробно прокомментирован, поэтому разобраться при желании труда не составит, опишу общие моменты. 

Основная идея заключается в следующем. На экране после вывода текстовой информации у нас остается 16 колонок для отображения диаграммы изменения давления, от этой цифры и будем отталкиваться. Минимальный промежуток времени, отображаемый на диаграмме, - это три часа (изначально хотел сделать час, но так часто смысла нет, давление так быстро не меняется). 3 часа = 180 минут/16 столбиков, т.е. 1 столбик при таком разрешении будет соответствовать 11,25 минут или 675000 миллисекунд. Это будет базовый интервал, именно через такие промежутки времени будем получать показания с датчика. Каждые 11,25 минут мы снимаем показания атмосферного давления и записываем их в массив размером 128 элементов (что соответствует ровно суткам, т.е. максимальному интервалу измерений). 

Дальше поступаем следующим образом: если выбран интервал три часа, то для построения диаграммы просто используем 16 последних значений. Если выбран интервал 6 часов, то из исходного массива берем так же 16 значений но выбираем их уже через одно (1,3,5 и т.д.), то же самое для 12 часов - каждое четвертое значение, и для 24 - каждое восьмое соответственно. Для примера постарался отобразить это в таблице в Excel:

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

 

Пробежимся по самому коду:

#define MIN_VAL 730                          //Минимально значение отображаемое на графике
#define MAX_VAL 760                          //Максимальное значение отображаемое на графике

Здесь можно задать пределы отображения давления на графике. По моим наблюдениям, в нашей местности давление редко опускается ниже 730 и поднимается выше 760, поэтому такой диапазон и был выбран. К тому же, от верхнего до нижнего края экрана - 32 строчки (8 точек в знакоместе * 4 строки), поэтому изменение давления на 1 мм.рт.ст. уже будет видно на диаграмме.

 

Логика работы основного цикла программы несложная. Обрабатываем нажатие кнопки (оно обрабатывается в прерывании, но и в основном цикле тоже должно присутствовать), которая циклически переключает интервал отображения. Далее идут два таймера. Первый каждые 11,25 минут сдвигает основной массив на один элемент,  дописывает в него новое значение атмосферного давления и сохраняет массив в памяти. Второй таймер, согласно установленному интервалу отображения данных, обновляет информацию на экране получая данные из основного массива.

Используемые функции.

 

void initPlot()

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

 

void get_data ()

Эта функция передает 16 выбранных значений из базового массива в функцию отрисовки диаграммы (drawPlot), рассчитывает дельту давления за выбранный период и вызывает функцию вывода текстовой информации на экран (screen_data). 

 

void screen_data (int value, int delta, byte interval)

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

 

void drawPlot(byte pos, byte row, byte width, byte height, int min_val, int max_val, int fill_val)

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

 

void update_all ()
void read_all ()

Функции записи (обновления) и чтения данных в/из памяти EEPROM. Не то чтобы это было обязательно для этого проекта, но, как я уже говорил, на случай отключения питания устройства мне показалось полезной возможность сохранить накопленный за сутки массив данных. Если отключение было долгим, из-за чего данные в памяти стали неактуальными, или просто хочется начать отсчет с нуля, есть возможность обнулить информацию. Для этого надо выключить устройство, зажать кнопку переключения диапазона и подать питание. После этого массив в памяти будет обнулен, и на экране отобразится сообщение об этом: "Reset data OK". 

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

На этом, вроде, все, на последок несколько фотографий готового устройства:

Вопросы, замечания и т.д. прошу в комментарии. Спасибо за внимание!

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (3) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
Ольга #
Барометр замечательный. Яркий экран, спокойный для глаз фон. И главное его преимущество, по сравнению с другими моделями - компактность.
Ответить
0

[Автор]
AMatroskin #
Скорректированный код для работы с датчиком BMP280 (без влажности) выложен в теме на форуме по ссылке выше.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Печатная плата для усилителя "LM3886 + AD825" USB-реле (2 канала)
вверх