Isi kandungan:

Paparan Waktu dan Cuaca Arduino 3-dalam-1: 11 Langkah
Paparan Waktu dan Cuaca Arduino 3-dalam-1: 11 Langkah

Video: Paparan Waktu dan Cuaca Arduino 3-dalam-1: 11 Langkah

Video: Paparan Waktu dan Cuaca Arduino 3-dalam-1: 11 Langkah
Video: Fungsi Arduino Millis dijelaskan dengan 3 contoh 2024, November
Anonim

Oleh Boomer48Mengikuti Lagi oleh pengarang:

Menggunakan ATtiny85
Menggunakan ATtiny85
Menggunakan ATtiny85
Menggunakan ATtiny85
Alat Pemisahan Pie Kuasa dan Alat Pemangkasan Poligon
Alat Pemisahan Pie Kuasa dan Alat Pemangkasan Poligon
Alat Pemisahan Pie dan Alat Pemangkasan Poligon
Alat Pemisahan Pie dan Alat Pemangkasan Poligon
Kawalan Digital untuk Amp Audio Manual
Kawalan Digital untuk Amp Audio Manual
Kawalan Digital untuk Amp Audio Manual
Kawalan Digital untuk Amp Audio Manual

Saya suka mikrokontroler PIC dan saya suka pengaturcaraan dalam bahasa pemasangan. Sebenarnya, sejak beberapa tahun kebelakangan ini, saya telah menyiarkan sekitar 40 projek di laman web saya berdasarkan gabungan tersebut. Baru-baru ini saya memesan beberapa bahagian dari salah satu vendor AS kegemaran saya dan saya melihat Arduino Nano, dengan kabel pengaturcaraan, dengan harga hanya $ 1.20 lebih banyak daripada cip pemproses ATMEGA328 yang kosong. Oleh itu, saya membeli beberapa daripadanya. Kemudian saya memuat turun Arduino IDE dan membersihkan ingatan saya mengenai pengaturcaraan ‘C ++’.

Projek ini merupakan masukan jam yang menggunakan GPS untuk masa dan penerima RF yang menyahkod mesej cuaca dari sensor AcuRite biasa. Hasilnya adalah paparan waktu dan suhu berskala kecil. Jam GPS dan rutin cuaca disiapkan sebagai fail berasingan sehingga mudah untuk masuk ke rutin utama dan mengkonfigurasinya agar hanya berfungsi fungsi jam atau hanya fungsi cuaca. Cukup melepaskan "#define" yang sesuai di bahagian atas rutin utama jika anda hanya menginginkan salah satu fungsinya.

Sekiranya kedua-dua fungsi tersebut digunakan, maka garis atas LCD memaparkan waktu tempatan dan garis bawah LCD memaparkan kelembapan dan suhu di kedua-dua Celsius dan Fahrenheit. Sekiranya hanya fungsi jam digunakan, maka garis atas memaparkan waktu tempatan dan garis bawah memaparkan UTC. Sekiranya hanya fungsi cuaca yang digunakan, barisan atas memaparkan sensor pertama yang diterima dan garis bawah memaparkan sensor lain yang diterima. Saya menambah kemampuan itu kerana saya mempunyai 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 menghantar maklumat suhu dan kelembapan setiap 16 saat. Di bahagian belakang menunjukkan nombor model 000592TXR tetapi biasanya diiklankan sebagai model 06002M. Sensor ini digunakan oleh banyak model stesen cuaca yang berbeza sehingga senang dicari dan saya dapat menggunakannya di eBay dengan harga di bawah $ 20. AcuRite menjual sensor yang serupa untuk beberapa stesen cuaca mereka tetapi mereka mungkin atau mungkin tidak mematuhi protokol komunikasi yang sama. Terdapat beberapa petunjuk di web bahawa sensor suhu hanya 00606 menggunakan format mesej yang sama tetapi dengan bait kelembapan yang tidak sah.

Seperti yang dilihat dalam bentuk gelombang pertama yang ditunjukkan di atas, mesej cuaca dihantar dengan cepat dengan jurang 2ms antara mesej berturut-turut. Bentuk gelombang kedua yang ditunjukkan di atas mengembangkan sebahagian daripada satu mesej untuk melihat jangka masa dan corak bit. Terdapat empat bit penyegerakan yang tinggi sekitar 600us diikuti rendah 600us. Bit data diwakili oleh ketinggian 400us diikuti oleh rendah 200us (1) atau tinggi 200us diikuti oleh rendah 400us (0).

Format mesej terdiri daripada 7 bait data. Dua bait pertama adalah ID sensor dan ini tidak berubah (iaitu: ia tidak menggunakan kod bergolek). Byte terakhir adalah checksum aditif sederhana dari enam bait pertama. Byte ketiga adalah penunjuk tahap bateri dan semestinya 44 hex jika baterinya baik. Byte keempat adalah kelembapan dan nilai tidak berskala antara 0 dan 99. Penting untuk diingat bahawa bit byte 4, 5, dan 6 yang paling penting adalah bit pariti dan bukan merupakan sebahagian daripada pengukuran nilai. Bytes 5 dan 6 adalah suhu berskala (Celsius) dengan 4 bit bait 5 yang lebih rendah digabungkan dengan bait 7 bit yang lebih rendah 6 untuk membentuk nilai 11-bit. Suhu selalu ditunjukkan sebagai nombor positif dan hanya menjadi negatif apabila penskalaan diterapkan. Penskalaannya adalah (C / 10) - 100. Pembahagi dengan 10 diperlukan kerana resolusi suhu berada dalam sepersepuluh darjah. Pengurangan diperlukan kerana 100 ditambahkan oleh sensor untuk memastikan nilai yang dihantar positif.

Langkah 2: Penerima RF

Penerima RF
Penerima RF
Penerima RF
Penerima RF

Modul RF yang saya gunakan untuk projek ini adalah RXB6. Ia adalah penerima super heterodyne berbanding penerima super regeneratif yang kurang diingini. Sekiranya anda melihat modul RF yang murah di luar sana, anda akan mendapati bahawa papan pemancar dan penerima sering digabungkan bersama. Sebilangan besar penerima yang digabungkan adalah jenis regeneratif super sehingga mereka cenderung mempunyai ciri prestasi yang jauh lebih rendah (termasuk jarak) daripada penerima super heterodyne. Kami hanya memerlukan modul penerima untuk projek ini kerana kami akan mendapat isyarat dari pemancar sensor cuaca.

Langkah 3: Antena RF

Antena RF
Antena RF

RXB6 tidak dilengkapi dengan antena. Anda boleh membeli heliks dengan harga yang murah tetapi juga mudah untuk membuat antena anda sendiri. Sebenarnya, kabel pelompat papan roti boleh dilekatkan pada pin antena modul jika anda tidak mahu terlalu mewah. Sebaik-baiknya, antena dawai lurus berukuran 1/4 panjang gelombang yang berfungsi hingga sekitar 6,8 inci. Pada mulanya saya melakukan jumper wire dan tidak menghadapi masalah untuk mengambil sensor luar saya walaupun bengkel elektronik saya berada di ruang bawah tanah saya.

Kemungkinan lain adalah membuat antena heliks anda sendiri. Terdapat pelbagai rancangan untuk itu di web tetapi yang ditunjukkan dalam gambar di atas adalah yang saya buat. Saya menggunakan beberapa wayar teras pepejal dari sekeping kabel Ethernet sekerap dan melilitnya di sekitar batang licin bit gerudi 5/32 inci. Biarkan penebat dihidupkan kecuali hujung yang dijual ke papan RF. Anda memerlukan 20 giliran. Anda juga boleh menggunakan bit gerudi 7/32 inci dan membungkus 17 giliran. Mana-mana ini mungkin berfungsi dengan baik untuk jarak yang mungkin anda miliki untuk sensor anda. Kunci sebenarnya adalah mempunyai penerima RF yang baik. Sensor AcuRite juga mempunyai pemancar yang cukup kuat.

Langkah 4: Protokol Komunikasi RF

Terdapat beberapa teknik modulasi yang berbeza untuk menghantar data tetapi sensor ini menggunakan yang paling mudah iaitu OOK (on-off-keying) atau ASK (amplitude-shift-keying). Oleh kerana kita berurusan dengan bit data 0/1 dalam contoh ini, amplitudnya penuh atau mati sepenuhnya. Oleh itu, untuk tujuan kami, OOK dan ASK adalah sama kerana OOK bermaksud pembawa RF sama ada penuh atau mati. Format mesej secara amnya ditentukan oleh pengeluar peranti pemancar dan mereka boleh menggunakan hampir semua kadar penghantaran, gaya pemformatan bit, dan panjang mesej apa pun. Jalur 433-MHz penuh dengan transmisi untuk perkara seperti meter pintar, dan lain-lain, jadi perisian perlu diselaraskan untuk menapis hanya format mesej yang ingin kita gunakan.

Langkah 5: Data Masa

Data Masa
Data Masa

Saya menggunakan unit GPS yang murah untuk mendapatkan data masa yang tepat yang akan dimulakan semula secara automatik selepas gangguan bekalan elektrik. Saya mempunyai beberapa unit GPS (tanpa paparan) yang mengeluarkan ayat NMEA standard tetapi unit terkecil dan termurah yang saya miliki adalah NEO-6M. Modul NEO-6M mudah dihubungkan ke Arduino kerana menggunakan port bersiri tahap TTL. Satu-satunya perbezaan sebenarnya ialah standard NMEA menetapkan kadar baud bersiri 4800 tetapi defaultnya NEO-6M menjadi 9600 baud. Anda boleh menjalankan program "u-center" percuma untuk mengubah kadar baud tetapi saya membiarkannya di kilang. Terdapat juga program utiliti percuma yang disebut GPSInfo (dikeluarkan oleh Globalsat) yang sangat berguna untuk melihat maklumat GPS di PC. Anda boleh menyambungkan unit GPS ke kabel USB ke TTL standard untuk memeriksanya atau untuk memasangnya menggunakan PC. Perlu diingat bahawa cip GPS pada modul sebenarnya berjalan pada 3.3 volt (melalui pengatur voltan on-board) jadi jika anda ingin menyambung ke port RXDnya, anda harus turun dari 5 volt. Port TXD boleh berhubung terus ke Arduino atau PC.

Langkah 6: Zon Waktu

Memaparkan waktu GPS adalah perkara yang mudah dilakukan selagi anda hanya mahu memaparkan UTC (Universal Time Coordinated). Kalimat NMEA terdiri daripada watak-watak ASCII yang boleh dikeluarkan terus ke LCD. Bahagian masa adalah dalam format HHMMSS. FF (jam, minit, saat, dan detik pecahan). Untuk jam kita, bahagian pecahan tidak berguna jadi yang perlu kita tangani hanyalah enam aksara. Masalahnya ialah anda perlu menukar ke waktu tempatan anda dan ke format AM / PM 12 jam jika anda menginginkannya. Tetapi kadang-kadang masalah adalah apa yang menjadikan hidup menarik sehingga itulah bahagian perisian yang sebenarnya.

Bagi zon waktu, anda mungkin berpendapat bahawa hanya ada 24 daripadanya dengan 12 daripadanya di sebelah timur lokasi UTC (+ zon) dan 12 daripadanya di sebelah barat lokasi UTC (- zon). Sebenarnya, ada beberapa bola ganjil iaitu pecahan jam dan pasangan yang melebihi "had" 12 jam. Sekiranya anda tinggal di salah satu kawasan tersebut, saya minta maaf kerana perisian saya hanya merangkumi 24 zon jam keseluruhan. Ada juga di antara kita yang menggunakan Waktu Musim Panas pada siang hari tetapi tidak secara automatik diperhitungkan dalam perisian. Itu memerlukan jadual pencarian tarikh yang akan datang, kerumitan tambahan dalam perisian, dan keperluan untuk mengemas kini perisian jika minggu-tahun dalam tahun peralihan berubah. Sebaliknya, perkakasan menggunakan suis kenalan sesaat untuk membolehkan penetapan zon waktu dengan mudah (pengimbangan UTC).

Langkah 7: Skematik

Skematik
Skematik

Skema ditunjukkan di atas dan merangkumi sambungan untuk antara muka LCD 1602 4-bit. Data bersiri dari penerima RF berada pada tahap logik digital sehingga disambungkan terus ke salah satu pin input data Arduino. Pin dikonfigurasikan dalam perisian untuk melakukan fungsi interrupt-on-change sehingga kita dapat mengukur lebar nadi. Output TXD GPS disambungkan secara langsung ke input Arduino RX.

Terdapat dua suis yang digunakan. Seperti yang disebutkan sebelumnya, suis hubungan sesaat memungkinkan untuk menetapkan ofset UTC. Suis dapat ditekan kapan saja untuk memasuki mode set. Pada mulanya, paparan akan menunjukkan pengimbangan UTC "+77" yang tidak sah. Rujuk bahagian "Perisian Jam" untuk arahan tetapan offset UTC.

Suis kedua adalah suis hidup / mati sederhana. Pada posisi "mati" waktu akan ditampilkan dalam format 12 jam (AM / PM) dan pada posisi "aktif" waktu akan ditampilkan dalam format 24 jam. Suis ini boleh diubah bila-bila masa untuk beralih antara format.

Sekiranya hanya fungsi jam yang diinginkan, maka modul penerima RF tidak perlu disambungkan. Sekiranya hanya fungsi cuaca yang diinginkan, maka GPS dan kedua suis tidak perlu disambungkan.

Langkah 8: Perisian LCD

Saya cenderung menggunakan salah satu daripada dua jenis antara muka LCD. Salah satunya adalah antara muka 4-bit standard dan yang lain adalah antara muka 3-wayar yang menggunakan shift register. Saya merancang antara muka itu ketika saya bekerja dengan mikrokontroler PIC kecil yang mempunyai bilangan pin I / O yang terhad. Saya menggunakan antara muka 4-bit untuk projek ini tetapi mempunyai fail LCD saya sendiri dan bukannya menggunakan perpustakaan Arduino LCD generik. Itu mengurangkan penggunaan memori dan kerumitan kod dan juga membolehkan saya mengubah kod untuk projek tertentu seperti ini.

Langkah 9: Perisian Jam

Unit GPS mengeluarkan ayat NMEA-0183 standard yang merupakan rentetan ASCII yang mengandungi pelbagai maklumat. Untuk aplikasi ini saya memilih ayat GGA untuk mendapatkan maklumat masa kerana itulah ayat yang saya gunakan untuk projek GPS sebelumnya. Bidang maklumat dalam kalimat NMEA dipisahkan dengan koma jadi, setelah tajuk kalimat GGA dikesan, perisian biasanya akan menghitung koma dan memanggil rutin yang sesuai untuk setiap bidang maklumat GPS yang diinginkan. Hanya maklumat masa yang diperlukan di sini dan yang ada di lapangan setelah koma pertama sehingga tidak diperlukan penghitungan.

Enam digit masa (HHMMSS) disangga dan kemudian diproses setelah semuanya diterima. GPS mungkin mengeluarkan beberapa mesej yang tidak lengkap sejak awal sehingga rutin penyangga mengesahkan bahawa setiap watak adalah nilai berangka ASCII. Sekiranya watak buruk diterima, mesej akan dibuang. Ini juga mungkin berlaku pada waktu yang jarang berlaku semasa operasi normal, terutamanya jika komunikasi port bersiri sedikit menurun. Saya hanya melihat ini sekali dan semua yang berlaku adalah masa berhenti sejenak dan kemudian melonjak dua saat dan bukannya satu.

Sekiranya perisian dikonfigurasikan untuk hanya menampilkan waktu, maka baris pertama LCD akan memaparkan waktu tempatan dan baris kedua akan memaparkan UTC. Untuk UTC perisian hanya menghantar watak ASCII terus ke rutin paparan, dengan titik dua (:) dimasukkan dengan tepat.

Untuk menukar UTC ke waktu tempatan, ofset UTC (zon waktu) mesti digunakan. Oleh kerana masa UTC dari GPS dalam format ASCII, perisian menukar watak jam ASCII menjadi perpuluhan dan kemudian menambahkan ofset UTC. Offset UTC disimpan sebagai nilai BCD positif dengan bit tanda sehingga pertama kali ditukar menjadi nilai integer dan kemudian ditolak jika bit tanda ditetapkan. Setelah nilai jam waktu tempatan dihitung, jadual pencarian digunakan untuk mengubahnya menjadi BCD, dan kemudian BCD ditukar kembali ke ASCII untuk dipaparkan. Jadual carian perlu mengendalikan format UTC 24 jam serta zon waktu +/- 12. Untuk melakukan ini, masa UTC dari 0000 hingga 2300 menempati 24 entri tengah dalam jadual dengan 12 entri sebelum dan 12 entri selepas untuk memperhitungkan zon waktu. Satu meja dalam format 12 jam jadi saya juga menambahkan jadual pencarian untuk bahagian AM / PM paparan. Jadual yang lain dalam format 24 jam. Seperti disebutkan sebelumnya, suis hidup / mati memungkinkan pemilihan format 12 jam atau 24 jam.

Zon waktu diambil dari EEPROM semasa permulaan dan dipaparkan sebentar. Sekiranya belum ditetapkan sekurang-kurangnya sekali maka rutin pengaturan dipanggil. Rutin pengaturan juga dapat dipanggil kapan saja dengan menekan suis kenalan sesaat. Rutin pengaturan akan menginisialisasi tampilan ke "UTC OFFSET +77". Tekan pendek suis akan mengubah nilainya menjadi “-00”. Sekiranya zon waktu positif diperlukan, tekan pendek lain akan mengubah nilainya menjadi "+00". Tekan lama (> 1 saat) akan memindahkan mod tetapan ke langkah seterusnya. Pada tahap ini setiap tekan pendek akan meningkatkan nilai waktu hingga maksimum 12. Setelah mencapai zon waktu yang diinginkan, tekan dan tahan suis lebih dari 1 saat dan kemudian lepaskan. Perisian ini kemudian akan menyimpan nilai UTC di EEPROM dan secara ringkas memaparkan "OFFSET SAVED". Sekiranya anda membuat kesilapan semasa masuk, keluar dan kemudian tekan suis sekali lagi untuk menetapkannya semula.

NEO-6M tidak memerlukan penetapan kedudukan yang baik untuk mengeluarkan waktu sehingga harus mengeluarkan mesej sebaik sahaja mendapat satu satelit. Sehingga itu paparan akan berbunyi "TIADA DATA".

Langkah 10: Perisian Cuaca

Mikrokontroler PIC mempunyai keupayaan untuk mengaktifkan / mematikan pemasa menggunakan nadi luaran. Nadi input yang sama juga dapat digunakan sebagai gangguan luaran untuk memberi isyarat pembacaan jangka masa nadi. Arduino tidak mempunyai kemampuan yang tepat sehingga saya menggunakan fungsi interrupt-on-change. Di satu tepi denyut mesej RF, masa mikrodetik semasa dijimatkan oleh pengendali gangguan. Di pinggir yang bertentangan, masa berlalu dikira untuk menentukan lebar nadi.

Perisian ini mempunyai definisi "DEBUG" yang memungkinkan untuk menampilkan format data mentah dari pesan yang diterima. Terdapat juga definisi untuk menentukan pin input Arduino untuk aliran bersiri dari penerima RF. Perisian ini disiapkan untuk mengira tetapan daftar interrupt-on-change yang sesuai berdasarkan definisi ini. Pengiraannya hanya berfungsi untuk pin digital Arduino. Pin analog boleh digunakan sebagai gantinya tetapi itu memerlukan pengekodan keras nilai-nilai register.

Pengendali interrupt menentukan apakah kiraan yang ditangkap cukup lama untuk menjadi nadi permulaan. Seperti yang telah disebutkan sebelumnya, jurang antara beberapa mesej adalah 2ms sehingga itulah yang dicari oleh perisian. Oleh kerana semua lalu lintas 433-MHz, penyaringan awal dalam perisian memastikan bahawa waktu yang diukur sekurang-kurangnya 1.8ms tetapi tidak lebih besar dari 2.4ms. Setelah permulaan dikesan, perisian mencari bit penyegerakan (600us) dan dikira untuk memastikan empat daripadanya diterima. Setelah ujian ini lulus, perisian akan mencari masa bit yang tepat iaitu 200us dan 400us.

Bit yang diterima dibentuk menjadi bait dan setiap bait disimpan. Setelah tujuh bait diterima, checksum mesej disahkan sebelum proses selanjutnya dibenarkan. Sekiranya bait mentah akan dikeluarkan (mod debug), maka bait ditukar menjadi watak ASCII dan dihantar ke LCD. Sekiranya kelembapan dan output suhu diinginkan, maka penukaran yang sesuai dilakukan.

Dua bait data Centigrade dalam mesej RF disatukan untuk membentuk nilai 11-bit. Bahagian bawah digeser ke kiri satu bit untuk menghilangkan bit pariti dan untuk menyelaraskannya dengan bit di bahagian atas. Kedua-dua bait dibentuk menjadi pemboleh ubah kata 16-bit dan kemudian keseluruhannya beralih satu bit untuk mendapatkan penjajaran bit akhir. Pemboleh ubah perkataan kemudian ditukar menjadi pemboleh ubah titik terapung untuk pengiraan matematik.

Satu kelebihan besar menggunakan C ++ pada bahasa Arduino berbanding pemasangan di PIC adalah bahawa ia memudahkan pengiraan matematik. Seperti yang telah disebutkan sebelumnya, penukaran Centigrade adalah (C / 10) -100. Hasilnya diubah menjadi rentetan dan dikirim ke LCD untuk dipamerkan. Pengiraan Fahrenheit adalah (C * 1.8) + 32. Hasilnya sekali lagi ditukar menjadi rentetan dan dihantar ke LCD untuk paparan. Dalam kedua kes tersebut, penukaran String merangkumi tanda negatif (jika sesuai) dan titik perpuluhan. Pemeriksaan dibuat untuk titik perpuluhan untuk memastikan bahawa hanya satu watak setelah perpuluhan dihantar ke paparan. Pemeriksaan itu diperlukan kerana rentetan boleh terdiri dari 3 hingga 5 aksara panjangnya.

Saya mempunyai dua sensor AcuRite, jadi saya menambahkan pemeriksaan pada perisian untuk memastikan bahawa data untuk satu tidak menimpa data untuk yang lain jika perisian ditetapkan hanya untuk melakukan fungsi cuaca. Sensor pertama yang diterima setelah power up dipaparkan pada baris 1 dan yang lain dipaparkan pada baris 2. Dengan menggunakan mod debug, saya dapat melihat apa ID untuk setiap sensor sehingga saya dapat membuat pemeriksaan mudah dalam kod jika saya hanya ingin memproses data dari salah satu daripadanya.

Perisian memantau status bateri (byte3) dan memaparkan mesej jika menunjukkan bateri rendah. Mesej ini menimpa semua data lain untuk sensor itu.

Langkah 11: Memaparkan

Memaparkan
Memaparkan
Memaparkan
Memaparkan
Memaparkan
Memaparkan

Berikut adalah beberapa paparan contoh untuk pelbagai fungsi. Saya mempunyai beberapa Instruksional lain tetapi kebanyakan projek mikrokontroler PIC saya boleh didapati di laman web saya di: www.boomerrules.wordpress.com

Disyorkan: