微型互联网气象站
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
| ||||
|
关于这个项目
有很多应用程序可以让您将智能手机连接到物联网。我已经尝试了很多,但通常都很失望。布林克不是这样!它非常灵活,拥有漂亮的用户界面,适用于各种物联网平台,并且可以在 Android 和 iPhone 上运行。业余爱好者也可以免费使用!所以这是一个相对简单的物联网项目,让我可以使用 Blynk 进行探索。
硬件
这个项目的硬件相当简单。我们使用处理 WiFi 的 Arduino Nano 33 IoT、一个 BME280 传感器板,将温度、湿度和气压都集成在一个单元中,以及一个 1 英寸的 OLED 显示屏。所有三个都在 3.3 伏下运行良好。显示显然是可选的 - 目标是让气象站显示在您的手机上。但是,在处理 Blynk 和您的智能手机之前,首先在 OLED 显示屏上启动并运行所有内容变得更加容易。
下面的示意图显示了硬件是如何互连的。传感器和显示接口均采用 I2C。理论上,一个I2C可以支持多个设备,但是sensor和display的库有一些冲突,所以我最终得到了两个不同的I2C端口。传感器在模拟处使用正常的默认 I2C 端口 引脚 4 和 5。显示器使用设置在 digital 的辅助 I2C 端口 引脚 4 和 5。(是的,它们是相反的 - SDA 是数字引脚 5))
硬件封装在一个正面清晰的小塑料外壳中,以便可以查看显示屏。它是塑料的,因为它需要对 WiFi 的 RF 透明。它需要相对防风雨,但传感器底部有一个 1/2" 孔,暴露在外面的天气中。传感器安装在那个孔内。我用热把所有东西都装在外壳里胶水,但如果您打算在炎热的夏季将其放在室外,则可能需要使用环氧树脂。
通过 USB 电缆供电。这样,它可以通过开箱即用的单根电缆进行编程或供电。该电缆可以在编程时连接到您的计算机,或者在用作气象站时连接到插入式 USB 电源。
软件
在 Arduino 上运行的软件只不过是传感器、显示器和 Blynk 的库示例的混搭。涉及的库是传感器的 Adafruit_BME280_Library、显示器的 ss_oled 库和 Blynk 的 Blynk 库。所有三个都可以直接从 Arduino 的库管理器下载。您可能希望分别试验这些库中的每一个,以更好地了解每个库。
Blynk 有一堆关于如何配置硬件以与之交互的示例:https://examples.blynk.cc/ 不幸的是,它没有将 Nano 33 IoT 列为其支持的 Arduino 之一。但是 Blynk 确实支持 WiFiNINA,它被 Nano 33 IoT 和其他几个 Arduino 处理器使用。所以添加这两个包含解决了这个问题:#include
您将在我的代码中看到的另一个附加内容是: #include
注意 - 通常报告的大气压力已校正到海平面。在更高的海拔处,气压明显下降,因此要将传感器的值校正为它们在海平面上的等效读数,您必须在每 1000 英尺海拔的测量值中添加一个大约 1 英寸汞柱的值。在我自己的代码中,您会看到我添加了 1.3 来补偿我自己的海拔 1300 英尺。您需要更改此值以匹配您自己的海拔。每 1000 英尺 1" Hg 只是一个粗略的估计。如果你想要一个精确的修正,网上有表格可以为你提供精确的海拔修正。
此时,您可以设置硬件,并使用我附带的软件在 OLED 显示屏上显示天气数据。只需在 Setup 中注释掉 Blynk.begin() 行即可让气象站自行运行。 (如果你不注释掉 Blink.begin(),没有与 Blynk 的有效连接,草图将在该点停止或挂起。)在下一节中,我们将讨论 Blynk,如何设置它在 Arduino 草图和智能手机上以在手机上显示气象站。
布莱克
Blynk 很容易安装在你的 iPhone 或 Android 上,并带有详细的文档:http://docs.blynk.cc/ 但是那里有很多信息和很多选项,我一开始觉得有点混乱,所以我会在此提供我自己的 Blynk 入门版本。
我将 Blynk 与 iPhone 一起使用,但我认为体验与 Android 非常相似,您可以按照我的说明进行操作。拥有该应用程序后,您需要创建一个帐户。从那里,在应用程序中,您创建一个新项目。您的项目提供了一个身份验证代码,用于将您的硬件与您的项目联系起来。你的第一份工作是让你的硬件通过 WiFi 连接到你的 Blynk 项目。您可以使用位于 examples.blynk.cc 的 Blynk 的默认草图/程序 Blynk Blink 来完成并测试它,它允许您打开和关闭 Nano 33 IoT 上的板载 LED。我的建议是,在尝试让气象站与 Blynk 一起工作之前,你先试试这个并让它工作。
我们已经讨论了一些关于配置我们的软件以使我们的 Nano 33 IoT 与 Blynk 一起工作的内容。如果打开 examples.blynk.cc,它默认为 ESP8266 板。找到 #include
除了为 Nano 33 IoT 添加 WiFiNINA 支持之外,正如我们已经讨论过的,您需要添加您的 WiFi 凭据和您的 Blynk 项目的身份验证代码。我们将在一分钟内解释打开和关闭 LED,但首先,让我们检查连接。正确配置并运行 Blynk Blink 草图后,打开 Arduino 的串行监视器,您应该能够看到与 Blynk 云服务器的连接。此时,我们可以将硬件放在一边,在手机上使用 Blynk 应用程序。
我承认我发现 Blynk 应用程序有些混乱。左上角的图标允许您在项目之间进行选择,也可以注销您的帐户。右上角的一个允许您进入和退出编辑项目模式。中间的那个做什么取决于你在哪里。
要控制我们的板载 LED,我们需要在应用程序中进入编辑模式。然后您将看到一个空白屏幕。如果您向左滑动,它会移到一边以显示一个小部件工具箱。通过单击选择一个按钮,它现在将出现在主屏幕上。在那里单击它,它将打开以进行配置。将其从推送模式移动到切换模式。使用引脚选择来选择我们 Nano 33 IoT 上的板载 LED - 数字引脚 13。现在单击确定,然后点击右上角的图标退出编辑模式。您的按钮现在应该控制 LED。
我们现在准备将我们的气象站连接到我们的 Blynk 项目。打开我附带的软件,在 Setup 中取消注释 Blynk.begin() 行,添加您的项目身份验证代码和 WiFi 凭据,然后上传到 Arduino。
在手机上打开 Blynk。如果您遵循了本教程,您的按钮仍然存在,并且应该仍然能够打开和关闭板载 LED。进入编辑模式,单击按钮进行配置,然后使用最底部的删除将其删除。现在转到工具箱并选择一个标签值。它在列表的下方显示。返回显示页面,单击 Labeled Value 显示进行配置。单击 pin,然后选择 Virtual pin V3。我们将在下一段中解释虚拟引脚。现在对于标签,在上面写着“例如 Temp”的地方输入“Temp /pin.#/ deg.F”。 .# 告诉应用程序显示小数点后一位。选择大文本大小,并保留推送刷新间隔和绿色文本颜色。现在单击确定。您的标签值现在几乎可以显示温度了,但它太窄了。慢慢选择它 - 足够慢以至于它不会重新进入配置模式。标签的轮廓将亮起。现在可以拉伸以显示整条线。它也可以四处移动,但我们不会在这里这样做。将其拉伸约 3/4 穿过屏幕。然后退出编辑模式,您应该会看到手机上显示的温度。
在我们完成配置 Blynk 之前,值得解释一下我们刚刚在设置温度显示时看到的一些事情。 Blynk 使用了一个有点独特的想法,称为虚拟引脚。显示值小部件可以设置为读取我们处理器上的模拟引脚,或设置为读取数字引脚是高电平还是低电平。但通常情况下,我们希望显示变量的内容。我们通过为该变量分配一个虚拟引脚号来做到这一点,从那时起,Blynk 应用程序将通过它的虚拟引脚号引用该变量。所以在我的软件中,你会看到我将华氏温度分配给虚拟引脚 V3 的地方。
另一个值得一提的 Blynk 想法是我们在推送模式下留下的刷新间隔。这意味着 Arduino 草图正在推送数据,在我们的例子中,每分钟更新一次温度、湿度和气压。但是 Blynk 也支持 Pull 方法,其中 Blynk 应用程序设置间隔并询问硬件以获取新数据。
所以现在让我们完成在 Blynk 上显示我们的气象站。您将需要另外两个标签值显示,一个显示湿度百分比(虚拟引脚 V4),另一个显示压力,单位为“in. HG”或英寸汞柱(虚拟引脚 V5)。为了让它看起来像我的,你需要金色的湿度和红色的压力。对于湿度,我显示了小数点后一位;对于压力,我显示了小数点后两位。
如果您现在拥有显示温度、湿度和气压的三个标签值显示,您可以添加所有三个的图表。这是通过添加 SuperChart 小部件来实现的。首先,将其向下拉伸,使其填满屏幕的其余部分。然后点击它进行配置。我打开了显示 x 轴值,并选择了实时、1 小时、6 小时、1 天、1 周、1 个月的分辨率。和 3 个月。我们需要三个数据流——一个用于我们的 3 个变量中的每一个。要配置每个数据流,请单击它右侧的图标。我们需要再次为每个选择虚拟引脚。对于 y 轴缩放,选择高度。然后对于温度,将高度设置为 67 - 100。对于湿度,将高度设置为 34 - 66。对于压力,将高度设置为 0 - 33。设置颜色以匹配标记值。打开显示 Y 轴。就是这样。退出编辑模式,您的手机显示屏应该和我的一样。图表开始需要一点时间。要获得快速结果,请查看实时或 1 小时分辨率。
您可能想了解的 Blynk 的另一项功能是与其他智能手机共享您完成的 Blynk 项目,以便不止一部手机可以查看气象站。要开始共享,请将您的项目置于编辑模式,然后单击项目设置的顶部中间图标。打开共享,然后生成链接。它会给你一个二维码,你可以通过电子邮件发送或以其他方式分享。新用户需要 Blynk 应用程序,但不需要 Blynk 上的帐户。未注册用户的应用程序有一个链接来加载另一个人的 Blynk 项目的二维码。而已。
这是对 Blynk 的一个非常有限的介绍,但应该给你一个很好的起点。我之前提到过 Blynk 是免费的——几乎是免费的。小部件和共享都消耗了 Blynk 称之为能量的点数。我认为您可以免费获得 2500 积分。这足以免费完成这个项目。但是分享或添加它可能会导致您耗尽 Blynk 能量。我花了 6 美元获得了额外的 5000 积分。如果您使用 Blynk 进行其他项目,您可能需要为 Blynk 燃料花费几美元。
代码
- 微型互联网气象站
微型互联网气象站Arduino
使用 WiFi 和 Blynk 到智能手机/*此草图适用于 Arduino Nano 33 IoT 它使用 BME280 传感器板它使用 0.96 英寸 128 x 64 OLED 显示屏它通过 WiFi 连接到 Blynk 云服务器以在智能手机上显示天气数据*/#include#include #include // BME280 library#include // 用于将天气数字转换为字符串以在 OLED 上显示#包含 // OLED 库 // 接下来的两个包含需要使 Nano 33 IoT 与 Blynk 一起工作#include #include char auth[] ="YourBlynkProjectCode";char ssid[ ] ="YourWifiID";char pass[] ="YourWiFiPassword";Adafruit_BME280 bme; // 使用I2C接口Adafruit_Sensor *bme_temp =bme.getTemperatureSensor();Adafruit_Sensor *bme_pressure =bme.getPressureSensor();Adafruit_Sensor *bme_humidity =bme.getHumiditySensor();#define SDA_PIN 5#define SCL_PIN 4#1Adafruit_define REOLED DDR -1#define FLIP180 0#define INVERT 0#define USE_HW_I2C 0#define MY_OLED OLED_128x64#define OLED_WIDTH 128#define OLED_HEIGHT 64SSOLED ssoled; // OLEDBlynkTimer 定时器实例; // Blynk timervoid setup() 的实例 { if (!bme.begin(0x76)) { // 等到检测到传感器而 (1) delay(10); bme_temp->printSensorDetails(); bme_pressure->printSensorDetails(); bme_湿度->printSensorDetails(); oledInit(&ssoled, MY_OLED, OLED_ADDR, FLIP180, INVERT, USE_HW_I2C, SDA_PIN, SCL_PIN, RESET_PIN, 400000L); oledFill(&ssoled, 0x0, 1); Blynk.begin(auth, ssid, pass); // 将此行注释掉以在没有 Blynk 的情况下运行气象站 timer.setInterval(60000L, myupdate); // 每分钟运行一次 myupdate myupdate(); // 运行对 Blynk 的显示和数据的初始更新,因为主循环等待一分钟}void loop() { Blynk.run(); // Blynk 更喜欢在主循环中自行运行。定时器运行(); // 其他一切都通过 Blynk 计时器处理}// 该例程由 Blynk 计时器调用以更新 OLED 显示器并将数据推送到 Blynkvoid myupdate(){sensors_event_t temp_event, pressure_event, height_event; bme_temp->getEvent(&temp_event); bme_pressure->getEvent(&pressure_event); bme_湿气->getEvent(&湿气_事件);浮动 ctemp =temp_event.temperature; // 获取摄氏温度 float ftemp =32 + (9*ctemp)/5; // 将温度转换为华氏度 float hum =modified_event.relative_humity; // 获取相对湿度 float ppress =pressure_event.pressure; // 以毫米为单位获取压力 float mpress =1.3 + ppress/33.8939; // 转换为英寸汞柱并加上 1.3 以匹配当地实际报告的气压 // 压力。您可能想要删除 1.3 和/或添加您自己的调整。字符 mytemp[8]; dtostrf(ftemp, 6, 2, mytemp); // 将 temp 转换为字符串 char myhum[8]; dtostrf(hum, 6, 2, myhum); // 将湿度转换为字符串 char mypress[8]; dtostrf(mpress, 6, 2, mypress); // 将压力转换为字符串 // 更新 OLED 显示 oledWriteString(&ssoled, 0,2,1,(char *)"Weather Station", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,2,3,(char *)"Temp =", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,50,3,(char *)mytemp, FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,105,3,(char *)"F", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,2,5,(char *)"Humid=", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,50,5,(char *)myhum, FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,105,5,(char *)"%", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,2,7,(char *)"Press=", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,50,7,(char *)mypress, FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,105,7,(char *)"in", FONT_NORMAL, 0, 1); // 将新的天气数据推送到 Blynk Blynk.virtualWrite(V3, ftemp); Blynk.virtualWrite(V4, hum); Blynk.virtualWrite(V5, mpress); }
示意图
制造工艺