Stasiun cuaca di Arduino dari A hingga Z. Bagian 3

Untuk dilanjutkan. Bagian sebelumnya .


Daftar isi:



Unit pusat. Perangkat lunak


Akhirnya, kami sampai pada bagian yang paling sulit bagi programmer mana pun - untuk menggambarkan dalam istilah manusia apa yang telah ia lakukan di sana.


Kode sumber untuk server adalah sekitar 1300 baris, termasuk lekukan, tetapi ini seharusnya tidak membuat Anda takut. Kode sumber diberikan dengan komentar terperinci, dalam hal ini saya tidak akan salah jika saya mengatakan bahwa sumber saya dijelaskan lebih baik daripada yang lain yang hanya dapat Anda temukan. Di komentar tepat di kode sumber Anda akan menemukan semua pinouts untuk menghubungkan modul dan semua tautan yang diperlukan ke dokumentasi eksternal. Rahasianya sederhana - saya menulis komentar untuk diri saya sendiri terus-menerus, "dalam perjalanan", jadi saya tidak mengalami kesulitan dengan dokumentasi.


Seperti yang sudah saya tulis, Anda bisa mulai tanpa memiliki semua modul. Misalnya, Anda dapat memulai tanpa memiliki modul radio atau ESP8266. Sensor tekanan barometrik BMP180 juga mungkin hilang. Tambah nanti. Benar, dalam hal ini, Anda (mungkin) harus berkomentar secara independen di sketsa bagian-bagian kode yang bertanggung jawab untuk berinteraksi dengan blok yang hilang, tetapi kemungkinan besar ini tidak akan diperlukan. Hal utama adalah bahwa setidaknya sesuatu telah dikumpulkan dan diraih, maka lebih menyenangkan untuk melanjutkan.


Khususnya, pada titik ini dalam cerita, kami belum menyusun modul tanpa jendela (eksternal) dan kami tidak memiliki server web kami sendiri dengan database, kami belum membutuhkannya (tetapi jika demikian, tancapkan segera sehingga Anda tidak perlu menggali):


  • modul radio nRF24L01 +
  • Modul WiFi ESP8266.

Namun, saya mungkin akan mulai dengan ESP8266, sebagai yang paling bermasalah dalam pemrograman dan pengoperasian modul. Alasannya terletak pada variasi kinerja modul itu sendiri dan firmware mereka.


Ketika saya menulis firmware AT standar untuk itu, ada sejumlah kelemahan:


  • mereka masih lembab (per 2016)
  • Saya tidak dapat menemukan perpustakaan normal untuk Arduino untuk mengontrol modul ESP8266 menggunakan perintah AT, saya harus "pertanian kolektif" sendiri.

Saya tidak mengeluarkan kode untuk ESP8266 di perpustakaan terpisah, tetapi hanya menulis fungsi yang diperlukan, sehingga sketsa keluar begitu lama. Selain itu, saya hanya menerapkan fungsi yang saya butuhkan. Semua pemrograman untuk ESP menggunakan perintah AT diturunkan ke string parsing dan pengaturan penundaan antara perintah.


Anda dapat menemukan dan mengunduh kode sumber untuk server (modul pusat) server.ino di sini .


Selanjutnya saya meletakkan firmware untuk ESP8266 dalam file firmware/AT23-SDK101-nocloud.bin dan dokumentasi untuk yang penasaran ada di direktori yang sama. Dengan menginstal firmware yang ditunjukkan, Anda dapat yakin bahwa sketsa saya akan berfungsi dengan WiFi seperti yang dimaksudkan. Saya tidak bereksperimen dengan firmware AT lainnya. Faktanya adalah saya berhasil menemukan firmware non- AT "canggih", dan bahkan berpartisipasi sedikit dalam pembuatannya, yang sangat cocok untuk keperluan kita (ini dia esp-link ). Namun, seperti yang sering terjadi, semuanya terjadi setelah pekerjaan pada versi stasiun cuaca saat ini selesai, sehingga diputuskan untuk membiarkannya apa adanya.


Jadi, di awal Anda harus mem-flash firmware AT yang ditentukan. Tidak ada yang rumit, tetapi juga sederhana. Cara melakukan ini dijelaskan banyak di mana pada jaringan - ESP8266 - menghubungkan dan memperbarui firmware .


Karena konverter USB-TTL saya tidak memiliki cukup daya saat ini dan port USB terus jatuh (ini giliran!), Saya secara elektris menghubungkan modul untuk firmware menggunakan “Arduino sebagai metode konverter TTL USB ke Serial sederhana”.


Karena saya bekerja di Linux, saya esptool.py dengan esptool.py . Untuk kenyamanan firmware, saya “nakolhozil” papan bantu kecil dengan sakelar (tidak dijelaskan di sini).


Setelah flashing, Anda perlu mengatur kecepatan port ke 57600 (karena untuk SoftSerial, kecepatan port di 115200 besar dan tidak menjamin operasi yang stabil) dengan perintah


 AT+UART_DEF=57600,8,1,0,0 

Selanjutnya, Anda perlu sedikit memodifikasi pustaka IDE Arduino standar, yaitu, di file arduino/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h , ubah baris yang sesuai ke


 #define _SS_MAX_RX_BUFF 128 // RX buffer size 

dalam file arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h ubah baris yang sesuai ke


 #define SERIAL_TX_BUFFER_SIZE 128 #define SERIAL_RX_BUFFER_SIZE 128 

dan dalam file arduino/hardware/arduino/avr/cores/arduino/USBAPI.h ubah baris yang sesuai ke


 #define SERIAL_BUFFER_SIZE 128 

Sebenarnya, ini salah, karena saat memperbarui Arduino SDK, file-file ini kemungkinan besar akan ditimpa dan Anda harus mengulangi semua koreksi lagi. Dalam sains, kita harus menemukan perpustakaan kita sendiri, yang memanipulasi nilai-nilai yang ditentukan (jika mungkin), tetapi ini bukan untuk semua orang.


Dengan satu atau lain cara, manipulasi awal telah berakhir.


Sekarang kita meneruskan langsung ke kode unit pusat (server) server.ino


Di baris pertama, Anda harus mengubah pengaturan akses untuk titik WiFi Anda


 const String SSID = "..."; const String PASSWORD = "..."; 

bekerja dengan server web akan dibahas secara rinci nanti.


Berikut ini adalah definisi debugging (dikomentari):


 //#define DEBUG //#define DEBUG_RF //#define DEBUG_ESP //#define DEBUG_LOG_SD 

Jika terjadi kesalahan, Anda selalu dapat menghapus komentarnya, mengkompilasi ulang, dan memuat ulang sketsa dan mendapatkan lebih banyak informasi debug di konsol atau menulisnya ke file di kartu SD. Dan Anda dapat menghapus komentar hanya apa yang Anda butuhkan. Misalnya, modul nRF24L01 +? Maka batalkan komentar hanya DEBUG_RF, dll.


Berikutnya adalah komentar ekstensif dengan pinout, inisialisasi, dan deskripsi terperinci dari seluruh perangkat.


Di sini Anda dapat mengubah nomor saluran radio untuk nRF24L01 +


 #define RF_CHANNEL 73 

Berikutnya datang void setup() , yang dibuat jelas dari komentar rinci di sana. Nah dan kemudian void loop() , kode untuk bekerja dengan server web belum dipertimbangkan.


Setelah mengisi sketsa, unit pusat Anda akan hidup dan menunjukkan sesuatu kepada Anda, tetapi tidak segera, tetapi setelah 10 menit - nilai DELAY_LOCAL_SENSOR . Anda bisa mengubahnya tentu saja.
Layar harus menunjukkan: suhu dan kelembaban kamar (data dari sensor DHT11) dan tekanan barometrik (dari BMP180).


Fungsi-fungsi berikut bertanggung jawab untuk tampilan pada LCD 16 × 4:


 void lcdClearRow(int row) //     ,   void lcdPrintOutdoor(int temperature, int humidity, float voltage) //     ,   void lcdPrintHome(int temperature, int humidity, int pressure) void lcdPrintInfo(char info[LCD_MAX_COLS]) void lcdPrintStatus() void lcdPrintLastSensorTime() 

Desain layar LCD1604 adalah sebagai berikut.


Desain Layar LCD1604


Baris pertama (atas) mencetak ikon bergaya (pejalan kaki) yang dirancang untuk menunjukkan cuaca di jalan (keluar di jalan, turun di jalan). Saya datang dengan ikon sendiri, jadi jika Anda memiliki ide yang lebih baik (yang cocok dalam 5x8 piksel), Anda dapat menentukannya di komentar (sebagai array byte). Anda dapat berlatih seni pixel di sini Custom Character Generator untuk Modul LCD HD44780 . Pada baris yang sama, tegangan modul jendela dicetak.


Baris kedua mencetak "weather in the house" dan tekanan atmosfer. Ikon rumah adalah standar, dapat dimengerti oleh semua orang.


Pada baris ketiga, lcdPrintLastSensorTime() mencetak berapa banyak waktu telah berlalu (dalam detik) dari saat pembacaan terakhir dari sensor diambil, masing-masing jalan dan, dipisahkan oleh koma, rumah. Sangat berguna untuk mengetahui dengan pasti bahwa stasiun cuaca tidak menunjukkan cuaca untuk kemarin. Bahkan, ini adalah informasi debug dan dapat dihapus di versi final.


Dan di baris keempat terakhir layar menggunakan fungsi lcdPrintStatus() , informasi status dicetak, di mana


  • s adalah sensor tekanan lokal
  • e adalah modul ESP8266
  • saya adalah koneksi WiFi
  • w adalah ketersediaan server web
  • File log pada kartu SD

Setelah masing-masing huruf konvensional ini akan ada tanda plus atau minus, yang berarti tidak ada atau ada kesalahan, masalah dalam pengoperasian modul yang sesuai.


Kembali ke pertanyaan memilih besi, saya akan menjelaskan tentang keuntungan memilih layar LCD1604 teks daripada yang grafis. Faktanya adalah bahwa modul LCD1604 dibeli dari berbagai penjual dalam banyak kasus akan sama dan dapat diprediksi dalam koneksi dan mudah diprogram. Apa yang tidak bisa dikatakan tentang tampilan grafik, meskipun Anda dapat menggambar dan menunjukkannya lebih banyak. Keterbacaan gambar dari jarak beberapa meter sekali lagi lebih baik dengan tampilan teks, ya, ya, bisakah saya membuat font yang lebih besar pada tampilan grafis, tetapi kemudian berapa banyak yang bisa saya muat di sana?


Selanjutnya Segera setelah Anda mengisi sketsa dan memastikan semuanya berjalan sebagaimana mestinya, Anda dapat menyambung kembali "motherboard" Arduino Mega ke sumber daya eksternal. Atau biarkan apa adanya, terhubung ke USB komputer untuk melihat semua keindahan ini di konsol debug.


Jika Anda tidak memiliki semua blok yang dirakit, maka Anda dapat mengomentari kode yang tidak perlu. Walaupun, saya ulangi, itu harus bekerja seperti itu, hanya mendapatkan pesan kesalahan di konsol. Bagaimana menyiasatinya?


Misalnya, Anda belum membeli sensor tekanan atmosferik BMP180. Di sketsa server.ino , kami mencari garis yang bertanggung jawab untuk menghubungkan pustaka yang sesuai, dalam kasus kami


 #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP085_U.h> 

Mengomentari di blok ini.


Selanjutnya, dalam Arduino IDE, kita mulai mengkompilasi kode (bukan firmware) dan melihat baris mana yang disumpah oleh kompiler. Kami mengomentari baris ini. Kami ulangi operasi hingga kode dikumpulkan secara normal, tanpa kesalahan. Sebelum mengedit, adalah praktik yang baik untuk membuat salinan sketsa sehingga ketika sensor yang diinginkan datang dari China yang cerah, jangan ulangi semua operasi kembali.


Tautan ke perpustakaan yang digunakan diberikan dalam kode sumber. Jika tidak ada tautan seperti itu, maka perpustakaan IDE standar Arduino digunakan.


Untuk berjaga-jaga, semua perpustakaan (kecuali yang standar) yang saya gunakan disimpan di direktori perpustakaan . Sebenarnya, ini salah. Anda harus mengunduh versi terbaru perpustakaan dari repositori resmi mereka (dengan bug tetap, fitur baru), tetapi jika mereka sulit ditemukan, apakah sudah dihapus atau versi lama tidak didukung, hanya untuk kasus ini saya menyimpan semua perpustakaan yang digunakan.


Berikutnya adalah perakitan transduser, jadi bagian ini keluar pendek agar tidak bercampur.

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


All Articles