本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于ADXL335的气象气球数据记录器

发布时间:2022-08-25
分享到:

基于ADXL335的气象气球数据记录器

发布时间:2022-08-25
分享到:

使用气象气球,您可以将 Arduino、相机、大蒜面包或其他任何您想要的东西送到三分之一的太空!尽管它是通往太空的三分之一,但几乎 99% 的大气层都不存在,所以我们称之为“太空边缘”。接下来,让我们来看看如何做到这一点。

根据您的需求和技能水平,你可以在三条路径中自行选择。不过由于平流层中令人难以承受的风,这三种途径都需要一些焊接技能。但并不是哪条路径更好,只是都各具特色,它可能基于你更擅长或感兴趣的部分。

  • 路径 1:使用原型板、各种传感器创建一个简单的数据记录器,几乎没有焊接技能。
  • 路径 2:使用预先设计的 PCB 屏蔽(印刷电路板)来制作干净漂亮的电路板,由我们设计和测试。
  • 路径 3:在程序中制作自己的 PCB。本文不会深入探讨如何设计和制作自己的 PCB,但会介绍一些指导方针供您思考。

我们将详细介绍每条路径,但这里有一些提示可以帮助您选择:

  • 路径 1 将是最简单的,并且将允许一些灵活性。您可以选择电路板上的传感器、电路板和功能。您将需要一些焊接技能,以确保在飞行过程中一切都保持在一起。
  • 路径 2 将是最严格的,这意味着您将必须使用一组指定的传感器,一个特定的 Arduino 板,但您将拥有一个看起来非常干净的 PCB,不必担心焊接或编码,对于学习PCB来说,这是一个很好的开始。
  • 路径 3 将是最难的,需要很多技能。您将需要知道(或学习)如何制作自己的 PCB 或 Arduino PCB 屏蔽板,知道如何对整个事物进行编码以及焊接电路板。如果您知道如何做所有这些事情,您可能可以自己做这个项目,但是本文可以帮助您解决一些非常重要的限制和细节。

但在我们开始之前,您需要牢记一些非常重要的规则。请务必阅读这些规则,因为在气象气球中发送物品可能会受到您居住地的限制。本文不会详细介绍如何选择合适的气球、建造有效载荷舱以及如何填充气球,但是在网上有很多关于如何做到这一点的指南。以下是您需要牢记的事项:

1. 您的有效载荷舱不能有任何手机信号。如果您出于任何原因在飞机上携带手机,则它必须处于飞行模式。

2. 如果您使用 GPS 寻找气球,您需要获得 HAM 无线电许可证(需要测试和收费)。

3. 如果您的有效载荷的重量尺寸比超过 3.0 盎司/平方英寸,那么总有效载荷重量必须小于 4 磅。

4. 任何单独的有效载荷/包裹必须小于 6 磅。

5. 如果您有两个有效载荷,则总有效载荷重量必须小于 12 磅。

路径 1 - 原型板
在开始设计之前,您需要牢记几个注意事项。首先,你想要什么。在提供的示意图中,您将拥有一个简单的温度和湿度传感器、一个气压传感器、一个 IMU 和一个 SD 卡模块。对于大多数项目来说,这应该足够了,但如果你想用你的 Arduino 找到你的有效载荷舱,你会想要包括一个 GPS 模块。有几种恢复选项:

1. SPOT GPS 模块。这些都有其优点和缺点。这些将非常易于使用,范围不受限制(它们使用卫星将坐标发送到您的手机),电池寿命长,而且很容易获得。但是,它们价格昂贵,不能倒置工作,而且信号会被厚物体阻挡。

这是我们使用的方法,但我们为它设计并 3D 打印了一个云台以使其保持直立。我们推荐SPOT 3 Satellite Messenger ,但这完全取决于您,只要您对此进行研究并了解不同类型的好处。

2. APRS 电台。这将是最可靠的,你可以用它做很多事情。您可以将模块连接到 Arduino 并让无线电发回数据、坐标等。这也可以让您获得准确的高度测量。

但这不会包含在接线图中,因此您必须学会自己接线。此外,您需要获得 HAM 无线电许可证,您需要参加测试并支付少量费用。这个许可证非常有用,所以它可能是值得的。

3. 手机。我不建议使用这种方法。因为不仅需要想办法在飞行后让手机退出飞行模式,而且手机本身可能比普通 SPOT 更贵。之所以上榜,是因为很多人使用手机作为备份,但它确实不是你应该使用的东西。

到这想必你已经决定如何恢复您的有效载荷,您将想要了解飞行的样子。例如,如果你想让你的 Arduino 远程部署降落伞,你应该想办法做到这一点。你还应该检查您将使用哪些传感器(温度可以降至 -40C (-40F),因此需要考虑这一点。

同时你还需要考虑如何为 Arduino 供电。低温会降低许多电池的性能,因此您可能需要一个大电源,以及一个诸如聚苯乙烯泡沫塑料盒之类的外壳,以保持物品舒适,同时保持在重量限制之下。

我建议您根据您想要获取的数据类型、您是否将在船上安装相机以及您计划在船上安装什么来制作某种清单。制作有效载荷托架也是一个好主意,然后根据有效载荷设计数据记录器。在实际设计之前,有很多事情需要考虑和确保,因此请确保您花很长时间仔细检查所有内容。

好吧,如果你走第一条路经,这里是传感器的示意图和接线图:

Mega 对于这些传感器来说是超级大材小用,但如果你也想使用我们的代码,你将不得不使用 Mega。如果您打算使用 Nano 之类的设备,请将 MicroSD 卡模块的引脚分配更改为电路板的 SPI 引脚。

这是零件清单:

  • SparkFun ADXL337
  • 头针
  • 微型 SD 卡模块
  • DHT22 湿度传感器
  • DS18B20 温度传感器
  • 原型板
  • Arduino Mega

您可以添加另一个 DS18B20 来读取内部温度,并添加您想要的任何传感器,但如果您想使用提供的代码,请使用上面的接线图。

//DHT22 Setup
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//SD Card Setup
#include <SPI.h>
#include <SD.h>
File sdcard_file;
int CS_pin = 10;
//DS18B20 Temperature sensor
#include <OneWire.h>
#include<DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int scale = 3; // 3 (±3g) for ADXL337, 200 (±200g) for ADXL377
boolean micro_is_5V = true; // Set to true if using a 5V microcontroller such as the Arduino Uno, false if using a 3.3V microcontroller, this affects the interpretation of the sensor data
void setup() {
Serial.begin(9600);
sensors.begin();
 dht.begin();
 pinMode(CS_pin, OUTPUT);//declaring CS pin as output pin
 if (SD.begin()){
   Serial.print("SD Card found!");
 } else
 {
   Serial.print("Error finding SD Card");
   return;
 }
 sdcard_file = SD.open("data.csv", FILE_WRITE);
 if (sdcard_file) { //If the file is found
 }
 else {
   Serial.print("error initializing SD card");
 }
sdcard_file.print("DS18B20");
sdcard_file.print(",");
sdcard_file.print("DHT22 Temp");
sdcard_file.print(",");
sdcard_file.print("Hum");
sdcard_file.print(",");
sdcard_file.print("H.InX");
sdcard_file.print(",");
sdcard_file.print("rawX");
sdcard_file.print(",");
sdcard_file.print("rawY");
sdcard_file.print(",");
sdcard_file.print("rawZ");
sdcard_file.print(",");
sdcard_file.print("scaledX");
sdcard_file.print(",");
sdcard_file.print("scaledY");
sdcard_file.print(",");
sdcard_file.print("scaledZ");
sdcard_file.print(",");
sdcard_file.println(" ");
}
void loop() {
delay(222);
//Accelerometer
 int rawX = analogRead(A0);
 int rawY = analogRead(A1);
 int rawZ = analogRead(A2);
 float scaledX, scaledY, scaledZ; 
 if (micro_is_5V) //scaling data if voltage is 5V (it is)
 {
   scaledX = mapf(rawX, 0, 675, -scale, scale); 
   scaledY = mapf(rawY, 0, 675, -scale, scale);
   scaledZ = mapf(rawZ, 0, 675, -scale, scale);
 }
 else //scaling data if voltage is 3.3V
 {
   scaledX = mapf(rawX, 0, 1023, -scale, scale);
   scaledY = mapf(rawY, 0, 1023, -scale, scale);
   scaledZ = mapf(rawZ, 0, 1023, -scale, scale);
 }
//DS18B20 Temp
sensors.requestTemperatures();
int etemp=sensors.getTempCByIndex(0);
//DS18B20 Humidity Sensor
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 float f = dht.readTemperature(true);
 // Check if any reads failed and exit early for DHT
 if (isnan(h) || isnan(t) || isnan(f)) {
   return;
 }
 // Compute heat index in Fahrenheit (the default)
 float hif = dht.computeHeatIndex(f, h);
 // Compute heat index in Celsius (isFahreheit = false)
 float hic = dht.computeHeatIndex(t, h, false);
 sdcard_file.print(etemp);
 sdcard_file.print(",");
 sdcard_file.print(t);
  sdcard_file.print(",");
 sdcard_file.print(h);
  sdcard_file.print(",");
 sdcard_file.print(hic);
  sdcard_file.print(",");
 sdcard_file.print(rawX);
  sdcard_file.print(",");
 sdcard_file.print(rawY);
  sdcard_file.print(",");
 sdcard_file.print(rawZ);
 sdcard_file.print(",");
 sdcard_file.print(scaledX);
  sdcard_file.print(",");
 sdcard_file.print(scaledY);
 sdcard_file.print(",");
 sdcard_file.print(scaledZ);
 sdcard_file.print(",");
 sdcard_file.print(" ");
 sdcard_file.println(" ");
sdcard_file.close();
delay(223);
}
float mapf(float x, float in_min, float in_max, float out_min, float out_max)
{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;

如果有任何问题,请务必检查接线,并使用每个传感器的代码来隔离问题。确保您的 SD 或 MicroSD 卡已格式化为 FAT16 或 FAT32,并且为 16GB 或更少。

此外,最好连接 LED 以显示数据记录器的状态指示。请避免在数据记录器未运行的情况下发送气球,因此请确保对所有内容进行三重检查。

如果您一直遇到 SD 卡模块问题,请尝试更换电源。经过大量测试,我们发现有些模块对电源非常敏感,所以要找一个可靠的电源。

到这一步数据记录器已完成。它应该读取温度、湿度和加速度计数据,并将其记录到 SD 卡上。如果您想要高度读数,则必须使用 GPS。90% 的基于气压传感器的高度计在 30, 000 英尺以外无法工作。如果您的气球超过了这个阈值,您将无法使用气压计。

路径 2 - 预先设计的 PCB
你正计划使用预先设计的 PCB。这种预先设计的 PCB 可让您获得内部温度、外部温度、湿度和加速度计读数。您将需要焊接技能,以及这些组件:

  • 5050贴片LED
  • SparkFun ADXL337
  • 很多头针
  • 微型 SD 卡模块
  • DHT22 湿度传感器
  • 2X DS18B20 温度传感器
  • Arduino

PCB 的 Gerber 文件位于本文下方的 GitHub 存储库中。

我们在飞行中使用了这个PCB,所以我们做了很多测试,并且我们在飞行后做了改进,让我们开始吧。

好的,让我们开始下载 Gerber 文件。转到GitHub 存储库,下载 ZIP 文件,然后复制并粘贴 Gerber Eclipse 文件。保持 gerber 压缩文件的 ZIP 文件很重要,因为在线服务将它们作为 ZIP。

可以开始寻找 PCB 了。在搜索引擎中,查找 PCB 服务。

之后您已经选择了一项服务,上传压缩的 gerber 文件,然后选择以下设置:

  • 单板
  • 1.6mm厚
  • 您想要的任何颜色
  • HASL(带铅)用于表面光洁度。如果您使用无铅焊料,您可能需要更改此设置
  • 1盎司铜重
  • 生产档案确认
  • 全面测试飞针测试
  • 无齿孔
  • 你想要的任何数量

大多数这些设置都已经设置好了,所以你只需要改变颜色。

现在是组装 PCB 的时候了。由于我们使用带有分线板的传感器,并且由于该 PCB 将充当屏蔽层,因此这将非常容易。下面为您提供焊接相关内容。

此外,将所有插头引脚焊接到 PCB 的侧面。这些将适合 Arduino Mega 的顶部,并会为您完成所有接线。

重要的是要知道这个 PCB 是如何工作的,这样你就知道如果东西坏了如何修复它。在 PCB 内,有非常小的 0.35mm 导线穿过它。这些电线将从每个传感器延伸到 PCB 中的某些插头引脚,然后连接到 Arduino。这使得构建干净,并且比传统的原型板和面包板更可靠。

将 PCB 焊接起来,将其放在 Arduino Mega 上,然后将其插入计算机。打开Arduino IDE并打开包含在GitHub 存储库中的 1.6 代码,您可以从中获取 PCB 文件。

将 microSD 卡格式化为 FAT16 或 FAT32。microSD卡模块需要16GB以下,否则无法使用。即使是 2GB 的 microSD 相机也足以满足两个小时的飞行。

现在将 SD 卡插入模块,并上传 1.6 代码。在串行监视器中,您应该会收到 SD 卡工作的成功消息,并且应该立即开始数据记录。

等待十秒钟,然后取出 SD 卡并将其插入计算机。应该有一个包含所有数据的 .csv 文件!

这是 GitHub 存储库不起作用的代码:

//DHT22 Setup
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//SD Card Setup
#include <SPI.h>
#include <SD.h>
File sdcard_file;
int CS_pin = 10;
//DS18B20 Temperature sensor
#include <OneWire.h>
#include<DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//MPL3115A2 Altimeter Setup
#include <Wire.h>
#include <Adafruit_MPL3115A2.h>
Adafruit_MPL3115A2 baro = Adafruit_MPL3115A2();
int scale = 3;
boolean micro_is_5V = true;
//LED
int Blue = 7;
int Red = 6;
int Green = 5;
void setup() {
pinMode(23, INPUT); //detects if a switch is turned on to stop the sdcard writing and to save the data
sensors.begin();
pinMode(Blue, OUTPUT);
pinMode(Red, OUTPUT);
pinMode(Green, OUTPUT);
digitalWrite(Green, HIGH);
 dht.begin();
 pinMode(CS_pin, OUTPUT);//declaring CS pin as output pin
 if (SD.begin()){
   digitalWrite(Green, LOW);
   digitalWrite(Green, HIGH);
   digitalWrite(Green, LOW);
   digitalWrite(Green, HIGH);
   digitalWrite(Green, LOW);
   digitalWrite(Green, HIGH);
 } else
 {
   digitalWrite(Green, LOW);
   digitalWrite(Red, HIGH);
   delay(5000);
   return;
 }
 sdcard_file = SD.open("data.csv", FILE_WRITE);
 if (sdcard_file) { //If the file is found
   digitalWrite(Red, LOW);
   digitalWrite(Blue, LOW);
   digitalWrite(Green, HIGH);
 }
 else {
    digitalWrite(Green, LOW);
   digitalWrite(Red, HIGH);
   delay(1000);
   digitalWrite(Red, LOW);
   digitalWrite(Blue, HIGH);
   delay(1000);
    digitalWrite(Green, LOW);
   digitalWrite(Red, HIGH);
   delay(1000);
   digitalWrite(Red, LOW);
   digitalWrite(Blue, HIGH);
   delay(1000);
   digitalWrite(Red, HIGH);
   digitalWrite(Blue, LOW);
 }
sdcard_file.print(",");
sdcard_file.print("DS18B20");
sdcard_file.print(",");
sdcard_file.print("DHT22 Temp");
sdcard_file.print(",");
sdcard_file.print("Hum");
sdcard_file.print(",");
sdcard_file.print("H.InX");
sdcard_file.print(",");
sdcard_file.print("Int. Temp");
sdcard_file.print(",");
sdcard_file.print("Pres. Pasc.");
sdcard_file.print(",");
sdcard_file.print("alt.");
sdcard_file.print(",");
sdcard_file.print("rawX");
sdcard_file.print(",");
sdcard_file.print("rawY");
sdcard_file.print(",");
sdcard_file.print("rawZ");
sdcard_file.print(",");
sdcard_file.print("scaledX");
sdcard_file.print(",");
sdcard_file.print("scaledY");
sdcard_file.print(",");
sdcard_file.print("scaledZ");
}
void loop() {
delay(222);
digitalWrite(Green, LOW);
digitalWrite(Blue, HIGH);
if(! baro.begin()) {
}
float pascals = baro.getPressure();
float altm = baro.getAltitude();
float tempC = baro.getTemperature();
//Accelerometer
 int rawX = analogRead(A0);
 int rawY = analogRead(A1);
 int rawZ = analogRead(A2);
 float scaledX, scaledY, scaledZ; 
 if (micro_is_5V) //scaling data if voltage is 5V (it is)
 {
   scaledX = mapf(rawX, 0, 675, -scale, scale); 
   scaledY = mapf(rawY, 0, 675, -scale, scale);
   scaledZ = mapf(rawZ, 0, 675, -scale, scale);
 }
 else //scaling data if voltage is 3.3V
 {
   scaledX = mapf(rawX, 0, 1023, -scale, scale);
   scaledY = mapf(rawY, 0, 1023, -scale, scale);
   scaledZ = mapf(rawZ, 0, 1023, -scale, scale);
 }
//DS18B20 Temp
sensors.requestTemperatures();
//DS18B20 Humidity Sensor
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 float f = dht.readTemperature(true);
 // Check if any reads failed and exit early for DHT
 if (isnan(h) || isnan(t) || isnan(f)) {
   return;
 }
 // Compute heat index in Fahrenheit (the default)
 float hif = dht.computeHeatIndex(f, h);
 // Compute heat index in Celsius (isFahreheit = false)
 float hic = dht.computeHeatIndex(t, h, false);
 sdcard_file.println(sensors.getTempCByIndex(0));
 sdcard_file.print(",");
 sdcard_file.print(t);
  sdcard_file.print(",");
 sdcard_file.print(h);
  sdcard_file.print(",");
 sdcard_file.print(hic);
  sdcard_file.print(",");
 sdcard_file.print(tempC);
  sdcard_file.print(",");
 sdcard_file.print(pascals);
  sdcard_file.print(",");
 sdcard_file.print(altm);
  sdcard_file.print(",");
 sdcard_file.print(rawX);
  sdcard_file.print(",");
 sdcard_file.print(rawY);
  sdcard_file.print(",");
 sdcard_file.print(rawZ);
 sdcard_file.print(",");
 sdcard_file.print(scaledX);
  sdcard_file.print(",");
 sdcard_file.print(scaledY);
 sdcard_file.print(",");
 sdcard_file.print(scaledZ);
 sdcard_file.print(",");
delay(223);
sdcard_file.close();
}
float mapf(float x, float in_min, float in_max, float out_min, float out_max)
{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
你的数据记录器已完成。它应该读取温度、湿度和加速度计数据,并将其记录到 SD 卡上。如果您想要高度读数,则必须使用 GPS。90% 的基于气压传感器的高度计在 30, 000 英尺以外无法工作。如果您的气球超过了这个阈值,您将无法使用气压计。

路径 3 - 制作自己的 PCB
这一条路径不会向您展示如何制作自己的 PCB。因此,在继续之前,您应该知道如何制作 PCB,或者学习如何制作。这部分只会介绍一些基本准则。

首先,你必须集思广益,写下你想从这次飞行中得到的东西。

以下是标准包括的一些内容:

  • 温度
  • 湿度
  • 高度
  • 空气质量
  • 辐射
  • 全球定位系统

您可以包含任何您想要的内容,但请确保您查看了所有内容。温度传感器的读数应能低至 -50C (-58F),并尽可能准确。由于来自太阳的太阳辐射,温度读数在非常高的温度下会不准确,因此看起来会比实际温度高一点!

另一个设计考虑因素是重量。如本文介绍中所述,根据有效负载类型,您的有效负载需要低于 12 磅、6 磅或 4 磅。此外,您将无法使用气压计来获取高度读数,因为它们中的大多数都超过了 30, 000 英尺。

最后的考虑是电源。平流层的温度将变得非常低。电池会失效,你的 Arduino 也很有可能会失效。您将需要找到解决此问题的方法。可以说,最好的策略是将数据记录器放在泡沫塑料盒中。这将保持室内温度与室温一样高。您可能还需要考虑太阳能电池板或暖手器。

好的!到这你已经考虑了所有内容,仔细检查了您想要的传感器,并写下了所有内容。是时候制作原理图和PCB了。对于原理图和 PCB,您可能想要像以前一样制作 PCB 屏蔽,或者制作完整的 PCB。

构建 PCB/屏蔽后,仔细检查一切以查看它是否有效,并确保您遵循指南。

到此你的数据记录器已完成。它应该读取温度、湿度和加速度计数据,并将其记录到 SD 卡上。如果您想要高度读数,则必须使用 GPS。90% 的基于气压传感器的高度计在 30, 000 英尺以外无法工作。如果您的气球超过了这个阈值,您将无法使用气压计。

结论
气象气球是将东西送到平流层的一种非常酷且简单的方式。您可以将相机(在我们的例子中是 360 度相机)发送到高海拔地区,获得很棒的镜头和数据,而无需太多的规定。但有一件事!

请确保遵守所有规则,并在飞行前添加雷达偏转器并提交航行通告(通知飞行员)。您的气球有效载荷很有可能撞到飞机,您不想损坏或冒生命危险。尽你所能减少损坏的风险,确保一切都坚固,这样你就不会掉落任何东西。

本文中所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论