Stasiun Cuaca IoT Portabel dengan Arduino Nano 33 IoT
Komponen dan Perlengkapan
- Arduino Nano 33 IoT: 1 buah
- Sensor cuaca BME: 1 buah
- Layar OLED 0.96 inci - 128x64: 1 buah
- Kotak Plastik 3.9" x 2.7": 1 buah
- Kabel Micro USB: 1 buah
- Kabel Jumper Breadboard Male to Female: 1 set
- Charger Dinding USB: 1 buah
Alat dan Mesin yang Diperlukan
- Pistol lem panas (generik): 1 buah
Aplikasi dan layanan online:
Tentang Proyek Ini
Ada banyak aplikasi di luar sana yang memungkinkan Anda menghubungkan smartphone Anda ke Internet of Things. Saya telah mencoba banyaknya dan biasanya kecewa. Tidak dengan Blynk! Ini sangat fleksibel, memiliki antarmuka pengguna yang indah, bekerja dengan semua jenis platform IoT, dan berjalan di Android dan iPhone. Ini juga gratis untuk hobi! Jadi ini adalah proyek IoT yang relatif sederhana yang memungkinkan saya untuk menjelajahi penggunaan Blynk.
Hardware
Hardware untuk proyek ini cukup sederhana. Kami menggunakan Arduino Nano 33 IoT yang menangani WiFi, papan sensor BME280 dengan suhu, kelembaban, dan tekanan barometrik dalam satu unit, dan layar OLED 1 inci. Semuanya berjalan baik pada 3,3 volt. Layar jelas opsional - tujuannya adalah untuk menampilkan stasiun cuaca di ponsel Anda. Namun, ini membuatnya jauh lebih mudah untuk mendapatkan semuanya berjalan pada layar OLED terlebih dahulu, sebelum berurusan dengan Blynk dan ponsel Anda.
Skematik di bawah ini menunjukkan bagaimana hardware terhubung. Keduanya, sensor dan layar, berinterface dengan I2C. Dalam teori, satu I2C dapat mendukung banyak perangkat, tetapi pustaka sensor dan layar mengalami beberapa konflik, jadi akhirnya saya menggunakan dua port I2C yang berbeda. Sensor menggunakan port I2C default pada pin analog 4 dan 5. Layar menggunakan port I2C sekunder yang diatur pada pin digital 4 dan 5. (Dan ya, mereka terbalik - SDA adalah pin digital 5))
Hardware dikemas dalam kotak plastik kecil dengan depan transparan, sehingga layar dapat dilihat. Ini plastik, karena perlu transparan terhadap RF untuk WiFi. Ini perlu relatif tahan cuaca, tetapi sensor terekspos ke cuaca luar melalui lubang 1/2 inci di bawah. Sensor dilekatkan sehingga berada tepat di dalam lubang itu. Saya melekatkan semuanya di dalam kotak dengan lem panas, tetapi Anda mungkin ingin menggunakan epoksi jika berencana meletakkannya di luar pada panas musim panas.
Daya disuplai melalui kabel USB. Dengan cara ini, dapat diprogram atau diberi daya oleh satu kabel yang keluar dari kotak. Kabel tersebut dapat pergi ke komputer Anda saat pemrograman atau ke sumber daya USB colokan saat digunakan sebagai stasiun cuaca.
Software
Software yang berjalan pada Arduino hanyalah sedikit lebih dari gabungan contoh pustaka untuk sensor, layar, dan Blynk. Pustaka yang terlibat adalah Adafruit_BME280_Library untuk sensor, pustaka ss_oled untuk layar, dan pustaka Blynk untuk Blynk. Ketiganya dapat diunduh langsung dari manajer pustaka Arduino. Anda mungkin ingin bereksperimen dengan masing-masing pustaka ini secara terpisah untuk pemahaman yang lebih baik tentang masing-masing.
Blynk memiliki banyak contoh cara mengonfigurasi hardware untuk berinterface dengannya: https://examples.blynk.cc/ Sayangnya, tidak mencantumkan Nano 33 IoT sebagai salah satu Arduino yang didukungnya. Namun, Blynk mendukung WiFiNINA, yang digunakan oleh Nano 33 IoT dan beberapa prosesor Arduino lainnya. Jadi menambahkan dua include ini memecahkan masalah tersebut: #include<WiFiNINA.h> dan #include<BlynkSimpleWiFiNINA.h
Penambahan lain yang Anda lihat dalam kode saya adalah: #include <avr/dtostrf.h> Ini diperlukan untuk mengonversi angka yang keluar dari sensor menjadi string yang sesuai untuk ditampilkan pada layar OLED. Satu hal yang sedikit memberiku kesulitan adalah Blynk senang menampilkan data baik dikirim sebagai string atau angka. Pada awalnya saya mengirim ke Blynk string yang sama yang saya kirim ke OLED. Itu bekerja baik untuk menampilkan angka, tetapi gagal total saat saya menambahkan grafik. Untuk membuat grafik bekerja, Blynk jelas membutuhkan angka sebenarnya.
Catatan - tekanan barometrik biasanya dilaporkan dikoreksi ke permukaan laut. Pada elevasi yang lebih tinggi, tekanan barometrik jelas menurun, jadi untuk mengoreksi nilai dari sensor ke nilai setara di permukaan laut, Anda harus menambahkan nilai sekitar 1 inci Hg untuk setiap 1000 kaki elevasi. Dalam kode saya yang dilampirkan, Anda akan melihat saya menambahkan 1,3 untuk mengompensasi elevasi saya sendiri sebesar 1300 kaki di atas permukaan laut. Anda akan ingin mengubah nilai ini agar cocok dengan elevasi Anda sendiri. 1 inci Hg per 1000 kaki hanyalah perkiraan kasar. Jika Anda ingin koreksi yang presisi, ada tabel online yang akan memberikan koreksi tepat untuk elevasi Anda.
Stasiun Cuaca tanpa Blynk
Pada titik ini, Anda dapat menyiapkan hardware dan menggunakan perangkat lunak saya yang dilampirkan untuk menampilkan data cuaca pada layar OLED. Cukup beri komentar pada baris Blynk.begin() di Setup untuk membuat stasiun cuaca berjalan sendiri. (Jika Anda tidak memberi komentar pada Blynk.begin(), tanpa koneksi yang valid ke Blynk, skets akan berhenti atau macet pada titik itu.) Di bagian selanjutnya, kita akan membicarakan Blynk, cara menyiapkannya baik pada skets Arduino maupun pada ponsel untuk menampilkan stasiun cuaca di ponsel.
Blynk
Blynk mudah diinstal di iPhone atau Android dan datang dengan dokumentasi rinci: https://docs.blynk.cc/ Namun ada begitu banyak informasi di sana dan begitu banyak opsi sehingga saya sedikit bingung pada awalnya, jadi saya akan memberikan versi saya sendiri tentang cara memulai dengan Blynk.
Saya menggunakan Blynk dengan iPhone, tetapi saya berpikir pengalaman cukup serupa dengan Android sehingga Anda dapat mengikuti instruksi saya dengan salah satunya. Setelah Anda memiliki aplikasi, Anda perlu membuat akun. Dari sana, di dalam aplikasi, Anda membuat proyek baru. Proyek Anda disediakan dengan kode autentikasi yang digunakan untuk menghubungkan hardware Anda dengan proyek Anda. Pekerjaan pertama Anda adalah menghubungkan hardware Anda melalui WiFi ke proyek Blynk Anda. Anda dapat mencapai ini dan mengujinya menggunakan skets/program default Blynk yang disebut Blynk Blink di examples.blynk.cc, yang memungkinkan Anda menyalakan dan mematikan LED papan pada Nano 33 IoT Anda. Saran saya adalah Anda mencoba ini dan mendapatkan yang berfungsi sebelum mencoba membuat stasiun cuaca bekerja dengan Blynk.
Kita sudah membicarakan sedikit tentang mengonfigurasi perangkat lunak kami agar Nano 33 IoT kami dapat bekerja dengan Blynk. Jika Anda membuka examples.blynk.cc, itu default ke papan ESP8266. Temukan #include <ESP8266WiFi.h> dan #include <BlynkSimpleEsp8266.h> dan ganti dengan #include<WiFiNINA.h> dan #include<BlynkSimpleWiFiNINA.h untuk papan Nano 33 IoT kami.
Selain menambahkan dukungan WiFiNINA untuk Nano 33 IoT, seperti yang sudah kita bicarakan, Anda perlu menambahkan kredensial WiFi Anda dan kode autentikasi proyek Blynk Anda. Kami akan menjelaskan cara menyalakan dan mematikan LED dalam sebentar, tetapi pertama, mari kita periksa koneksi. Dengan skets Blynk Blink yang dikonfigurasi dengan benar dan berjalan, buka Serial Monitor Arduino, dan Anda seharusnya dapat melihat koneksi dibuat ke server cloud Blynk. Pada titik ini, kita dapat menyisihkan hardware kami dan bekerja dengan aplikasi Blynk di ponsel.
Saya mengakui saya merasa aplikasi Blynk sedikit membingungkan. Ikon di kiri atas memungkinkan Anda memilih antara proyek dan juga keluar dari akun Anda. Yang di kanan atas memungkinkan Anda masuk dan keluar dari mode Edit Project. Apa yang dilakukan yang di tengah tergantung pada di mana Anda berada.
Untuk mendapatkan kontrol atas LED papan kami, kita perlu memasuki mode Edit di aplikasi. Anda kemudian akan melihat layar kosong. Jika Anda geser ke kiri, itu akan geser untuk mengungkapkan kotak alat widget. Pilih sebuah tombol dengan mengkliknya dan itu sekarang akan ada di layar utama. Klik di sana dan itu akan terbuka untuk konfigurasi. Pindahkan dari mode push ke mode switch. Gunakan pemilihan pin untuk memilih LED papan - pin digital 13 pada Nano 33 IoT kami. Sekarang klik OK, dan tekan ikon kanan atas untuk keluar dari mode Edit. Tombol Anda sekarang harus mengontrol LED.
Stasiun Cuaca dengan Blynk
Kami sekarang siap untuk menghubungkan stasiun cuaca kami ke proyek Blynk kami. Buka perangkat lunak saya yang dilampirkan, hilangkan komentar pada baris Blynk.begin() di Setup, tambahkan kode autentikasi proyek Anda dan kredensial WiFi, dan unggah ke Arduino.
Buka Blynk di ponsel Anda. Jika Anda telah mengikuti tutorial ini, tombol Anda masih ada, dan seharusnya masih dapat menyalakan dan mematikan LED papan. Pergi ke mode edit, klik tombol untuk mengonfigurasinya, dan hapus dengan Delete di bagian bawah. Sekarang pergi ke kotak alat dan pilih Labeled Value. Ini ada di bawah daftar di bawah Displays. Kembali ke halaman tampilan, klik tampilan Labeled Value untuk mengonfigurasinya. Klik pin, lalu pilih Virtual pin V3. Kami akan menjelaskan virtual pin di paragraf berikutnya. Sekarang untuk label, di mana tertulis "e.g. Temp" ketik "Temp /pin.#/ deg.F". .# memberitahu aplikasi untuk menampilkan satu tempat di belakang titik desimal. Pilih ukuran teks besar, dan biarkan Refresh Interval pada Push dan Text Color pada Green. Sekarang klik OK. Labeled Value Anda sekarang hampir siap untuk menampilkan suhu, tetapi terlalu sempit. Pilihnya perlahan - perlahan sehingga tidak memasuki mode konfigurasi lagi. Garis batas label akan menyala. Ini sekarang dapat diperlebar untuk menampilkan seluruh baris. Ini juga dapat dipindahkan, meskipun kita tidak akan melakukan itu di sini. Perlebarnya sekitar 3/4 layar. Kemudian keluar dari mode Edit dan Anda seharusnya melihat suhu ditampilkan di ponsel Anda.
Sebelum kita selesai mengonfigurasi Blynk, layak untuk menjelaskan beberapa hal yang baru saja kita lihat dalam menyiapkan tampilan suhu. Blynk menggunakan ide yang cukup unik yang disebut virtual pin. Widget nilai tampilan dapat diatur untuk membaca pin analog pada prosesor kita, atau diatur untuk membaca apakah pin digital tinggi atau rendah. Namun lebih sering tidak, kita ingin menampilkan isi variabel. Kami melakukannya dengan memberikan variabel itu nomor virtual pin, dan dari saat itu, aplikasi Blynk akan mereferensi variabel itu dengan nomor virtual pin-nya. Jadi dalam perangkat lunak saya, Anda akan melihat tempat di mana saya menetapkan suhu dalam Fahrenheit ke virtual pin V3.
Ide Blynk lain yang layak untuk disebutkan segera adalah Refresh Interval yang kami biarkan dalam mode Push. Itu berarti skets Arduino mendorong data keluar, dalam hal ini memperbarui suhu, kelembaban, dan tekanan barometrik sekali per menit. Namun, Blynk juga mendukung metode Pull, di mana aplikasi Blynk menetapkan interval dan menginterogasi hardware untuk data baru.
Jadi sekarang mari kita selesai menampilkan stasiun cuaca kami di Blynk. Anda akan membutuhkan dua tampilan Labeled Value lagi, satu untuk Kelembaban dalam % (Virtual pin V4) dan satu untuk Tekanan dalam " in. HG" atau inci merkuri (Virtual pin V5). Agar terlihat seperti milik saya, Anda akan ingin kelembaban dalam warna emas dan tekanan dalam warna merah. Untuk kelembaban, saya menunjukkan satu tempat di belakang titik desimal; untuk tekanan, saya menunjukkan dua tempat di belakang titik desimal.
Jika Anda sekarang memiliki tiga tampilan Labeled Value yang menunjukkan suhu, kelembaban, dan tekanan barometrik, Anda dapat menambahkan grafik dari ketiganya. Ini dicapai dengan penambahan widget SuperChart. Pertama, lebarkan ke bawah sehingga mengisi sisa layar. Kemudian klik pada itu untuk mengonfigurasi. Saya menyalakan Show x axis values dan saya memilih resolusi live, 1 jam, 6 jam, 1 hari, 1 minggu, 1 bulan, dan 3 bulan. Kami membutuhkan tiga data stream - satu untuk setiap variabel kami. Untuk mengonfigurasi setiap data stream, klik ikon di kanannya. Kami perlu lagi memilih virtual pin untuk masing-masing. Untuk skala sumbu y, pilih height. Kemudian untuk suhu, setel height ke 67 - 100. Untuk kelembaban, setel height ke 34 - 66. Untuk tekanan, setel height ke 0 - 33. Setel warna agar cocok dengan nilai yang ditandai. Nyalakan Show Y axis. Itu sudah cukup. Keluar dari mode Edit dan tampilan ponsel Anda seharusnya terlihat seperti milik saya. Membutuhkan waktu sedikit untuk grafik memulai. Untuk hasil cepat, lihat live atau resolusi 1 jam.
Satu fitur Blynk lagi yang mungkin Anda ingin ketahui adalah berbagi proyek Blynk selesai Anda dengan ponsel lain, sehingga lebih dari satu ponsel dapat melihat stasiun cuaca. Untuk memulai berbagi, letakkan proyek Anda dalam mode Edit, dan klik ikon tengah atas untuk Project Settings. Nyalakan Sharing, dan kemudian buat tautan. Ini akan memberi Anda kode QR yang dapat Anda kirim melalui email atau bagikan dengan cara lain. Pengguna baru membutuhkan aplikasi Blynk tetapi tidak memerlukan akun di Blynk. Aplikasi pengguna yang tidak terdaftar memiliki tautan untuk memuat kode QR dari proyek Blynk orang lain. Itu sudah cukup.
Ini adalah pengenalan yang cukup terbatas tentang Blynk, tetapi seharusnya memberi Anda tempat yang baik untuk memulai. Saya menyebutkan sebelumnya bahwa Blynk gratis - nah, hampir gratis. Keduanya, widget dan sharing, menggunakan poin yang disebut Blynk sebagai energi. Saya pikir Anda mendapatkan 2500 poin gratis untuk memulai. Itu lebih dari cukup untuk melakukan proyek ini secara gratis. Namun, berbaginya atau menambahkannya mungkin menyebabkan Anda kehabisan energi Blynk. Saya menghabiskan $6 untuk mendapatkan 5000 poin tambahan. Anda mungkin perlu menghabiskan beberapa dolar untuk bahan bakar Blynk jika Anda terlibat dalam melakukan proyek lain dengan Blynk.
Kode
Tiny Internet Weather Station
/* This sketch is for the Arduino Nano 33 IoT It uses a BME280 sensor board It uses a 0.96 inch 128 x 64 OLED display It connects through WiFi to the Blynk cloud server for display of weather data on a smartphone */ #include <Wire.h> #include <SPI.h> #include <Adafruit_BME280.h> // BME280 library #include <avr/dtostrf.h> // used to convert weather numbers to strings for display on OLED #include <ss_oled.h> // OLED library // Next two includes required to make Nano 33 IoT work with Blynk #include <WiFiNINA.h> #include <BlynkSimpleWiFiNINA.h> char auth[] = "YourBlynkProjectCode"; char ssid[] = "YourWifiID"; char pass[] = "YourWiFiPassword"; Adafruit_BME280 bme; // use I2C interface Adafruit_Sensor *bme_temp = bme.getTemperatureSensor(); Adafruit_Sensor *bme_pressure = bme.getPressureSensor(); Adafruit_Sensor *bme_humidity = bme.getHumiditySensor(); #define SDA_PIN 5 #define SCL_PIN 4 #define RESET_PIN -1 #define OLED_ADDR -1 #define FLIP180 0 #define INVERT 0 #define USE_HW_I2C 0 #define MY_OLED OLED_128x64 #define OLED_WIDTH 128 #define OLED_HEIGHT 64 SSOLED ssoled; // instance of OLED BlynkTimer timer; // instance of Blynk timer void setup() { if (!bme.begin(0x76)) { // wait until sensor is detected while (1) delay(10); } bme_temp->printSensorDetails(); bme_pressure->printSensorDetails(); bme_humidity->printSensorDetails(); oledInit(&ssoled, MY_OLED, OLED_ADDR, FLIP180, INVERT, USE_HW_I2C, SDA_PIN, SCL_PIN, RESET_PIN, 400000L); oledFill(&ssoled, 0x0, 1); Blynk.begin(auth, ssid, pass); // comment this line out to operate weather station without Blynk timer.setInterval(60000L, myupdate); // runs myupdate once per minute myupdate(); // run an initial update of display and data to Blynk because main loop waits one minute } void loop() { Blynk.run(); // Blynk prefers to run by itself in the main loop. timer.run(); // Everything else is handled through Blynk timer } // this routine is called by the Blynk timer to update both the OLED display and push data to Blynk void myupdate(){ sensors_event_t temp_event, pressure_event, humidity_event; bme_temp->getEvent(&temp_event); bme_pressure->getEvent(&pressure_event); bme_humidity->getEvent(&humidity_event); float ctemp = temp_event.temperature; // get temp in centigrade float ftemp = 32 + (9*ctemp)/5; // convert temp to fahrenheit float hum = humidity_event.relative_humidity; // get relative humidity float ppress = pressure_event.pressure; // get pressure in mm float mpress = 1.3 + ppress/33.8939; // convert to inch Hg and add 1.3 to match actual locally reported barometric // pressure. You may want to remove the 1.3 and/or add your own adjustment. char mytemp[8]; dtostrf(ftemp, 6, 2, mytemp); // convert temp to a string char myhum[8]; dtostrf(hum, 6, 2, myhum); // convert humidity to a string char mypress[8]; dtostrf(mpress, 6, 2, mypress); // convert pressure to a string // update OLED display oledWriteString(&ssoled, 0,2,1,(char *)"Weather Station", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,2,3,(char *)"Temp = ", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,50,3,(char *)mytemp, FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,105,3,(char *)"F", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,2,5,(char *)"Humid=", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,50,5,(char *)myhum, FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,105,5,(char *)"%", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,2,7,(char *)"Press=", FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,50,7,(char *)mypress, FONT_NORMAL, 0, 1); oledWriteString(&ssoled, 0,105,7,(char *)"in", FONT_NORMAL, 0, 1); // push new weather data to Blynk Blynk.virtualWrite(V3, ftemp); Blynk.virtualWrite(V4, hum); Blynk.virtualWrite(V5, mpress); }
Skematik
Gambar skematik tersedia di bagian bawah proyek.