Dingin di pondok, dan Anda ingin menyalakan pemanas beberapa jam sebelum kedatangan Anda, atau Anda khawatir tentang kemungkinan penutupan darurat sistem pemanas rumah pedesaan tanpa kehadiran Anda. Semua masalah ini dapat diselesaikan dengan menggunakan modul GSM, yang dapat mengirim dan menerima pesan SMS dan menanggapinya, menyalakan dan mematikan beban yang diperlukan. Secara teori, semuanya sederhana, dalam praktiknya, tentang cara mengimplementasikan perangkat seperti itu, ada banyak jebakan.

Rencana saya adalah membuat perangkat sederhana dan murah yang dilengkapi dengan dua sensor suhu, sensor kelembaban, modul GSM, serta relai keadaan padat dan soket untuk menghubungkan beban. Apa yang terjadi pada akhirnya dapat dilihat di foto. Sensor iklim BME280 dipilih sebagai sensor suhu dan kelembaban, saluran tekanannya tidak digunakan. Di foto, Anda dapat melihatnya di bawah penutup transparan di sebelah kiri modul utama. Pengaturan ini mengurangi efek pembangkitan panas di dalam housing pada pembacaan sensor. Sebagai penutup, tabung reaksi plastik Cina dengan dua lubang ventilasi digunakan. Sensor suhu kedua adalah remote, dibuat pada DS18B20. Itu terletak di dalam probe logam, terhubung ke perumahan dengan kabel melalui jack audio biasa untuk headphone. Probe dirancang untuk mengukur suhu sistem pemanas secara langsung. Volume bodi utama ditempati oleh solid-state relay (saya memilih yang lebih kuat) dan konverter dari 220V ke 5V untuk memberi daya pada rangkaian. Soket untuk menghubungkan beban dipasang di sisi belakang kasing, di foto itu tidak terlihat. Tampilan OLED berdasarkan pada pengontrol SH1106 menampilkan pembacaan sensor dan juga menunjukkan apakah beban aktif. Untuk mengontrol seluruh sistem, modul Arduino Pro Mini digunakan dalam versi 3.3V 8MHz. Saya bukan penggemar berat platform ini, tetapi banyaknya perpustakaan, termasuk yang diminum dengan hati-hati oleh penulis, menjadikannya pilihan terbaik ketika Anda perlu melakukan sesuatu yang sederhana dengan cepat.
Modul SIM800L GSM ditempatkan di rumah logam yang terpisah untuk mengurangi gangguan yang ditimbulkannya ke seluruh rangkaian. Seperti yang telah ditunjukkan oleh latihan, gangguan dari ini tidak berkurang banyak. Dan secara radikal mereka direduksi oleh antena eksternal yang dihubungkan oleh kabel berpelindung ke konektor coaxial, pada foto di atas berada di latar depan. Tapi kita akan membicarakan ini secara lebih rinci nanti.

Banyak artikel telah ditulis tentang penggunaan modul GSM, termasuk di hub, jadi saya akan menghindari pengulangan dan berbicara tentang apa yang belum saya lihat dalam publikasi tentang topik ini, yaitu bagaimana membuat perangkat yang andal berdasarkan modul ini.
Di garasi, tempat saya sering mengunjungi, baru-baru ini memasang penghalang di pintu masuk, yang terbuka ketika Anda memanggil nomor tertentu. Ternyata, itu dibuat pada modul GSM serupa. Saya terkejut betapa sulitnya untuk melewati nomor ini untuk membukanya. Sekarang saya tahu banyak alasan untuk ini. Pengetahuan ini membebani saya beberapa bulan percobaan dan sejumlah uang yang dihabiskan untuk itu. Saya berharap bahwa sekarang pengetahuan ini akan melayani orang lain. Pertimbangkan apa yang penting diperhatikan, beralih dari masalah perangkat keras yang jelas ke masalah perangkat lunak yang kurang jelas.
Hal pertama yang penting untuk dilakukan dengan benar adalah memasukkan kartu SIM.
Tampak jelas bagi saya bahwa kartu SIM dimasukkan dengan sudut miring ke depan. Selama seminggu saya telah mencoba memahami mengapa modul tidak ingin mendaftar di jaringan, secara bersamaan menguasai perintah di terminal. Akibatnya, pada beberapa forum berbahasa Inggris, saya menemukan sebutan yang perlu Anda masukkan dengan sudut miring ke belakang. Sungguh aneh bahwa itu umumnya dimasukkan dengan cara ini dan itu.
Agar bekerja dengan baik, Anda harus makan dengan baik.
Persyaratan daya untuk modul GSM cukup spesifik. Itu dibuat atas dasar microchip yang dirancang untuk ponsel tombol-tekan dan dirancang untuk didukung langsung dari baterai lithium. Karena itu, 5V banyak baginya, dan 3.3V tidak cukup. Selain itu, dalam mode transmisi pada daya maksimum, ia dapat mengkonsumsi arus hingga 2A. Jika sumber daya tidak dapat memberikan arus yang diperlukan, modul GSM dapat melakukan reboot ketika mencoba mendaftar di jaringan dan terus melakukan reboot dalam siklus tanpa akhir. Periode konsumsi puncak biasanya berlangsung kurang dari satu detik, sehingga tergoda untuk menggunakan stabilisator arus rendah dengan penyimpanan energi untuk periode beban puncak. Seperti drive, Anda dapat menggunakan baterai lithium. Penting untuk memastikan bahwa ia dapat dimatikan dan penting untuk tidak lupa menggunakannya, jika tidak memutuskan hubungan perangkat dari jaringan akan mengakibatkan baterai keluar dengan cepat dan kerusakannya yang tidak dapat dipulihkan. Pilihan lain adalah mengganti baterai dengan ionistor (superkapasitor). Dia tidak takut keluar dari dalam. Namun dia juga memiliki masalah dengan keandalan. Satu sel ionistor biasanya diberi nilai untuk tegangan 2,5 hingga 3V. Ionistor yang dirancang untuk tegangan lebih tinggi terdiri dari beberapa sel (biasanya 2). Namun dalam kasus ini, ketidakseimbangan tegangan dalam sel dapat menyebabkan kerusakan sel. Ketidakseimbangan tersebut mudah diperoleh karena perbedaan kapasitansi sel atau perbedaan arus bocor. Parameter resistansi internal ionistor juga harus dipertimbangkan. Ionistor dengan resistansi internal yang tinggi pada arus tinggi tidak berguna, dan ionistor dengan resistansi rendah tidak lebih murah daripada baterai. Setelah ionistor saya tiba-tiba mati karena ketidakseimbangan sel, saya hanya menerapkan konverter dari 220V ke 5V daya yang cukup. Untuk menurunkan tegangan ke modul GSM yang diinginkan, saya meletakkan dioda silikon biasa antara konverter dan modul. Pada dioda seperti itu, 0.7V biasanya turun, sehingga modul mendapatkan 4.3V yang diperlukan. Setelah dioda, berguna untuk menempatkan kapasitor elektrolitik berkapasitas besar. Ini akan memuluskan penurunan tegangan saat pemancar tiba-tiba dinyalakan.
Jauhkan dari antena pengirim.
Bahkan setelah saya memberikan modul GSM dengan daya yang diperlukan, gejala reboot muncul secara berkala, tetapi kali ini Arduino reboot. Mengamati kekuatannya menggunakan osiloskop menunjukkan bahwa kekuatan tidak diperlukan di sini. Rupanya, pemancar menciptakan modul, karena masalah muncul lebih sering semakin buruk kondisi penerimaan sinyal stasiun basis. Efek radikal dari interferensi dari antena pemancar seperti itu cukup dapat dijelaskan jika kita ingat bahwa pemancar modul mampu mengirimkan 2 watt ke antena. Kekuatan semacam itu dapat merebus satu mililiter air dalam 5 menit atau memanaskan telinga Anda beberapa derajat. Untuk mengatasi masalah ini, berbagai metode telah dicoba. Pertama, saya menghubungkan antena eksternal, yang terletak di luar kasing dan terhubung ke modul dengan kabel koaksial pendek. Namun, ini tidak memberikan efek yang diharapkan. Kemudian saya menempatkan modul dalam wadah logam terpisah, tempat antena dipasang dari luar. Itu menjadi lebih baik, tetapi tidak banyak. Secara radikal meningkatkan situasi hanya penghapusan antena pada jarak tertentu dari perangkat karena hubungannya dengan kabel koaksial yang cukup panjang.
Mengapa ini terjadi mudah dipahami dari pertimbangan fisik. Antena tipikal adalah pin seperempat gelombang, yaitu setengah dari antena dipol. Tetapi, untuk membuat medan listrik, setengah dari dipol tidak cukup, Anda perlu setengah lagi, maka medan listrik akan muncul di antara elemen antena yang bermuatan negatif dan positif. Untuk antena cambuk biasa, separuh lainnya adalah permukaan bumi, atau badan instrumen, atau 'keseimbangan' konduktif khusus. Tetapi untuk pemasar, semua ini terlalu rumit, jadi kami biasanya hanya menjual setengah dari antena normal. Bagaimana cara kerjanya? Sangat sederhana - setengah lainnya adalah kabel yang terhubung dengan antena. Fakta bahwa itu dilindungi tidak mengubah apa pun. Permukaan luar jalinannya memainkan peran paruh kedua antena dipol. Dalam hal ini, interferensi mudah terjadi pada kabel yang lewat di lingkungan, terlepas dari kenyataan bahwa kabel tampaknya terlindung. Nah, jika tidak ada kabel, misalnya, kita menyembunyikan modul di layar logam, dari mana antena menonjol? Jika layarnya besar (dibandingkan dengan panjang gelombang), maka ia berfungsi seperti paruh kedua dari emitor, dan jika itu kecil, maka kabel lain yang terhubung dengan modul ini memancarkan, tidak masalah yang mana. Gambar berikut menggambarkan hal di atas (pro dan kontra diperlihatkan untuk kejelasan, pada kenyataannya, muatan elemen antena berubah tanda dengan frekuensi pembawa).

Antena 'kanan' ditunjukkan di sebelah kiri, kabel kabel masuknya tidak mengeluarkan interferensi. Gambar tengah menunjukkan antena yang biasanya Anda beli. Di sini, kabel lead-in adalah bagian dari emitor dan mengganggu kabel yang lewat di dekatnya. Situasi di sebelah kanan menunjukkan ketika sumber sinyal disembunyikan di dalam selungkup yang tertutup rapat. Di sini, setiap kabel yang dibawa ke rumah semacam itu adalah bagian dari penghasil emisi.
Moralnya adalah bahwa satu-satunya cara yang dapat diandalkan untuk melindungi diri Anda dari gangguan yang disebabkan oleh antena pengirim adalah dengan membawanya dari sisa elektronik dengan menghubungkannya dengan kabel koaksial dengan panjang yang cukup. Berapa lama cukup? Adalah wajar untuk mengukur jarak dengan panjang gelombang, dalam hal ini adalah maksimum 30 cm. Ini adalah jarak minimum dimana antena harus ditugaskan, tetapi semakin jauh semakin baik.
Tidak semua port serial sama-sama bermanfaat.
Dalam mikrokontroler AVR sederhana, yang biasanya digunakan semua orang, hanya ada satu port serial perangkat keras, dan digunakan untuk mengunduh program. Oleh karena itu, implementasi perangkat lunak dari port serial adalah solusi yang sangat populer. Saya akan membuktikan pernyataan bahwa banyak orang akan menemukan yang tidak terduga - untuk mengelola modul GSM, implementasi perangkat lunak dari port serial tidak cocok sama sekali.
Inti masalahnya adalah bahwa implementasi perangkat lunak dari port serial melarang interupsi selama karakter selanjutnya ditransmisikan atau diterima. Tampaknya ini buruk, seperti yang dilakukan banyak orang. Sebagai contoh, implementasi protokol 1-kawat untuk membaca termometer Semiconductor Dallas juga melarang gangguan selama transmisi satu bit, yaitu, 65 mikrodetik. Ini tentu saja tidak terlalu bagus. Jika sistem memiliki penangan interupsi lain, mereka tidak akan dapat memberikan waktu respons interupsi kurang dari 65 mikrodetik ini. Jika permintaan interupsi datang ketika mereka ditolak, itu hanya akan diproses setelah interupsi diselesaikan lagi. Misalnya, port serial perangkat keras menggunakan interupsi untuk menempatkan karakter yang diterima berikutnya dalam buffer penerima. Jika karakter berikutnya tiba sampai interupsi dari yang sebelumnya diproses, itu akan hilang. Ini berarti bahwa port serial perangkat keras tidak akan dapat beroperasi pada kecepatan lebih besar dari 115200 bit per detik. Dalam hal implementasi perangkat lunak dari port serial, semuanya lebih buruk. Untuk operasinya, perlu bahwa waktu respons terhadap interupsi kurang dari waktu transmisi satu bit. Ini membatasi kita pada kecepatan 9600 bit per detik.
Masalah yang lebih serius adalah perangkat lunak port serial itu sendiri melarang interupsi. Selain itu, waktu yang melarangnya (waktu transmisi atau penerimaan satu karakter) selalu sekitar 10 kali lebih lama dari waktu pemrosesan interupsi maksimum yang diperlukan untuk operasi yang benar dari penerima port serial perangkat lunak yang sama. Artinya, ia selalu mengganggu dirinya sendiri sedemikian rupa sehingga pada saat yang sama ia tidak dapat menerima dan mengirim data. Tentu saja, dalam banyak kasus ini tidak diperlukan. Di sebagian besar, tetapi tidak dalam kasus kami dengan modul GSM. Dia dapat, secara tak terduga bagi kita, atas inisiatifnya sendiri, mulai mentransfer data (misalnya, ketika menerima pesan SMS). Dan dalam kasus menggunakan implementasi perangkat lunak dari port serial, ini dapat dengan mudah menyebabkan kegagalan protokol komunikasi dengan modul. Oleh karena itu, saya hanya menerapkan port serial perangkat keras yang sama baik untuk pemrograman Arduino dan untuk berkomunikasi dengan modul GSM. Tentu tidak nyaman, tetapi ini adalah satu-satunya cara untuk membuat perangkat yang andal.
Asynchronous Protocol - Asynchronous Handler
Protokol asinkron adalah protokol di mana satu sisi pertukaran dapat mulai mengirimkan informasi secara tak terduga ke sisi lain, yaitu, tanpa sinkronisasi dengan pesannya. Ini persis protokol komunikasi dengan modul GSM. Secara teratur menanggapi permintaan dari Arduino, tetapi mungkin juga mulai mengirimkan sesuatu sendiri, misalnya, untuk menginformasikan tentang pesan SMS yang diterima. Dan ini menciptakan masalah nyata, karena tidak ada perpustakaan yang saya tahu untuk bekerja dengan modul untuk Arduino mengambil protokol asynchrony ke akun sama sekali. Bayangkan bahwa Arduino mengirim perintah ke modul, dan modul pada saat yang sama mengirimkan informasi tentang pesan SMS yang diterima. Informasi ini akan diterima alih-alih menanggapi perintah. Akibatnya, perpustakaan akan mengembalikan kesalahan dalam menanggapi perintah (paling-paling, semuanya akan 'hang' paling buruk), dan pesan tentang SMS yang diterima akan hilang.
Ini mudah diperbaiki - Anda hanya perlu menulis sendiri, penangan protokol asinkron Anda. Penangan tidak sinkron hanya membuat persyaratan minimum yang diperlukan untuk respons modul terhadap perintahnya. Hasilnya, modul menjawab OK atau ERROR untuk setiap perintah. Dan hanya itu yang diperlukan untuk memperbaiki jawabannya. Semua baris lain yang datang dari modul diproses terlepas dari apakah mereka datang sebagai respons terhadap perintah atau atas perintah mereka sendiri. Arti dari garis-garis ini selalu dapat ditentukan oleh permulaannya. Jika saluran dimulai dengan + CSQ, maka itu berisi informasi tentang kualitas sinyal. Jika dimulai + CMT, maka ini adalah informasi tentang SMS yang diterima, dan itu berisi alamat pengirim. Baris pertama dikirim sebagai bagian dari respons terhadap perintah AT + CSQ, dan modul kedua dikirim atas inisiatifnya sendiri, tetapi bagi kami perbedaan ini sama sekali tidak signifikan. Modul mengirim pesan SMS yang diterima langsung ke port serial. Ini menghindari membacanya dari memori dan penghapusan selanjutnya. Agar kita dapat mengenali pesan SMS dalam aliran pesan umum dari modul, mereka harus mulai dengan simbol #, jika tidak maka pesan tersebut akan diabaikan.
Perpustakaan yang dibuat oleh penulis yang menerapkan pendekatan di atas terletak di
sini .
Untuk menerima garis yang dimulai dengan urutan karakter tertentu, klien membuat objek khusus - perangkap. Dia dapat membuat sejumlah perangkap seperti itu. Baris yang diterima dari modul, selain OK, ERROR, yang tidak termasuk dalam jebakan, diabaikan begitu saja. Karena arsitektur seperti itu tidak memerlukan analisis lengkap dari respons modul untuk berbagai jenis perintah, kode perpustakaan berkali-kali lebih kompak daripada perpustakaan yang saya tahu.
Apa hasilnya?
Hasilnya adalah perangkat yang bekerja dengan andal di area dengan jangkauan yang buruk, bahkan lebih baik daripada telepon biasa. Di bawah ini adalah garis besar lengkapnya.

Bagi yang berminat, ada tautan ke github di mana Anda akan menemukan kode sumber proyek dan deskripsi perintah yang dapat dikirim ke perangkat dalam pesan SMS.
github.com/olegv142/GsmMon