Daftar Isi:

Tampilan Waktu dan Cuaca Arduino 3-in-1: 11 Langkah
Tampilan Waktu dan Cuaca Arduino 3-in-1: 11 Langkah

Video: Tampilan Waktu dan Cuaca Arduino 3-in-1: 11 Langkah

Video: Tampilan Waktu dan Cuaca Arduino 3-in-1: 11 Langkah
Video: TUTORIAL SENSOR SUHU DHT11 ARDUINO - ARDUINO PROJECT INDONESIA - BELAJAR ARDUINO - TUTRIAL ARDUINO 2024, November
Anonim

Oleh Boomer48Ikuti Lainnya oleh penulis:

Menggunakan ATtiny85
Menggunakan ATtiny85
Menggunakan ATtiny85
Menggunakan ATtiny85
Partisi Pie Bertenaga Pi dan Alat Pemangkasan Poligon
Partisi Pie Bertenaga Pi dan Alat Pemangkasan Poligon
Partisi Pie Bertenaga Pi dan Alat Pemangkasan Poligon
Partisi Pie Bertenaga Pi dan Alat Pemangkasan Poligon
Kontrol Digital untuk Ampli Audio Manual
Kontrol Digital untuk Ampli Audio Manual
Kontrol Digital untuk Ampli Audio Manual
Kontrol Digital untuk Ampli Audio Manual

Saya suka mikrokontroler PIC dan saya suka pemrograman dalam bahasa rakitan. Faktanya, selama beberapa tahun terakhir, saya telah memposting sekitar 40 proyek di situs web saya berdasarkan kombinasi itu. Baru-baru ini saya memesan beberapa suku cadang dari salah satu vendor AS favorit saya dan saya melihat Arduino Nano, dengan kabel pemrograman, hanya seharga $1,20 lebih mahal daripada chip prosesor ATMEGA328. Jadi saya membeli beberapa dari mereka. Kemudian saya mengunduh Arduino IDE dan membersihkan memori saya tentang pemrograman 'C++'.

Proyek ini adalah gabungan dari jam yang menggunakan GPS untuk pengaturan waktu dan penerima RF yang menerjemahkan pesan cuaca dari sensor AcuRite yang umum. Hasilnya adalah tampilan waktu dan suhu skala kecil. Jam GPS dan rutinitas cuaca diatur sebagai file penyertaan terpisah sehingga mudah untuk masuk ke rutinitas utama dan mengonfigurasinya untuk melakukan fungsi jam saja atau hanya fungsi cuaca. Cukup batalkan komentar "#define" yang sesuai di bagian atas rutinitas utama jika Anda hanya menginginkan salah satu fungsi.

Jika kedua fungsi tersebut digunakan, maka garis atas LCD menampilkan waktu setempat dan garis bawah LCD menampilkan kelembapan dan suhu dalam Celcius dan Fahrenheit. Jika hanya fungsi jam yang digunakan, maka baris atas menampilkan waktu lokal dan baris bawah menampilkan UTC. Jika hanya fungsi cuaca yang digunakan, maka garis atas menampilkan sensor pertama yang diterima dan garis bawah menampilkan sensor lain yang diterima. Saya menambahkan kemampuan itu karena saya memiliki dua sensor cuaca.

Langkah 1: Sensor Cuaca

Sensor Cuaca
Sensor Cuaca
Sensor Cuaca
Sensor Cuaca
Sensor Cuaca
Sensor Cuaca

Sensor cuaca AcuRite yang digunakan di sini mengirimkan informasi suhu dan kelembaban setiap 16 detik. Di bagian belakang itu menunjukkan nomor model 000592TXR tetapi biasanya diiklankan sebagai model 06002M. Sensor ini digunakan oleh banyak model stasiun cuaca yang berbeda sehingga mudah ditemukan dan saya bisa mendapatkannya di eBay dengan harga di bawah $20. AcuRite menjual sensor yang tampak serupa untuk beberapa stasiun cuaca mereka tetapi mereka mungkin atau mungkin tidak mematuhi protokol komunikasi yang sama. Ada beberapa indikasi di web bahwa sensor suhu 00606 saja menggunakan format pesan yang sama tetapi dengan byte kelembaban yang tidak valid.

Seperti yang terlihat pada bentuk gelombang pertama yang ditunjukkan di atas, pesan cuaca dikirim secara beruntun dengan jarak 2 ms di antara pesan-pesan yang berurutan. Bentuk gelombang kedua yang ditunjukkan di atas memperluas bagian dari satu pesan untuk melihat durasi dan pola bit. Ada empat bit sinkronisasi yang tingginya sekitar 600us diikuti oleh rendah 600us. Bit data diwakili oleh 400us tinggi diikuti oleh 200us rendah (1) atau 200us tinggi diikuti oleh 400us rendah (0).

Format pesan terdiri dari 7 byte data. Dua byte pertama adalah ID sensor dan ini tidak berubah (yaitu: tidak menggunakan kode bergulir). Byte terakhir adalah checksum aditif sederhana dari enam byte pertama. Byte ketiga adalah indikator level baterai dan harus selalu 44 hex jika baterainya bagus. Byte keempat adalah kelembapan dan merupakan nilai yang tidak diskalakan antara 0 dan 99. Penting untuk diingat bahwa bit paling signifikan dari byte 4, 5, dan 6 adalah bit paritas dan bukan bagian dari pengukuran nilai-nilai. Byte 5 dan 6 adalah suhu skala (Celcius) dengan 4 bit lebih rendah dari byte 5 digabungkan dengan 7 bit lebih rendah dari byte 6 untuk membentuk nilai 11-bit. Suhu selalu direpresentasikan sebagai angka positif dan hanya menjadi negatif ketika penskalaan diterapkan. Skalanya adalah (C / 10) - 100. Pembagian dengan 10 diperlukan karena resolusi suhu dalam sepersepuluh derajat. Pengurangan diperlukan karena 100 ditambahkan oleh sensor untuk menjaga nilai yang ditransmisikan tetap positif.

Langkah 2: Penerima RF

Penerima RF
Penerima RF
Penerima RF
Penerima RF

Modul RF yang saya gunakan untuk proyek ini adalah RXB6. Ini adalah penerima super heterodyne sebagai lawan dari penerima super regeneratif yang kurang diinginkan. Jika Anda melihat modul RF murah di luar sana, Anda akan menemukan bahwa papan pemancar dan penerima sering digabungkan bersama. Sebagian besar receiver yang dibundel adalah tipe super regeneratif sehingga cenderung memiliki karakteristik kinerja yang jauh lebih rendah (termasuk jangkauan) daripada receiver super heterodyne. Kami hanya membutuhkan modul penerima untuk proyek ini karena kami akan mendapatkan sinyal dari pemancar sensor cuaca.

Langkah 3: Antena RF

Antena RF
Antena RF

RXB6 tidak dilengkapi dengan antena. Anda dapat membeli beberapa yang heliks cukup murah tetapi juga mudah untuk membuat antena Anda sendiri. Bahkan, kabel jumper papan tempat memotong roti dapat diselipkan ke pin antena modul jika Anda tidak ingin terlalu mewah. Idealnya, antena kawat lurus berukuran 1/4 panjang gelombang yang bekerja sekitar 6,8 inci. Saya awalnya melakukan hal kabel jumper dan tidak punya masalah mengambil sensor luar saya meskipun bengkel elektronik saya di ruang bawah tanah saya.

Kemungkinan lain adalah membuat antena heliks sendiri. Ada berbagai rencana untuk itu di web tetapi yang ditunjukkan pada gambar di atas adalah yang saya buat. Saya menggunakan beberapa kawat inti padat dari potongan kabel Ethernet dan melilitkannya di sekitar betis halus mata bor 5/32 inci. Biarkan insulasi menyala kecuali ujung yang disolder ke papan RF. Anda akan membutuhkan 20 putaran. Anda juga bisa menggunakan mata bor 7/32 inci dan membungkus 17 putaran sebagai gantinya. Semua ini mungkin akan berfungsi dengan baik untuk rentang yang mungkin Anda miliki untuk sensor Anda. Kunci sebenarnya adalah memiliki penerima RF yang baik untuk memulai. Sensor AcuRite juga memiliki pemancar yang cukup kuat.

Langkah 4: Protokol Komunikasi RF

Ada beberapa teknik modulasi yang berbeda untuk mentransmisikan data tetapi sensor ini menggunakan yang paling sederhana yaitu OOK (on-off-keying) atau ASK (amplitude-shift-keying). Karena kita berurusan dengan bit data 0/1 dalam contoh ini, amplitudonya penuh atau mati. Jadi, untuk tujuan kita, OOK dan ASK adalah sama karena OOK berarti pembawa RF penuh atau mati. Format pesan umumnya ditentukan oleh produsen perangkat transmisi dan mereka dapat menggunakan hampir semua kecepatan transmisi, gaya format bit apa pun, dan panjang pesan apa pun. Pita 433-MHz penuh dengan transmisi untuk hal-hal seperti smart meter, dll. Jadi, perangkat lunak perlu disetel untuk menyaring hanya format pesan yang ingin kita gunakan.

Langkah 5: Data Waktu

Data Waktu
Data Waktu

Saya menggunakan unit GPS murah untuk mendapatkan data waktu yang akurat yang akan otomatis restart setelah listrik padam. Saya memiliki beberapa unit GPS (tanpa tampilan) yang menampilkan kalimat standar NMEA tetapi unit terkecil dan termurah yang saya miliki adalah NEO-6M. Modul NEO-6M mudah dihubungkan ke Arduino karena menggunakan port serial level TTL. Satu-satunya perbedaan nyata adalah bahwa standar NMEA menetapkan baud rate serial 4800 tetapi NEO-6M default ke 9600 baud. Anda dapat menjalankan program "u-center" gratis untuk mengubah baud rate tetapi saya membiarkannya di default pabrik. Ada juga program utilitas gratis yang disebut GPSInfo (dikeluarkan oleh Globalsat) yang sangat berguna untuk melihat informasi GPS di PC. Anda dapat menghubungkan unit GPS ke kabel USB ke TTL standar untuk memeriksanya atau untuk menyetelnya menggunakan PC. Perlu diingat bahwa chip GPS pada modul benar-benar berjalan pada 3,3 volt (melalui regulator tegangan on-board) jadi jika Anda ingin terhubung ke port RXD-nya, Anda harus menurunkan level dari 5 volt. Port TXD dapat terhubung langsung ke Arduino atau PC.

Langkah 6: Zona Waktu

Menampilkan waktu GPS adalah hal yang mudah dilakukan selama Anda hanya ingin menampilkan UTC (Universal Time Coordinated). Kalimat NMEA terdiri dari karakter ASCII yang dapat langsung ditampilkan ke LCD. Porsi waktu dalam format HHMMSS. FF (jam, menit, detik, dan pecahan detik). Untuk jam kami bagian pecahan tidak berguna sehingga yang perlu kami tangani hanyalah enam karakter. Masalahnya adalah Anda kemudian perlu mengonversi ke waktu lokal Anda dan ke format AM/PM 12 jam jika Anda menginginkannya. Tetapi terkadang masalahlah yang membuat hidup menjadi menarik, jadi itulah sebenarnya bagian dari perangkat lunak itu.

Adapun zona waktu, Anda mungkin berpikir bahwa hanya akan ada 24 di antaranya dengan 12 di timur lokasi UTC (+ zona) dan 12 di barat lokasi UTC (-zona). Faktanya, ada beberapa yang eksentrik yang merupakan jam pecahan dan pasangan yang melebihi "batas" 12 jam. Jika Anda kebetulan tinggal di salah satu area itu, saya minta maaf karena perangkat lunak saya hanya mencakup 24 zona jam penuh. Ada juga sebagian dari kita yang menggunakan Waktu Musim Panas sebagian tahun tetapi itu tidak secara otomatis diperhitungkan dalam perangkat lunak. Itu akan membutuhkan tabel pencarian tanggal mendatang, kompleksitas ekstra dalam perangkat lunak, dan kebutuhan untuk memperbarui perangkat lunak jika minggu-minggu dalam setahun untuk peralihan berubah. Sebagai gantinya, perangkat keras menggunakan sakelar kontak sesaat untuk memungkinkan pengaturan zona waktu yang mudah (offset UTC).

Langkah 7: Skema

Skema
Skema

Skema ditunjukkan di atas dan termasuk koneksi untuk antarmuka LCD 4-bit 1602. Data serial dari penerima RF berada pada level logika digital sehingga terhubung langsung ke salah satu pin input data Arduino. Pin dikonfigurasi dalam perangkat lunak untuk melakukan fungsi interupsi-on-perubahan sehingga kita dapat mengukur lebar pulsa. Output GPS TXD terhubung langsung ke input Arduino RX.

Ada dua sakelar yang digunakan. Seperti disebutkan sebelumnya, sakelar kontak sesaat memungkinkan pengaturan offset UTC. Sakelar dapat ditekan kapan saja untuk masuk ke mode yang disetel. Awalnya, tampilan akan menampilkan offset UTC yang tidak valid dari "+77". Lihat bagian “Perangkat Lunak Jam” untuk petunjuk pengaturan offset UTC.

Sakelar kedua adalah sakelar hidup/mati sederhana. Pada posisi “off” waktu akan ditampilkan dalam format 12 jam (AM/PM) dan pada posisi “on” waktu akan ditampilkan dalam format 24 jam. Sakelar ini dapat diubah kapan saja untuk beralih antar format.

Jika hanya fungsi jam yang diinginkan, maka modul penerima RF tidak perlu dihubungkan. Jika hanya fungsi cuaca yang diinginkan, maka GPS dan kedua sakelar tidak perlu dihubungkan.

Langkah 8: Perangkat Lunak LCD

Saya cenderung menggunakan salah satu dari dua jenis antarmuka LCD. Salah satunya adalah antarmuka 4-bit standar dan yang lainnya adalah antarmuka 3-kawat yang menggunakan register geser. Saya merancang antarmuka itu ketika saya bekerja dengan mikrokontroler PIC kecil yang memiliki jumlah pin I/O terbatas. Saya menggunakan antarmuka 4-bit untuk proyek ini tetapi memiliki file termasuk LCD saya sendiri daripada menggunakan perpustakaan LCD Arduino generik. Itu mengurangi konsumsi memori dan kompleksitas kode dan juga memungkinkan saya untuk mengubah kode untuk proyek tertentu seperti ini.

Langkah 9: Perangkat Lunak Jam

Unit GPS mengeluarkan kalimat standar NMEA-0183 yang merupakan string ASCII yang berisi berbagai informasi. Untuk aplikasi ini saya memilih kalimat GGA untuk mendapatkan informasi waktu karena itulah kalimat yang saya gunakan untuk proyek GPS sebelumnya. Bidang informasi dalam kalimat NMEA dipisahkan dengan koma sehingga, setelah header kalimat GGA terdeteksi, perangkat lunak biasanya akan menghitung koma dan memanggil rutin yang sesuai untuk setiap bidang informasi GPS yang diinginkan. Hanya informasi waktu yang diperlukan di sini dan itu di lapangan setelah koma pertama sehingga tidak diperlukan penghitungan.

Enam digit waktu (HHMMSS) di-buffer dan kemudian diproses setelah semuanya diterima. GPS dapat menampilkan beberapa pesan yang tidak lengkap sejak awal sehingga buffering rutin memverifikasi bahwa setiap karakter adalah nilai numerik ASCII. Jika karakter buruk diterima, pesan akan dibuang. Ini juga dapat terjadi pada kesempatan langka selama operasi normal, terutama jika komunikasi port serial turun sedikit. Saya hanya melihat ini sekali dan semua yang terjadi adalah waktu berhenti sejenak dan kemudian melompat dua detik, bukan satu.

Jika perangkat lunak dikonfigurasi untuk hanya menampilkan waktu, maka baris pertama LCD akan menampilkan waktu lokal dan baris kedua akan menampilkan UTC. Untuk UTC perangkat lunak hanya mengirimkan karakter ASCII langsung ke tampilan rutin, dengan titik dua (:) disisipkan dengan tepat.

Untuk mengonversi UTC ke waktu lokal, offset UTC (zona waktu) harus diterapkan. Karena waktu UTC dari GPS dalam format ASCII, perangkat lunak mengubah karakter jam ASCII menjadi desimal dan kemudian menambahkan offset UTC. Offset UTC disimpan sebagai nilai BCD positif dengan bit tanda sehingga pertama-tama dikonversi ke nilai integer dan kemudian dinegasikan jika bit tanda disetel. Setelah nilai jam waktu lokal dihitung, tabel pencarian digunakan untuk mengubahnya menjadi BCD, dan kemudian BCD dikonversi kembali ke ASCII untuk ditampilkan. Tabel pencarian perlu menangani format UTC 24 jam serta +/- 12 zona waktu. Untuk melakukan ini, waktu UTC dari 0000 hingga 2300 menempati 24 entri tengah dalam tabel dengan 12 entri sebelum dan 12 entri setelah memperhitungkan zona waktu. Satu tabel dalam format 12 jam jadi saya juga menambahkan tabel pencarian untuk bagian AM/PM dari tampilan. Tabel lainnya dalam format 24 jam. Seperti disebutkan sebelumnya, sakelar hidup/mati memungkinkan pemilihan format 12 jam atau 24 jam.

Zona waktu diambil dari EEPROM selama inisialisasi dan ditampilkan sebentar. Jika belum diatur setidaknya sekali maka rutinitas pengaturan disebut. Rutinitas pengaturan juga dapat dipanggil kapan saja dengan menekan sakelar kontak sesaat. Rutinitas pengaturan akan menginisialisasi tampilan ke “UTC OFFSET +77”. Tekan sebentar sakelar akan mengubah nilainya menjadi "-00". Jika zona waktu positif diperlukan, tekan sebentar lagi akan mengubah nilainya menjadi "+00". Tekan lama (> 1 detik) akan memindahkan mode pengaturan ke langkah berikutnya. Pada titik ini setiap penekanan singkat akan menambah nilai waktu hingga maksimum 12. Setelah mencapai zona waktu yang diinginkan, tekan dan tahan sakelar selama lebih dari 1 detik lalu lepaskan. Perangkat lunak kemudian akan menyimpan nilai UTC di EEPROM dan secara singkat menampilkan “OFFSET SAVED”. Jika Anda membuat kesalahan saat masuk, keluar saja lalu tekan sakelar lagi untuk mengatur ulang.

NEO-6M tidak memerlukan perbaikan posisi yang baik untuk menghasilkan waktu sehingga harus mengeluarkan pesan segera setelah mendapat satu satelit. Sampai saat itu tampilan akan terbaca “NO DATA”.

Langkah 10: Perangkat Lunak Cuaca

Mikrokontroler PIC memiliki kemampuan untuk menghidupkan/mematikan timer menggunakan pulsa eksternal. Pulsa input yang sama juga dapat digunakan sebagai interupsi eksternal untuk memberi sinyal pembacaan durasi pulsa. Arduino tidak memiliki kemampuan yang tepat sehingga saya menggunakan fungsi interupsi-on-change. Di salah satu tepi pulsa pesan RF, waktu mikrodetik saat ini disimpan oleh pengendali interupsi. Di tepi yang berlawanan, waktu yang telah berlalu dihitung untuk menentukan lebar pulsa.

Perangkat lunak ini memiliki definisi "DEBUG" yang memungkinkan untuk menampilkan format data mentah dari pesan yang diterima. Ada juga definisi untuk menentukan pin input Arduino untuk aliran serial dari penerima RF. Perangkat lunak diatur untuk menghitung pengaturan register interupsi-saat-perubahan yang sesuai berdasarkan definisi ini. Perhitungan hanya bekerja untuk pin digital Arduino. Pin analog dapat digunakan sebagai gantinya tetapi itu akan membutuhkan pengkodean keras dari nilai register.

Handler interupsi menentukan apakah jumlah yang ditangkap cukup lama untuk menjadi pulsa awal. Seperti yang disebutkan sebelumnya, jarak antara beberapa pesan adalah 2 ms, jadi itulah yang dicari oleh perangkat lunak. Karena semua lalu lintas 433-MHz, penyaringan awal dalam perangkat lunak memastikan bahwa waktu yang diukur setidaknya 1,8 ms tetapi tidak lebih besar dari 2,4 ms. Setelah mulai terdeteksi, perangkat lunak mencari bit sinkronisasi (600us) dan menghitung untuk memastikan bahwa empat di antaranya diterima. Setelah tes ini lulus, perangkat lunak mencari waktu bit yang tepat dari 200us dan 400us.

Bit yang diterima dibentuk menjadi byte dan setiap byte disimpan. Setelah tujuh byte diterima, checksum pesan diverifikasi sebelum pemrosesan lebih lanjut diizinkan. Jika byte mentah akan dikeluarkan (mode debug), maka byte tersebut diubah menjadi karakter ASCII dan dikirim ke LCD. Jika output kelembaban dan suhu diinginkan, maka konversi yang sesuai dilakukan.

Dua byte data Celcius dalam pesan RF digabungkan untuk membentuk nilai 11-bit. Bagian bawah digeser ke kiri satu bit untuk menghilangkan bit paritas dan untuk menyelaraskannya dengan bit di bagian atas. Dua byte dibentuk menjadi variabel kata 16-bit dan kemudian semuanya digeser ke kanan satu bit untuk mendapatkan keselarasan bit terakhir. Variabel Word kemudian diubah menjadi variabel floating point untuk perhitungan matematika.

Satu keuntungan besar menggunakan C++ pada Arduino versus bahasa assembly pada PIC adalah menyederhanakan perhitungan matematika. Seperti disebutkan sebelumnya konversi Celcius adalah (C / 10) -100. Hasilnya diubah menjadi string dan dikirim ke LCD untuk ditampilkan. Perhitungan Fahrenheit adalah (C * 1.8) + 32. Hasilnya diubah lagi menjadi string dan dikirim ke LCD untuk ditampilkan. Dalam kedua kasus, konversi String menyertakan tanda negatif (jika sesuai) dan titik desimal. Pemeriksaan dilakukan untuk titik desimal untuk memastikan bahwa hanya satu karakter setelah desimal yang dikirim ke tampilan. Pemeriksaan itu diperlukan karena panjang string dapat berkisar antara 3 hingga 5 karakter.

Saya memiliki dua sensor AcuRite jadi saya menambahkan tanda centang di perangkat lunak untuk memastikan bahwa data untuk satu tidak menimpa data untuk yang lain jika perangkat lunak diatur untuk hanya melakukan fungsi cuaca. Sensor pertama yang diterima setelah power up ditampilkan pada baris 1 dan yang lainnya ditampilkan pada baris 2. Dengan menggunakan mode debug, saya dapat melihat ID untuk setiap sensor sehingga saya dapat melakukan pemeriksaan sederhana pada kode jika saya hanya ingin mengolah data dari salah satunya.

Perangkat lunak memantau status baterai (byte3) dan menampilkan pesan jika menunjukkan baterai lemah. Pesan ini menimpa semua data lain untuk sensor itu.

Langkah 11: Menampilkan

Menampilkan
Menampilkan
Menampilkan
Menampilkan
Menampilkan
Menampilkan

Berikut adalah beberapa contoh tampilan untuk berbagai fungsi. Saya memiliki beberapa Instructables lainnya tetapi sebagian besar proyek mikrokontroler PIC saya dapat ditemukan di situs web saya di: www.boomerrules.wordpress.com

Direkomendasikan: