• 方案介紹
    • 基于 ESP32 的便攜式高精度氣壓計(jì) DIY 項(xiàng)目
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于 ESP32 的便攜式高精度氣壓計(jì)

19小時(shí)前
255
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

聯(lián)系方式.txt

共1個(gè)文件

基于 ESP32 的便攜式高精度氣壓計(jì) DIY 項(xiàng)目

物聯(lián)網(wǎng)智能設(shè)備日益普及的今天,許多愛好者都渴望通過 DIY 項(xiàng)目來打造屬于自己的智能設(shè)備。今天,我將為大家介紹一個(gè)非常有趣的項(xiàng)目——Altisense,這是一個(gè)基于 ESP32 的便攜式高精度氣壓計(jì),能夠測量溫度、氣壓和海拔高度,并通過 OLED 屏幕顯示數(shù)據(jù)。此外,它還配備了旋轉(zhuǎn)編碼器,用于校準(zhǔn)和切換單位(米和英尺)。這個(gè)項(xiàng)目不僅實(shí)用,而且充滿了科技感,非常適合電子愛好者和 DIY 玩家。

在這里插入圖片描述

項(xiàng)目簡介

Altisense 是一個(gè)由 gokux 在 Instructables 上分享的項(xiàng)目,旨在通過簡單的 DIY 步驟,打造一個(gè)功能完備的便攜式氣壓計(jì)。這個(gè)項(xiàng)目的核心組件包括 MS5611 精密氣壓傳感器和 Seeed Studio XIAO ESP32-C3 微控制器。通過這些組件,我們可以實(shí)現(xiàn)對(duì)溫度、氣壓和海拔高度的實(shí)時(shí)測量,并將數(shù)據(jù)清晰地顯示在 0.96 英寸的 OLED 屏幕上。

所需材料

在開始制作之前,我們需要準(zhǔn)備以下材料和工具:

在這里插入圖片描述

電子元件

  1. Seeed Studio XIAO ESP32-C3:這是一個(gè)功能強(qiáng)大的微型控制器,適合用于各種小型項(xiàng)目。
  2. MS5611 氣壓傳感器模塊:用于測量氣壓和溫度。
  3. 0.96 英寸 OLED 顯示屏(SSD1306,128x64 分辨率):用于顯示測量數(shù)據(jù)。
  4. 旋轉(zhuǎn)編碼器(帶按鈕):用于校準(zhǔn)和切換單位。
  5. 300mAh 鋰電池:為設(shè)備供電。
  6. 小型滑動(dòng)開關(guān):用于控制設(shè)備的開關(guān)。
  7. 10kΩ 上拉電阻(可選):如果旋轉(zhuǎn)編碼器出現(xiàn)抖動(dòng),可以使用上拉電阻。

3D 打印材料

  • PLA 耗材(橙色、黑色):用于打印外殼和旋鈕。
  • 3D 打印機(jī):用于打印外殼部件。

軟件工具

  • Arduino IDE:用于編寫和上傳代碼到 ESP32-C3。
  • MS5611 庫:用于與 MS5611 氣壓傳感器通信
  • Adafruit SSD1306 庫:用于控制 OLED 顯示屏。

其他工具

  • 焊錫和焊筆:用于焊接電線。
  • 熱熔膠槍:用于固定組件。
  • 螺絲刀:用于安裝旋轉(zhuǎn)編碼器。

設(shè)計(jì)與 3D 打印

在這里插入圖片描述

設(shè)計(jì)思路

為了確保 Altisense 的便攜性和實(shí)用性,設(shè)計(jì)時(shí)需要對(duì)空間進(jìn)行優(yōu)化。所有組件需要緊密地集成在一個(gè)小巧的外殼中,同時(shí)保證布線方便和組裝簡單。我使用了 Fusion 360 軟件來設(shè)計(jì)項(xiàng)目,導(dǎo)入了所有組件的 3D 模型,并嘗試了不同的配置,最終找到了最優(yōu)的設(shè)計(jì)方案。

3D 打印過程

  1. 模型設(shè)計(jì):使用 Fusion 360 設(shè)計(jì)了外殼模型,包括主殼體、旋鈕和前面板。主殼體用于容納所有電子組件,旋鈕和前面板則用于安裝旋轉(zhuǎn)編碼器和 OLED 顯示屏。
  2. 切片設(shè)置:將設(shè)計(jì)好的模型文件導(dǎo)出為 STL 格式,然后導(dǎo)入到 Ultimaker Cura 切片軟件中。在切片軟件中,可以設(shè)置打印參數(shù),如層高、填充密度等。建議使用默認(rèn)的打印參數(shù),以確保打印質(zhì)量。
  3. 打印過程:將 PLA 耗材裝入 3D 打印機(jī),開始打印。主殼體使用橙色 PLA 打印,旋鈕和前面板使用黑色 PLA 打印。整個(gè)打印過程大約需要 2-3 小時(shí),具體時(shí)間取決于打印機(jī)的性能和設(shè)置的打印參數(shù)。

在這里插入圖片描述

電路搭建與代碼上傳

電路連接

在這里插入圖片描述

在搭建電路之前,我們需要先將代碼上傳到 ESP32-C3 開發(fā)板。以下是詳細(xì)的連接步驟:

  1. 連接 OLED 顯示屏與開發(fā)板
    • OLED 的 SCL 引腳連接到 ESP32-C3 的 D1 引腳。
    • OLED 的 SDA 引腳連接到 ESP32-C3 的 D2 引腳。
    • OLED 的 VCC 引腳連接到 ESP32-C3 的 3.3V 引腳。
    • OLED 的 GND 引腳連接到 ESP32-C3 的 GND 引腳。
      在這里插入圖片描述
  2. 連接 MS5611 氣壓傳感器與開發(fā)板
    • MS5611 的 SCL 引腳連接到 ESP32-C3 的 D1 引腳。
    • MS5611 的 SDA 引腳連接到 ESP32-C3 的 D2 引腳。
    • MS5611 的 VCC 引腳連接到 ESP32-C3 的 3.3V 引腳。
    • MS5611 的 GND 引腳連接到 ESP32-C3 的 GND 引腳。
  3. 連接旋轉(zhuǎn)編碼器與開發(fā)板
    • 編碼器的 A 引腳連接到 ESP32-C3 的 D0 引腳。
    • 編碼器的 B 引腳連接到 ESP32-C3 的 D1 引腳。
    • 編碼器的按鈕引腳連接到 ESP32-C3 的 D2 引腳。
    • 編碼器的 VCC 引腳連接到 ESP32-C3 的 3.3V 引腳。
    • 編碼器的 GND 引腳連接到 ESP32-C3 的 GND 引腳。
  4. 連接電源
    • 將鋰電池的正極連接到 ESP32-C3 的 VIN 引腳。
    • 將鋰電池的負(fù)極連接到 ESP32-C3 的 GND 引腳。
    • 將滑動(dòng)開關(guān)連接到鋰電池的正極,以便控制電源的開關(guān)。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

代碼上傳

  1. 安裝 Arduino IDE:從 Arduino 官方網(wǎng)站下載并安裝 Arduino IDE。
  2. 安裝 MS5611 庫:在 Arduino IDE 中,打開“草圖”->“包含庫”->“管理庫”,搜索并安裝以下庫:
    • MS5611 庫(https://github.com/jarzebski/Arduino-MS5611)
    • Adafruit GFX Library
    • Adafruit SSD1306 Library
  3. 上傳代碼:將提供的代碼復(fù)制到 Arduino IDE 中,選擇正確的開發(fā)板類型(Seeed Studio XIAO ESP32-C3)和 COM 端口,然后點(diǎn)擊“上傳”按鈕。

以下是代碼示例(部分代碼):

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <MS5611.h>
#include <EEPROM.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C // See datasheet for Address

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
MS5611 ms5611;

// Rotary Encoder Inputs
#define ENCODER_PIN_A D0 // D0
#define ENCODER_PIN_B D1 // D1
#define ENCODER_BUTTON_PIN D2 // D2

// EEPROM Addresses
#define EEPROM_REFERENCE_PRESSURE 0
#define EEPROM_UNITS 8

// Menu States
enum MenuState {
  MAIN_PAGE,
  SETTINGS_MENU,
  CALIBRATION_PAGE,
  UNITS_PAGE
};

MenuState currentMenuState = MAIN_PAGE;

// Calibration Variables
double currentReferencePressure;
float currentSetAltitude = 0;

// Units Variable (0 for meters, 1 for feet)
uint8_t currentUnits = 0;

// Encoder Variables
volatile long encoderCount = 0;
int lastStateCLK;
String currentDir = "";
unsigned long lastButtonPress = 0;
unsigned long buttonDebounceTime = 1000; // Debounce delay for button in ms
byte buttonPressCount = 0;

// Function Prototypes
void displayMainPage();
void displaySettingsMenu(int selectedOption);
void displayCalibrationPage();
void displayUnitsPage(int selectedOption);
void readEncoder();
void readButton();
void saveCalibration();
void loadCalibration();
void saveUnits();
void loadUnits();
float calculateAltitude(double pressure);
float convertToFeet(float meters);
void setupEncoder();
void setupButton();

void setup() {
  Serial.begin(115200);
  while (!ms5611.begin()) {
    Serial.println("Could not find a valid MS5611 sensor, check wiring!");
    delay(500);
  }

  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }

  display.clearDisplay();
  display.display();
  delay(500);

  setupEncoder();
  setupButton();

  loadCalibration();
  loadUnits();

  currentReferencePressure = ms5611.readPressure();
  Serial.print("Initial Reference Pressure: ");
  Serial.println(currentReferencePressure);

  Serial.print("Initial Units: ");
  Serial.println(currentUnits == 0 ? "Meters" : "Feet");

  displayMainPage();
}

void loop() {
  readButton();
  readEncoder();

  switch (currentMenuState) {
    case MAIN_PAGE:
      displayMainPage();
      break;
    case SETTINGS_MENU:
      // Handle settings menu logic
      break;
    case CALIBRATION_PAGE:
      // Handle calibration page logic
      break;
    case UNITS_PAGE:
      // Handle units page logic
      break;
  }

  delay(1);
}

void displayMainPage() {
  double realTemperature = ms5611.readTemperature();
  long realPressure = ms5611.readPressure();
  float altitudeMeters = calculateAltitude(realPressure);
  float altitudeDisplay = (currentUnits == 1) ? convertToFeet(altitudeMeters) : altitudeMeters;

  String unitString = (currentUnits == 1) ? "ft" : "m";

  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(1);
  display.setCursor(3, 50);
  display.print("Tmp");
  display.setTextSize(2);
  display.setCursor(24, 46);
  display.print(realTemperature, 1);
  display.print("c");

  display.setTextSize(1);
  display.setCursor(3, 28);
  display.print("Pre");
  display.setTextSize(2);
  display.setCursor(24, 24);
  display.print((int)(realPressure / 100));
  display.print("hPa");

  display.setTextSize(1);
  display.setCursor(3, 7);
  display.print("Alt");
  display.setTextSize(2);
  display.setCursor(24, 3);
  display.print(altitudeDisplay, 0);
  display.print(unitString);

  display.display();
}

float calculateAltitude(double pressure) {
  return 44330.0 * (1.0 - pow(pressure / currentReferencePressure, 0.1903));
}

float convertToFeet(float meters) {
  return meters * 3.28084;
}

最終組裝

組件安裝

  1. 安裝旋轉(zhuǎn)編碼器:將旋轉(zhuǎn)編碼器放入 3D 打印的槽位中,并使用兩個(gè)螺母將其固定在 3D 打印的外殼上。
  2. 安裝 ESP32-C3:在主殼體的底部涂上一些熱熔膠,然后將 ESP32-C3 放在上面,確保其牢固地粘附在殼體上。
  3. 安裝氣壓傳感器模塊:在 3D 打印的槽位中涂上一些熱熔膠,然后將 MS5611 氣壓傳感器模塊插入槽位中。
  4. 安裝 OLED 顯示屏:將 OLED 顯示屏安裝到前面板的槽位中,并使用熱熔膠固定。
  5. 安裝電池和開關(guān):將鋰電池和滑動(dòng)開關(guān)安裝到主殼體的指定位置,并使用熱熔膠固定。
  6. 連接電線:將鋰電池的正負(fù)極分別連接到 ESP32-C3 的 VIN 和 GND 引腳。將滑動(dòng)開關(guān)連接到鋰電池的正極,以便控制電源的開關(guān)。
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

組裝外殼

  1. 安裝前面板:將前面板安裝到主殼體的前面,并使用熱熔膠固定。
  2. 安裝旋鈕:將 3D 打印的旋鈕安裝到旋轉(zhuǎn)編碼器上。
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述

測試與使用

在這里插入圖片描述

測試步驟

  1. 連接電源:使用滑動(dòng)開關(guān)打開設(shè)備,確保設(shè)備正常啟動(dòng)。
  2. 檢查顯示:主屏幕上應(yīng)顯示溫度、氣壓和海拔高度。按下旋轉(zhuǎn)編碼器按鈕 2 秒,進(jìn)入設(shè)置菜單。
  3. 校準(zhǔn):選擇“Calibration”選項(xiàng),使用旋轉(zhuǎn)編碼器調(diào)整海拔高度,并按下按鈕保存校準(zhǔn)值。
  4. 切換單位:選擇“Units”選項(xiàng),使用旋轉(zhuǎn)編碼器在米和英尺之間切換海拔高度的單位。

使用建議

  • 便攜性:由于設(shè)備使用鋰電池供電,你可以將其帶到任何地方使用。
  • 個(gè)性化:你可以通過修改代碼來添加更多功能,如數(shù)據(jù)記錄、藍(lán)牙傳輸?shù)取?/li>
  • 外殼美化:你可以使用噴漆或貼紙來美化 3D 打印的外殼,使其更加符合你的個(gè)人風(fēng)格。
    在這里插入圖片描述

項(xiàng)目擴(kuò)展

這個(gè)項(xiàng)目不僅是一個(gè)實(shí)用的 DIY 項(xiàng)目,還可以根據(jù)你的需求進(jìn)行擴(kuò)展和定制。以下是一些擴(kuò)展建議:

  1. 添加藍(lán)牙功能:通過添加藍(lán)牙模塊,將測量數(shù)據(jù)傳輸到手機(jī)或其他設(shè)備。
  2. 數(shù)據(jù)記錄:添加一個(gè) SD 卡模塊,用于記錄測量數(shù)據(jù),方便后續(xù)分析。
  3. 添加更多傳感器:例如,添加濕度傳感器或紫外線傳感器,擴(kuò)展設(shè)備的功能。
  4. 美化外殼:使用噴漆或貼紙來美化 3D 打印的外殼,使其更加符合你的個(gè)人風(fēng)格。

總結(jié)

Altisense 是一個(gè)非常有趣且實(shí)用的 DIY 項(xiàng)目,它不僅能夠讓你親手制作一個(gè)便攜式氣壓計(jì),還能讓你學(xué)習(xí)到 3D 打印、電子電路搭建和 Arduino 編程的基礎(chǔ)知識(shí)。通過這個(gè)項(xiàng)目,你可以實(shí)現(xiàn)對(duì)溫度、氣壓和海拔高度的實(shí)時(shí)測量,并通過 OLED 屏幕清晰地顯示數(shù)據(jù)。更重要的是,你可以根據(jù)自己的需求對(duì)項(xiàng)目進(jìn)行擴(kuò)展和定制,讓它成為你獨(dú)一無二的智能設(shè)備。

希望這篇文章能夠激發(fā)你的創(chuàng)造力,讓你動(dòng)手制作屬于自己的 Altisense 氣壓計(jì)。如果你在制作過程中遇到任何問題,歡迎在評(píng)論區(qū)留言,我會(huì)盡力為你解答。如果你已經(jīng)完成了這個(gè)項(xiàng)目,也歡迎在評(píng)論區(qū)分享你的作品,讓我們一起交流和學(xué)習(xí)!

希望你喜歡這個(gè)項(xiàng)目,并在構(gòu)建過程中找到樂趣!如果你有任何問題或需要幫助,歡迎在評(píng)論區(qū)交流。

作者:Svan.


注意:本博文為不得在未經(jīng)本人同意進(jìn)行轉(zhuǎn)載或者二次創(chuàng)作,違者必究!??!

博客主頁:https://blog.csdn.net/weixin_51141489,需要源碼或相關(guān)資料實(shí)物的友友請(qǐng)關(guān)注、點(diǎn)贊,私信吧!

  • 聯(lián)系方式.txt
    下載

相關(guān)推薦