用Android和IOT检测地震波

本文介绍了如何利用物联网技术构建一个地震波检测系统,特别是通过Android设备来感知高频冲击波。通过压电振动传感器收集数据,通过WiFi模块将数据传输到移动设备,实现对地震活动的预警。文章详细阐述了从理论到实践的步骤,包括物联网概念、地震波类型、电路设计和Android连接。最终目标是提高地震预警的效率,以保护人们的生命安全。
摘要由CSDN通过智能技术生成

介绍

物联网(Internet of Things,IoT)近年来一直是互联网的流行词,除了对大众群众具有强烈的意义之外,它正在推动数据在机器间的混洗扩展到网络。说实话,物联网是未来技术的下一个前沿。

本文介绍了物联网的一般概念及其在现实世界中的应用,我们还将在本文的后面部分讨论如何构建功能性物联网应用程序。如果你是一个技术爱好者,那么你已经准备好了这篇文章。

什么是物联网?

那么,这个词是不言自明的:连接到互联网的东西。这一行可以用多种方式来解释。但是一个简单的解释可能是 - 将网络连接添加到设备网络,使其能够与用户和其他设备进行通信。总的来说,物联网提升了对我们现实世界的高度认识,并且提供了一个平台来监视对我们的意识暴露的反应。设备网络可能包含自己的IP地址,并可以相互连接以自动执行定义的任务。2014年,全球物联网市场收入达到6558亿美元。预计到2020年,市场规模将达到8.9万亿美元。

IoT&Real World(来源:LinkedIn

历史

卡耐基梅隆大学于1982年制造了一台改装的焦炭机器,据说这是第一台互联网连接设备。麻省理工学院自动识别中心的联合创始人凯文·阿什顿(Kevin Ashton)在1999年创造了“物联网”(Internet of Things)这个术语。十年后,物联网已经获得全球认可,并在2008 - 09年度成为重大技术进步。

应用

物联网可以以多种方式应用于我们的现实世界。想想一个当你面前出现的时候,你的前门开启的世界,但是当一个陌生人到达前面的台阶时,它会被锁住。灯光会自动打开,检测到您在房间中的存在,但在您离开房间时会自动关闭。咖啡开始酝酿时,你的声音命令它为你做一个。手表为您的爷爷准备了健康表,并在您出门时发现任何严重问题时向您的手机发送警报声。所以很显然,可能性和应用领域是无限的。你已经开始梦想了,不是吗?

物联网应用(来源:SlideShare

本条的结果

在这篇文章中,我们将构建一个主要针对人们安全事物的物联网项目。无论您是初学者还是专业人士,本文将教您如何将您的想法转化为令人敬畏的物联网对象。我们将在整篇文章中逐步讨论“事物”的协调和实施。我们走吧!

兔子在哪里?

让我们谈谈我们将在这篇文章中启动的想法。众所周知,地震是人类最大的灭绝性自然力量之一。由于在到达之前没有办法得到通知,生命和财产的损失往往跨越灾难的程度。

在这篇文章中,我们将摒弃一种近似的方式来检测物联网系统的波动,并且让自己意识到移动设备的高频冲击波。我们将使用Android作为测试移动平台。所以我们找到了兔子,对不对?让我们抓住它!

背景

我记录说,自1548年以来,我住在孟加拉国,这个地震历史悠久的国家。该国四面环绕着高地震活动区,其中包括缅甸北部的喜马拉雅弧和西隆高原,东部的阿拉干·马马复背斜和东北部复杂的纳卡 - 迪桑 - 贾夫隆冲断带。

从统计调查中发现,所述地区所在的印度板块在五千万年前与亚洲相撞。从那以后,盘子继续向北推进亚洲,向下推动喜马拉雅山,推动山脉。

近年来,相应的地区附近发生了一些大地震。可能我们很多人都听说过尼泊尔印度地震造成的巨大损失,这些地震造成数千人死亡,损失了数十亿美元的财产。在这两种情况下,我国也面临着重大的地震事件以及几处生命和财产损失。

国家地理杂志CNN其他一些值得信赖的消息来源报道,按照不久的将来,该国可能面临一场可能会发生9.0级大地震的悲惨命运。甚至在对其影响进行假设之前,计划灾难性的损失水平也不难,这次地震将成为世界上人口最密集的地区之一。

暂时的假设使我找到一种方法来认识地震活动,如果我们能够以某种方式测量有害的,并使人们在死亡时期意识到他们的安全庇护所,那么可以在很大程度上挽救他们宝贵的生命。但在此之前,我们需要学习一些有关地震波的基本知识。

孟加拉国 - 印度 - 缅甸地区隐藏的断层(来源:CNN

地震波

地震波传播振动,震动源将震动源的能量向四面八方传播。这些波在地球内部传播,可以用地震仪等敏感探测器进行测量。科学家们已经在世界各地建立了地震仪来追踪地壳的运动。(分析:地震波

所以它基本上是某种弹性波,可能是由于像地震,爆炸或大的山体滑坡这样的冲动而产生的。地震可以产生三种类型的地震波:P(主波),S(次波)和表面波。

P波

也被称为纵波或纵波或主波。这是地震波中速度最快的一种,它首先比其他地震波快速到达地震仪台,因此名为“小学”。这一波可以通过固体岩石和流体,如水或地球的液体层。它沿着它们传播的方向摇动地面,以1.5-8公里/秒的速度在地壳中行进。

 

P波(点击查看动画,来源:地震

S波

被称为在地震台站到达p波后期的剪切波或次波。略微1.7比P波慢倍。它垂直于他们正在传播的方向摇动地面。但是S波不能通过流体或气体传播,因为流体和气体不能传递剪切应力,而S波是剪切材料的波。

一般来说,地震会产生比压缩波更大的剪切波,接近地震的大部分破坏是剪切波引起的强烈振动的结果。

S波(点击查看动画,来源:地震

表面波

与上述不同,这种波浪不会深入地球内部。通常产生比体波更低的频率,因此容易区分地震记录。有两种类型的表面波:波和瑞利波虽然它是在物体(P&S)波后到达的,但它是表面波与地震有关的破坏和破坏的责任。

表面波(点击查看动画,来源:地震

 

要了解这些不同类型的地震波的全面影响,让我们来看看这个图像的动画。

地震的地震波(点击查看动画,来源:地震

抛光计划

从上面的研究中,我们对地震的事件有清晰的了解。当然,我们所有人都会支持一个呼叫,小波或者P波在地壳中传播得更快,在其他破坏性的波浪方面,它们是有利可图的。当它一闪而过,如果我们能够收集足够的数据来检测它,那么提前发出即将到来的可怕地震事件的警告显然是可能的。

即使通过计算P波和S波的到达时间之间的差异,也可以粗略估计到地震焦点的距离。作为一个经验法则:将两个波浪之间的时间乘以5将得到以英里为单位的焦点距离(来源:加州大学伯克利分校地震实验室)。

假设地震发生在地震台,相应的地震图记录了P波和S波的到达时间为04:00:20和04:00:26.62。所以这里两波的时差是6.62s。应用上述理论,从车站到地震重点的距离将近似(6.62 * 5)= 33英里。

所以根据经验法则,

到地震的距离=((P波到达时间) - (S波到达时间))* 5

做数学

我们来做一些数学。

案例1:猜猜地震已经产生,重点是距离你的位置112英里。由于P波在地壳中以大约6.0km / s的速度传播,所以时间要求达到你的位置 - ((1.6 * 112)/ 6)= 29.87s。

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.28s。

从上面的例子可以清楚地看到,在地震的焦点远离你的时候,P波和S波的时差会增大,而当它接近的时候,波的时差就会减小。

到目前为止,根据我们的想法,我们应该计划如何记录P波,让人们意识到即将到来的冲击波。

收集组件

现在是时候收集我们在工作中需要的主要组件。为了检测地震活动可能产生的振动,我们将使用压电振动传感器。

格罗夫 - 压电振动传感器

它适用于测量灵活性,振动,冲击和触摸。宽动态范围(0.001Hz〜1000MHz)保证了卓越的测量性能。而且,我们可以通过用螺丝调节板载电位器来调节其灵敏度。(来源:格罗夫 - 压电式振动传感器

 

格罗夫 - 压电振动传感器板(型号:SEN04031P)

 

USB到串行编程器

它提供了一系列USB到串行转换器电缆,用于提供USB和串行UART接口之间的连接。可提供一系列电缆,通过各种连接器接口提供5V,3.3V或用户指定信号电平的连接。(来源:USB到串行编程器

您可能需要安装驱动程序才能使用。我们的开发设备包含Windows 7 64位操作系统,因此我们已经为此模块安装了相应的驱动程序。

USB到串行编程器

Wifi模块

为了将传感器数据传输到便携式移动设备,我们将需要一个WiFi模块。在我们的案例中,我们使用了Wifi模块 - ESP8266。它是一个独立的SOC,集成了TCP / IP协议栈,可以让任何微控制器访问WiFi网络。它能够托管应用程序或卸载来自其他应用程序处理器的所有Wi-Fi网络功能。(来源 - WIFI模块 - ESP8266

我们需要一些工作来定制模块并使其可编程。我们需要为上下文管理几件事情,

  • Veroboard(模块将驻留在哪里)
  • 一些男性连接器
  • 三个10K电阻用于VC控制
  • 两个外部按钮用于重新启动并重置模块

  

重新建模的WIFI模块(型号 - ESP8266)

使Wifi模块可编程

一些忙碌的作品在我们前面,以使这个WiFi模块可编程。我们希望将这个模块与熟悉的Arduino IDE连接起来,将代码上传到开发板。因此,我们需要查看专用于上述芯片型号ESP8266 GITHUB项目。

官方网站下载Arduino IDE 安装完成后,转至“文件”→“首选项”→“附加板管理器URL”并粘贴此链接

图1.1:配置Arduino IDE以编程重新建模的WIFI模块

现在回到IDE的工具àBoard \ Boards Manager的家中,向下滚动,找到“ESP8266社区”esp8266的选项,点击它并按下安装按钮。有耐心,直到它完成安装。

图1.2:配置Arduino IDE以编程重新建模的WIFI模块

您可以通过右键单击我的电脑à管理à设备管理器à端口来检查相应的开发设备的可用端口,如果它们相同,请使用IDE的工具à端口进行双重检查。

转至Arduino IDE,选择ToolsàBoard→向下滚动并选择“Node MCU 1.0(ESP-12E Module)”。现在wifi模块准备好吃代码了!在此之前,我们需要弥补我们的电路。

完成电路

电路原理图

您需要了解电路原理图以及面包板,母 - 母连接器等的基本知识来连接这些东西,这是后面将要讲到的电路图。

 电路原理图

电路设计

根据图表,我们现在将连接起来,我们将需要一个面包板和一些电线。

将东西连接到面包板

除了代码(随着移动设备端),使用WiFi模块将数据从传感器上传到我的本地IP地址,这是一个真正的“哈哈”时刻!

现在是编写wifi模块代码的时候了,我们通过一个叫做connectify的工具创建一个本地的wifi网络,你也可以使用你的wifi路由器。

转到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("");

}

如果所有的事情都按照上面的步骤完成,代码将成功地加载到模块中(将电路板连接到电源,通过WiFi模块闪烁指示灯可以确定程序加载),还要确保引导模式在模块中被激活。现在根据端口号打开串口监视器,如果代码运行成功,你会看到你的本地IP地址的值上传(并继续更新值)。

从编程的WIFI模块获取本地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) {
}

这里的事情变得有趣了,不是吗?我们已经成功地捕捉到了一些振动的传感器值,并将这些值传输到了一个运行在同一个WIFI网络中的Android设备。但是,如果发生地震或地震活动,你可能会住在你家的外面,可能在你的办公室或咖啡店,然后呢?在这种情况下,事情不会帮助你,但是现在我们将把事情搞砸。

远程连接

我们需要将该值传输到我们的移动客户端可以解析该值的远程源。因此,我们正在使用一个称为ngrok的辉煌工具你可以为他们的文档执行。

下载并安装该工具后,只需带上cmd窗口并导航到已经安装的文件夹。把这个命令:

ngrok http your_local_ip_address:8080

执行命令并在浏览器中连同“https:// localhost:4040”一起在本地主机上执行。您将从ngrok获得2个通用链接,现在您可以在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%以上的准确结果,因此一些计算可以帮助用户知道他与地震聚焦点之间的距离(读他/她的移动设备)。我们会尽快更新这篇文章,只要我们得到一些很好的结果。我们也欢迎您的建议,以扩大我们的解决方案,因为这是为了我们,拯救人类。

本篇文章由@筱乐译@CSDN博客@千讯工作室

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值