Kontrol tirai melalui antarmuka RS-485. Bagian 2: tambahkan WiFi

Kami menyelesaikan tugas minimum - kami menguji cara motor AKKO AM72E bekerja melalui antarmuka RS485 . Sekarang kita dapat memerintahkan sinar matahari dengan mengirimkan elektron melalui kabel. Langkah selanjutnya yang jelas adalah transisi dari kontrol dengan bantuan partikel elementer ke kontrol dengan bantuan getaran, mis. gelombang radio. Mantra yang akan kita gunakan dalam kasus ini bergantung pada sihir yang kita pilih.
Setiap teknologi nirkabel akan sesuai untuk keperluan kita, tetapi saya ingin mengontrol tirai dari smartphone saya. Dalam hal ini, disarankan untuk tidak menginstal program tambahan apa pun. Saya akan terhubung ke jaringan WiFi rumah saya dan mengelola tirai listrik menggunakan browser. Drive, melalui adaptor RS485-UART saya akan terhubung ke ESP8266. Anda dapat menggunakan cara Anda sendiri dan menggunakan, misalnya, router WiFi.

ESP-01 untuk hari ini, adalah modul paling hemat dengan WiFi. Harganya sangat sedikit sehingga jika Anda perlu mengendalikan beberapa motor, kami tidak dapat menarik kabel dari satu motor ke motor lain, tetapi cukup sambungkan masing-masing ke modulnya sendiri. Dalam hal ini, kami tidak perlu memberikan setiap AM72E alamatnya sendiri - Anda dapat menghubungi alamat ESP-01. Kami tertarik pada ESP8266 tidak hanya karena harganya yang rendah dan ukurannya yang kecil, tetapi juga karena fakta bahwa ada sangat sedikit sumber daya di dalamnya dan akan membutuhkan banyak upaya untuk mendorong sesuatu yang akan bekerja di dalamnya.
Saya tidak akan menjelaskan cara menghubungkan dan memperbarui firmware ESP8266. Cara melakukan ini dengan benar dapat ditemukan di sini .
Di bawah Windows, untuk memprogram ESP8266, Anda dapat menggunakan Arduino IDE, dan kemudian kami menulis dalam C (well, hampir), atau NodeMcu, dan Anda dapat menulis dalam Lua. Ada opsi lain juga, tetapi mereka tidak cocok untuk kita.
Tidak, kami tidak terburu-buru untuk mengunggah NodeMcu. Firmware perlu disiapkan. Sumber daya pada ESP-01 tidak cukup sehingga kita dapat melupakannya jika kita ingin meningkatkan server Web. Ada flash ROM di papan tulis - tempat penyimpanan semua file kita - 512 KB. Ini sudah sangat kecil, tetapi kita tidak akan bersandar pada kurangnya sumber daya dalam flash, tetapi dalam RAM. SoC ESP8266 memiliki area RAM 64KB untuk kode program, dan 96KB untuk data. Saat startup, data dari flash dimuat ke dalam RAM. Jika kita mengisi firmware NodeMcu dan melihat jumlah memori yang tersedia, maka kita akan melihat ini:
gambar
21 kb! Dengan volume seperti itu, Anda harus menyimpan setiap byte! Kami juga melihat beberapa sampah setelah baris β€œTidak dapat mendeteksi firmware secara otomatis, karena jawaban yang tepat tidak diterima”. Ini adalah informasi debug, dikeluarkan pada kecepatan 74.880, kemudian kecepatan berubah. Begini tampilannya dengan kecepatan yang tepat:

Tidak ada yang menarik.
Pertama, tingkatkan jumlah RAM yang tersedia. Untuk melakukan ini secara signifikan, Anda dapat membuat ulang firmware sendiri. Kode sumber tersedia, tetapi Anda tidak ingin menyekop seluruh proyek hanya untuk kepentingan pengujian. Selain itu, ini harus dilakukan di Linux. Bukannya itu sangat sulit, tetapi jika kita terganggu, kita tidak akan pernah berakhir. Anda dapat menyesuaikan firmware di sini: frightanic.com/nodemcu-custom-build .
Saya beralih kotak centang ke dev096 dan menaruh tanda centang tambahan di sebelah 1-ware di jendela pilihan plug-in. Saya menyalakan modul ini karena satu fungsi - perhitungan CRC16. Ini dia:

Anda, tentu saja, dapat mengaktifkan atau menonaktifkan modul-modul yang Anda butuhkan. Sekarang masukkan email ke dalam formulir dan klik tombol "Periksa status build". Email satu kali juga baik-baik saja. Kami menunggu beberapa menit, dan dalam surat kami mendapatkan tautan ke file dengan firmware. Firmware di mana Anda hanya dapat bekerja dengan bilangan bulat akan menghemat flash dengan selusin kilobyte. Saya menuangkan yang ini. Tetapi Anda bisa membuat pilihan lain. Mari kita lihat mengapa kami berusaha sangat keras:

Sekarang kami memiliki 35 KB RAM yang tersedia.
Sebelum kita beralih ke pemrograman, mari kita kembali sebentar ke adaptor UART-RS485. Untuk bagian yang bertanggung jawab atas perpindahan transmisi-penerimaan. Untuk resistor R1. Saat memuat, ESP8266 menetapkan semua pin GPIO ke mode input, dan kemudian program menentukan dalam mode mana setiap GPIO akan bekerja. Ternyata pada saat memuat, kontak TX_UART (U0TXD) harus pada tingkat tinggi, jika tidak, program yang direkam dalam flash tidak akan mulai. Tanpa R1, ketika pin TX disurvei, level rendah akan dibaca dan ESP8266 akan "hang" sampai adaptor terhubung kembali.
Anda dapat menolak seluruh skema switching terima-kirim dengan menggunakan salah satu pin GPIO. Tetapi ada beberapa GPIO yang tersedia di ESP-01, dan mungkin mereka akan menemukan aplikasi lain dalam proyek Anda. Selain itu, dengan skema switching, adaptor yang kami buat dapat digunakan, misalnya, dengan router yang tidak memiliki GPIO.
Proyek ini terdiri dari tiga file: data, index.html dan init.lua. Lebih tepat untuk menganggap ini bukan sebagai proyek, tetapi sebagai prototipe. Misalnya, tidak ada otorisasi, kecuali saat terhubung ke router. Dan saya sama sekali tidak yakin bahwa server pada ESP8266 mampu menahan serangan. Kode tidak mengecek dengan cara apa pun, kecuali ketika terhubung, apakah ada koneksi jaringan atau telah menghilang. Tidak ada kode yang akan memulai ulang ESP8266 secara otomatis jika program macet. Dua tugas terakhir mudah diselesaikan, tetapi proyek akan menjadi lebih rumit.
Anda perlu mengedit file data - masukkan nama dan kata sandi jaringan WiFi Anda di sana. Dengan menghubungkan ESP8266 ke jaringan, kami akan dapat mengontrol tirai melalui Internet. Setelah Anda selesai debug init.lua, atur variabel debug ke false, atau hapus semuanya. Jadi lebih sedikit sampah yang akan tercecer di UART. Jika ini tidak dilakukan, maka drive mungkin tidak berfungsi. Selain itu, AKKO AM72E masih tidak dapat memahami apa yang Anda tulis padanya. Dalam hal ini, fungsi log dan semua baris yang disebutkan dalam init.lua juga dapat dihapus.
Mari kita kembali ke topik penghematan sumber daya. File data, dengan nama jaringan dan kata sandi saya, membutuhkan 1643 byte dalam memori. Jika Anda belum dapat menebaknya, maka file ini adalah file lua biasa. Itu bisa dikompilasi. Setelah dikompilasi, file yang sama sudah membutuhkan 1040 byte. Anda dapat melakukan hal yang sama dengan init.lua. Ukuran file dapat dikurangi lebih jauh. Penting untuk membuang segala sesuatu yang berlebihan darinya, pertama-tama, komentar dan spasi. File menjadi kurang dapat dibaca, tetapi jika kita membutuhkan lebih banyak ruang, kita harus melakukannya. Ini adalah praktik umum. Pada akhirnya, tidak ada yang akan menghargai desain kode Anda yang indah dan benar. Yah, mungkin pesaing ketika kode Anda sampai ke mereka. Tetapi fungsi terpotong akan segera terlihat. Apalagi jika ada yang bisa dibandingkan. Ketika perangkat dengan sedikit sumber daya diprogram, prioritas berubah. Inilah yang sering menyebabkan programditulis dalam C untuk embedded system tidak dapat dibaca dengan baik. Semuanya rumit dengan menggeser segala sesuatu yang mungkin ke preprosesor. Jika Anda memulai proyek dalam C dan menundanya selama beberapa bulan, maka Anda mungkin memerlukan waktu yang layak untuk mengetahui kode Anda sendiri. Kurang perhatian diberikan pada pemeliharaan kode, seperti dalam tiga hingga lima tahun, besi baru muncul dan semuanya harus ditulis ulang lagi karena arsitektur yang berubah.
Setelah saya secara manual menghapus semua yang tidak perlu dari file data, itu mulai menempati 705 byte. Pada saat yang sama, ukurannya masih dapat dikurangi beberapa puluh byte, jika variabel diberi nama yang tidak bermakna, tetapi nama-nama dari satu huruf (ya, ya, ini sama sekali tidak seperti yang diajarkan di sekolah). Setelah mengkompilasinya, file data.lc membutuhkan 728 byte dalam flash - oops! Itu bahkan terjadi!
Tidak ada banyak yang bisa dikatakan tentang index.htm. Saya juga menambahkan gambar dalam format svg kepadanya. Anda bisa melakukannya juga. Cukup isi curtain.svg ke dalam flash dengan file lain.
Init.lua - file proyek utama. Ada komentar dalam file itu sendiri dan jika ada sesuatu yang tidak jelas, Anda dapat memulai eksekusi baris demi baris dan umumnya bereksperimen sampai benar-benar diklarifikasi. Selain UARTA, masih ada switching LED yang terhubung ke GPIO2. File saat mengunggah oleh server dibaca dari flash dan ditransfer dalam blok 512 byte. Ini mengurangi persyaratan ukuran RAM yang tersedia.
Ini tidak ada dalam kode, tetapi jika menjadi perlu untuk menghitung CRC16, maka ini dilakukan dengan perintah ow.crc16 (buf, crc). Misalnya, jika Anda mengetik:
= ow.crc16 ('\ 85 \ 00 \ 00 \ 03 \ 01', 0xFFFF) pada baris perintah, kami mendapatkan
:
15593
Anda hanya perlu mengingat, kirim byte rendah terlebih dahulu, dan kemudian tinggi.
Inilah yang terjadi pada akhirnya:
Harus ada video)

Source: https://habr.com/ru/post/id387983/


All Articles