Lampu CO2 (mh-z19)

co2-lampe-main

Di sini, cukup sering mereka berbicara tentang sensor mh-z19 dan tentang esp8266, dan juga tidak lupa menyebutkan protokol mqtt.

Saya membaca semua ini dan memutuskan untuk menggabungkan membaca dalam satu perangkat. Sebenarnya dalam gambar inilah dia.

Intro (lewati)


Saya sudah lama terdaftar di Habré dan saya membacanya lebih lanjut, tetapi saya tidak terlalu aktif, tetapi saya harus mengatakan bahwa saya belajar banyak hal baru dan berguna di sini. Dan dari waktu ke waktu pikiran menggerogoti saya bahwa perlu tidak hanya untuk digunakan, tetapi juga untuk memberikan sesuatu dan berbagi. Saya tidak dapat menawarkan sesuatu yang baru, tetapi saya menyelesaikan proyek saya dan menurut saya cukup menarik untuk dipublikasikan.

Fungsi / Firmware


Seluruh proyek dibangun di atas esp8266 dan, karenanya, dapat berkomunikasi dengan baik dengan Internet. Protokol mqtt digunakan untuk transfer data. Sejujurnya, saya tidak benar-benar masuk jauh ke dalam perangkat protokol, tetapi masalahnya ternyata sangat nyaman, saya menggunakan broker mosca untuk tes di rumah, dan sekarang saya menggunakan cloudmqtt mereka memiliki pilihan gratis, untuk hal sepele itu hanya itu.

Sekarang Anda dapat pergi ke fungsinya sendiri.

Ketika saya menyalakan lampu, sepertinya ada pengaturan yang sudah disimpan, jika tidak, itu menyalakan wifi dengan nama "CO2.box", di alamat "192.168.4.1" itu menunjukkan halaman pengaturan:

Tangkapan layar


Sebenarnya lampu dapat bekerja dalam dua mode:

1. Menghubungkan ke broker mqtt, mengirim data dan menunjukkan konten CO2 melalui LED.
2. Hanya menampilkan konten LED CO2 di dalam ruangan.

LED dapat mengubah warnanya dari hijau ke merah, secara teori itu RGB, tapi saya tidak menghubungkannya dengan biru, oleh karena itu hanya LED RG. Jika konten co2 adalah 400 ppm (PPM Min di webgui), lampu bersinar dalam warna hijau jernih dan ketika konsentrasinya meningkat, warnanya merah ketika mencapai maksimum (PPM Max dalam webgui) mulai berkedip merah.

Reset ditampilkan pada tombol terpisah, itu juga membuat tombol lain, jika Anda tahan lebih dari satu detik, maka pengaturannya diatur ulang.

Kode Tombol
Inisialisasi Tombol (GPIO0)
// initialise reset button void BtnInit() { // set GPIO 0 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); // enable pullup resitor PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U); // disable globar interrupt ETS_GPIO_INTR_DISABLE(); // attach interrupt function ETS_GPIO_INTR_ATTACH(input_intr_handler, NULL); GPIO_DIS_OUTPUT(BTN_CONFIG_GPIO); // empty status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(2)); // enable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_ANYEDGE); // enable global interrupt ETS_GPIO_INTR_ENABLE(); // timer os_timer_disarm(&DebounceTimer); os_timer_setfn(&DebounceTimer, &debounce_timer_cb, 0); } 

Periksa seberapa banyak tombol telah ditekan dan diatur ulang

 // button reset pressed void ICACHE_FLASH_ATTR debounce_timer_cb(void *arg){ //disable globar interrupt ETS_GPIO_INTR_DISABLE(); gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_ANYEDGE); ETS_GPIO_INTR_ENABLE(); //start if button was pressed any age (hight or low) if(timepressed){ timepressed = 0; uint32 count = system_get_time() - timecount; #ifdef DEBUG os_printf("DIFF: %d us\n", count); #endif //check time between button on/off, if more 1 sec start delete settings in flash if(count >= 1000000){ if(wipe_flash(DELALLCONF) == 0){ os_timer_disarm(&wifiErrorLedTimer); os_timer_disarm(&ppmMaxLed); os_timer_disarm(&SendDataTimer); os_timer_disarm(&wifiConnCheck); os_printf("\n"); startMode(); } } } else { timepressed = 1; timecount = system_get_time(); #ifdef DEBUG os_printf("SYSTEMTIME: %d\n", timecount); #endif } } 


Untuk mqtt , otentikasi pengguna melalui login / pass didukung. Anda dapat memastikan bahwa data dikirim melalui https, tetapi untuk ini Anda harus menanamkan sertifikat dalam firmware, yang bertentangan dengan konsep - Saya ingin semua pengaturan dilakukan melalui webgui.

Masalah


Saya ingin menjalankan server DNS pada esp8266, sehingga selalu mengembalikan alamatnya dan tidak harus memasukkan alamat IP. Sayangnya, dalam versi esp8266 sdk saya, saya menemukan bug yang tidak membuat paket Ethernet dengan benar dan checksum tidak konvergen di sana dan respons klien diabaikan. Saya melihat kesalahan melalui wireshark, dan juga kesalahan serupa dijelaskan di forum espressif. Jadi saya meninggalkan ide itu.



Firmware ternyata umumnya tidak buruk, tetapi misalnya, saya masih tidak menemukan / menemukan cara untuk menutup koneksi tcp dengan benar, jadi ketika saya mengirim data dari browser, itu (browser) menunggu sesuatu dan tidak menutup koneksi.

Secara umum, kualitas kode, menurut saya, tidak terlalu tinggi (atau lebih tepatnya mengerikan), ini karena ini adalah proyek kedua saya dengan (proyek pertama adalah jam ), serta fakta bahwa SDK entah bagaimana tidak terlalu jelas dan seringkali dokumentasi tidak banyak membantu dan harus mencari contoh.

Sebagai contoh, saya ingin meletakkan rekaman flash ke file yang terpisah, tetapi setelah itu pengaturan berhenti menulis ke flash. Saya tidak pernah menemukan alasannya.

Sisi besi


Kemudian saya mencoba turun dengan komponen minimal, sepertinya berhasil dengan cukup baik. Pada awalnya, saya ingin menggunakan versi pertama esp8266, saya menemukan di internet cara untuk mengelola register geser dengan hanya satu pin. Semuanya bekerja dalam proteus, tetapi tidak hidup. Saya pikir masalah saya adalah saya tidak menemukan kapasitor yang sesuai.

esp12e


Saya menggunakan ESP8266 12e, karena memiliki memori 4MB dan tujuh pin yang dapat digunakan. Pada awal dan hampir sampai akhir proyek, saya ingin menggunakan empat layar tujuh segmen tambahan, yang dihubungkan melalui empat register geser 74hc595 , tetapi kemudian, ketika saya mulai meletakkan papan, semuanya tampak sedikit rumit dan berlebihan bagi saya. Secara umum, saya menghapusnya, tetapi di komit masih ada kode di mana layar itu. Karena itu, jika ada yang membutuhkannya, maka di sana Anda dapat mengambil bagian yang tepat.

Saya juga ingin semua ini bekerja dari usb, langsung dari komputer usb atau melalui catu daya (seperti telepon). Saya mengambil catu daya dari nokia lama (n900), ia mengeluarkan 1A, jadi itu cukup untuk mata, tapi itu perlu untuk menurunkan tegangan untuk esp8266 ke 3.3v.

Untuk ini, saya menggunakan asm1117 dan masalah pertama sedang menunggu saya, untuk beberapa alasan itu hanya memberikan 3c, esp8266 bekerja darinya, tetapi tidak stabil dan kesalahan yang sangat aneh muncul ketika bekerja.

Sebagai contoh, dia esp8266 tidak bisa menulis data ke flash, hanya reboot, butuh waktu cukup lama, sampai saya menyadari dari mana kesalahan itu berasal, saya hampir melompat-lompat dengan rebana.
Asm1117 sendiri menghasilkan 3.3-3.5v yang dibutuhkan, tetapi pada esp8266 hanya 2.8-3.1v. Pada prinsipnya, saya benar-benar tidak menyelesaikan masalah, saya menduga itu (tegangan) jatuh pada kabel. Kemudian saya redid seperti pada gambar di bawah ini dan semuanya mulai bekerja secara stabil.

Seperti sekarang


5v juga dibutuhkan hanya untuk sensor co2, omong-omong saya bisa mendapatkannya dengan 3.3V. Tetapi ada masalah bahwa ia meningkatkan nilainya di suatu tempat dalam satu jam berlari hingga 2000 ppm, tetapi jika ia mematikannya dan menghidupkannya lagi, maka nilainya segera turun.

Skema


Output log terhubung ke GPIO2 jika sesuatu tiba-tiba tidak berfungsi. Komunikasi dengan sensor CO2 terjadi sebagai standar - melalui UART.

Kalau begitu, sepertinya tidak ada yang rumit. Dari sirkuit yang ada pada gambar di atas, saya membentangkan papan. Saya sudah memiliki pengalaman, sebelum itu saya berlatih dengan arloji dan semuanya terasa sedikit lebih rumit. Secara umum, ternyata seperti ini:


Sayangnya, saya memiliki kesalahan di sini (ditandai dengan warna merah), yang saya perhatikan hanya di bagian akhir. Tanah sensor CO2 terhubung ke pin ini, tetapi tanah ini tidak terhubung ke yang lain dan dalam bentuk ini sensor tidak berfungsi, saya harus memasang jembatan di tempat itu.


Lutim, putar, bor, gergaji


Dari gambar di atas Anda dapat melihat bahwa semuanya dilakukan dengan menjarah. Saya menggunakan metode ini dengan asam sitrat, saya membacanya di radio kucing . Mereka menulis bahwa reaksi terbaik didapat.

Set alat saya untuk menjarah, pada kenyataannya, semuanya terjadi di kotak hijau di sebelah kanan.

Semua yang Anda butuhkan untuk menyiangi


Setelah saya mencairkan solusinya, saya meletakkan wadah di wastafel dengan air hangat, airnya tidak boleh lebih panas dari 40-45 derajat.

Contoh


Ternyata pada prinsipnya cukup baik, sayangnya saya hanya punya foto dari versi pertama, tetapi ada kesalahan.

Ada beberapa masalah dengan usb, saya memutuskan untuk menggunakan micro usb untuk menguranginya, saya punya beberapa potong, tapi saya tidak tahu bagaimana me-mount mereka. Ini terlihat seperti ini:


Seperti yang Anda lihat, tidak ada yang bisa memperbaikinya ke papan, Anda hanya bisa solder untuk dua tonjolan sisi, yang saya lakukan. Mount ternyata sangat lemah dan bahkan ketika menguji semuanya datang.

Kemudian saya memesan papan kecil di mana micro usb sudah terpasang. Sesuatu seperti ini:

Biaya


Saya melesat semua ini - itu adalah solusi yang baik, masih berfungsi.


Pada akhirnya terlihat seperti ini

Kedua sisi



Perumahan


Dalam kerajinan rumah, ini sering menjadi masalah besar, untuk melakukan semuanya dengan rapi dan indah. Ketika saya memulai proyek, saya masih belum memiliki printer 3D, tetapi sejak awal saya ingin mencetak kasing. Kupikir itu bisa dipesan di suatu tempat. Ketika mencari tempat untuk mencetak case, saya memutuskan lebih baik membeli printer 3D untuk diri saya sendiri. Pada prinsipnya, tidak ada persyaratan khusus, yang utama adalah bahwa ia mencetak secara normal dan tidak memerlukan biaya banyak. Dia berhenti di Anet A8. Mencetak dengan sangat baik, meskipun untuk waktu yang lama.

Kemudian saya membuat model kasus 3D, saya hanya mengenali opsi ketiga sebagai berhasil.

Opsi yang gagal





Ini adalah model 3D yang saya buat untuk case ini. Di dalam tubuh terletak bahan pembobot, sebagai penyeimbang ke bola dari atas, sehingga tubuh ternyata agak tinggi.

Foto lebih dekat


Bersama-sama, ini terlihat seperti ini:



Sampul foto. Dia harus dipalu dalam kasus ini. Dibutuhkan dua lubang kecil di bagian atas agar Anda dapat menekan tombol. Solusinya tidak terlalu sukses, Anda perlu sesuatu yang tipis dan panjang, dan Anda juga perlu menemukan tombol di dalam dengan sentuhan. Pada prinsipnya, saya menemukannya tanpa masalah, tetapi bagi seseorang tanpa pelatihan akan sulit.


Jadi saya menyimpan LED RGB di atas:


Beberapa foto lainnya




Kesimpulan


Saya awalnya tidak tahu apa yang harus ditulis dengan sangat cerdas. Saya pikir mungkin saya bisa daftar beberapa masalah, ada banyak dari mereka.

Bahkan, proyek ternyata lebih banyak untuk pelatihan. Ketika saya baru saja mulai melakukannya, sekitar tahun lalu di musim panas, bagi saya itu tampak seperti perangkat yang berguna dan dengan beberapa kepura-puraan terhadap desain dan secara umum itu pasti indah. Tapi sekarang, ketika saya melakukannya, ternyata entah bagaimana dan tidak terlalu diperlukan, meskipun sepertinya tidak ada (istri saya suka), sekarang berdiri di sudut (dimatikan).

Saya menyelesaikan firmware di suatu tempat di awal Desember dan sudah lupa banyak dari semua yang ditulis, jadi ada beberapa poin kontroversial dalam hal pelatihan juga.

Sekarang saya tidak akan melakukan itu, bukannya bola saya akan lampirkan sesuatu yang kecil, seperti mercusuar laut.

Seluruh proyek terletak di github . Ada papan dan kode yang bercerai, serta model 3D (jika seseorang ingin mencetak semuanya). Omong-omong, tabung memiliki ukuran M10x20mm.

PS: Beberapa poin tentang saya pribadi:

1. Ini adalah artikel pertama saya, mungkin saya membaca banyak di sini, tetapi tetap, bersimpati.
2. Firmware tidak ditulis dengan sangat baik, mungkin seseorang ingin mengulangnya.
3. Saya meminta maaf sebelumnya atas banyaknya kata-kata bahasa Inggris, sejak usia 16 tahun saya belum tinggal di negara berbahasa Rusia dan karena itu sering tidak tahu apa yang disebut beberapa hal dalam bahasa Rusia.

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


All Articles