Высотомер (альтиметр) вычисляет абсолютную высоту места, т.е. высоту относительно уровня моря. За уровень моря (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
|