亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino 环境监测

组件和用品

Arduino MKR1000
× 1
MikroE 环境点击
× 1

必要的工具和机器

Adafruit 母/母跳线

应用和在线服务

Arduino IDE
WolkAbout IoT Platform

关于这个项目

简介

我们手头有一些环境点击传感器,因此我们决定将它们连接到 Arduino MKR1000 并在 WolkAbout IoT Platform 上可视化它们。这个想法是每分钟进行一次测量,并每 15 分钟发布一次结果。如果传感器读数的发布失败(由于网络繁忙或其他一些问题),则结果应保留在设备的闪存中。每天最多可能写入 96 次,我们最大限度地减少了使闪存进入错误状态的机会(Arduino 保证 10,000 次写入周期)。

硬件设置

环境点击传感器连接到 I2C 通信引脚(即 MKR1000 上的 11 和 12)、Vcc 和地。

软件设置

我们使用了几个库来使这个项目成为可能,所有这些库都可以从 Arduino IDE 的库管理器安装,或者通过从附件中列出的 GitHub 存储库下载 .zip 档案,然后将它们添加到 Arduino IDE。所需的库是:

  • WiFi101
  • Adafruit 统一传感器驱动程序
  • Adafruit BME680 库
  • RTCZero
  • 闪存存储
  • WalkConnect

一旦安装了所有必需的库,请继续复制环境监控的内容 将附件中的草图绘制到 Arduino IDE 中。

它实现了一个循环缓冲区的结构,并用它来存储测量结果。还有一个关于如何使用 FlashStorage 库将该结构存储在闪存中的实现。数据的定时读取和发布是通过使用 RTCZero 库实现的。最初,在连接到 WiFi 后,我们向 WolkAbout IoT Platform 发送一个 ping 以获取将被输入到 RTC 库中的当前纪元,以便传感器读数可以正确地加上时间戳。

警报中断更改需要完成(读取和发布)任务的标志,其余工作在循环函数中处理。在这里我们检查是否需要阅读或发布。为实现最低功耗,WiFi 与 MKR1000 一样设置为低功耗模式。环境点击上的传感器会自动进入低功耗模式,直到请求读取为止。

必须对草图进行的更改包括在第 33 和 34 行输入 WiFi 凭据:

const char* ssid ="<*你的SSID*>";
const char* wifi_pass ="<*你的WIFI密码*>";

以及从 WolkAbout IoT Platform 输入设备凭据。

要获取这些凭据,您需要先使用设备类型创建设备。

此项目的设备类型,Environment click-deviceType.json, 可在项目的附件中找到,因此请创建它的副本。在 WolkAbout IoT Platform 上登录或创建您的帐户并打开设备 管理 申请。

选择设备 输入 管理 选项卡,然后按 + 签名并选择上传 选项,导航到设备类型的本地副本。

现在设备类型可用,您可以通过单击创建从它创建设备 设备 .

在这里,您需要为您的设备命名,设置连接类型 MQTT 并勾选 Create Default 的复选框 语义 (稍后在您的仪表板上创建小部件所必需的)。

保存 并且将显示带有设备凭据的表单。根据需要存储此信息,然后将其输入到 Arduino IDE 中的草图中:

const char *device_key ="device_key";
const char *device_password ="device_password";

现在您可以继续验证此草图并将其上传到您的电路板,但您仍然需要创建一种方法来显示接收到的传感器数据。

要显示此数据,请切换到可视化 和监控 WolkAbout IoT Platform 部分,然后按 + 添加仪表板 创建一个新仪表板 并输入仪表板的名称并将范围设置为设备名称。然后,您可以通过按 Add 开始向仪表板添加小部件 小部件。

选择热门

然后选择温度 来自您的设备。

Pressure 重复此过程 湿度 .创建另一个 Reading, 类型的小部件 选择海拔 并为 Gas 创建另一个卡片小部件 阻力 .您可以根据需要重新排列小部件。

在为您希望从您的设备接收到的整个单个传感器读数添加小部件后,以下仪表板将准备好从您的设备接收数据。

因此,请继续将设备部署到您选择的环境并远程监控条件。

结论

通过将 Arduino MKR1000 和 Environment Click 连接到 WolkAbout 物联网平台,您创建了一种节能的方式来报告您想要远程监控的地方的环境条件。该解决方案可以通过使用 WolkAbout IoT Platform 的规则引擎进行扩展,如果某个值超过您定义的阈值,您可以收到不同类型的通知。

有关规则引擎和其他 WolkAbout IoT Platform 功能的更多信息,您可以访问我们的用户指南页面。

代码

  • 环境监测示意图
  • 环境 click-deviceType.json
环境监控草图Arduino
将此草图导入 Arduino IDE 并编辑 WiFi 凭据和设备凭据
#include #include #include #include #include #include #include #include "WolkConn.h"#include "MQTTClient.h"/*要存储的outbound_message_t数量*/#define STORAGE_SIZE 32#define SEALEVELPRESSURE_HPA (1013.25)/ *用于将出站消息存储到持久性的圆形缓冲区*/typedef struct{ boolean valid; outbound_message_t outbound_messages[STORAGE_SIZE]; uint32_t 头; uint32_t 尾;布尔空; boolean full;} Messages;static Messages data;/*连接细节*/const char* ssid ="ssid";const char* wifi_pass ="wifi_pass";const char *device_key ="device_key";const char *device_password ="device_password ";const char* hostname ="api-demo.wolkabout.com";int portno =1883;WiFiClient espClient;PubSubClient client(espClient);/* WolkConnect-Arduino Connector context */static wolk_ctx_t wolk;/* Init flash storage * /FlashStorage(flash_store, Messages);/*初始化i2c传感器通信*/Adafruit_BME680 bme;RTCZero rtc;bool read;/*每分钟读取一次传感器。如果您更改此参数,请确保它 <60*/const byte readEvery =1;bool publish;/*每 10 分钟发布一次。如果更改此参数请确保它是 <60*/const byte publishEvery =10;byte publishMin;/*Flash 存储和自定义持久化实现*/void _flash_store(){ data.valid =true; flash_store.write(data);}void increase_pointer(uint32_t* pointer){ if ((*pointer) ==(STORAGE_SIZE - 1)) { (*pointer) =0; } else { (*指针)++; }}void _init(){ 数据 =flash_store.read(); if (data.valid ==false) { data.head =0; data.tail =0; data.empty =true; data.full =false; }}bool _push(outbound_message_t* outbound_message){ if(data.full) { increase_pointer(&data.head); } memcpy(&data.outbound_messages[data.tail], outbound_message, sizeof(outbound_message_t));增加指针(&data.tail); data.empty =false; data.full =(data.tail ==data.head); return true;}bool _peek(outbound_message_t* outbound_message){ memcpy(outbound_message, &data.outbound_messages[data.head], sizeof(outbound_message_t)); return true;}bool _pop(outbound_message_t* outbound_message){ memcpy(outbound_message, &data.outbound_messages[data.head], sizeof(outbound_message_t));增加指针(&data.head); data.full =false; data.empty =(data.tail ==data.head); return true;}bool _is_empty(){ return data.empty;}void init_wifi(){ if ( WiFi.status() !=WL_CONNECTED) { while (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { delay(1000) ); } }}void setup_wifi() { delay(10);如果(WiFi.status()!=WL_CONNECTED){ int numAttempts =0;而 (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { numAttempts++; if(numAttempts ==10){ Serial.println("无法连接 WiFi!");休息; } 延迟(1000); } }}void setup() { pinMode(LED_BUILTIN, OUTPUT);数字写入(LED_BUILTIN,低); /*初始化循环缓冲区结构*/ _init(); init_wifi(); wolk_init(&wolk, NULL, NULL, NULL, NULL, device_key, device_password, &client, hostname, portno, PROTOCOL_JSON_SINGLE, NULL, NULL); wolk_init_custom_persistence(&wolk, _push, _peek, _pop, _is_empty); /* 如果出现问题,板载 LED 将亮起 */ if(!bme.begin()) { digitalWrite(LED_BUILTIN, HIGH); } /*传感器初始化*/ bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C 延迟 150 毫秒(200);读=真;发布 =真; /*从服务器获取当前纪元*/ wolk_connect(&wolk);延迟(100); wolk_update_epoch(&wolk);而 (!(wolk.pong_received)) { wolk_process(&wolk);数字写入(LED_BUILTIN,高);延迟(1000); } 数字写入(LED_BUILTIN,低); wolk_disconnect(&wolk); rtc.begin(); rtc.setEpoch(wolk.epoch_time); rtc.setAlarmTime(rtc.getHours(), (rtc.getMinutes() + readEvery) % 60, rtc.getSeconds()); rtc.enableAlarm(rtc.MATCH_MMSS); rtc.attachInterrupt(alarmMatch); publishMin =(rtc.getMinutes() + publishEvery) % 60; WiFi.lowPowerMode();}void loop() { /*为了使中断例程尽可能短,例程只设置要完成的任务 read =true 表示应该完成传感器读数 publish =true 表示如果连接不可用,读数应发布到平台或保存在闪存中 */ if(read) { read =false; if (!bme.performReading()) { digitalWrite(LED_BUILTIN, HIGH); } wolk_add_numeric_sensor_reading(&wolk, "T", bme.temperature, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "H", bme.湿度, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "P", bme.pressure / 100.0, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "GR", bme.gas_resistance, rtc.getEpoch()); wolk_add_numeric_sensor_reading(&wolk, "A", bme.readAltitude(SEALEVELPRESSURE_HPA), rtc.getEpoch()); /*设置新闹钟*/ int alarmMin =(rtc.getMinutes() + readEvery) % 60; rtc.setAlarmMinutes(alarmMin);延迟(100); } 如果(发布){ 发布 =假; setup_wifi(); wolk_connect(&wolk); if(!wolk.is_connected) { _flash_store(); } 延迟(100); if(wolk_publish(&wolk) ==W_TRUE) { _flash_store(); } /*设置新的发布时间*/ publishMin =(rtc.getMinutes() + publishEvery) % 60;延迟(100); wolk_disconnect(&wolk);延迟(100); } 延迟(100); }/*定时中断例程*/void alarmMatch(){ read =true; if(publishMin ==rtc.getMinutes()) { 发布 =真; }}
环境 click-deviceType.jsonJSON
用于在 WolkAbout IoT Platform 上创建设备的设备类型
[ { "name":"Environment click", "description":"Device type for the BME680 sensor on MikroElektronika's board Environment Click", "guid":" def68ff6-63c5-4f9c-a066-bcc944b7bd2d", "deviceType":"STANDARD", "protocol":"JSON", "connectivityType":null, "firmwareUpdateType":null, "feeds":[ { "name":"温度”,“说明”:null,“参考”:“T”,“单位”:{“名称”:“摄氏度”,“guid”:“7c805d10-a879-11e9-83cd-0a0027000005”}},{“名称”:“湿度”,“说明”:空,“参考”:“H”,“单位”:{“名称”:“HUMIDITY_PERCENT”,“guid”:“7c8080a3-a879-11e9-83cd-0a0027000005”} }, { "name":"压力", "description":null, "reference":"P", "unit":{ "name":"MILLIBAR", "guid":"7c807980-a879-11e9-83cd -0a0027000005" } }, { "name":"Gas Resistance", "description":null, "reference":"GR", "unit":{ "name":"OHM", "guid":"7c805890- a879-11e9-83cd-0a0027000005" } }, { "name":"Altitude", "description":null, "referenc e":"A", "unit":{ "name":"METRE", "guid":"7c805a59-a879-11e9-83cd-0a0027000005" } } ], "actuators":[], "alarms":[], "configs":[], "attributes":[ { "name":"CONNECTIVITY_TYPE", "dataType":"ENUM", "validationRegex":"^(MQTT|HTTP)$", "options":[ "MQTT", "HTTP" ], "defaultValue":"MQTT", "required":true, "readOnly":true }, { "name":"FIRMWARE_UPDATE_ENABLED", "dataType":"BOOLEAN", "validationRegex ":"^(true|false)$", "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FIRMWARE_VERSION", "dataType":"STRING", "validationRegex":null, "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FILE_DIRECT_DOWNLOAD_ENABLED", "dataType":"BOOLEAN ", "validationRegex":"^(true|false)$", "options":null, "defaultValue":null, "required":false, "readOnly":true }, { "name":"FILE_URL_DOWNLOAD_ENABLED", "dataType":"BOOLEAN", "validationRegex":"^(true|false)$", "options":null, "defaultValue":null, "required":false, " readOnly":true } ] }]
关于环境监控
此存储库包含此项目中使用的 Arduino 草图 https://github.com/Wolkabout/Wolk-Arduino-Environment-Monitoring
Arduino WiFi 101 扩展板
Arduino WiFi 101 Shield 的 Wifi 库https://github.com/arduino-libraries/WiFi101
Adafruit 统一传感器驱动程序
所有传感器所需的统一传感器库https://github.com/adafruit/Adafruit_Sensor
Adafruit BME680 库
用于环境的库点击获取传感器读数https://github.com/adafruit/Adafruit_BME680
Arduino 的 RTC 库
基于 SAMD21 的电路板的 RTC 库 https://github.com/arduino-libraries/RTCZero
Arduino 的 FlashStorage 库
一种将数据存储到 ATSAMD21 上的闪存中的便捷方法https://github.com/cmaglie/FlashStorage
WalkConnect-Arduino
Arduino 库,可轻松连接到 WolkAbout 物联网平台。https://github.com/Wolkabout/WolkConnect-Arduino

示意图


制造工艺

  1. Arduino Spybot
  2. 使用 K30 传感器监测二氧化碳
  3. FlickMote
  4. 自制电视 B-Gone
  5. 主时钟
  6. 找到我
  7. Arduino Power
  8. Tech-TicTacToe
  9. Arduino Quadruped
  10. 非接触式温度监控门
  11. 森林火灾监测和探测系统(带短信警报)
  12. Arduino Joystick