13

K_b0KBsM · 6月17日 · 广东

创客项目秀 | 基于 Wio LTE的宠物物流安全卫士

今天小编给大家带来的是来自墨西哥的Maker Victor Altamirano为了解决宠物寄送过程中可能遇到的安全问题,而制作的“Follow My Paws”项目,该项目可以在远程实时向用户发送宠物航空仓的各种信息。

材料清单

硬件:

  • Seeed Studio Wio LTE
  • 物联网SIM卡
  • 适用于英特尔 Edison 的 Seeed Studio Grove 入门套件 plus
  • DHT11温湿度传感器

软件:

  • arduino IDE
  • SORACOM Funnel
  • Amazon Web Services AWS IoT
  • Amazon Web Services AWS Lambda
  • Amazon Web Services AWS SNS
  • Amazon Web Services AWS S3

背景

Follow My Paws:
微信图片_20240617094751.png
有时我们需要通过包裹服务发送宠物。我们怎么能确保他们出现意外时即使处理呢?。因此,主要问题是:宠物在物流寄送服务中运输时会出现意外情况。但是通常又不得不使用该服务,我们怎么能确保他们在任何时候都没事呢?

解决方案

微信图片_20240617094841.jpg
我将制作一个完整的物联网解决方案来监控宠物的环境,以确保它们在整个旅程中的健康。所有这些都与云平台集成,该平台除了实时显示包裹的状态外,还以固定的频率发送通知。

目前的监控解决方案仅限于无生命的包装,这使得对宠物的连续监控成为一种新奇事物。它很有用,因为多亏了这个系统,宠物主人可以 100% 确定他们的宠物会很好,并且可以在整个旅程中监控和跟踪它们。

硬件介绍

要将传感器连接到 WIO,传感器必须具有 Grove 型输入,如以下链接中所示的输入。

https://www.seeedstudio.com/c...

对于这个项目,我已经有了“Grove Starter Kit Plus”包,如下图所示。

微信图片_20240617094916.jpg

内容:
微信图片_20240617094935.jpg

建立的连接如下:

微信图片_20240617094950.png

Grove 软件包中包含的加速度计在连接到 WIO 时没有问题,因为它已经有了它的 Grove 适配器,我不得不破解它是 DHT,因为我们没有 Grove 的 DHT。

加速度计 Grove 版本:
微信图片_20240617095010.jpg

DHT No-Grove 版本:
微信图片_20240617095014.jpg

以下是将模块连接到 grove 电缆的方法:
微信图片_20240617095047.jpg

Wio设置

我们将通过将SIM卡连接到适当的插槽中来准备WIO LTE。
微信图片_20240617095110.jpg

找到SIM卡的插槽后,将SIM卡插入插槽(是的,保护您的IMEI和其他数据)。
微信图片_20240617095126.jpg

一旦卡完全插入,就会看到这一点。
微信图片_20240617095148.jpg

由于我们在WIO LTE中安装了SIM卡,因此我们将天线连接到下图所示的插槽。
微信图片_20240617095215.jpg

完成此操作后,我们将准备好将模块与Arduino IDE一起使用。

Wio Arduino设置:

这是在Arduino IDE上安装WIO LTE的官方指南。非常清晰简洁,强烈建议试用它。

https://github.com/Seeed-Stud...

Arduino软件在Github上。

Soracom平台设置:

检查您的SIM卡是否已经连接到一个组非常重要,就我而言,我称之为Harvest Group。
微信图片_20240617095300.jpg

如果我们没有创建组,我们将创建一个组,如下图所示,如果我们不这样做,我们将无法执行 AWS IoT 配置。
微信图片_20240617095315.jpg

自从创建了小组以来,就我而言,我们通过按“Harvest Group”进入小组菜单,一旦进入,我们将看到以下内容。
微信图片_20240617095334.jpg

在组菜单中,我们将输入选项“SORACOM Funnel”,此选项将允许我们访问与AWS服务的连接,所有凭证将在稍后的AWS配置中获得,因此请勿关闭此选项卡(请遵循)。
微信图片_20240617095422.jpg

AWS IoT 设置

要与 AWS IoT 通信,我们需要在 IAM 控制台中创建一个角色,以便授权 Soracom 访问我们的控制台。

第一步是创建一个允许我们与 AWS 通信的角色。
微信图片_20240617095439.jpg

在角色配置中,我们需要授予对 AWS IoT 的访问权限。
微信图片_20240617095455.jpg

在这里,我们可以看到可以与此角色一起使用的服务,在本例中,此策略只是一个示例。注意:如果您不确定要获取角色的策略,请选择策略 (AWSIoTFullAccess)。
微信图片_20240617095513.jpg

我们给新角色起了个名字。
微信图片_20240617095530.jpg

我们给新角色起了个名字。
微信图片_20240617095550.jpg
进入“设置”部分后,我们将复制“端点”,这将在 Soracom 控制台选项卡中使用。

下一步是在 AWS IoT 和其他 AWS 服务(如 Lambda、SNS 和 DynamoDB)之间创建连接。因此,为此,我们必须创建一个“规则”,该规则将用于在此服务和上述服务之间建立桥梁。
微信图片_20240617095605.jpg

一旦我们有了规则,我们将如图所示对其进行配置。
微信图片_20240617095628.jpg

在此选项卡中,我们将配置数据到达后要激活的 lambda(在完成配置其他服务之前不要关闭)
微信图片_20240617095646.jpg

AWS Lambda 设置

我们创建一个 Lambda,如屏幕上所示(它非常直观,应该没有问题)。
微信图片_20240617095707.jpg

lambda 应该以这种方式看待,使用 lambda 的原因是因为我们需要处理从模块获取的数据,以通过消息和我们的 Web 平台给出响应(执行此过程 2 次,因为我们将配置 2 个 lambda 以连接到 SNS 和 DynamoDB 的服务)
微信图片_20240617095722.jpg

第一个 Lambda SNS 服务:

这是向 SNS 发送通知的代码,稍后将在 SNS 配置中获取 TopicARN。

console.log('Loading function');
// Load the AWS SDK
var AWS = require("aws-sdk");
// Set up the code to call when the Lambda function is invoked
   exports.handler = (event, context, callback) => {
// Load the message passed into the Lambda function into a JSON object
var eventText = JSON.parse(JSON.stringify(event, null, 2));
// Log a message to the console; you can view this text in the Monitoring tab in the Lambda console or in the CloudWatch Logs console    
// Create a string, extracting the click type and serial number from the message sent by the AWS IoT button
// Write the string to the console
var temp=parseInt(eventText.temperature)
var acc=parseInt(eventText.accelerometer)
var moi=parseInt(eventText.moisture)
var air=parseInt(eventText.air)
var id=eventText.ID
var myarray=[0,0,0,0]
if(temp<15)
   {
   myarray[0]=4
   }
else if(temp >= 15 && temp < 18)
   {
   myarray[0]=3
   }    
else if(temp >= 18 && temp < 19)
   {
   myarray[0]=2
   }
else if(temp >= 21 && temp < 24) 
   {
   myarray[0]=1
   }
else if(temp >= 24 && temp < 26)
   {
   myarray[0]=2
   }
else if(temp >= 26 && temp < 28) 
   {
   myarray[0]=3
   }
else if(temp >= 28)
   {    
   myarray[0]=4
   }
   temp=temp*1.8+32
if(acc<3)
   {
   myarray[1]=1
   }
else if(acc >= 3 && acc < 6)
   {
   myarray[1]=2
   }
else if(acc >= 6 && acc < 10)
   {
   myarray[1]=3
   }
else if(acc >= 10) 
   {
   myarray[1]=4
   }
if(moi<20)
   {
   myarray[3]=4
   }
else if(moi >= 20 && moi < 30)
   {
   myarray[3]=3
   }
else if(moi >= 30 && moi < 40)
   {
   myarray[3]=2
   }
else if(moi >= 40 && moi < 50) 
   {
   myarray[3]=1
   }
else if(moi >= 50 && moi < 65)     
   {
   myarray[3]=2
   }
else if(moi >= 65 && moi < 80) 
   {
   myarray[3]=3
   }
else if(moi >= 80)
   {
   myarray[3]=4
   }
   air=0.5 * (temp + 61.0 + ((temp-68.0)*1.2) + (moi*0.094))       
if(air<90)
   {
   myarray[2]=1
   }
else if(air >= 90 && air < 102)
   {    
   myarray[2]=2
   }
else if(air >= 102 && air < 122)
   {
   myarray[2]=3
   }
else if(air >= 122) 
   {
   myarray[2]=4
   }
var mess="";
if(myarray[3]==1 || myarray[2]==1 ||  myarray[1]==1 || myarray[0]==1)
   {
   mess="Your dog goes in perfect travel conditions"
   }
if(myarray[3]==2 || myarray[2]==2 ||  myarray[1]==2 || myarray[0]==2)    
   {
   mess="Your dog is in good condition"
   }
if(myarray[3]==3 || myarray[2]==3 ||  myarray[1]==3 || myarray[0]==3)
   {
   mess="Your dog is fine but the travel conditions are not the best."
   }
if(myarray[3]==4 || myarray[2]==4 ||  myarray[1]==4 || myarray[0]==4)
   {
   mess="Your dog is fine but travel conditions should improve"
   }
// Create an SNS object
var sns = new AWS.SNS();
console.log("Received event:",JSON.stringify(myarray, null, 2),air);    
var params = {
Message: mess,
TopicArn: "YOURSNSENDPOINT"
   };
   sns.publish(params, context.done);
   };

第二个 Lambda DynamoDB 服务:

这是将数据发送到 DynamoDB 的代码。

console.log('Loading function');
var AWS = require("aws-sdk");
   exports.handler = (event, context, callback) => {
var eventText = JSON.parse(JSON.stringify(event, null, 2));
var temp=parseInt(eventText.temperature)
var acc=parseInt(eventText.accelerometer)
var moi=parseInt(eventText.moisture)
var air=0
var id=eventText.ID
var myarray=[0,0,0,0]    
if(temp<15)
   {
   myarray[0]=4
   }
else if(temp >= 15 && temp < 18)
   {
   myarray[0]=3
   }
else if(temp >= 18 && temp < 19)
   {
   myarray[0]=2
   }
else if(temp >= 21 && temp < 24) 
   {
   myarray[0]=1
   }
else if(temp >= 24 && temp < 26)
   {    
   myarray[0]=2
   }
else if(temp >= 26 && temp < 28) 
   {
   myarray[0]=3
   }
else if(temp >= 28)
   {
   myarray[0]=4
   }
   temp=temp*1.8+32
if(acc<3)
   {
   myarray[1]=1
   }
else if(acc >= 3 && acc < 6)
   {
   myarray[1]=2
   }
else if(acc >= 6 && acc < 10)
   {
   myarray[1]=3
   }
else if(acc >= 10) 
   {
   myarray[1]=4
   }
if(moi<20)
   {
   myarray[3]=4
   }
else if(moi >= 20 && moi < 30)
   {
   myarray[3]=3
   }
else if(moi >= 30 && moi < 40)     
   {
   myarray[3]=2
   }
else if(moi >= 40 && moi < 50) 
   {
   myarray[3]=1
   }
else if(moi >= 50 && moi < 65)
   {
   myarray[3]=2
   }
else if(moi >= 65 && moi < 80) 
   {
   myarray[3]=3
   }
else if(moi >= 80)
   {
   myarray[3]=4
   }
   air=0.5 * (temp + 61.0 + ((temp-68.0)*1.2) + (moi*0.094))       
if(air<90)
   {
   myarray[2]=1
   }
else if(air >= 90 && air < 102)
   {
   myarray[2]=2
   }
else if(air >= 102 && air < 122)
   {
   myarray[2]=3
   }
else if(air >= 122) 
   {
   myarray[2]=4
   }    
// Set the region
   AWS.config.update({region: 'ap-northeast-1'});
// Create the DynamoDB service object
var ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
var params = {
TableName: 'FMPtemp',
Item: {
'ID' : {S: id},
'Array' : {S: JSON.stringify(myarray, null, 2)}
   }
   };
// Call DynamoDB to add the item to the table
   ddb.putItem(params, function(err, data) {if (err) {} else {}});
   };

AWS SNS设置

在SNS服务中,我们创建了一个主题
微信图片_20240617095840.jpg

在 SNS 服务中,我们创建了一个主题。
微信图片_20240617095858.jpg

由于我们创建了主题,因此我们可以在希望通知到达的位置创建订阅。
微信图片_20240617095914.jpg

这是我们可以发送通知的所有方面的一个示例。
微信图片_20240617095946.jpg

为您的第一个 Lambda 保存此 ARN:
微信图片_20240617100004.jpg

AWS DynamoDB 设置:

对于这个项目和我们的 WEB 实现,我们需要在 DynamoDB 中创建 2 个表,因为一个表将用作数据存储,另一个表将用于可以在 WEB 平台中使用的临时变量。

对于此步骤,仅创建了两个表,如图所示:
微信图片_20240617100023.jpg

WEB 界面设置

Web 平台可能看起来很简单,但它在与 AWS 交互的方式上有一个非常有趣的实现。

使用网页时最大的问题之一是具有临时变量,因为每次更新页面时,我们都会丢失变量存储的所有信息,但是在我的实现中,我直接从 DynamoDB 中提取数据,这要归功于提供 AWS 的 javascript 开发工具包,因此我可以将信息存储在数据库中, 如上图所示,在名为“FMP”的数据库中,并保存临时变量和快速访问,以便部署和更新网页“FMPtemp”。

在显示网页时,调用FMPtemp数据库实时获取宠物的状态,并根据我们的算法确定宠物的一般状态,将通过颜色通知,如下图所示。
微信图片_20240617100046.jpg

每图标代表以下内容:

温度:环境温度

加速度:最大加速度

空气Q:空气质量

湿润:空气湿气

颜色范围:
微信图片_20240617100103.jpg

空气质量是使用以下公式计算的,使用简化版本来计算空气的露点,根据书籍,它必须小于 90:

空气 Q=0.5 * (温度 + 61.0 + ((温度-68.0)1.2) + (湿润 0.094))

最终产品

我们将温度传感器组装在外壳中。
微信图片_20240617100127.jpg

微信图片_20240617100132.jpg

微信图片_20240617100136.jpg

微信图片_20240617100143.jpg

微信图片_20240617100147.jpg

微信图片_20240617100151.jpg

推荐阅读
关注数
9152
内容数
48
深度服务产业的国际化双创平台
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息