描述
关于该项目
我目前居住在印度南部美丽的山站乌蒂。主要问题是大象经常进入村庄。我们有时会被他们的声音惊醒,但大多数时候他们是沉默的,所以我们不会被惊动。
所以我计划制作一个可以检测大象并发送警报的设备。
为您的项目制造 PCB
您可以以便宜的价格制造 10 块优质 PCB,并将其运送到您家门口。您还将获得首次订单的运费折扣。将您的 Gerber 文件上传到PCBWAY ,以便以高质量和快速的周转时间制造它们。PCBWay 现在可以提供从设计到外壳生产的完整产品解决方案。查看他们的在线 Gerber 查看器功能。使用奖励积分,您可以从他们的礼品店获得免费的东西。
项目流程:
首先,我们必须训练一些机器学习来检测大象。这个 SenseCAP K1100 套件包含 Grove AI 视觉模块和 Wio 终端,因此我们可以训练视觉模块检测大象并将数据发送到 Wio 终端,然后将数据传递到云端,并发出警报。比如电子邮件和短信。
步骤1:
这个 Grove AI Vision 模块可以通过使用 Roboflows ML 检测进行训练以检测模型。这是 Seeedstudio 创建和上传自定义模型的指南。https://wiki.seeedstudio.com/Grove-Vision-AI-Module/
这是我可以检测大象的模型。这不是一个很好的模型,但它工作得很好。
Seeedstudio 正在使用 Edge 脉冲集成,因此我将使用 Edge Impulse 模型对其进行更新,这将是一个更加自信的模型。
现在我们的 Wio 终端将得到模型检测结果,下一步是将模型分类结果发送到云端并发出警报。
第2步:
我最初的计划是集成 LoRa 和 TTN,但我没有 LoRaWAN 或 Helium 网关,所以我只是制定了使用 Wi-Fi 或蜂窝物联网的计划。然后我使用蜂窝移动来完成这项工作。
在这个项目中,我使用了 Blues Wireless notecard,它是一种基于蜂窝的物联网硬件,还允许与多个云平台集成。
我已经在 Wio 终端的 UART 端口(第 8 和第 10 针)中连接了 Blue 的记事卡。我添加了一个可以在夜间打开并在白天关闭的灯光系统,为视觉分类提供一些灯光。您必须在 Blues note hub 上创建一个新项目并对该项目进行编程,我将进入 Wio 终端以将数据发送到云端。
首先从 Blues Notehub 获取项目 ID 并将其粘贴到以下代码中。
接下来,编译代码并将其上传到 Wio 终端,现在这个 wio 终端将检测到串行数据并将其转发到 Blues Notecard。所以这现在将发送模型状态、模型置信度和计数。
这是我的完整代码
#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 终端接收到的数据,现在我们的数据到达了云端,接下来我们必须添加一些可视化和警报系统。
对于这种可视化,我们将使用 Qubitro Cloud 平台,Qubitro 允许可视化来自多个数据源(如 MQTT、TTN、HTTPS、Helium 等)的数据。有关更多详细信息,请访问 Qubitro.com 。转到portal.qubitro.com并创建一个新项目并添加一个具有 MQTT 连接的设备。您可以看到连接凭据,只需记下这些凭据,因为您将在下一步中需要这些凭据。
首先,转到 Blues Note hub 上的 Route 选项卡,然后选择类型为 MQTT 并以以下格式输入凭据。
现在我们需要做另一个程序,只需转到 Blues Device 上的环境部分,然后将内容更改如下。
这就是我们现在的最后一步。
第 3 步:
打开 Qubitro 门户并查找来自笔记中心的传入数据。
现在您看到我们也从笔记中心获得了如此多的数据,我们需要对它们进行整理。为此,只需转到 Blues Route 选项卡并向下滚动并添加一个 JSON 整流器,如下所示。
让我们再看一下数据,它现在更具可读性和合理性。(另外,我添加了位置)
下一步是将此导航的视觉效果添加到监控部分并创建一个新仪表板。
您可以根据需要添加不同的小部件。最后,我们将添加一个警报系统,为此我们将使用 webhook 和 make。
转到eu1.make.com并创建一个新帐户,
然后接下来创建一个像这样的新场景,
在这里,我添加了带有 Twilio 和电子邮件的 webhook,因此一旦触发了 webhook,它将启动 SMS 和电子邮件警报。
然后转到 Qubitro 门户并导航到规则部分,在此处添加一个新规则我添加了一个规则,例如模型分数 =100,因此每当检测到模型时,它都会触发 webhook,然后所有操作都将由 make 执行。
Webhook 警报流
这是电子邮件警报的最终输出。
这是 SMS 警报的最终输出。
结论:
在本教程中,我向您展示了如何使用 Qubitro Cloud 的 webhook 和 Twilio 集成的蜂窝通信构建基于视觉的大象检测警报系统。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !