看来大气压不仅影响天气的变化,还影响头痛等身体状况。大气压力因地区和条件而异,因此最好测量它在您所在位置的变化情况。
参考)
气压计采用 M5Stack Basic 和绝对压力传感器 (2SMPB-02E)
完成表格
只需用双面胶带将绝压传感器粘贴在 M5Stack Basic 的主体上即可。
LCD 上不显示任何内容。我觉得我没有充分利用 M5Stack 的优点,但这不是重点,所以这次我跳过它。
累积数据
我们使用物联网数据收集和存储服务“SORACOM Harvest Data”。
图表
与绝对压力传感器的连接是 I2C。 M5Stack Basic 定期读取和发送数据。
通信使用 Wi-Fi。电线护罩利用 ”SORACOM 弧”,您甚至可以通过 Wi-Fi 使用 SORACOM 的物联网服务。
这一次,其中,物联网数据积累/收集服务“SORACOM 收获数据”保存大气压力数据。
M5Stack代码
- 绝对压力传感器的读数由传感器本身降噪。了解更多信息使用 Grove 将传感器连接到 M5Stack 并测量大气压力解释在
- UDP 用于向 SORACOM Harvest Data 发送数据。有效负载格式本身是 JSON。代码比HTTP简单,可以减少数据量。目的地是
uni.soracom.io,但它是一种从这里路由到启用的服务的机制(统一端点)。 - 当检测到 Wi-Fi 断开连接时,它将重新启动并尝试重新连接。
m5stack_2SMPB-02E_wireguard_soracom.ino
/*
Barometer made with M5Stack Basic and pressure sensor (2SMPB-02E)
Copyright (c) 2022 Kohei "Max" MATSUSHITA (ma2shita+git@ma2shita.jp)
Released under the MIT license
https://opensource.org/licenses/mit-license.php
NOTE: Also follow the library's license.
*/
static const char _VERSION_[] = "2SMPB-WG-0.1";
#include <M5Stack.h>
static const char TAG[] = "TAG"; // for ESP_LOG*
#include <WiFi.h>
static const char WIFI_SSID[] = "YOUR_WIFI_SSID";
static const char WIFI_PASSWORD[] = "YOUR_WIFI_PASS";
WiFiUDP ctx;
static const char ENTRYPOINT_HOST[] = "uni.soracom.io";
static const int ENTRYPOINT_PORT = 23080;
#include <WireGuard-ESP32.h> // Install from lib. manager. "WireGuard-ESP32 by Kenta Ida"
static WireGuard wg;
static const char PRIVATE_KEY[] = "VzOe......kq4="; // [Interface] PrivateKey
static const IPAddress LOCAL_IP(999, 999, 999, 999); // [Interface] Address
static const char PUBLIC_KEY[] = "cx/QH.......VA="; // [Peer] PublicKey
static const char ENDPOINT_ADDRESS[] = "XXXX.soracom.io"; // [Peer] Endpoint(address)
static const uint16_t ENDPOINT_PORT = 99999; // [Peer] Endpoint(port)
#include <ArduinoJson.h> // Install from lib. manager. "ArduinoJson by Benoit Blanchon"
#include "Omron2SMPB02E.h" // Install from GitHub then a tweak fix by your hand. "https://github.com/omron-devhub/2smpb02e-grove-arduino"
Omron2SMPB02E prs;
template <typename T> void connect_to_network(T *wifi) {
int32_t _enter = millis();
wifi->mode(WIFI_STA);
ESP_LOGD(TAG, "begin():");
wifi->begin(WIFI_SSID, WIFI_PASSWORD);
while (wifi->status() != WL_CONNECTED) {
ESP_LOGV(TAG, ".");
delay(200);
}
ESP_LOGD(TAG, "localIP(): %s", wifi->localIP().toString().c_str());
ESP_LOGD(TAG, "elapsed(ms): %d", millis() - _enter);
}
template <typename T> bool is_network_connected(T *wifi) {
bool result = (wifi->status() == WL_CONNECTED);
if (!result) ESP_LOGE(TAG, "status() != WL_CONNECTED");
return result;
}
void connect_to_wireguard(WireGuard *wg) {
int32_t _enter = millis();
ESP_LOGD(TAG, "Adjust system time. (with winting 3 seconds for adjusting.)");
configTime(9 * 60 * 60, 0, "ntp.jst.mfeed.ad.jp", "ntp.nict.jp", "time.google.com");
delay(3000); // Wait for adjust
ESP_LOGD(TAG, "begin():");
wg->begin(LOCAL_IP, PRIVATE_KEY, ENDPOINT_ADDRESS, PUBLIC_KEY, ENDPOINT_PORT);
ESP_LOGD(TAG, "elapsed(ms): %d", millis() - _enter);
}
void mcu_restart() {
ESP_LOGD(TAG, "enter.");
delay(3000); // waiting for flush of serial buffer
M5.Power.reset();
}
void setup() {
delay(1000);
M5.begin();
dacWrite(25, 0); // Speaker OFF // bad known how for M5Stack ...
Serial.begin(115200); // for log
ESP_LOGD(TAG, "--- START: %s", _VERSION_);
M5.Lcd.sleep();
M5.Lcd.setBrightness(0);
connect_to_network(&WiFi);
connect_to_wireguard(&wg);
prs.begin();
prs.set_average(AVG_1, AVG_8);
delay(300);
prs.set_filter(FILTER_4);
delay(300);
prs.set_mode(MODE_NORMAL);
delay(300);
}
static const uint32_t LOOP_INTERVAL_MS_IN_LOOP = 60000; // msec
void loop() {
if (!is_network_connected(&WiFi)) mcu_restart();
StaticJsonDocument<16> doc;
doc["hPa"] = prs.read_pressure() / 100.0;
serializeJson(doc, Serial); // logging => e.g.) `{"hPa": 1014.1980135}`
Serial.println(); // for CRLF
ctx.beginPacket(ENTRYPOINT_HOST, ENTRYPOINT_PORT);
serializeJson(doc, ctx);
ctx.println();
ctx.endPacket();
delay(LOOP_INTERVAL_MS_IN_LOOP);
}
绝压传感器库返工
绝压传感器库截至2022年8月在主分支存在bug,无法编译出现如下错误。
In file included from \...\Arduino\libraries\2smpb02e-grove-arduino-master\src\Omron2SMPB02E.cpp:5:
\...\Arduino\libraries\2smpb02e-grove-arduino-master\src/Omron2SMPB02E.h:124:3: note: previous specification in 'Omron2SMPB02E::Omron2SMPB02E(uint8_t)' here
Omron2SMPB02E(uint8_t SDO = 1);
^~~~~~~~~~~~~
https://github.com/omron-devhub/2smpb02e-grove-arduino/pull/2/files手动应用此 P-R 中建议的内容将编译。
具体来说,更改第 39 行的src/Omron2SMPB02E.cpp 并删除src/Omron2SMPB02E.h 的第 11 到 13 行。
综上所述
如果您想自己使用测量数据,您不必担心,但如果您想向公众发布,则需要遵守气象业务法。为自己阅读更多内容。
https://www.jma.go.jp/jma/kishou/shinsei/kentei/index.html
SORACOM 成本
- SORACOM Arc 有一个免费层 (https://soracom.jp/services/arc/)
- SORACOM Harvest 有一个免费层 (https://soracom.jp/services/harvest/)
参考资料
-
绝对压力传感器本身
-
绝对压力传感器库
-
UDP传输
物联网
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308623305.html