Daftar Isi:

Otomatisasi Rumah 433MHz Raspberry Pi Super Sederhana: 7 Langkah
Otomatisasi Rumah 433MHz Raspberry Pi Super Sederhana: 7 Langkah

Video: Otomatisasi Rumah 433MHz Raspberry Pi Super Sederhana: 7 Langkah

Video: Otomatisasi Rumah 433MHz Raspberry Pi Super Sederhana: 7 Langkah
Video: DIY Home Automation Intruder Alarm System! || Home Assistant + Raspberry Pi + ESP8266 2024, November
Anonim
Otomatisasi Rumah Raspberry Pi 433MHz Super Sederhana
Otomatisasi Rumah Raspberry Pi 433MHz Super Sederhana

Tutorial ini adalah salah satu di antara banyak cara menggunakan Raspberry Pi untuk mengontrol perangkat nirkabel di sekitar rumah. Seperti banyak lainnya, ini akan menunjukkan kepada Anda cara menggunakan pasangan pemancar/penerima murah yang terhubung ke Pi Anda untuk berinteraksi dengan perangkat yang beroperasi pada pita frekuensi radio 433MHz yang umum digunakan. Ini secara khusus akan menunjukkan kepada Anda cara menghidupkan atau mematikan perangkat listrik apa pun menggunakan Pi Anda dengan mengirimkan perintah ke satu set soket daya yang dikendalikan dari jarak jauh 433MHz.

Mengapa saya membuat tutorial ini jika banyak yang sudah ada? Terutama karena hampir semua tutorial lain yang saya temui tampaknya terlalu rumit, terutama di sisi perangkat lunak. Saya perhatikan bahwa mereka sangat bergantung pada perpustakaan, skrip, atau cuplikan kode pihak ketiga untuk melakukan semua pekerjaan. Banyak yang bahkan tidak menjelaskan apa yang dilakukan kode yang mendasarinya - mereka hanya akan meminta Anda untuk memasukkan dua atau tiga perangkat lunak ke Pi Anda dan menjalankan banyak perintah, tanpa pertanyaan. Saya benar-benar ingin mencoba dan menggunakan Pi saya untuk menghidupkan dan mematikan perangkat listrik di sekitar rumah saya menggunakan satu set soket yang dikendalikan dari jarak jauh 433MHz, tetapi saya ingin membuat versi sistem saya sendiri yang dapat saya pahami, semoga menghilangkan kebutuhan untuk menggunakan perpustakaan atau skrip orang lain.

Itulah yang tutorial ini adalah tentang. Sisi perangkat lunak dari sistem ini terdiri dari dua skrip Python yang sangat sederhana - satu untuk menerima dan merekam sinyal, dan satu lagi untuk mengirimkan sinyal ini kembali ke soket daya nirkabel. Penerimaan/transmisi sinyal yang sebenarnya hanya bergantung pada pustaka RPi. GPIO yang mudah digunakan yang, setidaknya bagi saya, telah diinstal sebelumnya dengan Raspbian. Pustaka ini juga dapat diimpor langsung ke Python.

Untuk proyek ini Anda akan membutuhkan:

Sebuah Pi Raspberry. Model apa pun harus berfungsi, saya menggunakan starter kit all-in-one, tetapi mungkin Anda hanya memerlukan unit pusat

Pasangan pemancar/penerima 433MHz. Yang paling umum digunakan dalam jenis proyek ini tampaknya adalah ini. Membeli paket berisi lima seperti yang ditautkan memastikan bahwa Anda memiliki beberapa suku cadang

Satu set soket listrik 433MHz yang dikendalikan dari jarak jauh. Saya menggunakan ini yang sangat saya rekomendasikan, tetapi ada banyak model yang tersedia. Pastikan mereka beroperasi pada frekuensi ini

Beberapa aksesori bangunan sirkuit. Saya akan merekomendasikan menggunakan papan tempat memotong roti dan beberapa kabel jumper untuk membuat proses pembuatan sirkuit semudah mungkin.

[Jika Anda memutuskan untuk membeli salah satu produk ini, saya akan sangat menghargainya jika Anda mengakses daftar menggunakan tautan di atas - dengan begitu, saya mendapatkan bagian kecil dari keuntungan tanpa biaya tambahan untuk Anda!]

Langkah 1: Menyiapkan Unit Penerima

Menyiapkan Unit Penerima
Menyiapkan Unit Penerima

Sebelum Anda dapat menggunakan Pi Anda untuk mengirim perintah ke soket yang dikendalikan dari jarak jauh, Anda perlu mengetahui sinyal spesifik apa yang mereka tanggapi. Sebagian besar soket yang dikendalikan dari jarak jauh dikirimkan dengan handset yang dapat digunakan untuk menghidupkan atau mematikan unit tertentu. Dalam kasus yang saya beli, handset memiliki empat baris tombol ON/OFF berpasangan, yang masing-masing mengirimkan sinyal ON atau OFF ke unit soket tertentu.

Ini memunculkan pertanyaan - bagaimana kita tahu tombol mana yang sesuai dengan soket mana? Ini sebenarnya tergantung pada model yang Anda miliki. Salah satu alasan utama saya memilih gaya soket khusus saya (terkait dalam pendahuluan) adalah bahwa unit dapat dikonfigurasi dengan sakelar fisik untuk membuat soket tertentu merespons serangkaian tombol ON/OFF tertentu pada handset. Ini juga berarti bahwa Anda dapat mencabut dan memindahkan soket di sekitar rumah dengan mengetahui bahwa setiap unit akan selalu merespons sinyal ON/OFF yang sama.

Setelah Anda mengetahui bagaimana soket Anda berinteraksi dengan handset, Anda perlu menggunakan unit penerima 433MHz (gambar di atas) untuk 'mengendus' kode yang dikirim oleh handset. Setelah Anda merekam bentuk gelombang kode-kode ini, Anda dapat mereplikasinya menggunakan Python dan mengirimkannya menggunakan unit pemancar.

Hal pertama yang harus dilakukan di sini adalah menyambungkan pin pada receiver Anda ke pin GPIO yang benar pada Pi. Unit penerima memiliki empat pin, tetapi hanya tiga yang diperlukan. Saya pikir kedua pin pusat memberikan output yang sama, jadi Anda hanya perlu menghubungkan ke salah satunya (kecuali jika Anda ingin mengalirkan sinyal yang diterima ke dua pin GPIO yang terpisah).

Gambar di atas cukup banyak merangkum kabel. Setiap pin pada penerima dapat dihubungkan langsung ke pin yang sesuai pada Pi. Saya menggunakan papan tempat memotong roti dan kabel jumper untuk membuat prosesnya sedikit lebih elegan. Perhatikan bahwa Anda dapat memilih pin data GPIO apa pun untuk dihubungkan ke salah satu pin penerima pusat. Saya menggunakan pin yang ditandai sebagai '23' di header Pi saya.

PENTING: Jika Anda menghubungkan pin bertanda '3v3' pada gambar di atas ke pin tegangan tinggi pada Pi (misalnya 5v), Anda mungkin akan merusak Pi karena pin GPIO tidak dapat mentolerir tegangan di atas 3v3. Atau, Anda dapat menyalakannya dengan 5v dan mengatur pembagi tegangan untuk mengirim tegangan yang aman ke pin DATA.

Jangkauan penerima tidak akan terlalu besar pada tegangan ini, terutama jika antena tidak terhubung. Namun, Anda tidak memerlukan jarak jauh di sini - selama penerima dapat menangkap sinyal dari handset ketika mereka dipegang tepat di samping satu sama lain, itu saja yang kami butuhkan.

Langkah 2: Mengendus Kode Handset

Mengendus Kode Handset
Mengendus Kode Handset

Sekarang receiver Anda terhubung ke Pi, Anda dapat memulai tahap pertama yang menarik dari proyek ini - sniff. Ini melibatkan penggunaan skrip Python terlampir untuk merekam sinyal yang dikirimkan oleh handset ketika setiap tombol ditekan. Skripnya sangat sederhana, dan saya sangat menyarankan Anda untuk melihatnya sebelum menjalankannya - lagi pula, inti dari proyek ini adalah Anda tidak akan begitu saja menjalankan kode orang lain secara membabi buta!

Sebelum Anda memulai proses ini, Anda harus memastikan bahwa Anda memiliki pustaka Python yang diperlukan untuk menjalankan skrip sniffer. Mereka terdaftar di bagian atas skrip:

dari datetime impor datetime

impor matplotlib.pyplot sebagai pyplot impor RPi. GPIO sebagai GPIO

Pustaka RPi. GPIO dan datetime disertakan dengan distribusi Raspbian saya, tetapi saya harus menginstal pustaka matplotlib sebagai berikut:

sudo apt-get install python-matplotlib

Pustaka ini adalah pustaka plotting grafik yang umum digunakan yang sangat berguna bahkan di luar proyek ini, jadi menginstalnya pasti tidak ada salahnya! Setelah perpustakaan Anda diperbarui, Anda siap untuk mulai merekam data. Berikut cara kerja skrip:

Ketika dijalankan (menggunakan perintah 'python ReceiveRF.py'), ia akan mengonfigurasi pin GPIO yang ditentukan sebagai input data (pin 23 secara default). Kemudian akan terus-menerus mengambil sampel pin dan mencatat apakah menerima digital 1 atau 0. Ini berlanjut selama durasi yang ditentukan (5 detik secara default). Ketika batas waktu ini tercapai, skrip akan berhenti merekam data dan akan menutup input GPIO. Kemudian melakukan sedikit pasca-pemrosesan dan memplot nilai input yang diterima terhadap waktu. Sekali lagi, jika Anda memiliki pertanyaan tentang apa yang dilakukan skrip, Anda mungkin dapat menjawabnya sendiri setelah melihat cara kerjanya. Saya telah mencoba untuk membuat kode yang dapat dibaca dan sesederhana mungkin.

Yang perlu Anda lakukan adalah melihat saat skrip menunjukkan bahwa ia telah **Mulai merekam**. Setelah pesan ini muncul, Anda harus menekan dan menahan salah satu tombol pada handset selama sekitar satu detik. Pastikan untuk memegangnya dekat dengan penerima. Setelah skrip selesai merekam, skrip akan menggunakan matplotlib untuk memplot bentuk gelombang grafis dari sinyal yang diterimanya selama interval perekaman. Harap dicatat, jika Anda terhubung ke Pi Anda menggunakan klien SSH seperti Putty, Anda juga perlu membuka aplikasi X11 agar bentuk gelombang dapat ditampilkan. Saya menggunakan xMing untuk ini (dan untuk hal-hal lain seperti desktop jarak jauh ke Pi saya). Untuk memungkinkan plot ditampilkan, cukup mulai xMing sebelum Anda menjalankan skrip dan tunggu hingga hasilnya muncul.

Setelah jendela matplotlib Anda muncul, area yang menarik di dalam plot seharusnya cukup jelas. Anda dapat menggunakan kontrol di bagian bawah jendela untuk memperbesar hingga Anda dapat memilih tinggi rendahnya sinyal yang ditransmisikan oleh handset saat tombol ditekan. Lihat gambar di atas untuk contoh kode lengkapnya. Sinyal mungkin akan terdiri dari pulsa yang sangat pendek yang dipisahkan oleh periode waktu yang sama di mana tidak ada sinyal yang diterima. Blok pulsa pendek ini mungkin akan diikuti oleh periode yang lebih lama di mana tidak ada yang diterima, setelah itu polanya akan berulang. Setelah Anda mengidentifikasi pola yang termasuk dalam satu contoh kode, ambil tangkapan layar seperti itu di bagian atas halaman ini, dan lanjutkan ke langkah berikutnya untuk menafsirkannya.

Langkah 3: Mentranskripsi Sinyal yang Dihasilkan

Mentranskripsi Sinyal yang Dihasilkan
Mentranskripsi Sinyal yang Dihasilkan

Sekarang setelah Anda mengidentifikasi blok tertinggi dan terendah periodik yang sesuai dengan sinyal tombol tertentu, Anda memerlukan cara untuk menyimpan dan menafsirkannya. Dalam contoh sinyal di atas, Anda akan melihat bahwa hanya ada dua pola unik yang membentuk seluruh blok sinyal. Kadang-kadang Anda melihat harga tinggi yang pendek diikuti oleh harga rendah yang panjang, dan terkadang sebaliknya - harga tinggi yang panjang diikuti oleh harga rendah yang pendek. Ketika saya menyalin sinyal saya, saya memutuskan untuk menggunakan konvensi penamaan berikut:

1 = short_on + long_off0 = long_on + short_off

Lihat lagi pada bentuk gelombang berlabel, dan Anda akan melihat apa yang saya maksud. Setelah Anda mengidentifikasi pola yang setara dalam sinyal Anda, yang harus Anda lakukan adalah menghitung 1 dan 0 untuk membangun urutannya. Ketika ditranskripsi, sinyal di atas dapat ditulis sebagai berikut:

1111111111111010101011101

Sekarang Anda hanya perlu mengulangi proses ini untuk merekam dan menyalin sinyal yang sesuai dengan tombol lain di ponsel Anda, dan Anda telah menyelesaikan bagian pertama dari proses!

Sebelum Anda dapat mengirim ulang sinyal menggunakan pemancar, ada sedikit pekerjaan yang harus dilakukan. Waktu antara tertinggi dan terendah yang sesuai dengan 1 atau 0 sangat penting, dan Anda perlu memastikan bahwa Anda tahu berapa lama 'short_on' atau 'long_off' sebenarnya berlangsung. Untuk kode saya, ada tiga informasi waktu yang perlu saya ekstrak untuk mereplikasi sinyal:

  • Durasi interval 'pendek', yaitu awal dari 1 atau akhir dari 0.
  • Durasi interval 'panjang', yaitu akhir dari 1 atau awal dari 0.
  • Durasi interval 'diperpanjang'. Saya perhatikan bahwa ketika saya menahan tombol pada handset, ada periode 'extended_off' antara setiap contoh berulang dari blok sinyal. Delay ini digunakan untuk sinkronisasi dan memiliki durasi yang tetap.

Untuk menentukan nilai waktu ini, Anda dapat menggunakan fungsi zoom pada jendela matplotlib untuk memperbesar sepenuhnya dan menempatkan kursor di atas bagian sinyal yang relevan. Pembacaan lokasi kursor di bagian bawah jendela akan memungkinkan Anda untuk menentukan seberapa lebar setiap bagian dari sinyal yang sesuai dengan interval panjang, pendek atau diperpanjang. Perhatikan bahwa sumbu x plot mewakili waktu, dan komponen x dari pembacaan kursor dalam satuan detik. Bagi saya, lebarnya adalah sebagai berikut (dalam detik):

  • short_delay = 0,00045
  • long_delay = 0,00090 (dua kali lebih panjang dari 'short')
  • diperpanjang_delay = 0,0096

Langkah 4: Menyiapkan Unit Pemancar

Menyiapkan Unit Pemancar
Menyiapkan Unit Pemancar

Setelah Anda mengumpulkan kode dan data waktu, Anda dapat memutuskan unit penerima karena Anda tidak lagi membutuhkannya. Anda kemudian dapat memasang pemancar langsung ke pin Pi GPIO yang relevan seperti yang ditunjukkan pada gambar di atas. Saya telah menemukan bahwa pin pada unit pemancar diberi label, yang membuat prosesnya lebih mudah.

Dalam hal ini, boleh saja menyalakan unit menggunakan suplai 5v dari Pi karena pin DATA tidak akan mengirim sinyal ke Pi, hanya menerimanya. Juga, catu daya 5v akan memberikan jangkauan transmisi lebih banyak daripada menggunakan catu daya 3v3. Sekali lagi, Anda dapat menghubungkan pin DATA ke pin yang sesuai pada Pi. Saya menggunakan pin 23 (sama seperti untuk penerima).

Hal lain yang saya sarankan lakukan adalah menambahkan antena ke lubang kecil di kanan atas pemancar. Saya menggunakan kawat lurus sepanjang 17 cm. Beberapa sumber merekomendasikan kawat melingkar dengan panjang yang sama. Saya tidak yakin mana yang lebih baik, tetapi kabel lurus memberikan jangkauan yang cukup bagi saya untuk menghidupkan/mematikan soket dari lokasi mana pun di flat kecil saya. Yang terbaik adalah menyolder antena, tetapi saya baru saja melepas beberapa plastik dari kawat dan membungkus tembaga melalui lubang.

Setelah pemancar terhubung, itu semua pengaturan perangkat keras selesai! Satu-satunya yang tersisa untuk dilakukan sekarang adalah memasang soket Anda di sekitar rumah dan melihat program pemancar.

Langkah 5: Mengirimkan Sinyal Menggunakan Pi

Di sinilah skrip Python kedua masuk. Ini dirancang sesederhana yang pertama, jika tidak lebih. Sekali lagi, silakan unduh dan lihat kodenya. Anda perlu mengedit skrip untuk mengirimkan sinyal yang benar sesuai dengan data yang Anda rekam di langkah 3, jadi sekarang saat yang tepat untuk melihatnya sekilas.

Pustaka yang diperlukan untuk menjalankan skrip ini semuanya sudah diinstal sebelumnya di Pi saya, jadi tidak diperlukan instalasi lebih lanjut. Mereka terdaftar di bagian atas skrip:

waktu impor

impor sys impor RPi. GPIO sebagai GPIO

Di bawah impor perpustakaan adalah informasi yang harus Anda edit. Inilah tampilannya secara default (ini adalah informasi yang sesuai dengan soket saya sebagaimana ditentukan menggunakan langkah 3):

a_on = '1111111111111010101011101'

'a_off = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1110000off11110_lay 'de-det' 1110000off11111_on = '1110.000off11111110

Di sini kami memiliki delapan string kode (dua untuk setiap pasang tombol on/off pada handset saya - Anda mungkin memiliki lebih banyak atau lebih sedikit kode) diikuti oleh tiga bagian informasi waktu yang juga ditentukan pada langkah 3. Luangkan waktu untuk memastikan Anda telah memasukkan informasi ini dengan benar.

Setelah Anda puas dengan kode/penundaan yang Anda masukkan ke dalam skrip (Anda dapat mengganti nama variabel string kode jika Anda mau), Anda cukup siap untuk mencoba sistem! Sebelum melakukannya, lihat fungsi transmit_code() dalam skrip. Di sinilah interaksi sebenarnya dengan pemancar terjadi. Fungsi ini mengharapkan salah satu string kode dikirim sebagai argumen. Ini kemudian membuka pin yang ditentukan sebagai output GPIO dan mengulang setiap karakter dalam string kode. Ini kemudian menyalakan atau mematikan pemancar sesuai dengan informasi waktu yang Anda masukkan untuk membangun bentuk gelombang yang cocok dengan string kode. Ia mengirimkan setiap kode beberapa kali (10 secara default) untuk mengurangi kemungkinan terlewatkan, dan meninggalkan extended_delay di antara setiap blok kode, seperti halnya handset.

Untuk menjalankan skrip, Anda dapat menggunakan sintaks perintah berikut:

python TransmitRF.py kode_1 kode_2 …

Anda dapat mengirimkan beberapa string kode dengan menjalankan skrip tunggal. Misalnya, untuk menghidupkan dan mematikan soket (a) dan (b) dan soket (c), jalankan skrip dengan perintah berikut:

python TransmitRF.py a_on b_on c_off

Langkah 6: Catatan tentang Akurasi Waktu

Seperti disebutkan, waktu antara pulsa on/off yang ditransmisikan cukup penting. Skrip TransmitRF.py menggunakan fungsi time.sleep() python untuk membangun bentuk gelombang dengan interval pulsa yang benar, tetapi perlu dicatat bahwa fungsi ini tidak sepenuhnya akurat. Durasi yang menyebabkan skrip menunggu sebelum menjalankan operasi berikutnya dapat bergantung pada beban prosesor pada saat itu. Itulah alasan lain mengapa TransmitRF.py mengirim setiap kode beberapa kali - untuk berjaga-jaga jika fungsi time.sleep() tidak dapat membuat instance kode dengan benar.

Saya pribadi tidak pernah memiliki masalah dengan time.sleep() dalam hal mengirim kode. Namun saya tahu bahwa time.sleep() saya cenderung memiliki kesalahan sekitar 0.1ms. Saya menentukan ini menggunakan skrip SleepTest.py terlampir yang dapat digunakan untuk memberikan perkiraan seberapa akurat fungsi time.sleep() Pi Anda. Untuk soket kendali jarak jauh khusus saya, penundaan terpendek yang perlu saya terapkan adalah 0,45 ms. Seperti yang saya katakan, saya tidak memiliki masalah dengan soket yang tidak responsif, jadi sepertinya 0,45 ± 0,1 ms sudah cukup baik.

Ada metode lain untuk memastikan bahwa penundaan lebih akurat; misalnya, Anda dapat menggunakan chip PIC khusus untuk menghasilkan kode, tetapi hal-hal seperti itu berada di luar cakupan tutorial ini.

Langkah 7: Kesimpulan

Kesimpulan
Kesimpulan

Proyek ini telah mempresentasikan metode untuk mengendalikan alat listrik apa pun menggunakan Raspberry Pi dan satu set soket kendali jarak jauh 433MHz, dengan fokus pada kesederhanaan dan transparansi. Ini adalah proyek paling menarik dan fleksibel yang saya gunakan untuk Pi saya, dan ada aplikasi tak terbatas untuk itu. Berikut adalah beberapa hal yang sekarang dapat saya lakukan berkat Pi saya:

  • Nyalakan pemanas listrik di sebelah tempat tidur saya setengah jam sebelum alarm saya berbunyi.
  • Matikan pemanas satu jam setelah saya tidur.
  • Nyalakan lampu samping tempat tidur saya saat alarm berbunyi agar saya tidak tertidur kembali.
  • dan masih banyak lagi…

Untuk sebagian besar tugas ini, saya menggunakan fungsi crontab di Linux. Ini memungkinkan Anda mengatur tugas terjadwal otomatis untuk menjalankan skrip TransmitRF.py pada waktu tertentu. Anda juga dapat menggunakan Linux pada perintah untuk menjalankan tugas satu kali (yang, bagi saya, perlu diinstal secara terpisah menggunakan 'sudo apt-get install at'). Misalnya, untuk menyalakan pemanas setengah jam sebelum alarm berbunyi keesokan paginya, yang perlu saya lakukan hanyalah mengetik:

pada 05:30

python TransmitRF.py c_on

Anda juga dapat menggunakan proyek ini bersama dengan sistem pemantauan rumah Dropbox saya untuk mengontrol peralatan melalui internet! Terima kasih telah membaca, dan jika Anda ingin mengklarifikasi sesuatu atau membagikan pendapat Anda, silakan kirim komentar!

Direkomendasikan: