Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Мониторинг окружающей среды Arduino

Компоненты и расходные материалы

Arduino MKR1000
× 1
MikroE Environment click
× 1

Необходимые инструменты и машины

Гнездо / гнездо перемычки Adafruit

Приложения и онлайн-сервисы

IDE Arduino
Платформа WolkAbout IoT

Об этом проекте

Введение

У нас были под рукой датчики нажатия Environment, поэтому мы решили подключить их к Arduino MKR1000 и визуализировать их на платформе WolkAbout IoT. Идея заключалась в том, чтобы проводить измерения каждую минуту и ​​публиковать результаты каждые 15 минут. Если публикация показаний датчика не удалась (из-за загруженной сети или какой-либо другой проблемы), то результаты должны быть сохранены во флэш-памяти устройства. С потенциальным максимумом 96 операций записи в день мы минимизируем вероятность перевода флэш-памяти в неправильное состояние (Arduino гарантирует 10 000 циклов записи).

Настройка оборудования

Датчик щелчка среды подключается к контактам связи I2C (а именно 11 и 12 на MKR1000), Vcc и земле.

Настройка программного обеспечения

Мы использовали несколько библиотек, чтобы реализовать этот проект, все из которых могут быть установлены из диспетчера библиотек Arduino IDE или путем загрузки архивов .zip из репозиториев GitHub, перечисленных в приложениях, и последующего добавления их в Arduino IDE. Необходимые библиотеки:

  • Wi-Fi101
  • Унифицированный драйвер датчика Adafruit
  • Библиотека Adafruit BME680
  • RTCZero
  • FlashStorage
  • WolkConnect

После установки всех необходимых библиотек скопируйте содержимое раздела Мониторинг среды . скетч из вложений в Arduino IDE.

Он реализует структуру кольцевого буфера и использует ее для хранения результатов измерений. Также существует реализация того, как сохранить эту структуру во флэш-памяти с помощью библиотеки FlashStorage. Считывание и публикация данных по времени достигаются с помощью библиотеки RTCZero. Первоначально после подключения к Wi-Fi мы отправляем эхо-запрос на платформу WolkAbout IoT, чтобы получить текущую эпоху, которая будет загружена в библиотеку RTC, чтобы показания датчика могли быть правильно отмечены временем.

Прерывание по тревоге изменяет флаги для задач, которые необходимо выполнить (чтение и публикация), а остальная работа выполняется в функции цикла. Здесь мы проверяем, нужно ли нам читать или публиковать. Для минимального энергопотребления WiFi установлен в режим пониженного энергопотребления, как и MKR1000. Датчик при нажатии кнопки "Среда" автоматически переходит в режим низкого энергопотребления, пока не будет запрошено считывание.

Изменения, которые необходимо внести в эскиз, включают ввод учетных данных Wi-Fi в строках 33 и 34:

  const char * ssid ="<* ВАШ SSID *>"; 
const char * wifi_pass ="<* ВАШ ПАРОЛЬ WIFI *>";

а также ввод учетных данных устройства с WolkAbout IoT Platform.

Чтобы получить эти учетные данные, вам необходимо сначала создать устройство, указав тип устройства.

Тип устройства для этого проекта: Environment click-deviceType.json, доступен во вложениях к проекту, поэтому создайте его копию. Войдите или создайте свою учетную запись на платформе WolkAbout IoT и откройте Устройство . Управление приложение.

Выберите Устройство Тип Управление вкладка, а затем нажмите кнопку + подпишите и выберите Загрузить вариант, перейдя к вашей локальной копии типа устройства.

Теперь, когда доступен тип устройства, вы можете создать из него устройство, нажав Создать . устройство .

Здесь вам нужно дать своему устройству имя, установить Тип подключения . в MQTT и установите флажок Создать по умолчанию Семантический (необходимо для создания виджетов на панели управления позже).

Нажмите Сохранить . и отобразится форма с учетными данными устройства. Сохраните эту информацию, как хотите, а затем введите ее в свой эскиз в Arduino IDE:

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

Теперь вы можете продолжить, проверить и загрузить этот эскиз на свою доску, но вам все равно нужно создать способ отображения полученных данных датчика.

Чтобы отобразить эти данные, переключитесь на Визуализацию и мониторинг в разделе WolkAbout IoT Platform и создайте новую панель мониторинга, нажав + Добавить панель мониторинга и введите имя для панели мониторинга и установите для области любое имя устройства. Затем вы можете начать добавлять виджеты на свою панель управления, нажав Добавить . виджет .

Выберите В тренде .

а затем выберите Температура . с вашего устройства.

Повторите процесс для давления . и влажность . Создайте еще один виджет типа Чтение выберите Высота и создайте еще один виджет карточки для Газ Сопротивление . Вы можете переставлять виджеты по своему усмотрению.

После добавления виджетов для всего отдельного показания датчика, которое вы ожидаете получить от своего устройства, следующая панель будет готова для приема данных с вашего устройства.

Итак, разверните устройство в выбранной вами среде и удаленно отслеживайте условия.

Заключение

Подключив Arduino MKR1000 и Environment Click к платформе WolkAbout IoT, вы создали энергоэффективный способ сообщать об условиях окружающей среды в месте, которое вы хотите отслеживать удаленно. Это решение можно расширить за счет использования механизма правил 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 head; uint32_t tail; логическое пустое; boolean full;} Сообщения; статические данные сообщений; / * Детали подключения * / 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 * / static wolk_ctx_t wolk; / * Инициализация флеш-хранилища * / 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; / * Флэш-хранилище и реализация настраиваемого постоянства * / 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 () {data =flash_store.read (); если (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) {увеличить_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 () {задержка (10); если (WiFi.status ()! =WL_CONNECTED) {int numAttempts =0; в то время как (WiFi.begin (ssid, wifi_pass)! =WL_CONNECTED) {numAttempts ++; if (numAttempts ==10) {Serial.println («Не удалось подключиться к Wi-Fi!»); ломать; } задержка (1000); }}} установка void () {pinMode (LED_BUILTIN, OUTPUT); digitalWrite (LED_BUILTIN, LOW); / * Инициализируем структуру кольцевого буфера * / _init (); init_wifi (); wolk_init (&wolk, NULL, NULL, NULL, NULL, ключ_устройства, пароль_устройства, &клиент, имя хоста, номер порта, PROTOCOL_JSON_SINGLE, NULL, NULL); wolk_init_custom_persistence (&wolk, _push, _peek, _pop, _is_empty); / * Встроенный светодиод загорится, если что-то пошло не так * / 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); digitalWrite (LED_BUILTIN, HIGH); задержка (1000); } digitalWrite (LED_BUILTIN, LOW); 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; если (! 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.humidity, 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); если (! wolk.is_connected) {_flash_store (); } задержка (100); если (wolk_publish (&wolk) ==W_TRUE) {_flash_store (); } / * устанавливаем новое время публикации * / publishMin =(rtc.getMinutes () + publishEvery)% 60; задержка (100); wolk_disconnect (&wolk); задержка (100); } задержка (100); } / * Программа обработки прерывания по времени * / void alarmMatch () {read =true; если (publishMin ==rtc.getMinutes ()) {publish =true; }} 
Среда click-deviceType.json JSON
Тип устройства, который используется для создания устройства на платформе WolkAbout IoT
 [{"name":"Environment click", "description":"Тип устройства для датчика BME680 на плате MikroElektronika Environment Click", "guid":" def68ff6-63c5-4f9c-a066-bcc944b7bd2d "," deviceType ":" STANDARD "," protocol ":" JSON "," connectivityType ":null," firmwareUpdateType ":null," feeds ":[{" name ":" Температура "," description ":null," reference ":" T "," unit ":{" name ":" CELSIUS "," guid ":" 7c805d10-a879-11e9-83cd-0a0027000005 "}}, {" name ":" Влажность "," description ":null," reference ":" H "," unit ":{" name ":" HUMIDITY_PERCENT "," guid ":" 7c8080a3-a879-11e9-83cd-0a0027000005 "} }, {"name":"Давление", "description":null, "reference":"P", "unit":{"name":"MILLIBAR", "guid":"7c807980-a879-11e9-83cd -0a0027000005 "}}, {" name ":" Газостойкость "," description ":null," reference ":" GR "," unit ":{" name ":" OHM "," guid ":" 7c805890- a879-11e9-83cd-0a0027000005 "}}, {" name ":" Высота "," description ":null," referenc e ":" A "," unit ":{" name ":" METER "," guid ":" 7c805a59-a879-11e9-83cd-0a0027000005 "}}]," приводы ":[]," alarms ":[], «конфигурации»:[], «атрибуты»:[{«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}]}] 
WolkAbout Environment Monitoring
Этот репозиторий содержит эскиз Arduino, используемый в этом проекте https://github.com/Wolkabout/Wolk-Arduino-Environment-Monitoring
Arduino WiFi 101 Shield
Библиотека Wi-Fi для Arduino WiFi 101 Shield https://github.com/arduino-libraries/WiFi101
Унифицированный драйвер датчика Adafruit
Для всех датчиков требуется унифицированная библиотека датчиков https://github.com/adafruit/Adafruit_Sensor
Библиотека Adafruit BME680
Библиотека, используемая для среды, щелкните, чтобы получить показания датчика https://github.com/adafruit/Adafruit_BME680
Библиотека RTC для Arduino
Библиотека RTC для плат на базе SAMD21 https://github.com/arduino-libraries/RTCZero
Библиотека FlashStorage для Arduino
Удобный способ хранения данных во флеш-памяти на ATSAMD21 https://github.com/cmaglie/FlashStorage
WolkConnect-Arduino
Библиотека Arduino, которая обеспечивает простое подключение к платформе WolkAbout IoT. Https://github.com/Wolkabout/WolkConnect-Arduino

Схема


Производственный процесс

  1. Arduino Spybot
  2. Мониторинг CO2 с помощью датчика K30
  3. FlickMote
  4. Самодельный телевизор B-Gone
  5. Основные часы
  6. Найди меня
  7. Arduino Power
  8. Tech-TicTacToe
  9. Четвероногий Arduino
  10. Ворота бесконтактного мониторинга температуры