Dalam tutorial ini kita akan belajar cara membuat Wireless Weather Station berbasis Arduino. Anda dapat menonton video berikut atau membaca tutorial tertulis di bawah ini.
Ringkasan
Suhu dan kelembaban luar ruangan diukur menggunakan sensor DHT22 dan data ini dikirim secara nirkabel ke unit dalam ruangan menggunakan modul transceiver NRF24L01. Pada unit indoor juga terdapat sensor DHT22 lain untuk mengukur suhu dan kelembaban dalam ruangan, serta modul DS3231 Real Time Clock yang dapat melacak waktu meskipun Arduino kehilangan daya. Semua data ini dicetak pada layar OLED 0,96”.
Diagram Sirkuit Stasiun Cuaca Nirkabel Arduino
Mari kita lihat diagram sirkuit dan bagaimana proyek ini bekerja. Perhatikan bahwa saya sudah memiliki tutorial terperinci tentang cara kerja masing-masing modul ini, jadi untuk detail lebih lanjut Anda dapat memeriksanya:Tutorial NRF24L01, Tutorial DHT22, Tutorial DS3231 .
Anda bisa mendapatkan komponen yang diperlukan untuk proyek ini dari tautan di bawah:
Modul Pemancar NRF24L01……….
Sensor DHT22…………….……………………
DS3231 Jam Waktu Nyata………………….. Amazon / Banggood / AliExpress
Arduino Nano ………………………….……..
Baik modul real time clock maupun tampilan OLED menggunakan protokol I2C untuk komunikasi dengan Arduino sehingga terhubung ke pin I2C atau pin analog nomor 4 dan 5 pada board Arduino Nano. Tepat di sebelah modul transceiver NRF24L01 terdapat kapasitor untuk menjaga agar catu daya lebih stabil. Ada juga resistor pull-up yang terhubung ke pin data DHT22 agar sensor bekerja dengan baik.
Untuk catu daya saya menggunakan adaptor daya 12V DC untuk unit dalam ruangan, dan di sisi lain, untuk memberi daya pada unit luar ruangan saya menggunakan dua baterai Li-on yang menghasilkan sekitar 7,5V. Dengan konfigurasi ini unit outdoor dapat berjalan sekitar 10 hari sebelum baterai habis, karena kami mengirimkan data secara berkala dan sementara itu kami menempatkan Arduino ke mode tidur, di mana konsumsi daya hanya sekitar 7mA.
PCB desain khusus
Untuk menjaga agar komponen elektronik tetap teratur, sesuai dengan diagram sirkuit saya merancang PCB khusus menggunakan perangkat lunak desain sirkuit online gratis EasyEDA. Kami dapat mencatat bahwa PCB yang sama dapat digunakan untuk unit dalam dan luar ruangan, hanya papan Arduino yang harus diprogram secara berbeda.
Setelah kita menyelesaikan desain di sini, kita cukup mengekspor file Gerber yang digunakan untuk pembuatan PCB. Anda dapat memeriksa file proyek EasyEDA stasiun cuaca nirkabel Arduino di sini.
Kemudian kita bisa memesan PCB kita dari JLCPCB, yang sebenarnya adalah sponsor dari video ini.
Di sini kita cukup drag dan drop file Gerber dan setelah diunggah kita dapat meninjau PCB kita di penampil Gerber. Jika semuanya baik-baik saja maka kita dapat melanjutkan, memilih properti yang kita inginkan untuk PCB kita, dan kemudian kita dapat memesan PCB dengan harga yang wajar. Perhatikan bahwa jika ini adalah pesanan pertama Anda dari JLCPCB, Anda bisa mendapatkan hingga 10 PCB hanya dengan $2.
Namun demikian, setelah beberapa hari PCB telah tiba. Kualitas PCB sangat bagus dan semuanya sama persis dengan desainnya.
Saya mulai merakit komponen elektronik dari proyek ini dengan menyolder pin header ke PCB. Dengan cara ini kita dapat dengan mudah menghubungkan dan memutuskan komponen saat dibutuhkan.
Kemudian saya juga memasukkan dan menyolder kapasitor dan resistor pull-up. Setelah langkah ini selesai, sekarang kita cukup memasang komponen ke pin header dari PCB.
Selanjutnya, saya melanjutkan dengan membuat kasus untuk proyek tersebut. Untuk itu saya menggunakan papan MDF tick 8mm dan menggunakan gergaji bundar, saya memotong semua bagian sesuai ukuran.
Untuk mendapatkan pengukuran suhu dan kelembaban yang akurat, sisi casing harus memungkinkan udara masuk ke casing. Jadi, dengan menggunakan bor dan serak, saya membuat beberapa slot di panel samping pada unit indoor dan outdoor.
Saya juga membuat slot untuk layar OLED di panel depan, serta memotong aluminium kecil-kecilan sesuai ukuran yang nantinya akan saya pasang di panel depan sebagai hiasan.
Untuk merakit casing, saya menggunakan lem kayu dan beberapa klem, serta beberapa sekrup.
Saya melukis kasing menggunakan cat semprot. Saya menggunakan cat putih untuk unit outdoor dan cat hitam untuk unit indoor. Setelah cat mengering, saya cukup memasukkan PCB ke dalam casing.
Di bagian belakang unit indoor saya memasukkan colokan listrik dan sakelar daya, dan di unit outdoor saya menggunakan kabel jumper sederhana sebagai sakelar daya.
Dan hanya itu, stasiun cuaca nirkabel Arduino kami sekarang berfungsi, tetapi yang tersisa di video ini adalah melihat cara kerja program.
Kode Stasiun Cuaca Nirkabel Arduino
Kode unit outdoor stasiun cuaca Arduino:
/*
Arduino Wireless Communication Tutorial
Outdoor unit - Transmitter
by Dejan Nedelkovski, www.HowToMechatronics.com
Libraries:
NRF24L01 - TMRh20/RF24, https://github.com/tmrh20/RF24/
DHT22 - DHTlib, https://github.com/RobTillaart/Arduino/tree/master/libraries/DHTlib
LowPower - https://github.com/rocketscream/Low-Power
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <dht.h>
#include <LowPower.h>
#define dataPin 8 // DHT22 data pin
dht DHT; // Creates a DHT object
RF24 radio(10, 9); // CE, CSN
const byte address[6] = "00001";
char thChar[32] = "";
String thString = "";
void setup() {
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
int readData = DHT.read22(dataPin); // Reads the data from the sensor
int t = DHT.temperature; // Gets the values of the temperature
int h = DHT.humidity; // Gets the values of the humidity
thString = String(t) + String(h);
thString.toCharArray(thChar, 12);
// Sent the data wirelessly to the indoor unit
for (int i = 0; i <= 3; i++) { // Send the data 3 times
radio.write(&thChar, sizeof(thChar));
delay(50);
}
// Sleep for 2 minutes, 15*8 = 120s
for (int sleepCounter = 15; sleepCounter > 0; sleepCounter--)
{
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
}Code language: Arduino (arduino)
Deskripsi: Unit luar ruangan adalah pemancar komunikasi nirkabel, jadi di sini pertama-tama kita perlu menyertakan perpustakaan RF24, perpustakaan DHT, serta perpustakaan LowPower yang digunakan untuk menempatkan Arduino ke mode tidur.
Setelah menentukan instance mereka, pin yang menghubungkan modul dan beberapa variabel, di bagian setup kita perlu menginisialisasi alamat komunikasi nirkabel. Kemudian pada bagian loop, pertama kita membaca data dari sensor DHT22 atau itulah suhu dan kelembapannya. Awalnya nilai-nilai ini adalah bilangan bulat dan dipisahkan, jadi saya mengubahnya menjadi variabel String tunggal, memasukkannya ke dalam array karakter, dan menggunakan fungsi radio.write(), mengirimkan data ini ke unit dalam-ruang. Menggunakan for loop, kami mengirim data sebanyak 3 kali untuk memastikan penerima akan mendapatkan data jika pengontrol sedang sibuk pada saat pengiriman.
Pada akhirnya kami menempatkan Arduino ke mode tidur selama jangka waktu tertentu untuk meminimalkan konsumsi daya.
Deskripsi: Di sisi lain, di unit dalam ruangan atau penerima, kita perlu menyertakan dua perpustakaan lagi, satu untuk modul jam waktu nyata DS3231 dan satu lagi untuk tampilan OLED, perpustakaan U8G2. Dengan cara yang sama seperti sebelumnya, kita perlu mendefinisikan instance, pin dan beberapa variabel yang dibutuhkan untuk program di bawah ini. Juga di sini kita perlu mendefinisikan ikon suhu dan kelembaban sebagai bitmap.
Untuk tujuan ini, kita dapat menggunakan GIMP, editor gambar open source, yang melaluinya kita dapat menggambar apa saja dan kemudian mengekspornya sebagai bitmap(.xbm).
Kemudian kita dapat membuka file ini menggunakan notepad dan dari sana kita dapat menyalin bitmap ke dalam kode Arduino.
Perhatikan bahwa di sini kita dapat mendefinisikan bitmap sebagai konstan menggunakan pengubah variabel PROGMEM, dan dengan cara itu bitmap akan disimpan dalam memori flash, bukan SRAM papan Arduino.
static const unsigned char Temperature_20Icon_bits[] U8X8_PROGMEM // Save in the Flash memory
static unsigned char Temperature_20Icon_bits[] // Save in the SRAM
Di bagian penyiapan, kita perlu menginisialisasi komunikasi nirkabel serta menginisialisasi tampilan OLED dan modul jam waktu nyata.
Kemudian di bagian loop kami terus memeriksa apakah ada data masuk yang tersedia untuk dibaca melalui modul NRF24L01. Jika benar, menggunakan fungsi radio.read() kita membacanya, dan menyimpan dua karakter pertama ke dalam variabel String suhu, dan dua karakter berikutnya ke dalam variabel String kelembaban.
Kemudian kita menggunakan fungsi milis() untuk menampilkan berbagai data pada tampilan pada interval yang ditentukan dengan variabel interval yang saya atur menjadi 3 detik. Kami menggunakan fungsi millis() karena dengan cara ini sisa kode dapat dieksekusi berulang kali, sedangkan jika kami menggunakan fungsi delay(), program menunggu periode itu sehingga dengan cara itu kami mungkin akan kehilangan data yang masuk dari unit luar ruangan.
Selanjutnya, dengan menggunakan fungsi firstPage() dan nextPage() dari library U8G2, kami mencetak lima layar berbeda yang ditentukan dengan fungsi kustom.
Fungsi kustom drawDate() mendapatkan informasi tanggal dan waktu dari modul jam waktu nyata dan mencetaknya di layar dengan tepat. Fungsi drawInTemperature() membaca suhu dalam ruangan dan mencetaknya dengan tepat di layar. Sebenarnya, metode yang sama digunakan untuk mencetak semua layar di layar.
Jadi itu saja, saya harap Anda menikmati proyek Arduino ini dan belajar sesuatu yang baru. Jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar di bawah.