×

基于物联网的大象检测系统

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2022-10-18

戚歆敦

分享资料个

描述

关于该项目

我目前居住在印度南部美丽的山站乌蒂。主要问题是大象经常进入村庄。我们有时会被他们的声音惊醒,但大多数时候他们是沉默的,所以我们不会被惊动。

所以我计划制作一个可以检测大象并发送警报的设备。

inshot_20220925_2048546541_MCWMtzTNBg.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

为您的项目制造 PCB

 

您可以以便宜的价格制造 10 块优质 PCB,并将其运送到您家门口。您还将获得首次订单的运费折扣。将您的 Gerber 文件上传到PCBWAY ,以便以高质量和快速的周转时间制造它们。PCBWay 现在可以提供从设计到外壳生产的完整产品解决方案。查看他们的在线 Gerber 查看器功能。使用奖励积分,您可以从他们的礼品店获得免费的东西。

项目流程:

首先,我们必须训练一些机器学习来检测大象。这个 SenseCAP K1100 套件包含 Grove AI 视觉模块和 Wio 终端,因此我们可以训练视觉模块检测大象并将数据发送到 Wio 终端,然后将数据传递到云端,并发出警报。比如电子邮件和短信。

img_20220918_201641_4eaFVJWlJZ.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

步骤1:

这个 Grove AI Vision 模块可以通过使用 Roboflows ML 检测进行训练以检测模型。这是 Seeedstudio 创建和上传自定义模型的指南。https://wiki.seeedstudio.com/Grove-Vision-AI-Module/

这是我可以检测大象的模型。这不是一个很好的模型,但它工作得很好。

screenshot_(215)_FzjpTiRvZg.png?auto=compress%2Cformat&w=740&h=555&fit=max

Seeedstudio 正在使用 Edge 脉冲集成,因此我将使用 Edge Impulse 模型对其进行更新,这将是一个更加自信的模型。

现在我们的 Wio 终端将得到模型检测结果,下一步是将模型分类结果发送到云端并发出警报。

第2步:

我最初的计划是集成 LoRa 和 TTN,但我没有 LoRaWAN 或 Helium 网关,所以我只是制定了使用 Wi-Fi 或蜂窝物联网的计划。然后我使用蜂窝移动来完成这项工作。

在这个项目中,我使用了 Blues Wireless notecard,它是一种基于蜂窝的物联网硬件,还允许与多个云平台集成。

inshot_20220925_2104506611_JHjOoKQyeO.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

我已经在 Wio 终端的 UART 端口(第 8 和第 10 针)中连接了 Blue 的记事卡。我添加了一个可以在夜间打开并在白天关闭的灯光系统,为视觉分类提供一些灯光。您必须在 Blues note hub 上创建一个新项目并对该项目进行编程,我将进入 Wio 终端以将数据发送到云端。

image_7s4WiBIggV.png?auto=compress%2Cformat&w=740&h=555&fit=max

首先从 Blues Notehub 获取项目 ID 并将其粘贴到以下代码中。

image_1EQbXiQ8qo.png?auto=compress%2Cformat&w=740&h=555&fit=max

接下来,编译代码并将其上传到 Wio 终端,现在这个 wio 终端将检测到串行数据并将其转发到 Blues Notecard。所以这现在将发送模型状态、模型置信度和计数。

image_toVmbHCOzO.png?auto=compress%2Cformat&w=740&h=555&fit=max

这是我的完整代码

 

#define LGFX_AUTODETECT
#define LGFX_USE_V1
#include 
#include 
static LGFX lcd;                 
static LGFX_Sprite sprite(&lcd); 
int count;

#include 
#define txRxPinsSerial Serial1
#define productUID "com.gmail.pradeeplogu26:wio_gate_keeper"
Notecard notecard;

#include "Seeed_Arduino_GroveAI.h"
#include 
GroveAI ai(Wire);
uint8_t state = 0;
String Status;
double conf;
void setup() {
 pinMode(WIO_LIGHT, INPUT);
  notecard.begin(txRxPinsSerial, 9600);
  J *req = notecard.newRequest("hub.set");
  JAddStringToObject(req, "product", productUID);
  JAddStringToObject(req, "mode", "continuous");
  notecard.sendRequest(req);
  delay(1000);

  Wire.begin();
  Serial.begin(115200);
  Serial.println("begin");
  if (ai.begin(ALGO_OBJECT_DETECTION, MODEL_EXT_INDEX_1)) // Object detection and pre-trained model 1
  {
    Serial.print("Version: ");
    Serial.println(ai.version());
    Serial.print("ID: ");
    Serial.println( ai.id());
    Serial.print("Algo: ");
    Serial.println( ai.algo());
    Serial.print("Model: ");
    Serial.println(ai.model());
    Serial.print("Confidence: ");
    Serial.println(ai.confidence());
    state = 1;
  }
  else
  {
    Serial.println("Algo begin failed.");
  }

    lcd.init();
  lcd.setRotation(1);
  lcd.setBrightness(128);
  lcd.fillScreen(0xffffff);

  lcd.fillScreen(0x6699CC);
  lcd.setTextColor(0xFFFFFFu);
  lcd.setFont(&fonts::Font4);
  lcd.drawString("Gate Keeper", 90, 100);
  delay(2000);

}

void loop(){
if (state == 1)
{
  uint32_t tick = millis();
  if (ai.invoke()) // begin invoke
  {
    while (1) // wait for invoking finished
    {
      CMD_STATE_T ret = ai.state();
      if (ret == CMD_STATE_IDLE)
      {
        break;
      }
      delay(20);
    }

    uint8_t len = ai.get_result_len(); // receive how many people detect
    if (len)
    {
      int time1 = millis() - tick;
      Serial.print("Time consuming: ");
      Serial.println(time1);
      Serial.print("Number of people: ");
      Serial.println(len);
      object_detection_t data;       //get data

      for (int i = 0; i < len; i++)
      {
        Serial.println("result:detected");
        count=len;
          Status = "Positive";
        Serial.print("Detecting and calculating: ");
        Serial.println(i + 1);
        ai.get_result(i, (uint8_t*)&data, sizeof(object_detection_t)); //get result

        Serial.print("confidence:");
        Serial.print(data.confidence);
        conf=data.confidence;
        Serial.println();
      
        J *req = notecard.newRequest("note.add");
        if (req != NULL) {
          JAddStringToObject(req, "file", "sensors.qo");
          JAddBoolToObject(req, "sync", true);

          J *body = JCreateObject();
          if (body != NULL) {
            JAddNumberToObject(body, "confidence", data.confidence);
            JAddNumberToObject(body, "count", len);
            JAddStringToObject(body, "result", "positive");
            JAddItemToObject(req, "body", body);
          }
          notecard.sendRequest(req);
        }
      }
    }
    else
    {
      Serial.println("No identification");
      Status="Negative";
      conf=0.0;
      len=0;
    }
  }
  else
  {
    delay(1000);
    Serial.println("Invoke Failed.");
  }
}
else
{
  state == 0;
}

 lcd.fillScreen(0xffffff);
  lcd.fillRect(10, 3, 300, 30, 0x6699CC);
  lcd.setTextColor(0xFFFFFFu);
  lcd.setFont(&fonts::Font4);
  lcd.drawString("Gate Keeper", 90, 8);

  lcd.fillRect(10, 45, 140, 90, 0x9900FF);
  lcd.fillRect(170, 45, 140, 90, 0x9900FF);
  lcd.fillRect(10, 145, 140, 90, 0x9900FF);
  lcd.fillRect(170, 145, 140, 90, 0x9900FF);
  lcd.setTextSize(0.5, 0.5);
  lcd.setTextColor(0xFFFFFFu);
  lcd.drawString("Status", 60, 50);
  lcd.drawString("Light", 220, 50);
  lcd.drawString("Confidence", 35, 150);
  lcd.drawString("Count", 220, 150);

  int j = analogRead(WIO_LIGHT);
  int k = rand() % 100;

  lcd.setCursor( 35, 80);
  lcd.setTextSize(1, 1);
  lcd.print(Status);
  lcd.setCursor( 220, 80);
  lcd.setTextSize(1, 1);
  lcd.print(j);
  lcd.setCursor( 35, 170);
  lcd.setTextSize(1, 1);
  lcd.print(conf);
  lcd.setCursor( 220, 170);
  lcd.setTextSize(1, 1);
  lcd.print(count);
  delay(1000);
  
  //    lcd.fillScreen(0xffffff);
  lcd.setFont(&fonts::Font4);
  lcd.setTextSize(1, 1);


}

 

这是从 Blues Notehub 上的 Wio 终端接收到的数据,现在我们的数据到达了云端,接下来我们必须添加一些可视化和警报系统。

image_tOcAThjtri.png?auto=compress%2Cformat&w=740&h=555&fit=max

对于这种可视化,我们将使用 Qubitro Cloud 平台,Qubitro 允许可视化来自多个数据源(如 MQTT、TTN、HTTPS、Helium 等)的数据。有关更多详细信息,请访问 Qubitro.com 。转到portal.qubitro.com并创建一个新项目并添加一个具有 MQTT 连接的设备。您可以看到连接凭据,只需记下这些凭据,因为您将在下一步中需要这些凭据。

image_gMbS1kTmV8.png?auto=compress%2Cformat&w=740&h=555&fit=max

首先,转到 Blues Note hub 上的 Route 选项卡,然后选择类型为 MQTT 并以以下格式输入凭据。

image_pbiZU8tpct.png?auto=compress%2Cformat&w=740&h=555&fit=max

image_8KLQFgAhBQ.png?auto=compress%2Cformat&w=740&h=555&fit=max

现在我们需要做另一个程序,只需转到 Blues Device 上的环境部分,然后将内容更改如下。

image_3zOxGFNUiF.png?auto=compress%2Cformat&w=740&h=555&fit=max

这就是我们现在的最后一步。

第 3 步:

打开 Qubitro 门户并查找来自笔记中心的传入数据。

image_HIANPFXl9O.png?auto=compress%2Cformat&w=740&h=555&fit=max

现在您看到我们也从笔记中心获得了如此多的数据,我们需要对它们进行整理。为此,只需转到 Blues Route 选项卡并向下滚动并添加一个 JSON 整流器,如下所示。

image_3O3lMfwQKm.png?auto=compress%2Cformat&w=740&h=555&fit=max

让我们再看一下数据,它现在更具可读性和合理性。(另外,我添加了位置)

image_MRf2mlAtJ5.png?auto=compress%2Cformat&w=740&h=555&fit=max

下一步是将此导航的视觉效果添加到监控部分并创建一个新仪表板。

image_f0dyj47oa5.png?auto=compress%2Cformat&w=740&h=555&fit=max

您可以根据需要添加不同的小部件。最后,我们将添加一个警报系统,为此我们将使用 webhook 和 make。

转到eu1.make.com并创建一个新帐户,

image_fcJk171QwZ.png?auto=compress%2Cformat&w=740&h=555&fit=max

然后接下来创建一个像这样的新场景,

image_OynCEP0Q6G.png?auto=compress%2Cformat&w=740&h=555&fit=max

在这里,我添加了带有 Twilio 和电子邮件的 webhook,因此一旦触发了 webhook,它将启动 SMS 和电子邮件警报。

然后转到 Qubitro 门户并导航到规则部分,在此处添加一个新规则我添加了一个规则,例如模型分数 =100,因此每当检测到模型时,它都会触发 webhook,然后所有操作都将由 make 执行。

image_HEXlKVjo0y.png?auto=compress%2Cformat&w=740&h=555&fit=max

Webhook 警报流

这是电子邮件警报的最终输出。

image_cwvwvmL3Wq.png?auto=compress%2Cformat&w=740&h=555&fit=max

这是 SMS 警报的最终输出。

20220911_133705_mnP11cQbmt.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

结论:

inshot_20220925_2101259131_Sy49PdLCzX.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

在本教程中,我向您展示了如何使用 Qubitro Cloud 的 webhook 和 Twilio 集成的蜂窝通信构建基于视觉的大象检测警报系统。

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

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !