今天小编给大家带来的是来自墨西哥的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:
有时我们需要通过包裹服务发送宠物。我们怎么能确保他们出现意外时即使处理呢?。因此,主要问题是:宠物在物流寄送服务中运输时会出现意外情况。但是通常又不得不使用该服务,我们怎么能确保他们在任何时候都没事呢?
解决方案
我将制作一个完整的物联网解决方案来监控宠物的环境,以确保它们在整个旅程中的健康。所有这些都与云平台集成,该平台除了实时显示包裹的状态外,还以固定的频率发送通知。
目前的监控解决方案仅限于无生命的包装,这使得对宠物的连续监控成为一种新奇事物。它很有用,因为多亏了这个系统,宠物主人可以 100% 确定他们的宠物会很好,并且可以在整个旅程中监控和跟踪它们。
硬件介绍
要将传感器连接到 WIO,传感器必须具有 Grove 型输入,如以下链接中所示的输入。
https://www.seeedstudio.com/c...
对于这个项目,我已经有了“Grove Starter Kit Plus”包,如下图所示。
内容:
建立的连接如下:
Grove 软件包中包含的加速度计在连接到 WIO 时没有问题,因为它已经有了它的 Grove 适配器,我不得不破解它是 DHT,因为我们没有 Grove 的 DHT。
加速度计 Grove 版本:
DHT No-Grove 版本:
以下是将模块连接到 grove 电缆的方法:
Wio设置
我们将通过将SIM卡连接到适当的插槽中来准备WIO LTE。
找到SIM卡的插槽后,将SIM卡插入插槽(是的,保护您的IMEI和其他数据)。
一旦卡完全插入,就会看到这一点。
由于我们在WIO LTE中安装了SIM卡,因此我们将天线连接到下图所示的插槽。
完成此操作后,我们将准备好将模块与Arduino IDE一起使用。
Wio Arduino设置:
这是在Arduino IDE上安装WIO LTE的官方指南。非常清晰简洁,强烈建议试用它。
https://github.com/Seeed-Stud...
Arduino软件在Github上。
Soracom平台设置:
检查您的SIM卡是否已经连接到一个组非常重要,就我而言,我称之为Harvest Group。
如果我们没有创建组,我们将创建一个组,如下图所示,如果我们不这样做,我们将无法执行 AWS IoT 配置。
自从创建了小组以来,就我而言,我们通过按“Harvest Group”进入小组菜单,一旦进入,我们将看到以下内容。
在组菜单中,我们将输入选项“SORACOM Funnel”,此选项将允许我们访问与AWS服务的连接,所有凭证将在稍后的AWS配置中获得,因此请勿关闭此选项卡(请遵循)。
AWS IoT 设置
要与 AWS IoT 通信,我们需要在 IAM 控制台中创建一个角色,以便授权 Soracom 访问我们的控制台。
第一步是创建一个允许我们与 AWS 通信的角色。
在角色配置中,我们需要授予对 AWS IoT 的访问权限。
在这里,我们可以看到可以与此角色一起使用的服务,在本例中,此策略只是一个示例。注意:如果您不确定要获取角色的策略,请选择策略 (AWSIoTFullAccess)。
我们给新角色起了个名字。
我们给新角色起了个名字。
进入“设置”部分后,我们将复制“端点”,这将在 Soracom 控制台选项卡中使用。
下一步是在 AWS IoT 和其他 AWS 服务(如 Lambda、SNS 和 DynamoDB)之间创建连接。因此,为此,我们必须创建一个“规则”,该规则将用于在此服务和上述服务之间建立桥梁。
一旦我们有了规则,我们将如图所示对其进行配置。
在此选项卡中,我们将配置数据到达后要激活的 lambda(在完成配置其他服务之前不要关闭)
AWS Lambda 设置
我们创建一个 Lambda,如屏幕上所示(它非常直观,应该没有问题)。
lambda 应该以这种方式看待,使用 lambda 的原因是因为我们需要处理从模块获取的数据,以通过消息和我们的 Web 平台给出响应(执行此过程 2 次,因为我们将配置 2 个 lambda 以连接到 SNS 和 DynamoDB 的服务)
第一个 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服务中,我们创建了一个主题
在 SNS 服务中,我们创建了一个主题。
由于我们创建了主题,因此我们可以在希望通知到达的位置创建订阅。
这是我们可以发送通知的所有方面的一个示例。
为您的第一个 Lambda 保存此 ARN:
AWS DynamoDB 设置:
对于这个项目和我们的 WEB 实现,我们需要在 DynamoDB 中创建 2 个表,因为一个表将用作数据存储,另一个表将用于可以在 WEB 平台中使用的临时变量。
对于此步骤,仅创建了两个表,如图所示:
WEB 界面设置
Web 平台可能看起来很简单,但它在与 AWS 交互的方式上有一个非常有趣的实现。
使用网页时最大的问题之一是具有临时变量,因为每次更新页面时,我们都会丢失变量存储的所有信息,但是在我的实现中,我直接从 DynamoDB 中提取数据,这要归功于提供 AWS 的 javascript 开发工具包,因此我可以将信息存储在数据库中, 如上图所示,在名为“FMP”的数据库中,并保存临时变量和快速访问,以便部署和更新网页“FMPtemp”。
在显示网页时,调用FMPtemp数据库实时获取宠物的状态,并根据我们的算法确定宠物的一般状态,将通过颜色通知,如下图所示。
每图标代表以下内容:
温度:环境温度
加速度:最大加速度
空气Q:空气质量
湿润:空气湿气
颜色范围:
空气质量是使用以下公式计算的,使用简化版本来计算空气的露点,根据书籍,它必须小于 90:
空气 Q=0.5 * (温度 + 61.0 + ((温度-68.0)1.2) + (湿润 0.094))
最终产品
我们将温度传感器组装在外壳中。