Artikel ini dikhususkan untuk petualangan petualangan menarik yang harus saya lalui dalam proses membuat sensor eksternal yang diperbarui untuk stasiun cuaca yang dijelaskan
di sini dalam artikel ini satu setengah tahun yang lalu. Menurut pengalaman operasi dari versi sebelumnya, saya benar-benar ingin membuat sensor dengan tampilan kontrol sehingga akan mungkin untuk secara berkala memeriksa (dan memverifikasi) komponen stasiun yang paling berubah-ubah - sensor kecepatan angin. Petualangan dimulai ketika saya mulai memilih tampilan untuk tujuan ini dan, untuk sejumlah alasan, tentang yang lebih lanjut, saya memilih produk MELT asli saya. Tetapi sebelum saya menjelaskan
teknik cara-cara
seks non-tradisional untuk mengatasi produk-produk dari perusahaan ini yang saya pilih, ada baiknya untuk membahas secara singkat alasan utama semua modernisasi muluk yang saya mulai.
Dalam komentar pada artikel itu, saya benar menunjukkan tentang desain sensor bahwa sumbu perangkat seperti itu harus memiliki ujung yang solid dan bertumpu pada alas yang sama-sama solid (ingat jam tangan “pada banyak batu”). Tentu saja, saya tahu ini, tapi kemudian saya tidak bisa memikirkan cara untuk memberikan sumbu cahaya dengan titik tajam kekerasan yang cukup, jadi, sebaliknya, saya mengambil jalan meminimalkan gesekan dengan merendam ujung kuningan (untuk baling-baling cuaca) atau dural (untuk sensor kecepatan) di PTFE yang lembut (lihat . Pengrajin dalam artikel yang ditentukan). Dalam pemahaman penuh, bahwa keputusan ini bersifat sementara dan berumur pendek dan dalam waktu dekat akan diperlukan untuk menghasilkan sesuatu yang lebih substantif.
Hasil dari dua musim operasi terakhir menunjukkan bahwa solusi semacam itu sangat cocok untuk baling-baling cuaca, yang, tentu saja, menggergaji dasar fluoroplastik ke logam dengan sumbu kuningan, tetapi itu tidak menyakitinya sama sekali - gesekan minimal tidak diperlukan di sana, bahkan sebagian sebaliknya. Itu lebih buruk dengan sensor kecepatan, di mana tidak hanya fluoroplastic digergaji di pangkalan, tetapi juga ujung itu sendiri dari duralumin lunak terhapus panjangnya dua milimeter. Sebagai hasilnya, pertama-tama, ambang untuk memulai tidak dapat diterima meningkat dan sensor harus dimodernisasi. Anemometer itu sendiri juga mengalami modernisasi, karena laser compact disc atas dasar yang dibuat bertingkat dari matahari dan memperoleh penampilan yang tidak rapi (saya juga tidak tahu sebelumnya bahwa compact disc terdiri dari dua lapisan).
Saya berharap untuk memberi tahu Anda lebih banyak tentang sensor baru nanti, setelah itu setidaknya sedikit beroperasi dan Anda dapat memastikan bahwa Anda tidak perlu mengubah apa pun sekaligus (yaitu, tidak lebih awal dari awal musim panas). Dan sekarang hanya beberapa detail tentang perubahan pada rangkaian pengukuran, karena mereka terkait dengan topik utama artikel ini.
Tentang rangkaian pengukuran sensor
Sehubungan dengan penurunan ambang awal, muncul pertanyaan tentang waktu yang diperlukan untuk mengukur frekuensi rendah yang berasal dari sensor kecepatan (untuk detail, lihat
publikasi ini tentang metode untuk mengukur frekuensi rendah). Agar tidak membatasi ambang memulai artifisial, dalam hal ini kita harus mengukur frekuensi mulai dari 1-2 hertz: mengingat sensor memiliki 16 lubang dalam lingkaran (lihat foto sensor
pada artikel asli ), ini sesuai dengan kira-kira satu revolusi dalam 8-16 detik, yang jelas lebih rendah dari ambang batas untuk memulai. Artinya, batas waktu untuk menunggu kedatangan pulsa frekuensi berikutnya harus setidaknya 1 detik (lihat artikel yang ditunjukkan pada metode pengukuran), yang membuat masuk akal dari kisah hemat energi: untuk mendapatkan waktu pembaruan yang dapat diterima dan pada saat yang sama mengelola untuk meratakan data untuk menghindari obrolan di layar, kita harus bangun controller setiap dua detik. Dan jika setengah dari mereka akan meluangkan waktu untuk menunggu pulsa, maka tidak akan ada penghematan energi - dengan mempertimbangkan fakta bahwa LED yang memancarkan sensor telah bekerja selama ini, menghabiskan sekitar 20 mA.
Beberapa detail dalam tanda kurungSaya perhatikan dalam tanda kurung bahwa sehubungan dengan masalah ini, saya langsung ingat meter saat ini yang dirancang di biro desain kami di awal tahun delapan puluhan, bahkan sebelum munculnya semua jenis pengendali. Rata-rata vektor sejati diterapkan di dalamnya: yaitu, rekaman semua bacaan dihitung oleh sinyal dari meja putar sensor kecepatan itu sendiri - sebuah analog perkiraan dari bangun interupsi eksternal. Dengan kata lain, jika tidak ada arus, maka tidak ada rekaman yang dibuat, dan sirkuit tidak mengkonsumsi apa pun - hanya jam waktu nyata yang bekerja. Ambang untuk memulai meja putar itu, dibuat dalam bentuk
impeller dengan daya apung nol, adalah, sejujurnya, 2-3 cm / detik, dan meter menunjukkan arah dengan memutar seluruh tubuh. Jadi ada di dalam air, yang 700 kali lebih padat dari udara! Selama waktu rata-rata, yang berjumlah berjam-jam, roda gila akan terbalik setidaknya sekali, karena hampir tidak ada pengukuran kosong di sana. Dan untuk stasiun cuaca,
seperti yang telah disebutkan , metode rata-rata yang benar secara matematis tidak cocok, karena dengan tidak adanya angin seharusnya menunjukkan sesuatu yang nyata. Oleh karena itu, di sini kita tidak dapat melakukan tanpa batas waktu artifisial terbatas untuk menunggu pulsa dari sensor.
Dimungkinkan untuk melengkapi kontrol yang kompleks dari kebangkitan pengontrol dari dua sumber: biasanya dari gangguan eksternal dari sensor kecepatan (yaitu, sambil menunggu pulsa dari sensor, pengontrol juga masuk ke mode hemat daya), dan jika tidak ada angin, ia dipaksa dari Watchdog. Ini akan masuk akal hanya ketika mengubah prinsip membaca sensor kecepatan dari optik ke sirkuit yang lebih hemat energi (yang masih perlu dicari - sensor Hall, misalnya, mengkonsumsi 5-10 mA, yang secara fundamental kurang dari desain optik). Tapi semuanya disederhanakan karena fakta bahwa sensor saya sekarang didukung oleh baterai surya, yang memungkinkan saya untuk hanya meninggalkan mode hemat daya.
Untuk pembacaan jam, saya tidak repot-repot dengan timer atau menghitung Arduino millis (), tetapi cukup mengatur generator frekuensi eksternal primitif dengan periode sekitar 1,5 detik pada timer 555:

Seperti yang kita ingat, rangkaian sensor menggunakan Atmega328 controller "telanjang" dalam paket DIP, diprogram melalui Uno dan dipasang pada soket, Arduino sendiri digunakan hanya untuk prototyping. Output generator dihubungkan ke pin interupsi INT0, pin 4 dari rangkaian mikro (pin D2 dari papan Uno). Interupsi perbedaan positif (RISING) menetapkan bendera tertentu, yang menurutnya bacaan berikutnya diambil dalam siklus utama. Frekuensi dari sensor juga diukur dengan metode interupsi (output sensor terhubung ke input interupsi INT1, pin 4 (D3), lihat metode terakhir
dalam artikel yang sama ), karena total waktu tunggu maksimum adalah dua kali periode frekuensi yang diukur. Dengan batas waktu 1 detik, maka, frekuensi minimum yang diukur adalah 2 Hz (satu putaran anemometer dalam 8 detik). Dalam setiap siklus keempat, rata-rata terjadi dan data yang sudah selesai dikirim ke modul utama, yaitu, bacaan diperbarui kira-kira setiap 6 detik.
Keseluruhan cerita dengan sensor yang diperbarui harus dikalibrasi dan diperiksa secara berkala untuk melihat apakah gesekan telah meningkat, membandingkan bacaan dengan anemometer manual. Oleh karena itu, sangat merepotkan ketika bacaan ditampilkan di satu tempat (di rumah), dan sensor eksternal dipasang di tempat yang sama sekali berbeda - di gazebo taman. Muncul pertanyaan tentang memasang LCD kontrol di rumah sensor. Karena keindahan tidak diperlukan di sini, persyaratan informasi untuknya minimal: tampilan 10 karakter satu baris sudah cukup. Tetapi persyaratan geometriknya cukup ketat: layar harus pas dengan lebar case yang ada, yaitu 70 mm. Saya harus mengatakan bahwa karena ketidaksukaan organik saya terhadap tampilan LCD (redup, kontras rendah, dengan huruf kecil, kualitas cahaya latar yang menjijikkan, dan juga banyak mengonsumsi, lebih banyak tentang itu nanti), saya hampir tidak mengetahui kisaran yang tersedia di ritel. Dan dengan segera menjadi jelas bahwa tampilan yang saya butuhkan harus sangat dicari untuk dijual: layar LCD 16x2 standar, yang dominan di toko-toko, memiliki panjang papan 80 mm dan tidak dapat masuk ke sensor saya, dan semua jenis lainnya bahkan lebih besar ukurannya, terlepas dari dari perusahaan. Di alam, tentu saja, ada varietas yang lebih kecil, tetapi kemudian di alam, dan bukan di ritel domestik.
Solusi: oh MELT!
Pada akhirnya, saya menemukan dua MELT sekaligus yang sangat sesuai dengan tugas saya. Yang pertama adalah 10-karakter MT-10S1 single-line dengan controller, yang, menurut produsen, "
mirip dengan HD44780 dari HITACHI dan KS0066 dari SAMSUNG ." Ini memiliki karakter yang agak besar: tingginya lebih dari 8 mm, yang sebenarnya merupakan ciri khas pajangan Tiongkok dengan ukuran yang jauh lebih besar. Lebar papan adalah 66 mm, dimensi layar yang menonjol (eksternal) adalah 62x19,5. Konsumsi dalam hal ini tidak terlalu mengganggu saya (karena sensor eksternal ditenagai oleh baterai tenaga surya jelas lebih besar dari yang diperlukan), tetapi karena kebiasaan, melihat garis dalam lembar data, saya menemukan bahwa itu juga lebih kecil dari biasanya - 0,7 mA (semua LCD biasa ditampilkan pada analog HD44780 mengkonsumsi dari 1,2 mA dan lebih tinggi). Masih ada lampu latar ke tumpukan, seperti biasa untuk semua jenis ini - agak miskin dan pada saat yang sama menghabiskan banyak energi.

Tampilan kedua MT-10T7 bahkan lebih menakjubkan: tepatnya dalam dimensi yang sama muat 10 digit tujuh segmen dengan ketinggian sebanyak 13 mm. Beberapa kecurigaan disebabkan oleh non-standar, dan, tampaknya, antarmuka buatan sendiri (yang contoh pemrograman dalam pseudocode verbal bahkan diberikan dalam lembar data). Layar tidak mengandung pengontrol nyata: ada satu set pemicu kait statis yang dikendalikan oleh logika kombinasional. Namun berkat kesederhanaan ini, seluruh desain ini hanya mengkonsumsi 30 μA, yaitu, sangat cocok untuk perangkat yang beroperasi dengan daya baterai sepanjang waktu (konsumsi 1,4 mA di layar konvensional dan bahkan 0,7 mA di MT-10S1 jauh lebih tinggi daripada yang diizinkan untuk seperti itu). penerapan nilai - hitung sendiri berapa lama tampilan seperti itu akan bekerja, bahkan tanpa memperhitungkan komponen perangkat yang tersisa, misalnya, dari baterai AAA dengan kapasitas sekitar 1500 mAh).

Singkatnya, berikan dua!
MT-10T7
Upaya untuk secara independen mereproduksi algoritma untuk MT-10T7, yang dijelaskan dalam lembar data (baik pada Arduino dan pada assembler murni), tidak mengarah pada kesuksesan. Apa yang dilakukan salah, saya tidak mengerti, karena saya menemukan
publikasi ini , di mana penulis (eshkinkot) memberikan contoh penanganan MT-10T7 yang ditulis dengan sangat baik dan benar-benar dieksekusi, setelah itu semuanya langsung bekerja. Jika ada yang tertarik, maka di
sini terdapat contoh eshkinkot yang dimodifikasi, dilengkapi dengan semua simbol bermakna yang valid pada indikator tujuh digit, termasuk huruf yang tidak cocok dengan angka:




Dalam gambar-gambar ini, kontras layar sedikit terdistorsi dengan mengatur pembagi ke output Vo - 18 kOhm (berkuasa): 10 kOhm (ke ground), meskipun tanpa itu kontras "default" cukup dapat diterima.
Saya kemudian menambahkan ke contoh yang ditunjukkan fungsi yang mereproduksi angka acak pada tampilan dalam tiga hingga empat tempat desimal - positif atau negatif, bilangan bulat atau titik mengambang, yaitu, jumlah total karakter dapat mencapai lima: "-12,7", misalnya. Karena titik dalam kode tujuh-segmen tidak menempati keakraban terpisah, jumlah bit maksimum yang akan ditampilkan adalah 4. Parameter input untuk fungsi ini adalah: a) array (char buf [5]) yang berisi representasi ACSII dari angka, b) jumlah karakter aktual di dalamnya (ii dari 1 hingga 5) dan c) posisi (pos dari 0 hingga 9) tempat meletakkan tanda pertama (kiri) nomor (untuk fungsi dan notasi yang digunakan sepanjang jalan, lihat publikasi yang ditunjukkan oleh eshkinkot atau dalam contoh dengan referensi):
Kode fungsivoid writeASCIIdig_serial(char buf[5], byte ii, byte pos)
Modul MT-10T7 untuk kontrol output nilai numerik lebih nyaman daripada tampilan garis-matriks biasa: ia memiliki angka besar, dan titik desimal tidak menempati keakraban yang terpisah dan, oleh karena itu, seseorang dapat memasukkan satu karakter lagi di posisi yang sama. Tetapi untuk tujuan saya, akan lebih mudah jika ada kemungkinan menghasilkan huruf (jika tidak arah harus ditampilkan dalam derajat kompas, yang agak tidak biasa). Oleh karena itu, untuk kasus ini, saya memalingkan mata saya ke matriks single-line MT-10S1 ukuran identik yang sama, yang, terlepas dari sejumlah kekurangan, dan bermigrasi ke desain yang sudah jadi. Pada saat yang sama, ia sudah memiliki lampu latar, yang tidak dimiliki MT-10T7 (untuk ini perlu segera membeli MT-10T8), dan saya memutuskan bahwa dalam hal ini kehadirannya tidak akan sakit.
MT-10S1
Layar MT-10S1 memiliki ukuran huruf satu-setengah kali lebih kecil, tetapi juga ukuran yang cukup baik. Selain itu, layarnya dikemas secara ekonomis dalam dimensi keseluruhan: tidak ada mitra impor 10 digit, tetapi di Winstar WH1601L (di mana karakternya sedikit lebih pendek), milimeter keseluruhan lebih dari satu tanda dari panjang papan dan layar. Nah, konsumsi pengontrol hampir setengahnya (dibandingkan dengan WH1601L yang sama). Sebenarnya, keuntungan berakhir di sana, kemudian "fitur" dimulai.
Modul ini membanggakan bahwa, sebagaimana telah disebutkan, ia memiliki controller yang kompatibel dengan HD44780 HITACHI. Artinya, dia harus bekerja dengan Liquid Crystal kesayangannya tanpa tekanan yang tidak semestinya. Selain itu, halaman pengkodean "default" bertepatan dengan halaman English-Cyrillic HD44780 dan banyak analoginya, yaitu, MT-10S1 harus bekerja dengan Liquid Crystal Rus tanpa masalah, tidak ada halaman kode yang diperlukan untuk ini untuk diaktifkan. Dan dia benar-benar melakukan semua ini, tetapi dengan nuansa.
Peringatan pertama - dalam versi single-line, pengembang tampaknya menghemat register, dan hanya 8 karakter string (alamat 00h - 07h) ada dalam memori per register (dan dua karakter yang tersisa sudah ada di register lain (40h-41j). Artinya, tampilan de facto adalah dua garis, hanya kedua garis secara fisik terletak di satu garis. Setelah pemeriksaan lebih dekat, ternyata hal yang sama berlaku untuk WH1601 (hanya di sana register kedua mengambil delapan digit penuh). Mengapa hal ini dilakukan dengan sangat tidak nyaman sama sekali tidak jelas, dalam tampilan display 16x2 biasa adalah enam belas-bit, dan pemotongan seperti itu hampir tidak membuat produk lebih murah, sebaliknya, karena kebutuhan untuk menghasilkan versi yang berbeda dari pengontrol (jika mereka berbeda, yang saya tidak yakin sama sekali). Saya pikir itu terkait dengan konsumsi MT-10S1 yang kurang dari biasanya, tetapi WH1601 yang sama mengkonsumsi 1,2-1,4 mA, artinya, tidak ada bedanya dengan rekan-rekan tingkat lanjutnya.
Tampaknya, oke - dalam Liquid Crystal Rus, fungsi setDRAMModel () dan konstanta LCD_DRAM_WH1601 yang sesuai ditemukan. Untuk mode ini, perpustakaan memiliki terjemahan alamat yang jelas:
if (ac>7 && ac<0x14) command(LCD_SETDDRAMADDR | (0x40+ac-8));
Tapi saya tidak tahu cara kerjanya pada tampilan satu baris lainnya, dan MT-10S1 sepenuhnya menolak untuk bekerja dalam mode ini - layar tetap kosong. Karena kita berbicara tentang mengatasi, Anda tidak akan dapat memperbaikinya dengan fungsi sederhana yang ditulis sendiri di atas perpustakaan, tetapi saya tidak melihat-lihat di perpustakaan dan mencari tahu apa masalahnya - Saya sudah memiliki lebih dari setengah lusin opsi terkoreksi Kristal cair, saya tidak ingin memproduksinya dan selanjutnya.
Tampilan MT-10S1 harus dinyatakan sebagai dua baris: lcd.begin (16, 2); (alih-alih 16 Anda dapat mengganti 10 atau 12, tidak ada yang akan berubah, karena jumlah karakter sebenarnya dalam satu baris masih 8). Upaya untuk menginisialisasi sebagai baris tunggal (nomor 1 di posisi kedua) akan menyebabkan kegagalan - latar belakang akan menjadi gelap. Dan angka multi-digit hanya dapat ditampilkan dalam 8 karakter, untuk garis yang lebih panjang, karakter ekstrem di atas 8 akan hilang begitu saja. Oleh karena itu, karakter 9 dan 10 hanya cocok untuk menampilkan jumlah tambahan (unit ukuran, misalnya), atau Anda perlu memecah nomor baris menjadi digit yang terpisah, dan ketika melampaui karakter 8, ubah posisi kursor ke karakter pertama dari baris kedua.
Untuk penderita
, di sini Anda dapat mengunduh sketsa percobaan untuk tampilan ini (koneksi lead - dalam teks sketsa atau dalam diagram di bawah). By the way, kontras (tentang yang tidak ada kata dalam dataset pabrik, dan output Vo ditetapkan sebagai NC) disesuaikan dengan cara yang biasa di sini, tetapi Anda benar-benar tidak perlu melakukan ini: dengan tidak adanya cahaya latar, latar belakang tampak agak gelap, tetapi ketika Anda mencoba mencerahkannya dengan menghubungkan pembagi ke output Vo Kontras hilang secara nyata ketika lampu latar dihidupkan.
Antarmuka dengan pengontrol
Setelah memeriksa bahwa semuanya berfungsi sebagaimana mestinya, muncul pertanyaan tentang bagaimana menghubungkan semua ini ke pengontrol sensor. Tentu saja, tidak ada kesimpulan gratis yang cukup untuk pengontrol sensor untuk memberikan kontrol darinya, tetapi saya tidak benar-benar ingin memagari kota dengan pengontrol besar - lebih nyaman ketika sistemnya modular dan output ke tampilan tidak mengganggu pengoperasian algoritma dasar yang sudah dibajak sebelumnya. Tetap menggunakan antarmuka serial.
Ini memunculkan solusi I
2 C berdasarkan PCF8574 (atau banyak analognya), terutama karena chip ini sendiri hanya merupakan register geser yang diperdaya, dan karena itu mengkonsumsi beberapa puluh mikroampere di tempat kerja dan kurang dari 10 mikroamper saat istirahat. Bersama dengan MT-10T7 mereka membentuk pasangan yang sangat baik untuk membuat perangkat berdaya rendah dengan indikator, dan MELT bahkan memiliki opsi yang siap pakai untuk kasus ini:
MT-10T11 dengan total konsumsi 30 μA.
Tetapi untuk MT-10S1 tidak ada solusi yang mudah - untuk beberapa alasan, hanya versi dengan konfigurasi 20x4 yang disertakan dengan tambahan dalam bentuk analog PCF8574 di antara tampilan garis MELT (
UPD: dalam komentar mereka menyarankan ada juga konfigurasi MT-16S2H 16x4 dengan antarmuka yang sama, meskipun , dimensinya melebihi dimensi yang saya butuhkan). Modul selesai dari tipe yang dijelaskan
dalam artikel ini tidak nyaman digunakan dalam kasus ini, karena fitur kedua yang tidak menyenangkan dari tampilan MT-10S1 adalah pinout non-standarnya. Kesimpulannya sama (HD44780, namun, lebih tepatnya, pasangan domestiknya, KB1013VG6), tetapi semuanya berada dalam urutan yang sama sekali tidak standar. Demi kepentingan, saya memeriksa baik impor 16x1 dan MELT dua baris / empat baris - mereka semua memiliki urutan keluaran standar, dan MT-10S1 menonjol di latar belakang ini karena beberapa alasan. Jadi, Anda harus membuat keputusan sendiri.
Sebagai hasilnya, saya dengan sepele menempatkan pengontrol ATmega328 yang sama ke layar, diprogram dengan cara yang sama - melalui UNO, dan kemudian dimasukkan ke dalam soket pada papan terpisah, hanya dilengkapi dengan aksesori yang diperlukan untuk memulai: kuarsa dengan konduktor, catu daya dan rangkaian-RC. Reset output (lihat sirkuit sensor
di artikel asli , di mana controller terhubung dengan cara yang sama).
Berbicara tentang Reset ChainingBy the way, tentang rangkaian Reset: Saya memiliki kapasitor sekecil 1 μF pada resistor beberapa kOhms, yaitu, waktu tunda saat menyalakan daya adalah beberapa milidetik. Berapa banyak? Manual ini mengajarkan kita bahwa, seperti untuk seluruh keluarga Mega, rantai eksternal tidak diperlukan sama sekali di sini, awal yang benar seharusnya dilakukan oleh sirkuit internal, dan jauh lebih cepat. Tetapi kebiasaan meletakkan rantai RC eksternal pada pin 1 dari controller untuk start-up yang tertunda ketika saya dihidupkan tetap bersama saya dari waktu keluarga AVR Classic yang sudah terlupakan, di mana controller mungkin tidak memulai dengan benar jika tegangan suplai tidak cukup cepat. Dan dalam keluarga Mega Brown-out Detector, ini mungkin tidak berfungsi dengan baik. Dalam kasus-kasus kritis, masih bermanfaat untuk memasang monitor daya eksternal, well, tapi di sini rantai RC tidak melukai apa pun, tetapi dapat membantu dalam kasus dengan sumber daya yang buruk. Omong-omong, pengembang papan Arduino sangat menyadari hal ini, karena di papan Uno, misalnya, ada rantai yang sama 10 kOhm / 100 nF.
Dan Tuhan sendiri memerintahkan dua pengontrol AVR yang identik untuk di-dock melalui Serial-interface yang biasa, yang bagaimanapun, kecuali untuk proses pemrograman, tidak digunakan di tempat lain dalam proyek ini, dan untuk penggunaan yang semuanya sudah ada di tangan. Omong-omong, solusi semacam itu tidak berbeda harga dari komponen-komponen berbasis PCF8574 dan dapat bersaing dengannya dalam hal penghematan energi dalam varian dengan MT-10T7 - jika MT-10T11 yang disebutkan di atas tidak tersedia.
Secara total, rangkaian modul MT-10S1 dengan pengontrol adalah sebagai berikut (dalam diagram, penunjukan kesimpulan ATmega328 diberikan dalam tanda kurung setelah kesimpulan dari papan Arduino):

Di controller, saya menerapkan mode hemat daya (well, ya, itu tidak benar-benar diperlukan di sini, tapi mengapa menyimpan chip di sepanjang jalan yang tidak perlu?). Selain itu, wake-up terjadi sesuai dengan sinyal dari generator gelombang persegi yang sama pada chip 555 sebagai jam dari pengontrol utama, hanya kali ini di sepanjang tepi jatuh (FALLING) untuk sedikit memisahkan fungsi pengukuran dan transfer data.
Misteri alamSatu misteri alam terkait dengan ini, yang tidak bisa saya pecahkan. Diketahui bahwa Mega hanya dapat dikeluarkan dari tidur nyenyak oleh interupsi asinkron eksternal, karena jam dimatikan dan interupsi sinkron tidak dapat terjadi. Dan seluruh keluarga pengontrol AVR 28-pin, memimpin pohon keluarga mereka dari ATmega8 (48/88/168/328), hanya memiliki interupsi tingkat rendah seperti INT0 dan INT1 (dan interupsi PCINT, tetapi tidak digunakan dalam Arduino). Semua rekomendasi resmi terkait dengan ini baik dalam materi Atmel dan di situs Arduino. Contoh di situs web arduino.cc secara eksplisit mengatakan: "
Dalam semua mode tidur IDLE, hanya RENDAH yang dapat digunakan ." Dan ini, seolah-olah, tidak diragukan, misalnya, Biksu mengulangi hal yang sama secara lebih rinci
dalam bukunya : “
Perhatikan bahwa tipe interupsi RENDAH dipilih. Ini adalah satu-satunya jenis interupsi yang dapat digunakan dalam contoh ini. Jenis RISING, FALLING, dan CHANGE tidak akan berfungsi . "
Gangguan pada level rendah sangat tidak nyaman untuk digunakan, karena begitu terjadi, dengan level terendah pada output, ini akan terjadi berulang-ulang, dan langkah-langkah khusus harus diambil untuk menghilangkan pemicu yang tidak perlu. Jadi, mencari-cari di berbagai forum untuk mencari berbagai solusi untuk masalah ini, saya tiba-tiba menemukan beberapa contoh kode di mana INT0 dari tipe RISING atau FALLING secara eksplisit digunakan untuk keluar dari tidur. Tentu saja, saya menghubungkan ini dengan buta huruf dari penulis. Tetapi ketika
saya tersandung frasa: "
Meskipun Anda dapat menggunakan jenis interupsi (RISING, FALLING, CHANGE) lainnya - mereka semua akan mengeluarkan prosesor dari tidur ", saya memutuskan, terlepas dari musuh, untuk melakukan percobaan langsung - itu baik untuk itu dengan tangan.
Dan, yang mengejutkan saya, semuanya bekerja dengan sempurna. Mode Hemat Daya - SLEEP_MODE_PWR_DOWN; karena kesia-siaan, di sini saya tidak mengambil langkah-langkah untuk mengurangi konsumsi dengan menonaktifkan semua fungsi lainnya, tetapi generator clock tetap mati. Namun demikian, pengontrol bangun secara teratur di tepi jatuh, meminta data, menampilkannya di layar dan tertidur lagi. Demi kemurnian percobaan, saya melepas MK dari papan UNO dan memasukkannya ke dalam soket saya dengan kuarsa yang terhubung, dan semuanya masih berfungsi. Ini dapat dilihat dari konsumsi: hampir 17 mA dalam mode normal dan 0,9-1 mA dengan penghematan daya dihidupkan (yang 0,7 mA harus dikaitkan dengan tampilan).
Tanpa keluar dari keterkejutan saya, saya membaca lembar data dari Atmel, melihat ke buku Evstifeev (dengan terjemahannya), bahkan melihat manual Atmel lama tentang keluarga Klasik, kemudian menghabiskan setengah hari mencari setidaknya beberapa penjelasan tentang apa yang terjadi (baik dalam bahasa Rusia dan Rusia). dalam bahasa Inggris) di dua mesin pencari terkenal, tetapi tidak ada petunjuk sama sekali. Kecuali itu berguna dalam Atmel's Application Notes, karena diragukan bahwa sesuatu yang bertentangan dengan lembar data diterbitkan di sana. Saya akan senang jika seseorang yang tahu tahu apa yang saya salah pahami.
UPD: live assembler check (ATmega8) menunjukkan kepatuhan penuh dengan lembar data, yaitu, hanya gangguan level yang berfungsi. Satu-satunya penjelasan yang muncul dalam pikiran adalah bahwa Arduino entah bagaimana menghubungkan interupsi PCINT ke interupsi biasa. Upaya untuk memperjelas situasi dengan mempelajari teks perpustakaan sistem Arduino tidak menghasilkan apa-apa - di sana iblis akan mematahkan kakinya.
Transfer data dari pengontrol sensor ke pengontrol tampilan melalui UART diatur dalam bentuk dialog. Bangun, setiap gangguan ke-4, pengontrol tampilan meminta data pada gilirannya:
. . . . . if (flag==1) {
Berikut buft, bufhh, bufss dan bufd adalah array (bukan string!) Dari lima byte, yang berisi data tentang suhu, kelembaban, kecepatan dan arah dalam bentuk dekomposisi ASCII dari angka-angka yang sesuai. Agar tidak menerima terlalu banyak, setup'e menetapkan batas waktu penerimaan yang disingkat:
. . . . . Serial.begin(9600); Serial.setTimeout(10);
Lebih nyaman untuk ditampilkan: pertama, Anda segera memiliki panjang nomor yang diterima, dan kedua, fungsi Serial.print () mengirimkan string ASCII dari sisi pengontrol sensor, dengan jeda yang ditetapkan hanya dalam 10 ms yang sama antara pengiriman :
. . . . .
Perhitungan kecepatan dalam m / s di sini identik dengan yang dilakukan dalam modul utama stasiun (ambang awal diatur secara acak menjadi 0,3 m / s) dan juga harus diubah sesuai dengan hasil kalibrasi.
Jika Anda mencoba menerima data dengan Serial.read biasa (), dan kemudian menampilkan hasil penerimaan pada tampilan dengan fungsi seperti lcd.print (t, 1), di mana t adalah suhu dalam derajat, sama, misalnya, ke 12,7, maka MT-10S1 sebagai respons terhadap ini perintah akan menampilkan "49.5". Ditebak, atau disarankan? Ini adalah tiga karakter pertama dalam urutan "49 50 46 55", yaitu, dalam ekspansi ASCII dari angka "12,7". Oleh karena itu, lebih mudah untuk langsung menerima array karakter dan langsung menampilkan sebanyak karakter yang dikirim (hitungan adalah penghitung yang bertambah satu setiap interupsi):
. . . . if (count%8==0){
Baris terakhir perlu didekripsi. Faktanya adalah bahwa data arah dikirim dalam kode 0-15 (yang mana mereka masih ditransfer dari kode Gray ketika menerapkan
rata-rata vektor ). Dalam hal tampilan tujuh segmen MT-10T7, mereka diterjemahkan ke dalam derajat kompas:
. . . . . dd=atoi(bufd);
Dan di sini kita dapat menulis secara langsung dalam huruf Rusia, dengan cara yang sama seperti pada modul utama stasiun cuaca (karena itulah tampilan ini, pada kenyataannya, dipilih):
. . . . . void dir_dd(char dd[]) {switch(atoi(dd)) { case 0: {lcd.print(""); break;} case 1: {lcd.print("C"); break;} case 2: {lcd.print("C"); break;} case 3: {lcd.print("C"); break;} case 4: {lcd.print(""); break;} case 5: {lcd.print(""); break;} case 6: {lcd.print(""); break;} case 7: {lcd.print(""); break;} case 8: {lcd.print(""); break;} case 9: {lcd.print(""); break;} case 10: {lcd.print(""); break;} case 11: {lcd.print(""); break;} case 12: {lcd.print(""); break;} case 13: {lcd.print("C"); break;} case 14: {lcd.print("C"); break;} case 15: {lcd.print("C"); break;} }
Penampilan
Foto menunjukkan tampilan layar dengan pengontrol yang terhubung dalam kondisi kerja:

Beginilah tampilan unit sensor yang dimodifikasi:

Parameter lampu latar adalah yang ditunjukkan dalam diagram di atas. Karena penurunan tegangan pada lampu latar dalam modul MELT adalah 4,5 V, dengan catu daya 12 V, arus lampu latar adalah 50 mA (maksimum untuk modul ini 60 mA).
Rumah ini disegel secara maksimal untuk menghindari masuknya udara lembab (bingkai hitam layar tampilan berasal dari selubung karet kabel tipis). Pelat putih di sebelah kanan adalah penutup sensor suhu-kelembaban SHT-75, yang dikeluarkan dari kasing (sensor itu sendiri terletak di belakangnya). Kabel kuning di atas adalah antena pemancar 433 MHz. Di sebelah kiri adalah konektor di mana sensor kecepatan dan arah terhubung.
Jadi bacaan pada tampilan modul utama stasiun cuaca terlihat seperti (modul hitam dengan antena putih di sebelah kanan adalah penerima 433 MHz):
