Proses manufaktur
| × | 1 | ||||
| × | 1 |
|
| ||||
|
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:
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.
#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; }}
[ { "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 } ] }]
Proses manufaktur
Komponen dan persediaan Arduino Yun Shield × 1 Arduino Leonardo × 1 Arduino Yun × 1 Arduino MKR GSM 1400 × 1 Arduino MKR WAN 1300 × 1 Seed Grove - Sensor Gas(MQ2) × 1 Seeed Grove - Sensor kualitas udara v1.3 × 1 Perangk
Komponen dan persediaan Arduino MKR WiFi 1010 × 1 Arduino MKR ENV Shield × 1 Aplikasi dan layanan online Arduino IoT Cloud Tentang proyek ini Ceritanya Dengan membuat proyek ini, Anda akan belajar cara membaca data dari berbagai sensor yang ters
Komponen dan persediaan Arduino UNO × 1 PHPoC Shield untuk Arduino × 1 Sensor magnet × 1 Tentang proyek ini Jika Anda seorang pemula, Anda dapat mempelajari tentang wifi dan sensor di Arduino - tutorial Wifi dan Arduino - Sensor Pintu. Dalam tutorial ini, s
Komponen dan persediaan Arduino UNO × 1 Modul GPRS/GPS A7 × 1 Sensor Kualitas Air × 1 Alat dan mesin yang diperlukan Besi solder (generik) Aplikasi dan layanan online Microsoft Azure Arduino IDE Tentang proyek ini