Selamat siang, Habrovsk!
Pengantar singkat
Suatu hari saya menjadi pemilik bahagia dari salah satu pemain papan tunggal terkecil yang bekerja pada LEDE, dan hal pertama yang ingin saya lakukan (setelah mengedipkan LED) adalah stasiun cuaca rumah, yang dapat diakses dari mana saja. Langkah pertama adalah mengambil data tentang suhu, kelembaban dan tekanan. Untuk ini, sensor
DHT11 dan
LPS3311AP yang dibeli sebelumnya dipilih (foto di bawah potongan).
Foto untuk mereka yang tertarik Setelah google singkat, ternyata jika keluarga pertama didokumentasikan dengan baik dan memiliki banyak perpustakaan untuk bekerja, maka barometer yang saya pilih tidak begitu populer kecuali untuk perpustakaan yang ditulis sendiri (walaupun sangat berkualitas tinggi) untuk toko Arduino di mana sensor dibeli (bukan iklan, hanya sebuah penghormatan), tidak ada yang dapat ditemukan.
Pilihan apa yang tersisa?
- Kumpulkan layer pada mikrokontroler ATmega328, flash, isi kode yang sudah jadi dan bacalah darinya. Sangat mengasyikkan, tetapi sepertinya mencoba merakit sepeda untuk digunakan nanti sebagai penopang.
- Baca "secara manual" dengan I2C, mengandalkan lembar data resmi . Saya mencoba, itu mungkin, tetapi saya tidak ingin menghasilkan skrip bash dan tampaknya tidak sesuai secara metodologi.
- Tulis perpustakaan untuk bekerja dengan sensor seperti yang Anda inginkan.
Jika Anda tertarik pada bagaimana itu datang dan apa yang terjadi, selamat datang di kucing.
Pertanyaan pertama yang saya temui adalah pilihan bahasa. Dari apa yang berhasil di papan tunggal ini tanpa menari dengan rebana - C ++ dan Python. Karena di masa depan saya ingin menempatkan proyek ini di jantung rumah pintar untuk diri saya sendiri, pilihan ada pada yang terakhir.
Karena efek itik, saya tidak mengajukan pertanyaan berikutnya (versi mana) dan segera memasukkan python3 ringan dan perpustakaan untuk bekerja dengan bus I2C.
Kemudian ada jam merokok, pertama
lembar data , kemudian
panduan perangkat lunak dari produsen. Mereka memungkinkan untuk mempersiapkan sensor dengan cepat untuk operasi (meskipun panduan perangkat lunak ternyata lebih lengkap, termasuk mengenai rekomendasi untuk memeriksa penyelesaian pengukuran dan "mengatur ulang" sensor untuk pengumpulan yang lebih akurat.
Kesulitan pertama yang saya temui adalah membaca data. Karena data dari termometer ditransmisikan dalam dua byte, dan tekanan dalam tiga, perlu untuk mendapatkan beberapa byte dan menggabungkannya menjadi satu nomor besar. Tapi python akan mengkonversi hex ke int secara default, dan penggabungan sederhana tidak berfungsi. Konversi int ke hex mengembalikan string yang digabung sempurna tetapi tidak dikonversi kembali ke angka. Jalan keluar? Mungkin saja untuk menghubungkan dukungan untuk tipe-c, tetapi saya tidak ingin dipusingkan, serta menyumbat memori dengan perpustakaan tambahan, jadi diputuskan untuk menulis fungsi pada 7 (sebenarnya 8, jika kita menghitung kamus) baris untuk menerjemahkan string pseudo-byte ke angka.
Hex berisi string ke ints_t_h = { '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4, '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9, 'a' : 10, 'b' : 11, 'c' : 12, 'd' : 13, 'e' : 14, 'f' : 15 } def __string_to_int(self, hex_string): l = len(hex_string) - 1 res = 0 for h in hex_string: res += s_t_h[h] * (16 ** l) l -= 1 return res
Saya percaya bahwa pertanyaan "mengapa membaca dari kamus?" Dapat ditanyakan di sini. jawabannya sederhana - tidak terpikir oleh saya untuk membuat keputusan yang jelas tentang tipe casting, jika para ahli memiliki jawaban untuk pertanyaan ini, saya akan dengan senang hati melakukan perubahan.
Kesulitan kedua yang membingungkan saya adalah interpretasi data. Kedua dokumen di atas memberikan rumus yang sangat sederhana untuk konversi:
Pout(mbar)=(PRESS_OUT_H & PRESS_OUT_L & PRESS_OUT_XL)[dec] / 4096
untuk tekanan;
T(degC) = 42.5 + (Temp_OUTH & TEMP_OUT_L)[dec] / 480
untuk suhu.
Apa yang menyenangkan, mereka langsung menawarkan sistem metrik.
Namun, pendekatan pertama dengan keras kepala memberi saya hasil 0x2F8000, yang berarti 760 milibar atau sekitar 585 mmHg. Seni Untuk ketinggian 130 meter di atas permukaan laut, ini jelas tidak cukup. Memeriksa ulang kode, membaca kembali informasi tentang pengukuran tekanan, me-reboot sensor dan bermain dengan akurat tidak memberikan apa-apa. Tetapi studi berulang dari pedoman ini membantu - stabil 760 mbar diartikan sebagai sinyal bahwa sensornya salah. Pembaca yang hati-hati melihat foto yang terlampir di awal artikel dapat memastikan bahwa sensor, pada prinsipnya, tidak ada pada chip :) Untungnya, saya dengan cepat membeli dua dari mereka sekaligus.
Foto chip kerja dan operasi yang tepat
Kotak hitam kecil di tengah adalah pelat pengukur HCLGA-16L, "jantung" sensor.

Setelah penemuan ini, menjadi jelas bahwa pemeriksaan kesehatan harus dilakukan. Jadi fungsi lahir:
periksa kerja BROKEN_MARKER = 0x2f8000/4096 def __working_check(self, address): c1 = self.__read_pressure(address) c2 = self.__read_pressure(address) c3 = self.__read_pressure(address) if c1 == c2 == c3 == BROKEN_MARKER: return True else: return False
Untuk menghindari kasus positif palsu yang jarang, tetapi masih berpeluang terjadi, pembacaan dilakukan tiga kali dan hanya setelah itu dikeluarkan vonis ketidakberoperasian. Dimungkinkan untuk menggunakan konstanta secara berlebihan dalam kode seperti itu, tetapi nada yang baik harus diperhatikan kapan pun memungkinkan.
Segera muncul ide di benak saya bahwa tidak akan buruk selama inisialisasi untuk memeriksa apakah alamat di bus sudah benar, dan fungsi
__deviceAdressCheck ditambahkan, yang memeriksa register
WHO_AM_I dan
berharap menerima nomor yang didambakan 0xBB.
Mengenai hal ini, tampaknya, tidak ada poin yang lebih menarik.
Kode lengkap tersedia di github dan tersedia untuk digunakan dan dimodifikasi.