Перейти к содержанию

Барометр на Arduino


Рекомендуемые сообщения

Барометр/барограф на ардуино с отображением на LCD экране графика изменения давления за выбранный период.

Ссылка на статью: //cxem.net/arduino/arduino273.php

Автор статьи: //cxem.net/profile/22479/

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Небольшие корректировки, для тех кто хочет поменять датчик на BMP280 (который дешевле и без влажности). 

Цитата

Датчик у меня BMP280, работать с той библиотекой, которая у вас в скетче (BME280) —  не захотел, писал No Connection to sensor. Хотя из монитора порта видно под тестовым скетчем — что он работает, отдает данные под адресом 76. Заменил библиотеку на Adafruit_BMP280.h и внес исправления по тексту, где вызывалась bme — заменил на bmp.

Исправленный код:
 

/*
Барометр с цифровым и графическим отображение данных атмосферного давления.
Компоненты: Экран текстовый LCD 2004, платформа: arduinio nano/uno (Atmega328 или больше),датчик давления: BMP 280.
Amatroskin 2022 год.
*/

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "GyverButton.h"
#include <Adafruit_Sensor.h>                 
#include <Adafruit_BMP280.h>               

#define SEALEVELPRESSURE_HPA (989.70)       // Задаем высоту
#define BTN_PIN 3                            //Пин кнопки
#define BASE_PERIOD 675000                   //Период набора основного массива 675000мс = 11,25 мин (*16 столбиков = 3 часа) максимальное разрешение графика
#define MIN_VAL 730                          //Минимально значение отображаемое на графике
#define MAX_VAL 760                          //Максимальное значение отображаемое на графике 

LiquidCrystal_I2C lcd(0x27, 20, 4);          //Создаем необходимые объекты
GButton butt1(BTN_PIN);
Adafruit_BMP280 bmp;

uint32_t tmr1, tmr2;                          //переменные таймеров
uint32_t  set_period = BASE_PERIOD;           //Период отображения, изменяется кратно 3 часам (3, 6, 12, 24)
int16_t plot_array[20];                       //Массив данных для отрисовки графика
uint16_t base_array [128];                    //Базовый массив хранит все измерения за последние сутки (128 ячеек * 11,25 минут = 1440 минут = 24 часа)
int16_t value, delta;                         //Текушие (снимаемые) показания, разница показаний за выбранный отрезок времени
byte interval = 1;                            //Интервал отображаемый на экране (разница во времени между соседними столбиками диаграммы)
                                              // 11,25 мин * 16 = 3 часа, 22,5 мин - 6 часов, 45мин - 12 часов, 90 мин - 24 часа
void setup() {
  read_all ();
  //  Serial.begin(9600);
  attachInterrupt(1, isr, CHANGE);
  butt1.setDebounce(80);                      // настройка антидребезга (по умолчанию 80 мс)
  butt1.setTimeout(300);                      // настройка таймаута на удержание (по умолчанию 500 мс)
  lcd.init();
  lcd.backlight();
  lcd.clear();
  if (!bmp.begin(0x76)) {                              //Инициализация датчика BME280 по адресу 0x76 (по умолчанию)
    //Serial.println("Could not find a valid BMP280!");//Печать сообщения об ошибке в монитор порта
    lcd.setCursor(3, 1);
    lcd.print(F("No connection"));                     //___________________________или на самом экране
    lcd.setCursor(5, 2);
    lcd.print(F("to sensor"));
    while (1);                                          //без датчика дальше не пойдет
  }

  if (!digitalRead(BTN_PIN)) {                          //Сброс настроек при включении с зажатой кнопкой
    for (byte i = 0; i < 128; i++) base_array [i] = 0;  //Стереть данные
    update_all ();                                      //Сохранить
    lcd.setCursor(5, 1);                                //Сообщить об этом
    lcd.print(F("Reset data"));
    lcd.setCursor(9, 2);
    lcd.print(F("OK"));
  }
  while (!digitalRead(BTN_PIN));
  lcd.clear();
    
  initPlot();                                           //Инициализация символов для отрисовки
  
  value = round ((bmp.readPressure() / 133.32239023154F));//Снимаем текущие показания, конвертируем в мм.рт.ст.
  base_array[0] = value;
  get_data ();
}

void isr() {                                              //Опрашиваем кнопку в прерывании, чтобы поймать нажатие в любом случае
  butt1.tick();
}

void loop() {
  butt1.tick();                                           //Опрос кнопки
  if (butt1.isClick()) {                                  //При нажатии:
    interval *= 2;                                        //Переключаем масштаб диаграммы
    if (interval > 8) interval = 1;
    set_period = BASE_PERIOD * interval;                  //Пересчитываем интервал обновления данных с датчика
    get_data ();                                          //Обновляем информацию на дисплее
  }
                            
  if (millis() - tmr1 >= BASE_PERIOD) {                   //Набираем базовый массив данных
    tmr1 = millis();                                      //Каждые 11,25 минут снимаем показания с датчика
    for (int i = 126; i >= 0; i--) {                      //Сдвигаем весь массив на один пункт
      base_array[i + 1] = base_array[i];
    }
    value = round ((bmp.readPressure() / 133.32239023154F));//Переводим в мм/рт.ст.
    base_array[0] = value;                                 //Записываем последние показания в массив
    update_all ();                                         //И запоминаем в EEPROM
  }

  if (millis() - tmr2 >= set_period) {                     //Через промежуток времени set_period (миллисекунды)
    tmr2 = millis();                                       //Обновляем данные на экране
    get_data ();
  }
}

void get_data () {                                          //Отрисовываем 16 столбиков диагаммы на экране
  for (int i = 15; i >= 0; i--) {
    drawPlot(0, 3, 16, 4, MIN_VAL, MAX_VAL, (base_array[i * interval]));
  }
  delta = ((base_array[0]) - (base_array[15 * interval]));  //Расчитываем дельту (изменение давления) за выбранный интервал 
  screen_data (value, delta, (interval * 3));               //Выводим текстовую информацию на экран
}

void screen_data (int value, int delta, byte interval) {    //Функция вывода текстовой информациина экран (все кроме столбиков диаграмы) 
  lcd.setCursor(17, 0);
  lcd.print(value);
  lcd.setCursor(17, 2);
  if (delta == value) delta = 0;
  if (delta > 0) {
    lcd.print("+");
  } else if (delta < 0) {
    lcd.print("-");
  } else if (delta == 0) {
    lcd.print(" ");
  }
  lcd.setCursor(18, 2);
  lcd.print(abs(delta));
  if (abs(delta) < 10) {
    lcd.setCursor(19, 2);
    lcd.print(" ");
  }
  lcd.setCursor(17, 1);
  lcd.print("mmH");
  lcd.setCursor(17, 3);
  lcd.print(interval);
  (interval < 10) ? lcd.print("h ") : lcd.print("h");
}

void initPlot() {
  // необходимые символы для работы
  // создано в http://maxpromer.github.io/LCD-Character-Creator/
  byte row8[8] = {0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111};
  byte row7[8] = {0b00000,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111};
  byte row6[8] = {0b00000,  0b00000,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111};
  byte row5[8] = {0b00000,  0b00000,  0b00000,  0b11111,  0b11111,  0b11111,  0b11111,  0b11111};
  byte row4[8] = {0b00000,  0b00000,  0b00000,  0b00000,  0b11111,  0b11111,  0b11111,  0b11111};
  byte row3[8] = {0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b11111,  0b11111,  0b11111};
  byte row2[8] = {0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b11111,  0b11111};
  byte row1[8] = {0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b00000,  0b11111};
  lcd.createChar(0, row8);
  lcd.createChar(1, row1);
  lcd.createChar(2, row2);
  lcd.createChar(3, row3);
  lcd.createChar(4, row4);
  lcd.createChar(5, row5);
  lcd.createChar(6, row6);
  lcd.createChar(7, row7);
}

                                              //Отрисовка диаграммы, код взят у Гайвера https://alexgyver.ru/lcd-plots-and-bars/
void drawPlot(byte pos, byte row, byte width, byte height, int min_val, int max_val, int fill_val) {

  for (byte i = 0; i < width; i++) {
    plot_array[i] = plot_array[i + 1];
  }
  fill_val = constrain(fill_val, min_val, max_val);
  plot_array[width - 1] = fill_val;
  for (byte i = 0; i < width; i++) {         // каждый столбец параметров
    int infill, fract;
    
                                             // найти количество целых блоков с учётом минимума и максимума для отображения на графике
    infill = floor((float)(plot_array[i] - min_val) / (max_val - min_val) * height * 10);
    fract = (infill % 10) * 8 / 10;                          // найти количество оставшихся полосок
    infill = infill / 10;
    for (byte n = 0; n < height; n++) {     // для всех строк графика
      if (n < infill && infill > 0) {       // пока мы ниже уровня
        lcd.setCursor(i, (row - n));        // заполняем полными ячейками
        lcd.write(0);
      }
      if (n >= infill) {                          // если достигли уровня
        lcd.setCursor(i, (row - n));
        if (fract > 0) lcd.write(fract);          // заполняем дробные ячейки
        else lcd.write(16);                       // если дробные == 0, заливаем пустой
        for (byte k = n + 1; k < height; k++) {   // всё что сверху заливаем пустыми
          lcd.setCursor(i, (row - k));
          lcd.write(16);
        }
        break;
      }
    }
  }
}

void update_all () {                             //Обновляем данные в EEPROM
  eeprom_update_block((void*)&base_array, 0, sizeof(base_array));
}

void read_all () {                              //Читаем данные из EEPROM
  eeprom_read_block((void*)&base_array, 0, sizeof(base_array));
}

Спасибо коллеге за доработки!

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Мне не нравятся подобные дисплеи, для промышленного оборудования нормально, а дома не хочу на такой смотреть. У нас на работе они применяются.

Лужу, паяю, ЭВМ починяю!

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

9 часов назад, O5-14 сказал:

 Нормальный экран вместо всяких стекляшек от мобилок, отлично)

У МЭЛТ'а есть шикарный большой MT-20S4M^_^

кому он нужен по такой цене для любительских поделок????? 

Цена 2418 руб. (от 1 шт.)

Цена 1579 руб. (от 16 шт.)

Цена1547 руб.(от 54 шт.)

 

2004 с впаянным i2c стоит 300-500 максимум )))))

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

  • 1 месяц спустя...
В 22.06.2023 в 20:58, O5-14 сказал:

 У МЭЛТ'а есть шикарный большой MT-20S4M^_^

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

Ссылка на комментарий
Поделиться на другие сайты

13 минут назад, Александр Матроскин сказал:

(работают на общественном транспорте)

Современных выпусков ? Недавно проблема появилась ? Температурно-влажностной режим тоже под вопросом. 

Ссылка на комментарий
Поделиться на другие сайты

22 часа назад, O5-14 сказал:

Современных выпусков ? Недавно проблема появилась ? Температурно-влажностной режим тоже под вопросом. 

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...