Четверг, 21.11.2024
Завод горного оборудования
Меню сайта
Google_Translate
Категории раздела
Мои статьи [125]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Рейтинг@Mail.ru

Яндекс.Метрика
Главная » Статьи » Мои статьи

Как узнать высоту места используя BMP180

Высотомер (альтиметр) вычисляет абсолютную высоту места, т.е. высоту относительно уровня моря. За уровень моря (sea level) принято значение 1013 mb (760 мм рт.ст.). Высота выводится в метрах.

Схема соединений

Схема собрана на Arduino Uno, BMP180 и SSD1306

В источнике [1] использован дисплей SSD1306 с SPI интерфейсом. У меня дисплей SSD1306 с интерфейсом I2C, поэтому скетч изменен под этот интерфейс.

Скетч Altimeter_SSD1306.ino

#include "Wire.h"
#include "SFE_BMP180.h"

#include <Adafruit_SSD1306.h>

#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_RESET); // создаём объект "дисплей"

SFE_BMP180 pressure;
double baseline;

void setup() {
  Serial.begin(9600);

  // инициализация дисплея по интерфейсу I2C, адрес 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay(); // очистка дисплея

  pressure.begin();

  baseline = getPressure();
}

double getPressure()
{
  char status;
  double T, P, p0, a;
  status = pressure.startTemperature();
  if (status != 0)
  {
    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0)
    {
      status = pressure.startPressure(3);
      if (status != 0)
      {
        delay(status);
        status = pressure.getPressure(P, T);
        if (status != 0)
        {
          return (P);
        }
      }
    }
  }

}

void loop() {

  double alt, P;
  P = getPressure();
  baseline = 1013;
  alt = pressure.altitude(P, baseline);

  char status;
  double T;

  status = pressure.startTemperature();
  if (status != 0) {
    delay(status);

    status = pressure.getTemperature(T);
    if (status != 0) {

      status = pressure.startPressure(3);
      if (status != 0) {
        delay(status);

        status = pressure.getPressure(P, T);
        if (status != 0) {
          
          display.setTextSize(2); // установка размера шрифта
          display.setTextColor(WHITE); // установка цвета текста
          display.setCursor(12, 0); // установка курсора в позицию X = 12; Y = 0
          display.print ("Altitude "); // записываем в буфер дисплея нашу фразу
          display.setCursor(24, 16); // установка курсора в позицию X = 24; Y = 16
          display.print (String (alt) ); // записываем в буфер дисплея высоту

          display.display(); // и её выводим на экран

        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");

  delay(5000);
  display.clearDisplay();
}

Использовалась среда Arduino 1.8.19 в Windows 7. Библиотека Adafruit_SSD1306.h уже есть в этой среде, её нужно только подключить. Для этого в меню пройдите Скетч -> Подключить библиотеку -> Управлять библиотеками... В окне поиска Менеджера библиотек введите Adafruit SSD1306 и нажмите Enter. Через пару секунд в окне появится библиотека Adafruit SSD1306. Нажмите на кнопку Установка.
Также вам надо найти в интернете и скачать zip-архив библиотеки SFE_BMP180.h. Zip-архив этой библиотеки SFE_BMP180-master.zip можно взять и в Каталоге файлов на этом сайте. ZIP-архив библиотеки надо установить в среде Arduino IDE. Идем Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку...

В Каталоге файлов есть Altimeter_LCD1602.ino – вариант скетча для дисплея LCD 1602.

Барической ступенью называется изменение высоты на единицу давления. В условиях стандартной атмосферы 1 мм ртутного столба соответствует 11 метрам, а 1 Гектопаскаль (HPa) 9 метрам (30 футов). Для перевода давления из HPa в мм рт.ст. нужно значение в HPa умножить на 0,75 и наоборот. [10]

Атмосферное давление постоянно меняется, соответственно изменяется вычисленная высота местоположения. Для более - менее точного определения высоты надо использовать среднее значение давления для вашего места. У меня получилось значение 695 - 696 мм рт.ст. за полугодовой период наблюдений. Такому давлению соответствует высота 730 - 733 метра. Это хорошо согласуется с имеющимися данными в источниках.

Попробовал вывести в скетче на дисплей SSD1306 сообщение на русском языке. В интернете по теме русский текст на SSD1306 нашел форум arduino.ru, на котором обсуждалась эта тема с использованием библиотеки OLED_I2C. Приводится и ссылка  на скачивание этой библиотеки с русским шрифтом, но она оказалась битой. Библиотека не скачивается. Тогда скачал обычный вариант этой библиотеки с английскими шрифтами. Оказалось, что все шрифты находятся в файле DefaultFonts.c. На старом варианте этого форума пользователь b1ba_  в своем сообщении привел содержимое RusFont[]. Я добавил его в конец файла DefaultFonts.c и всё заработало. Получилась модифицированная библиотека OLED_I2C с русским шрифтом. Скачать zip-архив библиотеки OLED_I2C с русским шрифтом можно на этом сайте в Каталоге файлов.

Вариант скетча высотомера на русском языке:

Скетч Altimeter_Ru

// OLED_I2C_ViewFont
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// A quick demo of how to use my OLED_I2C library.
//
// To use the hardware I2C (TWI) interface of the Arduino you must connect
// the pins as follows:
//
// Arduino Uno/2009:
// ----------------------
// Display:  SDA pin   -> Arduino Analog 4 or the dedicated SDA pin
//           SCL pin   -> Arduino Analog 5 or the dedicated SCL pin
//
// Arduino Leonardo:
// ----------------------
// Display:  SDA pin   -> Arduino Digital 2 or the dedicated SDA pin
//           SCL pin   -> Arduino Digital 3 or the dedicated SCL pin
//
// Arduino Mega:
// ----------------------
// Display:  SDA pin   -> Arduino Digital 20 (SDA) or the dedicated SDA pin
//           SCL pin   -> Arduino Digital 21 (SCL) or the dedicated SCL pin
//
// Arduino Due:
// ----------------------
// Display:  SDA pin   -> Arduino Digital 20 (SDA) or the dedicated SDA1 (Digital 70) pin
//           SCL pin   -> Arduino Digital 21 (SCL) or the dedicated SCL1 (Digital 71) pin
//
// The internal pull-up resistors will be activated when using the
// hardware I2C interfaces.
//
// You can connect the OLED display to any available pin but if you use
// any other than what is described above the library will fall back to
// a software-based, TWI-like protocol which will require exclusive access
// to the pins used, and you will also have to use appropriate, external
// pull-up resistors on the data and clock signals.
//

#include "Wire.h"
#include "SFE_BMP180.h"

#include "OLED_I2C.h" // библиотека для oled экрана

OLED  myOLED(SDA, SCL, 8); // создаем объект myOLED
extern uint8_t RusFont[]; // подключаем русский шрифт
extern uint8_t BigNumbers[]; // подключаем BigNumbers шрифт

SFE_BMP180 pressure;
double baseline;


void setup() {
  Serial.begin(9600);

  myOLED.begin();
  myOLED.setFont(RusFont);

  pressure.begin();
  baseline = getPressure();
}

double getPressure()
{
  char status;
  double T, P, p0, a;
  status = pressure.startTemperature();
  if (status != 0)
  {
    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0)
    {
      status = pressure.startPressure(3);
      if (status != 0)
      {
        delay(status);
        status = pressure.getPressure(P, T);
        if (status != 0)
        {
          return (P);
        }
      }
    }
  }

}

void loop() {

  double alt, P;
  P = getPressure();
  baseline = 1013;
  alt = pressure.altitude(P, baseline);

  char status;
  double T;

  status = pressure.startTemperature();
  if (status != 0) {
    delay(status);

    status = pressure.getTemperature(T);
    if (status != 0) {

      status = pressure.startPressure(3);
      if (status != 0) {
        delay(status);

        status = pressure.getPressure(P, T);
        if (status != 0) {
          myOLED.clrScr();      // Стираем все с экрана
          myOLED.invert(false); // Фон экрана черный
          myOLED.setFont(RusFont); // устанавливаем русский шрифт
          myOLED.print("DSCJNF D VTNHF{", CENTER, 0); // Выводим надпись "ВЫСОТА В МЕТРАХ" по центру
          
          myOLED.setFont(BigNumbers);   // переходим на шрифт с большими цифрами (BigNumbers)
          myOLED.print(String (alt), CENTER, 20 );      // выводим на дисплей высоту места
          myOLED.update();  // Обновляем информацию на дисплее
        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");

  delay(5000);    // Пауза 5 секунд

}

Скачать скетчи и библиотеки

 

Пример вывода русских букв на экран SSD1306

Набирать русский текст довольно легко. Переключаем клавиатуру на английскую раскладку и набираем текст, нажимая клавиши с русскими буквами [7]. Получаем нечитаемый английский текст, но при выводе на дисплей SSD1306 вы получите правильный русский текст. Для прописных русских букв нажмите Shift. Там же приводится таблица соответствия английских и русских букв.
В версию 2.10 библиотеки OLED_I2C добавлена поддержка ESP8266.

Скетчи и библиотеки к ним можно скачать в Каталоге файлов.
Скетч может не работать, если адреса ваших устройств на шине I2C не совпадают с указанными в скетче. Запустите скетч I2C_Scanner и определите адреса устройств. Исправьте в скетче адреса на полученные реальные адреса устройств.

Использованные ресурсы

1. https://www.engineersgarage.com/arduino-bmp180-ssd1306-oled-altitude-meter/
2. https://arduino-site.ru/datchik-davleniya/?ysclid=lrthkbfma532890050
3. https://robohobby.by/lessons/oled_tutorial/?ysclid=lrudvfzc7l984453294
4. https://роботехника18.рф/oled-arduino/?ysclid=lrudufhf7u842909006
5. https://arduino.ru/forum/programmirovanie/pomogite-razobratsya-s-displeem-oled-lcd-display-i2c-096-iic-serial-128x64?page=2
6. https://arduino.ru/forum/obshchii/vyvod-russkogo-teksta-na-oled-096-129x64-displei
7. https://hcomp.ru/blog/po/?ysclid=lrtyuceext338722074
8. https://роботехника18.рф/oled-arduino/?ysclid=lrteuc6gzr779939868
9. https://microcontrollerslab.com/arduino-bmp180-barometric-sensor-oled/
10. https://training.urrv.ru/выдерживание-высот/?ysclid=lzqz578334951926659

Последнее редактирование статьи 13.08.2024

Категория: Мои статьи | Добавил: zgo (26.01.2024)
Просмотров: 206 | Комментарии: 1 | Теги: высотомер, BMP180, SSD1306, russian text, русский текст, altimeter | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Поиск
Друзья сайта
  • Создать сайт
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Все проекты компании
  • Сайт завода zgo.ucoz.ru
  • Забайкальский край
    Дарасун
    Яндекс.Погода


    Хостинг Ucoz опять навязал видеорекламу, но обещает - "мы настроили систему так, чтобы в сутки на уникального посетителя приходилось не более двух показов."
    Совет, как не смотреть видеорекламу.

    Или используйте Uran - браузер от Ucoz без рекламы Скачать

    или подключите к браузеру блокировщик рекламы, например, Adblock Plus или uBlock Origin

    Универсальный декодер кириллицы



    Защита, контроль, управление.



    DONATE (поддержи автора)
    Все статьи авторские, при использовании прошу ссылаться на сайт
    Copyright Дарасунский завод горного оборудования © 2004 - 2024
    Бесплатный конструктор сайтов - uCoz