使用 Android 和 IOT 检测地震波
一种通过物联网检测地球地震活动并使 Android 设备能够自我感知以拯救生命的研究与开发方法。
将要涵盖的主题
引言
物联网(IoT)在最近一段时间一直是互联网的热门词汇,除了它对大众来说听起来有些杂乱的含义外,物联网正在促进机器到网络之间海量数据的交换。老实说,物联网是未来技术的下一个前沿。
本文将介绍物联网的通用概念及其在现实世界中的应用,我们还将在本文后面讨论构建一个功能性的物联网应用程序。如果您是技术爱好者,那么您已经准备好阅读本文了。
什么是物联网?
好吧,这个词不言而喻:一个连接到互联网的“东西”。这一句话可以从多种角度来解释。但简单的解释可以是:为设备网络添加互联网连接,使它们能够与用户和其他设备进行通信。总的来说,物联网促进了我们对现实世界的高度感知,并提供了一个平台来监测这些感知暴露给我们的反应。设备网络可以拥有自己的 IP 地址,并可以相互连接以自动执行定义的任务。2014 年,全球物联网市场的收入达到了 6558 亿美元。预计到 2020 年,其市场规模将增长到 8.9 万亿美元!
物联网与现实世界(来源:LinkedIn)
历史
1982 年,卡内基梅隆大学制造了一台改装的可乐贩卖机,据说这是第一台联网电器。MIT 自动识别中心的联合创始人 Kevin Ashton 于 1999 年创造了“物联网”一词。十年后,物联网获得了全球认可,并在 2008-09 年成为一项重大的技术进步。
应用
物联网可以在现实世界中以多种方式应用。想象一下这样的世界:当你走到家门口时,前门会自动打开,而当陌生人出现在门口时,它会自动锁上。当检测到你在房间里时,灯会自动打开,当你离开房间时,灯会自动关闭。当你用语音命令制作咖啡时,咖啡机会开始冲泡。你的手表会为你爷爷准备一份健康报告,并在你外出时,如果发现任何严重问题,会向你的手机发送警报语音,等等。所以,可能性和应用领域显然是无限的。你已经开始做梦了吧?
物联网应用(来源:SlideShare)
本文的成果
在本文中,我们将构建一个主要针对人们安全问题的物联网项目。无论您是初学者还是专业人士,本文都将教您如何将您的想法转化为一个很棒的物联网对象。我们将贯穿全文,一步一步地讨论“事物”的协调以及它们的实现。让我们开始吧!
兔子在哪里?
让我们来谈谈我们将在本文中启动的想法。众所周知,地震是人类能够最小化其破坏性影响的最具毁灭性的自然力量之一。由于无法提前得知其到来,生命和财产的损失常常超出灾难性水平。
在本文中,我们将演示一种通过物联网系统检测地震波的近似方法,并通过您的移动设备了解即将到来的冲击波。我们将使用 Android 作为测试移动平台。所以,我们找到了那只兔子,对吗?我们来抓住它!
背景
我住在孟加拉国,根据记录,该国有自 1548 年以来悠久的地震历史。该国被高地震活动区域所包围,包括北部的喜马拉雅山弧和什隆高原,东部的缅甸弧、阿拉干冲断构造带,以及东北部的复杂那加-迪桑-贾夫隆冲断带。
从统计调查中发现,所提及区域所在的印度板块约在 5000 万年前与亚洲板块碰撞。从那时起,该板块持续向北推入亚洲,垫覆喜马拉雅山脉并将其隆起。
最近,该区域附近发生了多次大地震。可能我们很多人听说过 尼泊尔 和 印度 地震造成的巨大破坏,造成数千人死亡,财产损失达数十亿美元。在这两次事件中,我国也遭受了重大地震事件,以及数次生命和财产损失。
根据《国家地理》的一份报告(以及许多其他可信来源,例如 CNN),据估计,该国可能面临发生一次高达 9.0 级的巨型逆冲地震的悲惨命运,可能在不久的将来发生。即使在其影响的猜测之前,也很难预测这场地震将对世界上人口最稠密的地区之一造成何等灾难性的损失。
初步的假设促使我寻找一种了解地震活动的方法。如果我们能够以某种方式测量有害的地震波,并在较不危险的时候让人们了解他们的安全避难所,这将在很大程度上挽救他们宝贵的生命。但在此之前,我们需要了解一些关于地震波的基本知识。
孟加拉国-印度-缅甸地区隐藏的断层(来源:CNN)
地震波
地震波是从震源向四面八方传播的振动,将能量从震源向外传递。这些波穿过地球内部,可以用地震仪等灵敏探测器进行测量。科学家们在全球各地都设置了地震仪来追踪地壳的运动。(分析:地震波)
所以,它基本上是一种弹性波,可以由地震、爆炸或大规模山体滑坡等脉冲产生。一次地震可以产生三种类型的地震波:P(初至)波、S(次至)波和表面波。
也称为压缩波、纵波或初至波。这是最快的地震波,比其他地震波传播得更快,首先到达地震仪,因此得名“初至”。这种波可以穿过固体岩石和流体,如水或地球的液态层。它们沿传播方向摇晃地面,在地壳中传播速度为 1.5-8 公里/秒。
P 波(点击查看动画,来源:地震)
也称为剪切波或次至波,比 P 波晚到达地震台站。比 P 波慢约 1.7 倍。它们以与其传播方向垂直的方向摇晃地面。但 S 波无法在流体或气体中传播,因为流体和气体无法传递剪切应力,而 S 波是剪切材料的波。
总的来说,地震产生的剪切波比压缩波更大,地震附近的许多破坏是由剪切波引起的强烈地面运动造成的。
S 波(点击查看动画,来源:地震)
与上述两种波不同,这种类型的波不会深入地球内部。通常比体波的频率低,因此在地震图上很容易区分。表面波有两种类型:勒夫 波和瑞利 波。虽然它们在体波(P 和 S)之后到达,但地震相关的破坏和毁灭是由表面波造成的。
表面波(点击查看动画,来源:地震)
为了理解这些不同类型地震波的全部影响,让我们看看这个图像的动画。
地震的地震波(点击查看动画,来源:地震)
通过上述研究,我们对地震事件有了清晰的认识。当然,我们都会支持一个观点:初至波(P 波)在地球地壳中传播得最快,并且与其他破坏性波相比,造成的损害较小。由于它瞬时传播,如果我们能够收集足够的数据来检测它,那么很明显就可以提前预警即将发生的严重地震事件。
即使通过计算 P 波和 S 波到达时间之间的差值,也可以对地震焦点到距离进行粗略估计。经验法则:将两波之间的时间乘以 5,即可得到距离焦点的距离(单位:英里)(来源:加州大学伯克利分校地震学实验室)。
让我们做一个假设,一次地震击中了一个地震台站,相应的地震图记录了 P 波和 S 波的到达时间分别为 04:00:20 和 04:00:26.62。那么这里两波的时间差为 6.62 秒。应用上述理论,台站到震源的距离将大约是(6.62*5)= 33 英里。
所以根据经验法则,
距离震源的距离 = (P 波到达时间 - S 波到达时间) * 5
让我们来做一些计算。
情况 1:假设发生了一场地震,其震源距离您的位置 112 英里。由于 P 波在地壳中的传播速度约为 6.0 公里/秒,因此到达您位置所需的时间为 - ((1.6 * 112) / 6) = 29.87 秒。
S 波比 P 波慢 1.7 倍,在地壳中传播速度约为 3.5 公里/秒,因此到达您位置所需的时间为 - ((1.6 * 112) / 3.5) = 51.2 秒。
这两波之间的时间差为 = (51.2 – 29.87) = 21.33 秒,这是一个近似值,因为传播速度可能受多种因素影响,但实际结果不会有太大差异(基于上述公认的参考资料)。
情况 2:现在假设一个更近的地震,其震源距离您的位置 12 英里。那么 P 波将在 - ((1.6 * 12) / 6) = 3.2 秒到达您位置。
S 波将需要 - ((1.6 * 12) / 3.5) = 5.48 秒。
所以,在这种情况下,时间差为 = (5.48 – 3.2) = 2.28 秒。
从以上两种情况可以清楚地看出一点:当地震震源点离您越远,P 波和 S 波之间的时间差就越大;当它越近时,时间差就越小。
到目前为止,根据我们的想法,我们应该着手计划如何记录 P 波并让人们了解即将到来的冲击波。
收集材料
是时候收集我们将需要的关键组件了。为了检测地震活动可能产生的振动,我们将使用压电振动传感器。
它适用于测量柔韧性、振动、冲击和触摸。宽动态范围(0.001Hz~1000MHz)保证了出色的测量性能。而且,我们可以通过调整板载电位器来调整其灵敏度。(来源:Grove - 压电振动传感器)
Grove - 压电振动传感器板(型号:SEN04031P)
它提供一系列 USB 转串行转换线缆,可在 USB 和串行 UART 接口之间提供连接。提供一系列线缆,可提供 5V、3.3V 或用户指定的信号电平以及各种连接器接口的连接。(来源:USB 转串行编程器)
您可能需要安装相应的驱动程序才能使用该设备。我们的开发设备运行 Windows 7 64 位操作系统,因此我们为此模块安装了相应的驱动程序。
USB 转串行编程器
为了将传感器数据传输到便携式移动设备,我们将需要一个 Wi-Fi 模块。在本例中,我们使用了 Wi-Fi 模块 - ESP8266。它是一个独立的 SOC,集成了 TCP/IP 协议栈,可以使任何微控制器访问 Wi-Fi 网络。它能够托管应用程序,或者将所有 Wi-Fi 网络功能卸载到另一个应用程序处理器。(来源 - Wi-Fi 模块 - ESP8266)
我们需要做一些工作来定制模块并使其可编程。我们需要处理以下几个问题:
- 万用板(模块将在此处安装)
- 一些公头连接器
- 三个 10K 电阻用于 VC 控制
- 两个外部按钮用于重启和重置模块
重新设计的 Wi-Fi 模块(型号 - ESP8266)
为了使该 Wi-Fi 模块可编程,还有一些繁琐的工作要做。我们希望将该模块连接到熟悉的 Arduino IDE 以将代码上传到开发板。因此,我们需要查看专门针对上述芯片型号 ESP8266 的 GITHUB 项目。
从 官方网站下载 Arduino IDE。安装后,转到文件 -> 首选项 -> 其他主板管理器 URL,然后粘贴此 链接。
图 1.1:为可编程重新设计的 Wi-Fi 模块配置 Arduino IDE
现在回到 IDE 的主界面 -> 工具 -> 主板 -> 主板管理器,向下滚动并找到“esp8266 by ESP8266 community”选项,单击它,然后按安装按钮。请耐心等待安装完成。
图 1.2:为可编程重新设计的 Wi-Fi 模块配置 Arduino IDE
您可以通过右键单击“我的电脑”->“管理”->“设备管理器”->“端口”来检查您的开发设备的可用端口,并与 IDE 的“工具”->“端口”进行双重核对,确保它们相同。
转到 Arduino IDE,选择“工具”->“主板”-> 向下滚动并选择“Node MCU 1.0 (ESP-12E Module)”。现在 Wi-Fi 模块已准备好接收代码!在此之前,我们需要完成电路连接。
完成电路连接
您需要对电路图和面包板、公母连接器等有基本了解才能连接这些组件。这是我们稍后将遵循的电路图。
电路图
根据图示,我们将连接各个组件,这里我们需要一个面包板和一些导线。
将组件连接到面包板
这是一个真正的“啊哈”时刻,因为一切都已准备就绪,只剩下代码(以及移动设备端)将数据从传感器通过 Wi-Fi 模块上传到我的本地 IP!
现在是时候为 Wi-Fi 模块编写代码了,我们通过一个名为 Connectify 的工具创建了一个本地 Wi-Fi 网络,您也可以使用自己的 Wi-Fi 路由器。
移至 Arduino IDE 并编写以下代码。
#include <ESP8266WiFi.h>
const char* ssid = "SweetHeart"; // username of your network
const char* password = "123456780"; // password of your network
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0; // will store last time LED was updated
// constants won't change :
const long interval = 500; // interval at which to blink (milliseconds)
int sensorValue = 0;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
//Start the server
server.begin();
Serial.println("Server started");
//Print the IP address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait unlil the client sends some data
Serial.println("new client");
while (!client.available()) {
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
sensorValue = analogRead(A0);
}
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
String webpage = "<head><meta http-equiv=""refresh"" content=""1""></head>";
webpage += "<body>";
//webpage += "Value: ";
webpage += String(sensorValue);
webpage += "</body></html>";
client.println(webpage);
Serial.println("Client disconnected");
Serial.println("");
}
如果所有步骤都按照上述步骤完成,代码将成功加载到模块中(连接电路板到电源,您可以通过 Wi-Fi 模块闪烁的 LED 来确定程序是否加载成功),还要确保模块已激活引导模式。现在根据端口号打开串行监视器,如果代码成功运行,您将看到本地 IP 地址,数据已上传到该地址(并继续更新值)。
从编程后的 Wi-Fi 模块获取本地 IP
在浏览器中输入该 IP 地址,如果一切按预期运行,您将看到输出。
本地 IP 地址处的压电传感器读数
触摸压电传感器,您会看到上传的值发生突然变化。根据代码,值每 1 秒刷新一次,可以根据需要进行更改。
与 Android 连接
由于我们已经将传感器值发送到了本地 IP 地址,因此现在是时候将该值广播到我们的移动设备了。因此,我们使用 Android 作为移动操作系统平台(该模块可以广播到任何平台)。
正如我们之前所见,我们将传感器值作为 HTTP 响应打印出来,所以从客户端(即 Android)端,我们需要解析这些值就足够了。
为了解析 HTTP 响应,我们将使用一个为 Android 编写的库,名为 OkHTTP。让我们来写代码。
public class GetResponse { OkHttpClient client = new OkHttpClient(); String run(String url) throws IOException { Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } }
GetResponse example = new GetResponse(); try { String response = example.run("http://192.168.25.103"); Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show(); } catch (IOException e) { }
事情在这里变得越来越有趣了,不是吗?我们成功地捕获了由于某些振动产生的传感器值,并将值传输到了同一 Wi-Fi 网络中运行的 Android 设备。但对于地震或地震活动,您可能不在家,可能在办公室或咖啡店,然后呢?在这种情况下,这些东西将无法帮助您,但现在我们将为这种情况进行改进。
远程连接
我们需要将值传输到一个远程源,我们的移动客户端可以从中解析值。因此,我们正在使用一个名为 ngrok 的出色工具。您可以在其 文档中找到实现方法。
下载并安装该工具后,只需打开 CMD 窗口并导航到安装目录。输入此命令
ngrok http your_local_ip_address:8080
执行命令并在浏览器中访问 localhost 以及链接“https://:4040”。您将在那里获得 2 个 ngrok 通用链接,现在您可以在 Android 客户端的 Java 代码中使用其中任何一个,因为这两个链接都是通用的,并且可以在世界任何地方访问。很有趣,不是吗?
让手机感知
一切都按预期进行。最后一步是解析我们将从通用链接获得的相应 HTML 值,并让我们的移动设备知道如何处理该值。让我们来进行解析。
现在我们将仅从 HTML 响应中获取预期的值。我们将设置一个值过滤器,如果响应值在任何时候超过过滤器值,我们的移动设备将发出警报音。
我们使用的过滤器值为 512。通常,压电传感器根据接收到的振动频率,其值在 0-1024 的范围内。因此,我们将设置一个值,正好是其范围的一半,任何超过该值的值都会触发警报音。
我们之前的代码在这里会稍作修改。
GetResponse example = new GetResponse(); try { String response = example.run("http://92832de0.ngrok.io"); //Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show(); String htmlTextStr = Html.fromHtml(response).toString(); if (Integer.valueOf(htmlTextStr) > 512) { Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); if (alert == null) { alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); } Ringtone ring = RingtoneManager.getRingtone(getApplicationContext(), alert); ring.play(); } } catch (IOException e) { }
我们将使用一个计时器来定制这个功能。从 Android 客户端,我们将每 5 秒向相应的通用地址发送一次请求。所以我们需要一个计时器来实现这一点。
private int mInterval = 5000; // 5 seconds by default, can be changed later private Handler mHandler;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ..... mHandler = new Handler(); startRepeatingTask(); }
void startRepeatingTask() { mStatusChecker.run(); }
Runnable mStatusChecker = new Runnable() { @Override public void run() { try { //this function can change value of mInterval. GetResponse example = new GetResponse(); try { String response = example.run("http://92832de0.ngrok.io"); //Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show(); String htmlTextStr = Html.fromHtml(response).toString(); if (Integer.valueOf(htmlTextStr) > 512) { Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); if (alert == null) { alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); } Ringtone ring = RingtoneManager.getRingtone(getApplicationContext(), alert); ring.play(); } } catch (IOException e) { } } finally { mHandler.postDelayed(mStatusChecker, mInterval); } } };
关注点
我们已经成功地制作了一个从移动设备检测地震活动的原型,未来的前景是无限的。我们开始这项研究工作是考虑到我们地区近期发生巨型逆冲地震的可能性。我们希望将这项工作扩展到大规模,并将寻找一些资金,以便我们可以继续这项研究工作,并且该解决方案可以在关键时刻真正帮助人们。在当前情况下,该解决方案可以为挽救数百万人的生命发挥至关重要的作用。
通过一些先进的研究(我们正在继续建模),有可能获得超过 90% 的地震振动准确结果,并且一些计算可以帮助用户当场(在他们的移动设备上)了解他们与地震震源之间的距离。一旦我们得到一些好的结果,我们将继续更新本文。欢迎您提出扩大我们解决方案规模的建议,因为这是为了我们自己,为了拯救人类。
贷方
对于组件的组装和接线,我们要感谢我们(Project[R] Lab, WizardApps)的一位杰出贡献者,Chayan Mistry 先生,EEE(大三),NWU 大学,库尔纳,孟加拉国。
文章历史
2015 年 10 月 8 日 - 更新参考
2015 年 8 月 8 日 - 解决格式问题
2015 年 7 月 8 日 - 发布主文章
参考文献
- 物联网
- 物联网的重要性
- 地震
- 地震 - 孟加拉国百科
- 地震波
- https://en.wikipedia.org/wiki/Seismic_wave
- http://sunshine.chpc.utah.edu/Labs/SeismicWaves/
- http://www.colorado.edu/physics/phys2900/homepages/Marianne.Hogan/waves.html
- http://www.geo.mtu.edu/UPSeis/waves.html
- http://www.sms-tsunami-warning.com/pages/seismic-waves#.V6ozAymKTIU
- http://earthquake.usgs.gov/learn/topics/seismology/keeping_track.php
- 地震波与地球内部
- 地震/振动传感器
- 实验室 8