Высотомер-даталоггер: ESP32 с BMP388, хранение данных на MicroSD карте и OLED дисплей

В этом проекте мы создадим высотомер-даталоггер с ESP32 и датчиком BMP388. BMP388 – это точный датчик давления, который позволяет оценивать высоту с высокой точностью. В данном проекте давление и высота записываются в файл на карте microSD. Мы также добавили OLED дисплей к этому проекту, чтобы вы могли проверить текущую высоту, нажав на кнопку.

Высотомер-даталоггер ESP32 с BMP388, хранение на MicroSD карте и OLED дисплей

Для руководства по началу работы с BMP388 ознакомьтесь со следующим учебником: ESP32 with BMP388 Barometric/Altimeter Sensor (Arduino IDE)

Обзор проекта

Прежде чем переходить непосредственно к проекту, давайте рассмотрим основные особенности этого проекта.

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

HTML форма ESP32 для ввода давления на уровне моря
  • ESP32 подключен к датчику давления BMP388, модулю карты microSD, OLED дисплею и кнопке.

  • Каждую минуту (или другой период времени, который вы зададите в коде) ESP32 записывает новые показания датчика в файл на карте microSD (2). Записываются текущее давление на уровне моря, текущее давление в месте расположения датчика, температура и оценка высоты.

  • Когда вы нажимаете кнопку, OLED дисплей включается и показывает текущую высоту и температуру (3). Через 5 секунд он выключается (для экономии энергии).

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

Необходимые компоненты

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

ESP32 BMP388 датчик высоты давления температуры Arduino OLED SSD1306 MicroSD карта - демонстрация

Предварительные требования

Прежде чем продолжить, убедитесь, что вы выполнили следующие предварительные требования.

1. Установка платы ESP32 в Arduino IDE

Мы будем программировать ESP32 с помощью Arduino IDE. Поэтому у вас должно быть установлено дополнение ESP32. Следуйте следующему руководству, если вы еще этого не сделали:

Если вы хотите использовать VS Code с расширением PlatformIO, следуйте следующему руководству, чтобы узнать, как программировать ESP32:

2. Установка библиотек

Для сборки этого проекта вам необходимо установить следующие библиотеки:

Вы можете установить эти библиотеки через менеджер библиотек Arduino. Перейдите в Sketch > Include Library > Manage Libraries и найдите нужную библиотеку по имени.

Установка библиотек (VS Code + PlatformIO)

Если вы программируете ESP32 с помощью PlatformIO, добавьте следующие строки в файл platformio.ini для подключения библиотек (также измените скорость Serial Monitor на 115200):

monitor_speed = 115200
lib_deps =   ESP32Async/AsyncTCP
        ESP32Async/ESPAsyncWebServer
     adafruit/Adafruit SSD1306@^2.4.6
     adafruit/Adafruit GFX Library@^1.10.10
     adafruit/Adafruit BMP3XX Library@^2.1.0

3. Форматирование карты MicroSD

Прежде чем продолжить с руководством, убедитесь, что вы отформатировали карту microSD в формате FAT32. Следуйте приведенным ниже инструкциям для форматирования карты microSD или используйте программу, такую как SD Card Formatter (совместима с Windows и Mac OS).

1. Вставьте карту microSD в компьютер. Перейдите в Мой компьютер и щелкните правой кнопкой мыши по SD-карте. Выберите Форматировать, как показано на рисунке ниже.

Форматирование MicroSD карты - шаг 1

2. Откроется новое окно. Выберите FAT32, нажмите Начать, чтобы инициализировать процесс форматирования, и следуйте инструкциям на экране.

Форматирование MicroSD карты - шаг 2

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

Подключите все компоненты, как показано на следующей схеме.

Схема подключения ESP32 BMP388 Даталоггер OLED кнопка

Вы также можете проверить подключение в следующей таблице:

Компонент

Назначение выводов ESP32

BMP388

GPIO 21 (SDA), GPIO 22 (SCL)

OLED дисплей

GPIO 21 (SDA), GPIO 22 (SCL)

Модуль карты MicroSD

GPIO 5 (CS), GPIO 23 (MOSI), GPIO 18 (CLK), GPIO 19 (MISO)

Кнопка

GPIO 4

Код

Скопируйте следующий код на вашу плату ESP32, и проект заработает сразу.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/altimeter-datalogger-esp32-bmp388/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

//Libraries for microSD card
#include "FS.h"
#include "SD.h"
#include "SPI.h"

AsyncWebServer server(80);

// Replace with your network credentials
const char* ssid     = "ESP32";
const char* password = NULL;

//OLED Display
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Variables for BMP388
float seaLevelPressure = 1013.25;
Adafruit_BMP3XX bmp;
float alt;
float temp;
float pres;
String dataMessage;

//Pushbutton
const int buttonPin = 4;
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

//Timers for datalogging
unsigned long lastTimer = 0;
unsigned long timerDelay = 18000;

const char* PARAM_INPUT_1 = "seaLevelPressure";

// HTML web page to handle 1 input field
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
  <title>Sea Level Pressure</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  </head><body>
  <form action="/get">
    Sea Level Pressure: <input type="float" name="seaLevelPressure">
    <input type="submit" value="Submit">
  </form>
</body></html>)rawliteral";

void initBMP(){
  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  //if (! bmp.begin_SPI(BMP_CS)) {  // hardware SPI mode
  //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) {  // software SPI mode
    Serial.println("Could not find a valid BMP3 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);
}

void getReadings(){
  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  temp = bmp.temperature;
  pres = bmp.pressure / 100.0;
  alt = bmp.readAltitude(seaLevelPressure);
}

void initDisplay(){
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(500);
  display.clearDisplay();
  display.setTextColor(WHITE);
}

void displayReadings(){
  display.clearDisplay();
  // display temperature
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Temperature: ");
  display.setTextSize(2);
  display.setCursor(0,10);
  display.print(String(temp));
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(2);
  display.print("C");
  // display altitude
  display.setTextSize(1);
  display.setCursor(0, 35);
  display.print("Altitude: ");
  display.setTextSize(2);
  display.setCursor(0, 45);
  display.print(String(alt));
  display.print(" m");
  display.display();
}

// Initialize SD card
void initSDCard(){
   if (!SD.begin()) {
    Serial.println("Card Mount Failed");
    return;
  }
}

// Write to the SD card
void writeFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path, FILE_WRITE);
  if(!file) {
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.print(message)) {
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
}

// Append data to the SD card
void appendFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, FILE_APPEND);
  if(!file) {
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.print(message)) {
    Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

// Initialize WiFi
void initWiFi() {
  WiFi.softAP(ssid, password);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
}

void setup() {
  Serial.begin(115200);
  initBMP();
  initDisplay();
  initSDCard();
  initWiFi();
  pinMode(buttonPin, INPUT);

  File file = SD.open("/data.txt");
  if(!file) {
    Serial.println("File doesn't exist");
    Serial.println("Creating file...");
    writeFile(SD, "/data.txt", "Pressure, Altitude, Temperature \r\n");
  }
  else {
    Serial.println("File already exists");
  }
  file.close();

  // Send web page with input fields to client
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/html", index_html);
  });

  // Send a GET request to <ESP_IP>/get?input1=<inputMessage>
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    // GET input1 value on <ESP_IP>/get?input1=<inputMessage>
    if (request->hasParam(PARAM_INPUT_1)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      seaLevelPressure = inputMessage.toFloat();
    }
    else {
      inputMessage = "No message sent";
    }
    Serial.println(inputMessage);
    request->send(200, "text/html", "HTTP GET request sent to your ESP on input field with value: " + inputMessage +
                                     "<br><a href=\"/\">Return to Home Page</a>");
  });
  server.begin();

}
void loop() {
  int reading = digitalRead(buttonPin);
  display.clearDisplay();

  // Light up when the pushbutton is pressed
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
        getReadings();
        displayReadings();
        delay(5000);
        display.clearDisplay();
        display.display();
        lastDebounceTime = millis();
      }
    }
  }
  lastButtonState = reading;

  // Log data every timerDelay seconds
  if ((millis() - lastTimer) > timerDelay) {
    //Concatenate all info separated by commas
    getReadings();
    dataMessage = String(pres) + "," + String(alt) + "," + String(temp)+ "," + String(seaLevelPressure) + "\r\n";
    Serial.print(dataMessage);
    //Append the data to file
    appendFile(SD, "/data.txt", dataMessage.c_str());
    lastTimer = millis();
  }
}

Просмотреть исходный код

Как работает код

Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу демонстрации.

Начните с подключения всех необходимых библиотек:

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BMP3XX.h"
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
//Libraries for microSD card
#include "FS.h"
#include "SD.h"
#include "SPI.h"

Следующие строки задают имя и пароль для точки доступа. В данном случае мы устанавливаем пароль в NULL – это создает открытую точку доступа. Вы можете добавить пароль для точки доступа, если хотите.

// Replace with your network credentials
const char* ssid     = "ESP32";
const char* password = NULL;

Задайте размер OLED дисплея и создайте экземпляр на стандартных I2C выводах.

// OLED Display
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

Мы устанавливаем давление на уровне моря по умолчанию 1013.25 гПа. Однако вам следует подключиться к точке доступа, чтобы изменить это значение для получения более точных результатов.

float seaLevelPressure = 1013.25;

Создайте экземпляр для датчика BMP388 под именем bmp – это автоматически использует стандартные выводы I2C.

Adafruit_BMP3XX bmp;

Следующие переменные будут использоваться для сохранения данных датчика.

float alt;
float temp;
float pres;
String dataMessage;

Кнопка подключена к GPIO 4.

const int buttonPin = 4;

Переменные buttonState и lastButtonState сохраняют текущее состояние кнопки и последнее состояние кнопки.

int buttonState;
int lastButtonState = LOW;

Следующие переменные используются для устранения дребезга кнопки.

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

Показания BMP388 сохраняются каждую минуту. Вы можете изменить это в переменной timerDelay (в миллисекундах).

//Timers for datalogging
unsigned long lastTimer = 0;
unsigned long timerDelay = 60000;

Переменная PARAM_INPUT_1 будет использоваться для поиска входного значения в HTML форме. Чтобы узнать больше о HTML формах с ESP32, мы рекомендуем это руководство.

const char* PARAM_INPUT_1 = "seaLevelPressure";

Переменная index_html сохраняет простую HTML страницу, которая отображает поле ввода для текущего давления на уровне моря.

// HTML web page to handle 1 input field
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
  <title>Sea Level Pressure</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  </head><body>
  <form action="/get">
    Sea Level Pressure: <input type="float" name="seaLevelPressure">
    <input type="submit" value="Submit">
  </form>
</body></html>)rawliteral";

Когда вы отправляете новое значение давления, ESP32 получает запрос по следующему URL (например, давление = 1022):

/get?seaLevelPressure=1022

Инициализация BMP388

Функция initBMP() инициализирует датчик BMP388. Прочитайте руководство ESP32 with the BMP388, чтобы узнать больше.

void initBMP(){
  if (!bmp.begin_I2C()) {   // hardware I2C mode, can pass in address & alt Wire
  //if (! bmp.begin_SPI(BMP_CS)) {  // hardware SPI mode
  //if (! bmp.begin_SPI(BMP_CS, BMP_SCK, BMP_MISO, BMP_MOSI)) {  // software SPI mode
    Serial.println("Could not find a valid BMP3 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bmp.setTemperatureOversampling(BMP3_OVERSAMPLING_8X);
  bmp.setPressureOversampling(BMP3_OVERSAMPLING_4X);
  bmp.setIIRFilterCoeff(BMP3_IIR_FILTER_COEFF_3);
  bmp.setOutputDataRate(BMP3_ODR_50_HZ);
}

Получение показаний BMP388

Функция getReadings() получает новые показания: температуру, давление и высоту и сохраняет их в переменных temp, pres и alt.

void getReadings(){
  if (! bmp.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  temp = bmp.temperature;
  pres = bmp.pressure / 100.0;
  alt = bmp.readAltitude(seaLevelPressure);
}

Инициализация OLED дисплея

Функция initDisplay() инициализирует OLED дисплей.

void initDisplay(){
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(500);
  display.clearDisplay();
  display.setTextColor(WHITE);
}

Чтобы узнать больше об OLED дисплее с ESP32, прочитайте ESP32 OLED Display with Arduino IDE.

Отображение показаний BMP388

Функция displayReadings() отображает температуру и высоту на дисплее.

void displayReadings(){
  display.clearDisplay();
  // display temperature
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Temperature: ");
  display.setTextSize(2);
  display.setCursor(0,10);
  display.print(String(temp));
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(2);
  display.print("C");
  // display altitude
  display.setTextSize(1);
  display.setCursor(0, 35);
  display.print("Altitude: ");
  display.setTextSize(2);
  display.setCursor(0, 45);
  display.print(String(alt));
  display.print(" m");
  display.display();
}

Инициализация карты microSD

Функция initSDCard() инициализирует карту microSD на стандартных выводах SPI.

// Initialize SD card
void initSDCard(){
   if (!SD.begin()) {
    Serial.println("Card Mount Failed");
    return;
  }
}

Если вы хотите использовать другие выводы, прочитайте эту статью, чтобы узнать, как задать пользовательские выводы SPI.

Запись на карту microSD

Функции writeFile() и appendFile() записывают и добавляют сообщение в файл на карте microSD.

// Write to the SD card
void writeFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path, FILE_WRITE);
  if(!file) {
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.print(message)) {
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
}

// Append data to the SD card
void appendFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, FILE_APPEND);
  if(!file) {
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.print(message)) {
    Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

Чтобы узнать больше о функциях работы с картой microSD, прочитайте ESP32: Guide for MicroSD Card Module using Arduino IDE.

Настройка точки доступа

Инициализация Wi-Fi путем установки ESP32 в режим точки доступа.

// Initialize WiFi
void initWiFi() {
  WiFi.softAP(ssid, password);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
}

setup()

В setup() инициализируем Serial Monitor, датчик BMP388, OLED дисплей, карту microSD, запускаем точку доступа и определяем кнопку как INPUT.

Serial.begin(115200);
initBMP();
initDisplay();
initSDCard();
initWiFi();
pinMode(buttonPin, INPUT);

Создаем новый файл на карте microSD с именем data.txt, если он еще не существует.

File file = SD.open("/data.txt");
if(!file) {
  Serial.println("File doesn't exist");
  Serial.println("Creating file...");
  writeFile(SD, "/data.txt", "Pressure, Altitude, Temperature \r\n");
}
else {
  Serial.println("File already exists");
}
file.close();

Когда вы обращаетесь к точке доступа по корневому (/) URL, сервер (ESP32) отправляет HTML страницу (переменная index_html) с формой.

// Send web page with input fields to client
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html);
});

Следующая часть получает входное поле, которое вы ввели в форму, и сохраняет его в переменной seaLevelPressure.

// Send web page with input fields to client
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html);
});

// Send a GET request to <ESP_IP>/get?input1=<inputMessage>
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
  String inputMessage;
  // GET input1 value on <ESP_IP>/get?input1=<inputMessage>
  if (request->hasParam(PARAM_INPUT_1)) {
    inputMessage = request->getParam(PARAM_INPUT_1)->value();
    seaLevelPressure = inputMessage.toFloat();
  }
  else {
    inputMessage = "No message sent";
  }
  Serial.println(inputMessage);
  request->send(200, "text/html", "HTTP GET request sent to your ESP on input field with value: " + inputMessage +
                                     "<br><a href=\"/\">Return to Home Page</a>");
});

Чтобы узнать больше о том, как это работает, прочитайте: Input Data on HTML Form ESP32/ESP8266 Web Server using Arduino IDE.

loop()

В loop() мы проверяем состояние кнопки. Если она была нажата, мы включаем OLED дисплей с текущими показаниями температуры и высоты.

int reading = digitalRead(buttonPin);
display.clearDisplay();

// Light up when the pushbutton is pressed
if (reading != lastButtonState) {
  lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
  if (reading != buttonState) {
    buttonState = reading;
    if (buttonState == HIGH) {
      getReadings();
      displayReadings();
      delay(5000);
      display.clearDisplay();
      display.display();
      lastDebounceTime = millis();
    }
  }
}
lastButtonState = reading;

Мы также сохраняем новые показания каждые 60 секунд (переменная timerDelay).

if ((millis() - lastTimer) > timerDelay) {
  //Concatenate all info separated by commas
  getReadings();
  dataMessage = String(pres) + "," + String(alt) + "," + String(temp)+ "," + String(seaLevelPressure) + "\r\n";
  Serial.print(dataMessage);
  //Append the data to file
  appendFile(SD, "/data.txt", dataMessage.c_str());
  lastTimer = millis();
}

Демонстрация

Загрузите код на вашу плату. Не забудьте выбрать правильную плату (ESP32) и COM-порт.

После загрузки вы должны увидеть следующие сообщения в Serial Monitor*.

ESP32 BMP388 Высотомер-даталоггер демонстрация Serial Monitor

*В моем случае отображается «File already exists». Но при первом запуске должно отобразиться «File doesn’t exist», «Creating file …».

Через несколько секунд появятся первые показания.

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

HTML форма ESP32 для ввода давления на уровне моря

После нажатия кнопки отправки вы увидите введенное значение в Serial Monitor.

ESP32 BMP388 Высотомер-даталоггер Serial Monitor - новое значение давления на уровне моря

Если вы нажмете на кнопку, вы сможете проверить текущую температуру и высоту на OLED дисплее.

ESP32 BMP388 датчик высоты давления температуры Arduino OLED SSD1306 MicroSD карта

Если вы хотите проверить все показания, вам нужно просто подключить карту microSD к компьютеру, и вы сможете получить доступ к файлу data.txt со всеми записями. Для анализа данных вы можете использовать Google Sheets, Excel или другое программное обеспечение.

Заключение

Этот проект показал вам, как записывать данные на карту microSD с помощью ESP32 и как получать высоту с помощью датчика давления BMP388. Вы также узнали, как создать точку доступа, где вы можете вводить данные, которые ESP32 будет использовать, – например, давление на уровне моря.

У нас есть аналогичный проект с использованием датчика температуры (он подключается к серверу NTP для добавления временных меток к показаниям, поэтому ESP32 должен иметь доступ к интернету):

Узнайте больше об ESP32 с нашими ресурсами:

Зачем мы создали этот проект?

Несколько любопытных фактов об этом проекте для тех из вас, кто хочет узнать немного больше о нас. Несколько недель назад мы посетили остров Пику, португальский остров в архипелаге Азорских островов. Ландшафт острова отличается вулканом Понта-ду-Пику, самой высокой горой в Португалии и самой высокой точкой Срединно-Атлантического хребта высотой 2351 метр.

Одной из главных достопримечательностей посещения острова Пику является восхождение/поход на гору до самой высокой точки. Мы решили, что эта поездка будет хорошей возможностью протестировать датчик BMP388 на различных высотах – поэтому мы создали этот проект логирования данных.

Восхождение на Пику, Азорские острова Восхождение на Пику - отметка 30 Гора Пику, Азорские острова

На вершине датчик показывал примерно 2260 метров, что примерно на 90 метров отличается от реального значения (2351 метр). Мы не думаем, что разница в 90 метров существенна на такой высоте. А как вы считаете? Температура показывала 13 градусов Цельсия (55 градусов по Фаренгейту), что совпадало с температурой, предсказанной в прогнозе.

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

BMP388 Даталоггер ESP32 тестирование

Вы посещали остров Пику или Азорские острова? Расскажите нам в комментариях ниже.

Спасибо за чтение.


Источник: Altimeter Datalogger: ESP32 with BMP388, MicroSD Card Storage and OLED Display