0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用BMP280制作一个气象站

科技观察员 来源:Abid hossain 作者:Abid hossain 2022-09-19 16:15 次阅读

该项目是一个无需任何互联网连接即可显示当地大气压力、温度湿度和紫外线指数的气象站。

背景

之前很长一段时间,我想在不使用互联网的情况下制作一个气象站,测量周围的天气数据并在需要时查看数据。所以,如今我着手做了一个看起来很酷的当地气象站,可以测量你周围的气压、温度、湿度和当天的紫外线指数(如果你把它放在窗户附近)。它还有一个时钟屏幕,用于显示时间、日期和星期几。

pYYBAGMoJMKAb63QAAGGM5n0tMk078.png

poYBAGMoJMiAPdOQAAG5ZjEm-nU261.png

pYYBAGMoJMyAQRnNAAJILOymKtg273.png

在本文中,我将向您展示如何通过这些步骤制作这个凉爽的气象站。

第 1 步:构建外壳

我使用Autodesk fusion 360创建外壳并用绿色 PLA 打印。它需要支撑,我在我的 Ender 3 上以 70mm/s 的速度以 20% 的填充量打印它。

poYBAGMoJNKAVwAkAALwqEs8wfE804.png

第 2 步:BMP280

BMP280 是大气压力和温度传感器,它使用 I2C 或 SPI 协议与 Arduino 通信。这里我使用 SPI。要使用 SPI,请连接-

CS到D10

SDA 转 D11

SDO 到 D12

SCK 到 D13

在代码部分,要使用这个传感器,我们需要一个库。首先,我将库包含在代码中#include 《Adafruit_BMP280.h》。你可以在本文下方找到跳转。

然后我定义传感器的 SPI 引脚。在 setup 函数中,我初始化 BMP 传感器,在 loop 函数中,我使用bmp.readPressure()andbmp.readTemperature()命令读取压力和温度数据。我将压力值除以 100 以测量以 hPa 为单位的压力。要测量我使用bmp.readAltitude(1005.47)命令的高度。在这一步,您必须根据您所在地区的平均压力更改值。(1005.47)

第 3 步:DS3231 RTC

这个气象站还有一个时间屏幕,可以显示当前时间、日期和星期的日子。为此,我使用了 DS231 RTC 模块,它使用 I2C 协议进行通信。所以要使用这个,连接 -

SCL 到 A5

SDA 转 A4

首先,您必须使用库示例中的DS3231_set.ino程序在 RTC 上设置时间和日期。

在主程序中,我包含库#include 《DS3231.h》并根据库中的指令读取时间数据。这里我使用库中的示例作为代码的参考。我为一周中的每一天创建了一个案例来查找当前日期。

第 4 步:DHT11

我用这个传感器来测量湿度。为此,我将其数据连接到 Arduino D2 。在程序中,我包含 DHT 库,#include 《DHT.h》然后在设置中初始化传感器,在循环中,我使用dht.readHumidity()命令读取湿度值。

第 5 步:GUVA-S12SD 紫外线传感器

GUVA-S12SD是基于氮化镓肖特基光电二极管。它具有240-370nm的典型UV检测波长(覆盖UVB和大部分UVA光谱)。它输出一个校准的模拟电压,该电压随紫外光强度而变化。因此,我们可以通过 Arduino ADC 读取模拟值。

在循环功能中,我模拟读取传感器值并计算紫外线指数

float sensorValue = analogRead(A0);

float sensorVoltage = sensorValue / 1024 * 5.0;

int UV_index = sensorVoltage / 0.1;

第 6 步:OLED 显示屏

我在这个项目中使用 0.96“ 128*64 OLED 显示器,它使用 I2C 协议,所以我将它连接到 Arduino,如下所示 -

SCK 到 A5

SDA 转 A4

在程序中,我首先涵盖了Adafruit_SSD1306和Adafruit_GFX库

#include 《Adafruit_GFX.h》

#include 《Adafruit_SSD1306.h》

然后我创建显示变量并添加一些位图来显示一些图像。在设置中,我初始化了显示。然后在循环中,我使用该display.print()函数显示每个数据。我在四个页面上显示数据,时间、压力、温度和湿度以及 UV_index。每页之间有 5 秒的延迟。

Local weather station code:

#include

#include

然后我创建显示变量并添加一些位图来显示一些图像。在设置中,我初始化了显示。然后在循环中,我使用该display.print()函数显示每个数据。我在四个页面上显示数据,时间、压力、温度和湿度以及 UV_index。每页之间有 5 秒的延迟。

Local weather station code:

#include
#include
#include
#include
#include

#include
#include
#include
#include
//#include

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)

DS3231 clock;
bool century = false;
bool h12Flag;
bool pmFlag;

Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

const unsigned char PROGMEM frame0 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x18, 0x07, 0xC0, 0x07, 0x86, 0x18, 0x61, 0xE0, 0x0F, 0x02, 0x00, 0x40, 0xF0, 0x0F, 0x02, 0x00, 0x40, 0xF0, 0x1E, 0x00, 0x00, 0x00, 0x78, 0x1C, 0x40, 0x00, 0x02, 0x38, 0x3C, 0x61, 0x00, 0x06, 0x3C, 0x3C, 0x01, 0x80, 0x00, 0x3C, 0x38, 0x00, 0x80, 0x00, 0x1C, 0x38, 0x00, 0xC0, 0x00, 0x1C, 0x78, 0x00, 0xE0, 0x00, 0x1E, 0x79, 0xC0, 0xF0, 0x03, 0x9E, 0x79, 0xC0, 0x7C, 0x03, 0x9E, 0x78, 0x00, 0x7E, 0x00, 0x1E, 0x38, 0x00, 0x7E, 0x00, 0x1C, 0x38, 0xFC, 0xFF, 0x3F, 0x1C, 0x3C, 0xFC, 0x7E, 0x3F, 0x3C, 0x3C, 0xFE, 0x7E, 0x7F, 0x3C, 0x1C, 0x7E, 0x18, 0x7E, 0x38, 0x1E, 0x3F, 0x00, 0xFC, 0x78, 0x0F, 0x3F, 0xC3, 0xFC, 0xF0, 0x0F, 0x0F, 0xFF, 0xF8, 0xF0, 0x07, 0x87, 0xFF, 0xE1, 0xE0, 0x03, 0xC1, 0xFF, 0x83, 0xC0, 0x03, 0xF0, 0x3C, 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x3F, 0x80, 0x00, 0x7F, 0x81, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const unsigned char PROGMEM frame1 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x01, 0x00, 0x9D, 0x80, 0x00, 0x03, 0x80, 0xB4, 0xE0, 0x00, 0x06, 0x80, 0xA6, 0x80, 0x00, 0x04, 0xC0, 0xA6, 0xE0, 0x00, 0x0C, 0x40, 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA6, 0x80, 0x00, 0x08, 0x20, 0xA6, 0xE0, 0x00, 0x08, 0x60, 0xA6, 0x80, 0x00, 0x0E, 0xC0, 0xA6, 0xE0, 0x00, 0x03, 0x80, 0xA6, 0x80, 0x00, 0x00, 0x10, 0xA6, 0xC0, 0x00, 0x00, 0x38, 0xA6, 0xE0, 0x00, 0x00, 0x38, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0, 0x00, 0x00, 0x44, 0xA6, 0x80, 0x00, 0x00, 0x6C, 0xA6, 0xE0, 0x00, 0x00, 0x38, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x00, 0xA4, 0xE0, 0x00, 0x00, 0x00, 0xA6, 0x80, 0x00, 0x00, 0x40, 0xA6, 0xE0, 0x00, 0x00, 0xC0, 0xA6, 0x80, 0x00, 0x01, 0xA0, 0xA6, 0xE0, 0x00, 0x01, 0x30, 0xA6, 0xE0, 0x00, 0x03, 0x10, 0xA6, 0x80, 0x00, 0x02, 0x18, 0xA6, 0xE0, 0x00, 0x06, 0x08, 0xA6, 0x80, 0x00, 0x06, 0x08, 0xA6, 0x80, 0x00, 0x02, 0x19, 0xA6, 0xC0, 0x00, 0x03, 0xF3, 0x26, 0x60, 0x00, 0x00, 0xC6, 0x26, 0x30, 0x00, 0x00, 0x0C, 0xE3, 0x10, 0x00, 0x00, 0x09, 0x80, 0x98, 0x00, 0x00, 0x19, 0x00, 0xC8, 0x00, 0x00, 0x13, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x12, 0x00, 0x6C, 0x00, 0x00, 0x1B, 0x00, 0x4C, 0x00, 0x00, 0x09, 0x80, 0xC8, 0x00, 0x00, 0x0C, 0xC1, 0x98, 0x00, 0x00, 0x04, 0x7F, 0x30, 0x00, 0x00, 0x06, 0x1C, 0x60, 0x00, 0x00, 0x03, 0x81, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const unsigned char PROGMEM frame2 [] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80};

void setup() {
Serial.begin(57600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 failed"));
}
Wire.begin();
dht.begin();
if (!bmp.begin()) {
Serial.println(F("Problem.bmp"));
while (1) delay(10);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 9);
display.setFont(&FreeSans9pt7b);
display.println("**** LOCAL ****");
display.setCursor(0, 38);
display.setFont(&FreeMonoBoldOblique12pt7b);
display.println("wather");
display.setCursor(27, 58);
display.println("Station");
display.display();
delay(2000);


bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */

}


void loop() {

//Time
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(13, 15);
display.setFont(&FreeMonoBoldOblique12pt7b);
display.print(clock.getHour(h12Flag, pmFlag));
display.setCursor(38, 15);
display.println(":");
display.setCursor(50, 15);
display.println(clock.getMinute());
display.setCursor(70, 15);
if (pmFlag) {
display.println(" PM");
} else {
display.println(" AM ");
}
display.setFont(&FreeSans9pt7b);

display.setCursor(20, 60);
display.println(clock.getDate());
display.setCursor(40, 60);
display.println("/");
display.setCursor(46, 60);
display.println(clock.getMonth(century));
display.setCursor(65, 60);
display.println("/");
display.setCursor(70, 60);
display.println("20");
display.setCursor(90, 60);
display.println(clock.getYear());
display.setCursor(30, 30);
display.setFont(&FreeSans9pt7b);
switch (clock.getDoW()) {
case 1:
display.println("Saturday");
break;
case 2:
display.println("Sunday");
break;
case 3:
display.println("Monday");
break;
case 4:
display.println("Tuesday");
break;
case 5:
display.println("Wednesday");
break;
case 6:
display.println("Thursday");
break;
case 7:
display.println("Friday");
break;
}


display.display();
delay(5000);
//P
display.clearDisplay();
display.drawBitmap(0, 0, frame0, 40, 40, 1);
display.setFont(&FreeSans9pt7b);
display.setCursor(41, 28);
display.println(bmp.readPressure() / 100);
display.setCursor(110, 28);
display.setFont();
display.println("hPa");
display.setCursor(0, 55);
display.setFont(&FreeSans9pt7b);
display.println("Altitude:");
display.setCursor(65, 62);
display.println(bmp.readAltitude(1005.47));
display.setCursor(113, 62);
display.println("m");
display.display();
delay(5000);
//T&RH
display.clearDisplay();
display.setFont(&FreeMonoBoldOblique12pt7b);
display.drawBitmap(0, 5, frame1, 40, 51, 1);
display.setCursor(35, 30);
display.print(bmp.readTemperature());
display.setFont(&FreeSans9pt7b);
display.setCursor(102, 28);
display.println(" *");
display.setCursor(110, 31);
display.println(" C");
display.setFont();
display.setCursor(66, 45);
display.println("RH :");
byte RH = dht.readHumidity();
display.setCursor(95, 45);
display.println(RH);
display.setCursor(110, 45);
display.println("%");
display.drawBitmap(0, 56, frame2, 135, 15, 1);
display.display();
delay(5000);
//UV
display.clearDisplay();
float sensorValue = analogRead(A0);
float sensorVoltage = sensorValue / 1024 * 5.0;
int UV_index = sensorVoltage / 0.1;
display.setFont(&FreeSans9pt7b);
display.setCursor(0, 15);
display.print(" UV INDEX ");
display.setCursor(58, 45);
display.println(UV_index);
display.display();
delay(5000);
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 气象站
    +关注

    关注

    1

    文章

    693

    浏览量

    15347
  • DIY设计
    +关注

    关注

    2

    文章

    59

    浏览量

    19706
  • BMP280
    +关注

    关注

    1

    文章

    20

    浏览量

    5571
收藏 人收藏

    评论

    相关推荐

    如何使用miniprog3设置气象站

    你好,可以请人帮我,我想计划的cy3271-exp1 PSoC气象站板采用miniprog3这样我可以把周围的光强读数然后发送阅读通过串行命令我写的应用程序并存储的数据画成了GR促性腺激素释放
    发表于 04-15 08:32

    如何使用树莓派制作气象站

    自动气象站可以实时探测气温、湿度、气压、风速、风向、降雨量、紫外线辐射等气象信息,通过不同的传感器采集地面气象数据,数据采集完成后通过网络统传输到
    发表于 05-19 07:59

    怎样去设计基于ESP32的家庭气象站系统

    或 毕业设计技术解答毕设帮助:7468760412 主要器件本项目学长将使用ESP32创建气象站。基本原理是通过读取DHT22和BMP180传感器的数据,然后使用ESP32传输创
    发表于 12-13 07:38

    通过BMP280气压/温度传感器模块测量大气压和温度

    ()函数在电脑串口调试终端打印输出。气压:气压是作用在单位面积上的大气压力。气压的国际制单位是帕斯卡,简称帕,符号是Pa。气象学中,人们般用千帕(kPa)、或使用百帕(hpa)作为单位。二、 传感器参数配置概述Core提供的库函数默认将
    发表于 01-07 06:40

    分享太阳能WiFi气象站的设计方案

    说明太阳能 WiFi 气象站 V3.0这个气象站如此紧凑的气象站,由多个气象传感器组成,测
    发表于 06-20 07:58

    分享气象站项目

    描述气象站 | 风向
    发表于 07-11 07:16

    分享不错的太阳能WiFi气象站V2.0的项目

    新版本的气象站。我还为这个项目制作定制的 PCB,所以任何对电子电路知之甚少的人都可以制作这个项目。我的 V-2.0 PCB 也可用于
    发表于 09-12 06:32

    BOSCH气压传感器BMP280数据手册

    BOSCH气压传感器BMP280数据手册
    发表于 01-19 10:38 0次下载

    气压传感器bmp280与ms5611哪个好

    本文开始阐述了BMP280的定义与BMP280的应用程序,其次阐述了MS5611的定义、MS5611参数、MS5611的分类与典型应用,最后详细分析了气压传感器bmp280与ms5611哪个比较好。
    发表于 03-08 09:08 2.5w次阅读

    BMP280气压传感器的制作

    在此示例中,将以下BMP280引脚分别连接到Arduino,VCC到3.3V,GND到GND,SCL到A5,SDA到A4。
    的头像 发表于 10-31 17:32 6612次阅读

    使用BMP280测量温度、压力和高度

    电子发烧友网站提供《使用BMP280测量温度、压力和高度.zip》资料免费下载
    发表于 10-26 11:43 10次下载
    使用<b class='flag-5'>BMP280</b>测量温度、压力和高度

    BMP280气压传感器使用指南

    博主最近在调试 bmp280 气压传感器。
    的头像 发表于 04-17 18:02 8721次阅读
    <b class='flag-5'>BMP280</b>气压传感器使用指南

    制作BMP280 ESP32天气预报器

    电子发烧友网站提供《制作BMP280 ESP32天气预报器.zip》资料免费下载
    发表于 06-08 10:33 0次下载
    <b class='flag-5'>制作</b><b class='flag-5'>BMP280</b> ESP32天气预报器

    使用BMP280-DHT11的Arduino气象站

    电子发烧友网站提供《使用BMP280-DHT11的Arduino气象站.zip》资料免费下载
    发表于 07-06 14:48 0次下载
    使用<b class='flag-5'>BMP280</b>-DHT11的Arduino<b class='flag-5'>气象站</b>

    bmp280气压传感器模块例程

    BMP280 气压传感器是一种高精度的数字气压传感器,可以用于测量大气压力、温度和高度。它具有低功耗、高线性度和高分辨率的特点,适用于各种应用场景,如天气站、室内气压监测、气象预报和高度测量
    的头像 发表于 12-18 13:51 762次阅读