• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于 ESP32 的便携式高精度气压计

05/14 08:43
1325
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

联系方式.txt

共1个文件

基于 ESP32 的便携式高精度气压计 DIY 项目

物联网智能设备日益普及的今天,许多爱好者都渴望通过 DIY 项目来打造属于自己的智能设备。今天,我将为大家介绍一个非常有趣的项目——Altisense,这是一个基于 ESP32 的便携式高精度气压计,能够测量温度、气压和海拔高度,并通过 OLED 屏幕显示数据。此外,它还配备了旋转编码器,用于校准和切换单位(米和英尺)。这个项目不仅实用,而且充满了科技感,非常适合电子爱好者和 DIY 玩家。

在这里插入图片描述

项目简介

Altisense 是一个由 gokux 在 Instructables 上分享的项目,旨在通过简单的 DIY 步骤,打造一个功能完备的便携式气压计。这个项目的核心组件包括 MS5611 精密气压传感器和 Seeed Studio XIAO ESP32-C3 微控制器。通过这些组件,我们可以实现对温度、气压和海拔高度的实时测量,并将数据清晰地显示在 0.96 英寸的 OLED 屏幕上。

所需材料

在开始制作之前,我们需要准备以下材料和工具:

在这里插入图片描述

电子元件

  1. Seeed Studio XIAO ESP32-C3:这是一个功能强大的微型控制器,适合用于各种小型项目。
  2. MS5611 气压传感器模块:用于测量气压和温度。
  3. 0.96 英寸 OLED 显示屏(SSD1306,128x64 分辨率):用于显示测量数据。
  4. 旋转编码器(带按钮):用于校准和切换单位。
  5. 300mAh 锂电池:为设备供电。
  6. 小型滑动开关:用于控制设备的开关。
  7. 10kΩ 上拉电阻(可选):如果旋转编码器出现抖动,可以使用上拉电阻。

3D 打印材料

  • PLA 耗材(橙色、黑色):用于打印外壳和旋钮。
  • 3D 打印机:用于打印外壳部件。

软件工具

  • Arduino IDE:用于编写和上传代码到 ESP32-C3。
  • MS5611 库:用于与 MS5611 气压传感器通信
  • Adafruit SSD1306 库:用于控制 OLED 显示屏。

其他工具

  • 焊锡和焊笔:用于焊接电线。
  • 热熔胶枪:用于固定组件。
  • 螺丝刀:用于安装旋转编码器。

设计与 3D 打印

在这里插入图片描述

设计思路

为了确保 Altisense 的便携性和实用性,设计时需要对空间进行优化。所有组件需要紧密地集成在一个小巧的外壳中,同时保证布线方便和组装简单。我使用了 Fusion 360 软件来设计项目,导入了所有组件的 3D 模型,并尝试了不同的配置,最终找到了最优的设计方案。

3D 打印过程

  1. 模型设计:使用 Fusion 360 设计了外壳模型,包括主壳体、旋钮和前面板。主壳体用于容纳所有电子组件,旋钮和前面板则用于安装旋转编码器和 OLED 显示屏。
  2. 切片设置:将设计好的模型文件导出为 STL 格式,然后导入到 Ultimaker Cura 切片软件中。在切片软件中,可以设置打印参数,如层高、填充密度等。建议使用默认的打印参数,以确保打印质量。
  3. 打印过程:将 PLA 耗材装入 3D 打印机,开始打印。主壳体使用橙色 PLA 打印,旋钮和前面板使用黑色 PLA 打印。整个打印过程大约需要 2-3 小时,具体时间取决于打印机的性能和设置的打印参数。

在这里插入图片描述

电路搭建与代码上传

电路连接

在这里插入图片描述

在搭建电路之前,我们需要先将代码上传到 ESP32-C3 开发板。以下是详细的连接步骤:

  1. 连接 OLED 显示屏与开发板
    • OLED 的 SCL 引脚连接到 ESP32-C3 的 D1 引脚。
    • OLED 的 SDA 引脚连接到 ESP32-C3 的 D2 引脚。
    • OLED 的 VCC 引脚连接到 ESP32-C3 的 3.3V 引脚。
    • OLED 的 GND 引脚连接到 ESP32-C3 的 GND 引脚。
      在这里插入图片描述
  2. 连接 MS5611 气压传感器与开发板
    • MS5611 的 SCL 引脚连接到 ESP32-C3 的 D1 引脚。
    • MS5611 的 SDA 引脚连接到 ESP32-C3 的 D2 引脚。
    • MS5611 的 VCC 引脚连接到 ESP32-C3 的 3.3V 引脚。
    • MS5611 的 GND 引脚连接到 ESP32-C3 的 GND 引脚。
  3. 连接旋转编码器与开发板
    • 编码器的 A 引脚连接到 ESP32-C3 的 D0 引脚。
    • 编码器的 B 引脚连接到 ESP32-C3 的 D1 引脚。
    • 编码器的按钮引脚连接到 ESP32-C3 的 D2 引脚。
    • 编码器的 VCC 引脚连接到 ESP32-C3 的 3.3V 引脚。
    • 编码器的 GND 引脚连接到 ESP32-C3 的 GND 引脚。
  4. 连接电源
    • 将锂电池的正极连接到 ESP32-C3 的 VIN 引脚。
    • 将锂电池的负极连接到 ESP32-C3 的 GND 引脚。
    • 将滑动开关连接到锂电池的正极,以便控制电源的开关。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码上传

  1. 安装 Arduino IDE:从 Arduino 官方网站下载并安装 Arduino IDE。
  2. 安装 MS5611 库:在 Arduino IDE 中,打开“草图”->“包含库”->“管理库”,搜索并安装以下库:
    • MS5611 库(https://github.com/jarzebski/Arduino-MS5611)
    • Adafruit GFX Library
    • Adafruit SSD1306 Library
  3. 上传代码:将提供的代码复制到 Arduino IDE 中,选择正确的开发板类型(Seeed Studio XIAO ESP32-C3)和 COM 端口,然后点击“上传”按钮。

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

#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. 安装旋转编码器:将旋转编码器放入 3D 打印的槽位中,并使用两个螺母将其固定在 3D 打印的外壳上。
  2. 安装 ESP32-C3:在主壳体的底部涂上一些热熔胶,然后将 ESP32-C3 放在上面,确保其牢固地粘附在壳体上。
  3. 安装气压传感器模块:在 3D 打印的槽位中涂上一些热熔胶,然后将 MS5611 气压传感器模块插入槽位中。
  4. 安装 OLED 显示屏:将 OLED 显示屏安装到前面板的槽位中,并使用热熔胶固定。
  5. 安装电池和开关:将锂电池和滑动开关安装到主壳体的指定位置,并使用热熔胶固定。
  6. 连接电线:将锂电池的正负极分别连接到 ESP32-C3 的 VIN 和 GND 引脚。将滑动开关连接到锂电池的正极,以便控制电源的开关。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

组装外壳

  1. 安装前面板:将前面板安装到主壳体的前面,并使用热熔胶固定。
  2. 安装旋钮:将 3D 打印的旋钮安装到旋转编码器上。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

测试与使用

在这里插入图片描述

测试步骤

  1. 连接电源:使用滑动开关打开设备,确保设备正常启动。
  2. 检查显示:主屏幕上应显示温度、气压和海拔高度。按下旋转编码器按钮 2 秒,进入设置菜单。
  3. 校准:选择“Calibration”选项,使用旋转编码器调整海拔高度,并按下按钮保存校准值。
  4. 切换单位:选择“Units”选项,使用旋转编码器在米和英尺之间切换海拔高度的单位。

使用建议

  • 便携性:由于设备使用锂电池供电,你可以将其带到任何地方使用。
  • 个性化:你可以通过修改代码来添加更多功能,如数据记录、蓝牙传输等。
  • 外壳美化:你可以使用喷漆或贴纸来美化 3D 打印的外壳,使其更加符合你的个人风格。
    在这里插入图片描述

项目扩展

这个项目不仅是一个实用的 DIY 项目,还可以根据你的需求进行扩展和定制。以下是一些扩展建议:

  1. 添加蓝牙功能:通过添加蓝牙模块,将测量数据传输到手机或其他设备。
  2. 数据记录:添加一个 SD 卡模块,用于记录测量数据,方便后续分析。
  3. 添加更多传感器:例如,添加湿度传感器或紫外线传感器,扩展设备的功能。
  4. 美化外壳:使用喷漆或贴纸来美化 3D 打印的外壳,使其更加符合你的个人风格。

总结

Altisense 是一个非常有趣且实用的 DIY 项目,它不仅能够让你亲手制作一个便携式气压计,还能让你学习到 3D 打印、电子电路搭建和 Arduino 编程的基础知识。通过这个项目,你可以实现对温度、气压和海拔高度的实时测量,并通过 OLED 屏幕清晰地显示数据。更重要的是,你可以根据自己的需求对项目进行扩展和定制,让它成为你独一无二的智能设备。

希望这篇文章能够激发你的创造力,让你动手制作属于自己的 Altisense 气压计。如果你在制作过程中遇到任何问题,欢迎在评论区留言,我会尽力为你解答。如果你已经完成了这个项目,也欢迎在评论区分享你的作品,让我们一起交流和学习!

希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。

作者:Svan.


注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!

博客主页:https://blog.csdn.net/weixin_51141489,需要源码或相关资料实物的友友请关注、点赞,私信吧!

  • 联系方式.txt
    下载

相关推荐