Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Pemantauan Lingkungan Arduino

Komponen dan persediaan

Arduino MKR1000
× 1
Klik Lingkungan MikroE
× 1

Alat dan mesin yang diperlukan

Kabel jumper Adafruit Wanita/Wanita

Aplikasi dan layanan online

Arduino IDE
WolkAbout IoT Platform

Tentang proyek ini

Pendahuluan

Kami memiliki beberapa sensor klik Lingkungan, jadi kami memutuskan untuk menghubungkannya ke Arduino MKR1000 dan memvisualisasikannya di WolkAbout IoT Platform. Idenya adalah melakukan pengukuran setiap menit dan mempublikasikan hasilnya setiap 15 menit sekali. Jika penerbitan pembacaan sensor gagal (karena jaringan yang sibuk atau masalah lain), maka hasilnya harus disimpan dalam memori Flash perangkat. Dengan potensi maksimum 96 penulisan sehari, kami meminimalkan kemungkinan memori Flash menjadi status yang salah (Arduino menjamin 10.000 siklus penulisan).

Penyiapan perangkat keras

Sensor klik Lingkungan terhubung ke pin komunikasi I2C (yaitu 11 dan 12 pada MKR1000), Vcc, dan ground.

Penyiapan perangkat lunak

Kami menggunakan beberapa perpustakaan untuk memungkinkan proyek ini, yang semuanya dapat diinstal dari manajer perpustakaan Arduino IDE, atau dengan mengunduh arsip .zip dari repositori GitHub yang tercantum dalam lampiran dan kemudian menambahkannya ke Arduino IDE. Pustaka yang diperlukan adalah:

  • WiFi101
  • Driver Sensor Terpadu Adafruit
  • Perpustakaan Adafruit BME680
  • RTCZero
  • Penyimpanan Flash
  • WolConnect

Setelah semua perpustakaan yang diperlukan diinstal, lanjutkan dan salin konten Pemantauan lingkungan sketsa dari lampiran ke Arduino IDE.

Ini mengimplementasikan struktur buffer melingkar dan menggunakannya untuk menyimpan hasil pengukuran. Ada juga implementasi cara menyimpan struktur itu di memori Flash menggunakan perpustakaan FlashStorage. Pembacaan waktu dan penerbitan data dicapai dengan menggunakan perpustakaan RTCZero. Awalnya, setelah terhubung ke WiFi, kami mengirim ping ke WolkAbout IoT Platform untuk mendapatkan epoch saat ini yang akan dimasukkan ke perpustakaan RTC sehingga pembacaan sensor dapat diberi stempel waktu dengan benar.

Interupsi alarm mengubah tanda untuk tugas yang perlu dilakukan (baca dan publikasikan) dan pekerjaan lainnya ditangani dalam fungsi loop. Di sini kami memeriksa apakah kami perlu membaca atau menerbitkan. Untuk konsumsi daya minimal, WiFi diatur dalam mode daya rendah seperti halnya MKR1000. Sensor pada klik Lingkungan mati secara otomatis hingga pembacaan diminta.

Perubahan yang harus dilakukan pada sketsa termasuk memasukkan kredensial WiFi pada baris 33 dan 34:

const char* ssid ="<*SSID ANDA*>";
const char* wifi_pass ="<*PASSWORD WIFI ANDA*>";

serta memasukkan kredensial perangkat dari WolkAbout IoT Platform.

Untuk mendapatkan kredensial ini, Anda harus membuat perangkat terlebih dahulu dengan menggunakan jenis perangkat.

Jenis perangkat untuk proyek ini, Environment click-deviceType.json, tersedia di lampiran proyek, jadi buat salinannya. Masuk ke atau buat akun Anda di WolkAbout IoT Platform dan buka Perangkat Manajemen aplikasi.

Pilih Perangkat Jenis Manajemen tab lalu tekan tombol + tanda tangani dan pilih Unggah pilihan, menavigasi ke salinan lokal Anda dari jenis perangkat.

Sekarang setelah jenis perangkat tersedia, Anda dapat membuat perangkat darinya dengan mengeklik Buat perangkat .

Di sini, Anda perlu memberi nama pada perangkat Anda , atur Jenis Konektivitas ke MQTT dan centang kotak untuk Buat Default Semantik (diperlukan untuk membuat widget di dasbor Anda nanti).

Tekan Simpan dan formulir dengan kredensial perangkat akan ditampilkan. Simpan informasi ini sesuka Anda, lalu masukkan ke dalam sketsa Anda di Arduino IDE:

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

Sekarang Anda dapat melanjutkan, memverifikasi, dan mengunggah sketsa ini ke papan Anda, tetapi Anda masih perlu membuat cara untuk menampilkan data sensor yang diterima.

Untuk menampilkan data ini, alihkan ke Visualisasi dan Pemantauan di WolkAbout IoT Platform dan buat dasbor baru dengan menekan + Tambahkan dasbor dan memasukkan nama untuk dasbor dan menyetel cakupan ke apa pun nama perangkatnya. Kemudian Anda dapat mulai menambahkan widget ke dasbor dengan menekan Tambah widget.

Pilih Tren

lalu pilih Suhu dari perangkat Anda.

Ulangi proses untuk Tekanan dan Kelembaban . Buat widget lain dengan jenis Membaca, pilih Ketinggian dan buat widget kartu lain untuk Gas Resistensi . Anda dapat mengatur ulang widget sesuka Anda.

Setelah menambahkan widget untuk seluruh pembacaan sensor individual yang Anda harapkan dari perangkat Anda, dasbor berikut akan siap menerima data dari perangkat Anda.

Jadi, lanjutkan dan terapkan perangkat ke lingkungan yang telah Anda pilih dan pantau kondisinya dari jarak jauh.

Kesimpulan

Dengan menghubungkan Arduino MKR1000 dan Environment Click ke WolkAbout IoT Platform, Anda menciptakan cara hemat energi untuk melaporkan kondisi lingkungan tempat yang ingin Anda pantau dari jarak jauh. Solusi ini dapat diperluas melalui penggunaan mesin aturan WolkAbout IoT Platform, yang memungkinkan Anda menerima berbagai jenis notifikasi jika nilai tertentu melewati ambang batas yang Anda tetapkan.

Untuk informasi lebih lanjut tentang mesin aturan dan fitur WolkAbout IoT Platform lainnya, Anda dapat mengunjungi halaman Panduan Pengguna kami.

Kode

  • Sketsa pemantauan lingkungan
  • Lingkungan klik-deviceType.json
Sketsa pemantauan lingkunganArduino
Impor sketsa ini ke Arduino IDE dan edit kredensial WiFi dan kredensial perangkat
#include #include #include #include #include #include #include #include "WolkConn.h"#include "MQTTClient.h"/*Jumlah outbound_message_t untuk disimpan*/#define STORAGE_SIZE 32#define SEALEVELPRESSURE_HPA (1013.25) *Buffer melingkar untuk menyimpan pesan keluar agar tetap ada*/typedef struct{ boolean valid; outbound_message_t outbound_messages[STORAGE_SIZE]; kepala uint32_t; uint32_t ekor; boolean kosong; boolean full;} Pesan;data Pesan statis;/*Detail koneksi*/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;/* Memulai penyimpanan flash * /FlashStorage(flash_store, Messages);/*Init i2c sensor communication*/Adafruit_BME680 bme;RTCZero rtc;bool read;/*Baca sensor setiap menit. Jika Anda mengubah parameter ini, pastikan <60*/const byte readEvery =1;bool publish;/*Publish setiap 10 menit. Jika Anda mengubah parameter ini, pastikan bahwa <60*/const byte publishEvery =10;byte publishMin;/*Flash storage dan implementasi persistensi kustom*/void _flash_store(){ data.valid =true; flash_store.write(data);}void peningkatan_pointer(uint32_t* pointer){ if ((*pointer) ==(STORAGE_SIZE - 1)) { (*pointer) =0; } else { (*penunjuk)++; }}void _init(){ data =flash_store.read(); if (data.valid ==false) { data.head =0; data.ekor =0; data.kosong =benar; data.penuh =salah; }}bool _push(outbound_message_t* outbound_message){ if(data.full) { peningkatan_pointer(&data.head); } memcpy(&data.outbound_messages[data.tail], outbound_message, sizeof(outbound_message_t)); peningkatan_pointer(&data.tail); data.kosong =salah; 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)); peningkatan_pointer(&data.head); data.penuh =salah; data.kosong =(data.ekor ==data.kepala); 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); if ( WiFi.status() !=WL_CONNECTED) { int numAttempts =0; while (WiFi.begin(ssid, wifi_pass) !=WL_CONNECTED) { numAttempts++; if(numAttempts ==10){ Serial.println("Tidak dapat menjangkau WiFi!"); merusak; } penundaan(1000); } }}pengaturan batal() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, RENDAH); /*Inisialisasi struktur buffer melingkar*/ _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 on board akan menyala jika terjadi kesalahan*/ if(!bme.begin()) { digitalWrite(LED_BUILTIN, HIGH); } /*Sensor init*/ 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 untuk penundaan 150 ms(200); baca =benar; terbitkan =benar; /*Dapatkan epoch saat ini dari server*/ wolk_connect(&wolk); penundaan(100); wolk_update_epoch(&wol); while (!(wolk.pong_received)) { wolk_process(&wolk); digitalWrite(LED_BUILTIN, TINGGI); penundaan (1000); } digitalWrite(LED_BUILTIN, RENDAH); wolk_disconnect(&wol); rtc.mulai(); 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() { /*Untuk menjaga agar rutin interupsi sesingkat mungkin, rutin hanya menetapkan tugas yang harus dilakukan read =true berarti pembacaan sensor harus dilakukan publish =true berarti pembacaan harus dipublikasikan ke platform atau disimpan dalam flash jika koneksi tidak tersedia */ if(read) { read =false; if (!bme.performReading()) { digitalWrite(LED_BUILTIN, TINGGI); } 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()); /*set alarm baru*/ int alarmMin =(rtc.getMinutes() + readEvery) % 60; rtc.setAlarmMinutes(alarmMin); penundaan(100); } if(terbitkan) { publikasikan =salah; setup_wifi(); wolk_connect(&wol); if(!wolk.is_connected) { _flash_store(); } penundaan(100); if(wolk_publish(&wolk) ==W_TRUE) { _flash_store(); } /*set waktu publikasi baru*/ publishMin =(rtc.getMinutes() + publishEvery) % 60; penundaan(100); wolk_disconnect(&wol); penundaan(100); } penundaan(100); }/*rutin interupsi berjangka waktu*/void alarmMatch(){ read =true; if(publishMin ==rtc.getMinutes()) { publish =true; }}
Environment click-deviceType.jsonJSON
Jenis perangkat yang digunakan untuk membuat perangkat di 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":" Suhu", "deskripsi":null, "referensi":"T", "satuan":{ "nama":"CELSIUS", "guid":"7c805d10-a879-11e9-83cd-0a0027000005" } }, { " name":"Humidity", "description":null, "reference":"H", "unit":{ "name":"HUMIDITY_PERCENT", "guid":"7c8080a3-a879-11e9-83cd-0a0027000005" } }, { "name":"Pressure", "description":null, "reference":"P", "unit":{ "name":"MILLIBAR", "guid":"7c807980-a879-11e9-83cd -0a0027000005" } }, { "name":"Resistensi Gas", "description":null, "reference":"GR", "unit":{ "name":"OHM", "guid":"7c805890- a879-11e9-83cd-0a0027000005" } }, { "nama":"Ketinggian", "deskripsi":null, "referensi e":"A", "unit":{ "name":"METRE", "guid":"7c805a59-a879-11e9-83cd-0a0027000005" } } ], "aktuator":[], "alarm":[], "configs":[], "attributes":[ { "name":"CONNECTIVITY_TYPE", "dataType":"ENUM", "validationRegex":"^(MQTT|HTTP)$", "options":[ "MQTT", "HTTP" ], "defaultValue":"MQTT", "wajib":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 } ] }]
WolkTentang Pemantauan Lingkungan
Repositori ini berisi sketsa Arduino yang digunakan dalam proyek inihttps://github.com/Wolkabout/Wolk-Arduino-Environment-Monitoring
Arduino WiFi 101 Perisai
Pustaka Wifi untuk Arduino WiFi 101 Shieldhttps://github.com/arduino-libraries/WiFi101
Driver Sensor Terpadu Adafruit
Pustaka sensor terpadu diperlukan untuk semua sensorhttps://github.com/adafruit/Adafruit_Sensor
Perpustakaan Adafruit BME680
Perpustakaan yang digunakan untuk Lingkungan klik untuk mendapatkan pembacaan sensorhttps://github.com/adafruit/Adafruit_BME680
Perpustakaan RTC untuk Arduino
Perpustakaan RTC untuk papan berbasis SAMD21 https://github.com/arduino-libraries/RTCZero
Perpustakaan FlashStorage untuk Arduino
Cara mudah untuk menyimpan data ke dalam memori Flash di ATSAMD21https://github.com/cmaglie/FlashStorage
WolkConnect-Arduino
Perpustakaan Arduino yang menyediakan konektivitas mudah ke WolkAbout IoT Platform.https://github.com/Wolkabout/WolkConnect-Arduino

Skema


Proses manufaktur

  1. Arduino Spybot
  2. Pemantauan CO2 dengan Sensor K30
  3. FlickMote
  4. TV Buatan Sendiri B-Gone
  5. Jam Master
  6. Temukan Saya
  7. Arduino Power
  8. Tech-TicTacToe
  9. Arduino Quadruped
  10. Gerbang Pemantauan Suhu Tanpa Kontak