使用 AWS IoT 的工厂监控系统
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
|
应用和在线服务
| ||||
| ||||
| ||||
| ||||
| ||||
|
关于这个项目
想象一下,您要休假一周左右,并且担心家里的植物。这是一个很棒的项目,可以在您出去度假前花上一周时间。
使用以下功能为自己构建一个工厂监控和通知系统
- 使用 dweet.io 监测温度、光照值和土壤湿度值
- 或使用新的 Amazon IoT 服务将数据记录到 AWS - DynamoDB
- 使用 AWS -SNS 通知,向自己发送电子邮件,以便您可以通知您的堂兄/邻居快速给植物浇水或检查您家中的恒温器。
此外,我还设计了一个 3D 打印外壳,用于放置 Arduino Yun、grove shield 和传感器。
如果您有兴趣查看我的工厂的运行情况,请点击此处的链接
http://dweet.io/follow/PlantMonitorTorontoON
以下是完成构建所需执行的步骤
#1 构建电路 使用 Grove 连接器屏蔽 如项目的原理图部分所示,基本上连接
- 温度传感器到 A0
- 土壤湿度传感器至 A1
- 光传感器到 A2
- 并使用 220 欧姆电阻将 LED 连接到引脚 #2
#2 3D 打印 STL 文件, 附在 自定义部件和外壳部分、 这里有 3 个 STL 文件要打印,将切片软件设置为 0.3 毫米层高 和至少25%的填充密度 或更高
3D 打印大约需要 2 小时,因此请下载 STL 文件并启动您的 3D 打印机,同时完成以下其他步骤
#3 确定土壤水分值
将下面附加的代码(土壤水分值)上传到您的 Arduino Yun 并确定下面代码中的 tooDryValue。基本上如果土壤水分的值低于 tooDryValue,您需要给植物浇水。(这个值就是你想要的值将在 AWS-SNS 条件下使用发送电子邮件)
这是显示我用来确定 toodryvalue 的方法的视频
#4 将 Arduino 代码上传到 Yun 以将数据发布到 dweet.io
现在,一旦您决定了 toodryvalue ,将 ArduinoYunDweetIO.ino 文件上传到 Yun,并且作为代码的一部分,还将“PlantMonitorTorontoON”替换为对您更有意义的内容。
这是测试将传感器数据上传到 dweet.io 的视频
#5 在您的计算机上设置 AWS CLI (这里我使用的是 Mac)
现在要在 DyanamoDB 中使用 AWS IoT 记录数据,您必须在 https://aws.amazon.com/free 创建一个帐户,在这里您还必须提供您的信用卡详细信息,但对于下面的教程,您不应该产生任何费用(同样取决于 AWS 设置的区域)
完成后创建一个文件夹“AWS "在您的 Mac 上,然后按照以下链接下载并安装 AWS CLI
http://docs.aws.amazon.com/iot/latest/developerguide/installing-aws-cli.html
我使用的是 mac ,这是我遵循的说明
$ curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"$ unzip awscli-bundle.zip$ sudo ./awscli -bundle/install -i /usr/local/aws -b /usr/local/bin/aws
注意:在终端你需要在你刚刚创建的 AWS 文件夹中
#6 使用 CLI 创建事物,该事物应显示在 AWS IoT 控制台中
现在我们将使用以下命令在 AWS IoT 中创建一个事物
aws iot create-thing --thing-name "plantSystem"
欲了解更多信息,请参阅链接
http://docs.aws.amazon.com/iot/latest/developerguide/create-thing.html
#7 创建证书
要创建和激活您需要的证书,请输入以下命令
aws iot create-keys-and-certificate --set-as-active --certificate-pem-outfile cert.pem --public-key-outfile publicKey.pem --private-key-outfile privateKey .pem
此命令将在 AWS 文件夹中为您创建证书(3 个 pem 文件),如下面的屏幕截图所示
#8 创建 AWS IoT 策略并将其附加到您的证书
首先在 AWS 文件夹中创建一个 json 文件,使用您最喜欢的文本编辑器(我更喜欢 sublime text 2) - 将文件命名为 policy.json
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":["iot:*"], "Resource":[ "*"] }]}
然后将以下命令复制粘贴到您的文本编辑器中
aws iot create-policy --policy-name "PubSub" --policy-document file://./policy.json
#9 将策略附加到证书,然后将证书附加到设备
一个接一个地发出下面的命令
$aws iot attach-principal-policy --principal "arn:aws:iot:xxxxxxxxxxxxxxxxxxxxxxxx" --policy-name "PubSub"$ aws iot attach-thing-principal --thing-name "PlantSystem" --principal "arn:aws:iot:xxxxxxxxxxxxxxxxxxxxxxxx"
如果您没有记下证书,那么获取证书的一种简单方法是转到 AWS IoT 控制台,单击您的证书,然后转到屏幕右侧的详细信息。从这里您可以将 arn 复制粘贴到终端
有关详细信息,请参阅
上的文档http://docs.aws.amazon.com/iot/latest/developerguide/secure-communication.html
#10 在您的计算机上验证/测试您的设置并使用 MQTT.fx 进行测试
现在声明已在您的计算机上完成设置,从下面的链接下载并安装 MQTT.fx 以测试设置是否正常工作,我们是否能够通过 AWS IoT 发布和订阅数据
http://mqttfx.jfx4ee.org/index.php/download
有关更多设置信息和下载根证书,请使用以下链接
http://docs.aws.amazon.com/iot/latest/developerguide/verify-pub-sub.html
- 在 MQTT.fx 中,您必须设置连接配置文件
- 并链接您在上述步骤中下载的证书
这是一个快速视频,展示了如何在您的计算机上测试您的设置,在我的情况下是使用 MQTT.fx 工具的 MAC。
完成并测试您的设置正常后,请按照以下步骤将证书上传到 Arduino Yun
#11 设置 Arduino Yun 与 AWS IoT 云通信
从 github 下载最新版本的 Arduino Yun SDK 并解压到您的 Arduino“Libraries”文件夹中
https://github.com/aws/aws-iot-device-sdk-arduino-yun
如果您是第一次使用 Arduino Yun,请按照
上的设置说明进行操作https://www.arduino.cc/en/Guide/ArduinoYun
基本上使用该链接,您将学习如何设置 Arduino Yun 以连接到家庭 WiFi 网络。
然后将流程示例草图 Arduino IDE 加载到您的 YUN(文件->示例->桥-> 流程),这将确认 Yun 可以访问互联网
将您的 rootCA 文件、私钥和证书放入 certs 文件夹中,如下面的屏幕截图所示
接下来修改codebase_upload.sh 和 environment_setup.sh 并将 [your_boards_IP] 替换为您开发板的 IP 地址,将 [your_boards_IP] 替换为您的密码
在您的终端中运行以下命令以授予 .sh 文件的权限,这将需要大约 5-10 分钟,这将移动证书并在 Yun 上安装分发、python-openssl、pip、paho-mqtt。这些是您从 Yun 与 AWS 云通信所需的包(在我们的案例中也称为 PlantSystem)
$chmod 755 codebase_upload.sh$./codebase_upload.sh$chmod 755 environment_setup.sh$./environment_setup.sh
要在 Linux/Windows 上安装,请点击
上的链接https://github.com/aws/aws-iot-device-sdk-arduino-yun#installation
现在作为使用 AWS CLI 的下一组的一部分,我们将在 DynamoDB 中创建一个表来发布传感器数据
#12 创建 IAM 角色并授予权限
基本上要将数据输入到我们将在下一步创建的 DynamoDB 传感器表中,我们需要创建一个 IoT 规则,该规则将对 AWS 收到的 MQTT 消息进行操作,为此我们需要创建一个角色并授予必要的权限
创建一个json文件rolePolicy.json
{"Version":"2012-10-17", "Statement":[{ "Sid":"", "Effect":"Allow", "Principal":{ "Service":" iot.amazonaws.com" }, "Action":"sts:AssumeRole" }]}
并在终端中运行以下命令来创建角色
aws iam create-role --role-name iot-actions-role --assume-role-policy-document file://./rolePolicy.json
创建另一个json文件policy.json
{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":[ "dynamodb:*", "lambda:InvokeFunction"] , "资源":["*"] }]}
然后调用 create-policy 并指定 IAM 策略文档
aws iam create-policy --policy-name iot-actions-policy --policy-document file://./policy.json
最后使用 - 将策略-ARN 修改为您在上一步中收到的 ARN 将策略附加到角色
aws iam attach-role-policy --role-name iot-actions-role --policy-arn "arn:aws:xxxxxxxxxxxxx:policy/iot-action-policy"
http://docs.aws.amazon.com/iot/latest/developerguide/config-and-test-rules.html
#13 在 AWS 控制台的 DynamoDB 中设置表
作为此步骤的一部分,我们将在 AWS 控制台中创建一个 DynamoDB
表名:植物传感器
分区键:key
排序键:时间戳
并将您的读取容量单位和写入容量设置为 1。
#14 创建将数据插入到 PlantSensor 表中的规则
创建一个json文件——plantdatarule.json(这里修改下节的roleArn值,去IAM->Roles->iot-action-role获取arn)
{ "sql":"SELECT * FROM 'topic/plantdata'", "ruleDisabled":false, "actions":[{ "dynamoDB":{ "tableName":"plantSensor", "hashKeyField" :"key", "hashKeyValue":"${topic(2)}", "rangeKeyField":"timestamp", "rangeKeyValue":"${timestamp()}", "roleArn":"arn:aws:iam ::XXXXXXXXXXXX:role/iot-actions-role" } }]}
然后在终端上运行以下命令
aws iot create-topic-rule --rule-name plantDataToDynamoDB --topic-rule-payload file://./plantdatarule.json
现在,如果您转到 AWS IoT 控制台,您应该看到创建了一个名为“PlantDataToDynamoDB”的规则,如下面的屏幕截图所示(忽略电子邮件发送规则,这是以下步骤的一部分。)
使用 MQTT.FX 运行快速测试以查看是否在创建的表中创建记录。
#15 上传 Arduino 草图以将数据从云发布到 AWS IoT
这里首先从 github 下载 ArduinoJSON 库
https://github.com/bblanchon/ArduinoJson
现在从下面的代码部分下载 YunAWSIoTDynamoDB、ino 和 aws_iot_config.h 文件并将其上传到 Yun。
打开您的串行监视器,您应该会看到发布到 DynamoDB 的温度、光照值和土壤湿度值。
如果您使用过 AWS,您可以通过设置 Lambda 函数和发布数据动态来做各种很棒的事情......
注意: 如果您打算将此设置为永久设置,请不要忘记增加循环结束时的延迟,以增加发布到 DynamoDB 的时间间隔,以免产生额外成本。有关定价的更多信息,请参阅 https://aws.amazon.com/iot/pricing/
#16 设置 AWS-IoT SNS 规则以在您的土壤湿度值低于阈值时接收和发送电子邮件。
基本上,此步骤包括根据 AWS IoT 规则设置简单的 SNS 通知。
首先将以下策略分配给您在 IAM 控制台的上一步中创建的 AWS 角色 (iot-action-role)
-亚马逊SNSRole
-AmazonSNSFullAccess
在 SNS 控制台中完成后,创建一个名为 sendMail 的主题 并创建订阅并在您的手机上设置您的电子邮件以在土壤湿度值低时收到通知。
现在返回 AWS IoT 控制台并使用 +Create Resource 按钮创建一个名为 Email Send 的规则并提供以下信息
- 姓名:电子邮件发送
- 属性:mositValue(这应该与您在 Arduino 代码中作为主题的一部分发布的 json 值匹配)
- 主题过滤器:主题/植物数据
- 条件:作为 moistval <250(这是您在本教程的前几步中确定的值)
- 选择操作:发送消息作为推送通知 SNS
- SNS 目标:sendEmail
- 角色:iot-action-role
完成后,您的控制台应如下面的屏幕截图
这是我从一杯水中取出土壤湿度传感器时收到的示例电子邮件
阅读有关 AWS-SNS 的更多信息
https://aws.amazon.com/sns/faqs/
#15 将 3D 打印部件放在一起并将其添加到锅中。
您需要一个 4x40 的螺丝和螺母将黑土扑克 3D 打印部件连接到 Arduino Yun 的底座部分
顶部刚好搭扣,这里记得将顶部开口指向你的窗户,然后戳一下锅里的土壤水分。然后用微型 USB 电缆插头给 Yun 供电到墙上的插座。
请注意,我仍在探索和学习 AWS 的精彩世界,并且对 AWS 控制台上的功能感到敬畏,因此,如果您使用 AWS 已有一段时间,请发表您对功能的评论或建议喜欢看/适用于工厂监控项目。谢谢..
代码
- 土壤水分值
- ArduinoYunDweetio
- ArduinoYunAWSIoTDynamodb
- aws_iot_config.h
SoilMoistureValueArduino
Arduino 草图,为您的室内植物确定理想的土壤水分值// Grove 湿度传感器连接到 Grove Shieldconst 上的 A1 int ledPin =2;int moisturValue =0;int tooDryValue =250;//根据您提出的内容更改此值void setup() {Serial.begin(9600); pinMode(ledPin,OUTPUT);digitalWrite(ledPin,LOW);}void loop() {moisturValue =analogRead(moisturePin);Serial.print("Moisture sensor =");Serial.println(moisturValue); //先用干沙检查值,然后用湿沙迪夫(moisturValueArduinoYunDweetioArduino
使用 Arduino Yun 将传感器数据发布到 dweet.io//由 @CarmelitoA 为室内植物监控项目创建 - 将数据上传到 dweet.io。 (CC BY-SA https://creativecommons.org/licenses/by-sa/4.0/)#include#include #define SITE_URL "www.dweet.io"#include
定制零件和外壳
示意图
Connect the sensors to the Grove starter kit that is- Temperature sensor to A0
- Soil Moisture sensor to A1
- Light sensor to A2
In addition, using a 220 Ohms resistor connect an LED to pin#2. Connect the
Temperature sensor to A0
Soil Moisture sensor to A1
Light sensor to A2
And using a 220 Ohms resistor connect an LED to pin#2
制造工艺