$10 便携式 Arduino 气象站 (AWS)
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
|
关于这个项目
图> 图> 图>最近我的大学有一个小型的科学展览。所以我的老师要求我在学院展示一个项目,教年轻学生电子学,所以基本上我有两天时间来做一些事情。
由于这里的气候条件变化很大,最近的温度在 34-40 摄氏度左右。所以我决定做一个气象站。
那么气象站的作用是什么?
气象站是一种使用多种传感器收集与天气和环境相关的数据的设备
像
这样的传感器- 风
- 湿度
- 下雨
- 温度
- 压力
- 海拔高度
目标是做一个便携式气象站
应有的功能
- 温度
- 湿度
- 压力
- 海拔
第 1 步:成分:是时候买东西了 图> 图> 图> 图> 图> 图>
所以这是我们项目需要的东西
我实际上是在 My UNO 上开始这个项目的,但后来我决定改用紧凑型解决方案。
那一刻我带着nano,所以不得不用它,很想用micro,因为它是最小的。
总之离开这些东西,谈论预算和零件这里是列表。
- DHT22 温湿度传感器 -> 3.00 美元
- BMP180 压力传感器(BMP280 在我所在的地区更便宜但更贵)> 2.00 美元
- Arduino Nano> 1.89 美元
- 焊接
- 带 I2C 驱动程序的 LCD 显示器> 3.0 美元
- Veroboard
- 女头
对于工具端,您将需要
- 烙铁
- 鼻钳
- 电线
还有一段时间
第 2 步:温度和湿度 - DHT22 图> 图> 图> 图> 图> 图>
可以使用不同的传感器进行温度测量。
流行的有 DHT22、DHT11、SHT1x
所以基本上,让我们了解一下这个传感器之间的不同之处,以及我为什么首先使用 DHT22。
AM2302 输出校准数字信号。采用独有的数字信号采集技术和湿度传感技术,确保其可靠性和稳定性。其传感元件与8位单片机相连。
该型号的每个传感器都在精确的校准室中进行温度补偿和校准,校准系数以程序类型保存在OTP内存中,当传感器检测时,它将引用内存中的系数。体积小、功耗低、传输距离长(100m)使AM2302适用于各种恶劣的应用场合。单排四针封装,连接非常方便。
让我们看看这三者的优缺点。
DHT11
优点:无需焊接。三款中最便宜的。快速获得稳定的输出。传输超过20m。强干扰。
缺点:图书馆!没有分辨率选项。误差:温度+/-2°C;湿度+/-5%RH。测量范围不足(0-50°C)。应用:园艺、农业。
DHT22
优点:无需焊接。向 DHT11 添加几美元并获得升级。流畅的曲线。最小的误差。范围大。传输超过20m。强干扰。
缺点:可以更敏感。缓慢的温度跟踪。需要图书馆。应用:环境监测。 SHT1x
优点:无需焊接。流畅的曲线。小错误。快速响应。低功耗。自动休眠。非凡的长期稳定性和一致性。
缺点:两个数字接口。湿度错误。与 DHT11 相同的测量范围。需要图书馆。应用:重型和长期安装。以下是三个相对便宜的选择。
连接
Vcc 至 5V 或 3.3V
地对地
数据到 arduino 的 pin 2
第 3 步:气压计和压力传感器 - BMP180 图> 图>
bmp180 气压传感器,带有 I2C(“Wire”)接口。
气压传感器测量周围空气的绝对压力。该压力随天气和海拔高度而变化。
这个 bmp180 模块带有一个 3.3 v 稳压器 662k,我把它吹到了一些愚蠢的地方,所以我连接了一根电线,将整个 vcc 直接旁路到芯片。
注意:这样做时,我限制自己只使用 3.3 v,使用高于它的电压会损坏设备。
其他型号可能没有 662k 稳压器。所以要彻底检查。
好的,回来让我们将传感器连接到 arduino。
传感器连接到arduino的i2c总线,nano和Uno是
SDA==>A4
SCL==>A5
VCC==>3.3V
地 ==> 地
让我们稍微谈谈压力以及压力如何测量高度和温度。
任何位置的大气压都不是恒定的。地球自转、地轴倾斜等诸多因素的复杂相互作用,导致高低气压的运动区域,进而导致我们每天看到的天气变化。通过观察压力变化,您可以预测天气的短期变化。
例如,压力下降通常意味着潮湿的天气或风暴即将来临(低压系统正在进入)。气压上升通常意味着晴朗的天气即将来临(高压系统正在通过)。
大气压力也随高度而变化。珠穆朗玛峰大本营绝对压力(5400)低于德里(216)
由于绝对压力很难直接比较从一个位置到另一个位置的压力测量值。我们使用相对压力。即海平面压力。
测量高度
海平面大气的平均压力为 1013.25 hPa(或 mbar)。当你爬向真空时,这个值会下降到零。由于此下降曲线很好理解,因此您可以使用以下等式计算两次压力测量值(p 和 p0)之间的高度差:
alti=44330*[1-(p/p0)^(1/5.255)]
如果您使用海平面压力 (1013.25 hPa) 作为基线压力 (p0),则方程的输出将是您当前的海拔高度。
注意事项
给它空气: 请记住,BMP180 需要接触环境空气来测量其压力,因此不要将其放在密封的情况下。提供一个小的通风孔就足够了。但空气不要太多 :另一方面,暴露在快速移动的空气或风中会导致瞬时压力变化,从而影响您的读数。保护设备免受强气流的影响。
保持冷静: 由于测量压力需要准确的温度读数,因此尽量不要将设备暴露在温度急剧变化的环境中,并使其远离附近的热部件和其他热源。
保持干燥 :BMP180 对湿气很敏感。请勿将其浸入水中或使其接触液态水。
不要盲目: 令人惊讶的是,BMP180 内的硅对光很敏感,光可以通过芯片顶部的孔进入设备。为获得最大精度,请将芯片与环境光屏蔽。
第 4 步:制作电路 图> 图> 图> 图> 图> 图>
因此,我们首先为 nano 制作标题。我们实际上切割了母头,然后将它们归档,使它们看起来好像它们原来是那个大小。然后我们焊接它。然后我们为 DHT22 传感器制作了标题
.它需要一个 10k 电阻将数据连接到地。然后我们焊接了所有东西。然后是 bmp180 的时候了,我们以类似的方式添加了接头。我们使用 3.3 V 作为电源。我们连接了所有的 i2c 总线。
我们最后添加了我们使用 i2c lcd 的显示器,所以我们使用了与 bmp180 模块相同的总线。
(有第四个插槽,我想稍后在其中添加 rtc 模块,以便在机器中集成时钟)
第 5 步:代码时间 图> 图> 图>
等一下.......
下载库
bmp180
https://github.com/sparkfun/BMP180_Breakout_Arduin...
BMP180_Breakout_Arduino_Library-master.zipDht22库
https://github.com/adafruit/DHT-sensor-library
要在 arduino 中安装库,请检查此链接
https://www.arduino.cc/en/Guide/Libraries
我使用了 arduino 1.6.5,所以代码肯定适用于这个版本,也可能更高,如果它不起作用,请使用 1.6.5 作为基础版本。
#include #include #include #include "DHT.h"#include
SFE_BMP180 压力;
#define ALTITUDE 20.56 #define I2C_ADDR 0x27 // <<- 添加你的地址在这里。#define Rs_pin 0#define Rw_pin 1#define En_pin 2#define BACKLIGHT_PIN 3#define D4_pin 4#define D5_pin 5#define D6_pin 6#define D7_pin 7
#define DHTPIN 2 // 什么数字我们连接的引脚
//取消注释您使用的任何类型!//#define DHTTYPE DHT11 // DHT 11#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321DHT dht(DHTPIN, DHTTYPE);LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);float t1,t2;
void setup(){ Serial.begin(9600);液晶显示器开始(16,2); // <<-- 我们的 LCD 是 20x4,如果需要,请更改您的 LCD // LCD 背光 ONlcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);lcd.setBacklight(HIGH); lcd.home(); // 回到 LCDlcd.print("Weather Station");delay(5000);dht.begin();压力。开始(); } void loop(){ 字符状态;双 T,P,p0,a;状态 =pressure.startTemperature(); if (status !=0) { delay(status);
status =pressure.getTemperature(T);如果(状态!=0){ Serial.print(“1”);液晶显示器(); lcd.setCursor(0,0); lcd.print("气压温度:"); lcd.setCursor(0,1);液晶打印(T,2); lcd.print(" 摄氏度 "); t1=T;延迟(3000);
状态=压力。开始压力(3); if (status !=0) { // 等待测量完成:delay(status);
status =pressure.getPressure(P,T);如果(状态!=0){lcd.clear(); lcd.setCursor(0,0); lcd.print("绝对压力:"); lcd.setCursor(0,1);液晶打印(P,2); lcd.print("mb");延迟(3000);
p0 =pressure.sealevel(P,ALTITUDE); // 我们在 1655 米(科罗拉多州博尔德)
a =pressure.altitude(P,p0);液晶显示器(); lcd.setCursor(0,0); lcd.print("海拔高度:"); lcd.setCursor(0,1);液晶打印(a,0); lcd.print("米");延迟(3000); } } } } float h =dht.readHumidity(); // 读取摄氏温度(默认) float t =dht.readTemperature(); t2=t;液晶显示器(); lcd.setCursor (0,0); // 转到第二行的开头 lcd.print("Humidity:"); lcd.setCursor(0,1);lcd.print(h); lcd.print("%");延迟(3000);液晶显示器(); lcd.setCursor (0,0); // 转到第二行的开头 lcd.print("DHT Tempurature:"); lcd.setCursor(0,1);液晶打印(t); lcd.print(" 摄氏度 ");延迟(3000);液晶显示器(); lcd.setCursor (0,0); // 转到第二行的开头 lcd.print("Mean Tempurature:"); lcd.setCursor(0,1);液晶打印((t1+t2)/2); lcd.print(" 摄氏度 ");延迟(3000);}
FSIULGKING9D7SD.ino
代码
- 代码片段 #1
代码片段 #1纯文本
#include
#include #include #include "DHT.h"#include SFE_BMP180 压力;
#define ALTITUDE 20.56 #define I2C_ADDR 0x27 // <<- 在此处添加您的地址。 #define Rs_pin 0#define Rw_pin 1#define En_pin 2#define BACKLIGHT_PIN 3#define D4_pin 4#define D5_pin 5#define D6_pin 6#define D7_pin 7
#define DHTPIN 2 //我们是什么数字引脚重新连接到
//取消注释您正在使用的任何类型!//#define DHTTYPE DHT11 // DHT 11#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);float t1,t2;
void setup(){ Serial.begin(9600);液晶显示器开始(16,2); // <<-- 我们的 LCD 是 20x4,如果需要,请更改您的 LCD // LCD 背光 ONlcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);lcd.setBacklight(HIGH); lcd.home(); // 回到 LCDlcd.print("Weather Station");delay(5000);dht.begin();压力。开始(); } void loop(){ 字符状态;双 T,P,p0,a;状态 =pressure.startTemperature(); if (status !=0) { delay(status);
status =pressure.getTemperature(T);如果(状态!=0){ Serial.print(“1”);液晶显示器(); lcd.setCursor(0,0); lcd.print("气压温度:"); lcd.setCursor(0,1);液晶打印(T,2); lcd.print(" 摄氏度 "); t1=T;延迟(3000);
状态=压力。开始压力(3); if (status !=0) { // 等待测量完成:delay(status);
status =pressure.getPressure(P,T);如果(状态!=0){lcd.clear(); lcd.setCursor(0,0); lcd.print("绝对压力:"); lcd.setCursor(0,1);液晶打印(P,2); lcd.print("mb");延迟(3000);
p0 =pressure.sealevel(P,ALTITUDE); // 我们在 1655 米(科罗拉多州博尔德)
a =pressure.altitude(P,p0);液晶显示器(); lcd.setCursor(0,0); lcd.print("海拔高度:"); lcd.setCursor(0,1);液晶打印(a,0); lcd.print("米");延迟(3000); } } } } float h =dht.readHumidity(); // 读取摄氏温度(默认) float t =dht.readTemperature(); t2=t;液晶显示器(); lcd.setCursor (0,0); // 转到第二行的开头 lcd.print("Humidity:"); lcd.setCursor(0,1);lcd.print(h); lcd.print("%");延迟(3000);液晶显示器(); lcd.setCursor (0,0); // 转到第二行的开头 lcd.print("DHT Tempurature:"); lcd.setCursor(0,1);液晶打印(t); lcd.print(" 摄氏度 ");延迟(3000);液晶显示器(); lcd.setCursor (0,0); // 转到第二行的开头 lcd.print("Mean Tempurature:"); lcd.setCursor(0,1);液晶打印((t1+t2)/2); lcd.print(" 摄氏度 ");延迟(3000);}
Github
https://github.com/sparkfun/BMP180_Breakout_Arduino_Library/archive/master.ziphttps://github.com/sparkfun/BMP180_Breakout_Arduino_Library/archive/master.zipGithub
https://github.com/adafruit/DHT-sensor-libraryhttps://github.com/adafruit/DHT-sensor-library示意图
制造工艺