Tujuan proyek
Entah bagaimana ternyata saya membangun rumah saya, sebuah kerangka. Dalam aul mewah saya tidak ada gas dan tidak diharapkan dalam waktu dekat, itu sebabnya saya memilih kerangka - yang lainnya, bagi saya, akan sangat mahal untuk memanaskan dengan listrik. Yah, juga karena itu adalah salah satu teknologi termurah.
Ok, saya melemparkan pipa ke sekitar rumah, menggantung baterai, sebuah ketel, rasanya hangat, tetapi ada sesuatu yang salah.
Setelah mendengarkan diri sendiri, saya menyadari bahwa ini adalah kodok yang tidak saya sukai, bahwa ketika saya tidak di rumah (12-16 jam sehari), pemanasnya bekerja. Dan itu mungkin tidak bekerja, nyalakan hanya sebelum kedatangan, karena kerangka memiliki sedikit kelembaman dan memungkinkan Anda untuk dengan cepat menaikkan suhu. Situasi yang sama ketika suatu tempat lama meninggalkan rumah. Nah, secara umum, berlari, memutar gagang boiler dengan perubahan suhu di jalan entah bagaimana tidak halal.
Menjadi jelas bahwa tanpa otomatisasi, ketempat pun, boiler adalah yang paling sederhana, tetapi memiliki kontak untuk menghubungkan relai kontrol eksternal. Tentu saja, Anda bisa langsung membeli boiler dengan semua fungsi yang diperlukan, tetapi bagi saya, boiler semacam itu entah bagaimana tidak manusiawi. Ditambah lagi aku ingin jongkok dengan otak, kencing sesuatu untuk jiwa, belajar sedikit C, meskipun dalam versi Arduino.
Sebenarnya tentang persyaratan:
- kontrol suhu setpoint
- kontrol suhu pendingin tergantung pada suhu di luar ruangan atau secara manual
- zona waktu dengan pengaturan berbeda, lebih dingin di siang hari, lebih panas di malam hari
- mode otomatis, dengan transisi siang-malam otomatis
- mode manual, tanpa transisi otomatis, untuk akhir pekan
- mode non-otomatis, di mana Anda dapat secara manual mengatur suhu cairan pendingin dan menghidupkan / mematikan boiler
- kontrol pemanasan secara lokal, dari tombol dan layar dan melalui situs web / aplikasi mobile
Itu pada awalnya, dan kemudian saya menderita dan menambahkan:
- kontrol lampu jalan (LED spotlight)
- sistem alarm berdasarkan sensor gerak, sirene dan lampu jalan
- mengukur energi yang dikonsumsi oleh boiler per hari / bulan / tahun + untuk setiap bulan dalam setahun
- mode alarm hanya dengan mem-flash lampu secara lambat
- mode pensinyalan dengan lampu berkedip cepat dan bunyi bip pendek dari sirene
- mode pensinyalan dengan lampu yang berkedip cepat dan suara sirene yang konstan
Tujuan artikel ini adalah untuk berbagi pengalaman, menggambarkan sesuatu dalam bahasa Rusia yang tidak dapat saya temukan di Internet. Saya pikir artikel ini akan bermanfaat bagi pemula Arduino do-it-yourselfers yang sudah sedikit akrab dengan pemrograman, karena hal-hal yang benar-benar mendasar yang tidak saya uraikan. Saya mencoba menulis kode sejelas mungkin, saya harap saya berhasil.
Apa yang ada di awal
Awalnya, proyek ini diimplementasikan pada sekelompok liar Arduino Nano + ESP8266, tetapi ESP bukan sebagai perisai, tetapi sebagai perangkat terpisah. Kenapa begitu Ya, karena saya sudah memiliki semua ini, tetapi tidak ada uang sama sekali dari kata itu, jadi saya tidak ingin membeli besi baru pada prinsipnya. Mengapa ESP tidak seperti tameng? Sekarang saya bahkan tidak ingat.
Arduino mengarahkan semua proses karena memiliki jumlah GPIO yang diperlukan, dan ESP mengirim semua data ke server Blynk, karena ia tahu Internet dan tidak memiliki cukup GPIO. Mereka menghubungkan diri mereka melalui UART, dan mengirim JSON dengan data satu sama lain. Skema ini tidak biasa, tetapi bekerja selama satu tahun tanpa keluhan. Siapa pun yang tertarik dapat melihat codec .
Saya akan segera memesan, saya tidak terlalu ahli pada saat itu (dan bahkan sekarang saya ingin melakukannya dengan lebih baik), jadi lebih baik bagi wanita hamil dan anak-anak untuk tidak menonton. Selain itu, semuanya ditulis dalam IDE Arduino, itu tidak akan diingat pada malam hari, yang sangat terbatas dalam hal refactoring, semuanya sangat primitif di sana.
Besi
Jadi, satu tahun telah berlalu, keuangan diizinkan untuk membeli ESP32 devkit v1, yang memiliki cukup GPIO, dapat mengakses Internet dan umumnya super controller. Selain lelucon, saya sangat menyukainya di akhir pekerjaan.
Daftar besi:
- ESP32 devkit v1 noname China
- 3 sensor suhu DS18B20, suhu di dalam rumah, di luar dan suhu pendingin di pipa
- blok 4 relay
- sensor pir HC-SR501
Saya tidak akan menggambar skema, saya pikir semuanya akan jelas dari makro dengan nama pin.
Mengapa FreeRTOS dan Arduino Core
Sekelompok perpustakaan ditulis di Arduino, khususnya Blynk yang sama, sehingga Anda tidak akan lepas dari Arduino Core.
FreeRTOS karena memungkinkan Anda untuk mengatur pekerjaan sepotong kecil besi yang mirip dengan pekerjaan pengontrol industri lengkap. Setiap tugas dapat dipindahkan ke tugasnya sendiri, dihentikan, dimulai, dibuat bila perlu, dihapus - semua ini jauh lebih fleksibel daripada menulis omong kosong panjang kode Arduino, ketika pada akhirnya semuanya dilakukan pada gilirannya dalam fungsi loop.
Saat menggunakan FreeRTOS, setiap tugas akan dieksekusi pada waktu yang ditentukan secara ketat, jika hanya daya prosesor yang cukup. Sebaliknya, di Arduino semua kode dieksekusi dalam satu fungsi, dalam satu utas, jika sesuatu melambat, sisa tugas akan tertunda. Ini terutama terlihat ketika mengelola proses cepat, dalam proyek ini lampu senter yang berkedip dan bunyi sirene akan dibahas di bawah ini.
Tentang logika
Tentang tugas FreeRTOS
→ Tautan ke seluruh codec proyek
Jadi, ketika menggunakan FreeRTOS, fungsi pengaturan memainkan peran fungsi utama, titik masuk ke aplikasi, tugas FreeRTOS (selanjutnya tugas) dibuat di dalamnya, fungsi loop tidak dapat digunakan sama sekali.
Pertimbangkan tugas kecil untuk menghitung suhu cairan pendingin:
void calculate_water_temp(void *pvParameters) { while (true) { if (heating_mode == 3) {} else { if (temp_outside > -20) max_water_temp = 60; if (temp_outside <= -20 && temp_outside > -25) max_water_temp = 65; if (temp_outside <= -25 && temp_outside > -30) max_water_temp = 70; if (temp_outside <= -30) max_water_temp = 85; } vTaskDelay(1000 / portTICK_RATE_MS); } }
Dideklarasikan sebagai fungsi yang harus mengambil _void pvParameters
, loop tanpa akhir diatur di dalam fungsi, saya gunakan while (true)
.
Perhitungan suhu sederhana vTaskDelay(1000 / portTICK_RATE_MS)
(jika mode operasi memungkinkan) dan kemudian tugas tersebut di- vTaskDelay(1000 / portTICK_RATE_MS)
oleh vTaskDelay(1000 / portTICK_RATE_MS)
selama 1 detik. Dalam mode ini, itu tidak memakan waktu CPU, variabel yang tugasnya bekerja, dengan kata lain, konteksnya, disimpan pada tumpukan untuk mengeluarkan mereka dari sana ketika saatnya tiba.
Tugas selanjutnya harus dibuat dalam pengaturan. Ini dilakukan dengan memanggil metode xTaskCreate
:
xTaskCreate(calculate_water_temp, "calculate_water_temp", 2048, NULL, 1, NULL);
Ada banyak argumen, tetapi bagi kami, calcul_water_temp signifikan - nama fungsi yang berisi kode tugas dan 2048 adalah ukuran tumpukan dalam byte.
Ukuran stack pada awalnya mengatur semua orang menjadi 1024 byte, kemudian saya menghitung metode yang diinginkan dengan mengetik, jika controller mulai jatuh dengan stack overflow (seperti yang dapat dilihat dari output di uart), saya hanya meningkatkan ukuran stack sebanyak 2 kali, jika tidak membantu, sebanyak 2 kali dan seterusnya sampai bekerja. Tentu saja, ini tidak menghemat memori terlalu banyak, tetapi ESP32 sudah cukup, dalam kasus saya Anda tidak bisa repot dengan ini.
Anda juga dapat menentukan pegangan untuk tugas - pegangan yang dengannya Anda dapat mengontrol tugas setelah pembuatan, misalnya - hapus. Ini adalah NULL terakhir dalam contoh. Pegangan dibuat seperti ini:
TaskHandle_t slow_blink_handle;
Selanjutnya, saat membuat tugas, pointer ke xTaskCreate
dilewatkan ke parameter xTaskCreate:
xTaskCreate(outside_lamp_blinks, "outside_lamp_blynk", 10000, (void *)1000, 1, &slow_blink_handle);
Dan jika kita ingin menghapus tugas, kita melakukan ini:
vTaskDelete(slow_blink_handle);
Cara ini digunakan dapat dilihat pada kode panic_control
panic_control.
FreeRTOS Mutex Pro
Mutex digunakan untuk menghilangkan konflik antara tugas saat mengakses sumber daya seperti uart, wifi, dll. Dalam kasus saya, saya perlu mutex untuk wifi dan akses ke memori flash.
Buat tautan ke mutex:
SemaphoreHandle_t wifi_mutex;
Dalam setup
buat mutex:
wifi_mutex = xSemaphoreCreateMutex();
Lebih jauh, ketika kita membutuhkan akses ke sumber daya tugas, dibutuhkan mutex, dengan demikian membiarkan sisa tugas tahu bahwa sumber daya sibuk dan tidak perlu mencoba untuk bekerja dengannya:
xSemaphoreTake(wifi_mutex, portMAX_DELAY);
portMAX_DELAY
- tunggu tanpa batas waktu sampai sumber daya dan mutex dibebaskan oleh tugas lain, selama ini tugas akan tidur.
Setelah bekerja dengan sumber daya, kami memberikan mutex sehingga orang lain dapat menggunakannya:
xSemaphoreGive(wifi_mutex);
Anda dapat melihat kode lebih send_data_to_blynk
dalam send_data_to_blynk
send_data_to_blynk.
Dalam praktiknya, tidak digunakannya mutex tidak terlihat selama pengoperasian controller, tetapi selama debug JTAG, kesalahan terus-menerus menghilang yang menghilang setelah menggunakan mutex.
Deskripsi singkat tentang tasok
get_temps
- menerima suhu dari sensor, setiap 30 detik, lebih sering tidak diperlukan.
get_time_task
- dapatkan waktu dari server NTP. Sebelumnya, waktu datang dari modul RTC DS3231, tetapi mulai gagal setelah satu tahun bekerja, jadi saya memutuskan untuk membuangnya sama sekali. Saya memutuskan bahwa bagi saya ini tidak memiliki konsekuensi khusus, terutama waktu mempengaruhi pergantian zona waktu pemanasan - siang atau malam. Jika Internet menghilang selama pengoperasian controller, waktu akan membeku, zona waktu akan tetap sama. Jika pengontrol mati dan setelah dihidupkan tidak ada Internet, maka waktu akan selalu 0:00:00 - mode pemanasan di malam hari.
calculate_water_temp
- dipertimbangkan di atas.
detect_pir_move
- menerima sinyal gerakan dari sensor HC-SR501. Sensor membentuk unit logis + 3.3V ketika gerakan terdeteksi, yang dideteksi menggunakan digitalRead
, omong-omong, pin untuk deteksi sensor ini harus ditarik hingga GND - pinMode(pir_pin, INPUT_PULLDOWN);
heating_control
- beralih mode pemanasan.
out_lamp_control
- kontrol lampu jalan.
panic_control
- kontrol sirene dan sorotan ketika gerakan terdeteksi. Untuk membuat efek sirene dan lampu berkedip, tugas terpisah digunakan, outside_lamp_blinks
dan siren_beeps
. Saat menggunakan FreeRTOS, flashing dan beep bekerja dengan sempurna, tepat pada interval yang ditentukan, tugas-tugas lain tidak mempengaruhi pekerjaan mereka, karena mereka hidup dalam aliran yang terpisah. FreeRTOS menjamin bahwa kode dalam tugas akan dieksekusi pada waktu yang ditentukan. Ketika mengimplementasikan fungsi-fungsi ini dalam loop
semuanya bekerja tidak begitu lancar, karena dipengaruhi oleh eksekusi kode lain.
guard_control
- kontrol mode penjaga.
send_data_to_blynk
- mengirim data ke aplikasi Blynk.
run_blynk
- tugas untuk meluncurkan Blynk.run()
seperti yang dipersyaratkan oleh manual untuk menggunakan Blynk. Seperti yang saya pahami, ini diperlukan untuk mendapatkan data dari aplikasi ke controller. Secara umum, Blynk.run()
harus dalam satu loop
, tetapi pada dasarnya saya tidak ingin meletakkan apa pun di sana dan menjadikannya tugas yang terpisah.
write_setting_to_pref
- rekam pengaturan dan mode operasi untuk menangkap mereka setelah reboot. Tentang pref akan dijelaskan di bawah ini.
count_heated_hours
- menghitung waktu operasi boiler. Saya melakukannya dengan sederhana, jika boiler dinyalakan pada saat peluncuran tugas (sekali setiap 30 detik), dalam memori flash nilai untuk kunci yang diinginkan bertambah satu.
send_heated_hours_to_app
- dalam tugas ini nilainya diekstraksi dan dikalikan dengan 0,00833 (1/120 jam), jam operasi yang diterima dari boiler dikirim ke aplikasi Blynk.
feed_watchdog
- feed Watchdog. Saya harus menulis anjing penjaga, karena setiap beberapa hari sekali controller bisa membeku. Apa yang terhubung dengan tidak jelas, mungkin ada beberapa jenis gangguan dengan catu daya, tetapi menggunakan anjing penjaga memecahkan masalah ini. Pengawas waktu 10 detik, tidak apa-apa jika controller tidak tersedia selama 10 detik.
heart_beat
- tugas dengan denyut nadi. Ketika saya melewati controller, saya ingin tahu bahwa itu berfungsi dengan baik. Karena di papan saya tidak ada LED Serial.begin(9600);
, saya harus menggunakan LED UART - instal Serial.begin(9600);
dan menulis string panjang di UART. Ini bekerja dengan cukup baik.
Leveling pemakaian ESP32 NVS
Deskripsi berikut agak kasar, secara harfiah di jari, hanya untuk menyampaikan inti masalah. Lebih detail
Arduino menggunakan memori EEPROM untuk menyimpan data dalam memori non-volatile. Ini adalah memori kecil di mana setiap byte dapat ditulis dan dihapus secara terpisah, sedangkan memori flash hanya dihapus oleh sektor.
Tidak ada EEPROM di ESP32, tetapi biasanya ada memori flash 4 Mb di mana Anda dapat membuat partisi untuk firmware pengontrol atau untuk menyimpan data pengguna. Bagian untuk data pengguna ada beberapa jenis - NVS, FATFS, SPIFFS. Itu harus dipilih berdasarkan pada tipe data yang dimaksudkan untuk merekam.
Karena semua data yang ditulis dalam proyek ini bertipe Int, saya memilih NVS - Penyimpanan Non-Volitile. Jenis partisi ini sangat cocok untuk menyimpan data yang kecil dan sering kali ditimpa. Untuk memahami alasannya, Anda harus masuk lebih jauh ke dalam organisasi NVS.
Seperti EEPROM dan FLASH, ada batasan untuk menimpa data, byte dalam EEPROM dapat ditimpa dari 100.000 menjadi 1.000.000 kali, dan sektor FLASH adalah sama. Jika kita menulis data satu detik sekali, maka kita mendapatkan 60 detik x 60 menit x 24 jam = 86.400 kali / hari. Artinya, dalam mode ini, byte akan bertahan 11 hari, yang sedikit. Setelah itu byte tidak akan tersedia untuk menulis dan membaca.
Untuk mengatasi masalah ini, fungsi update()
put()
dari perpustakaan Arduino EEPROM hanya menulis data ketika itu berubah. Artinya, Anda dapat menulis setiap detik beberapa pengaturan dan kode mode yang berubah sangat jarang.
NVS menggunakan metode berbeda untuk mengendalikan leveling keausan. Seperti disebutkan di atas, data dalam sektor flash dapat ditulis dalam bagian-bagian, tetapi hanya seluruh sektor yang dapat dihapus. Oleh karena itu, perekaman data dalam NVS dilakukan dalam semacam jurnal, jurnal ini dibagi menjadi beberapa halaman, yang ditempatkan dalam satu sektor memori flash. Data ditulis dalam pasangan kunci: nilai. Bahkan, ini bahkan lebih mudah daripada dengan EEPROM, karena bekerja dengan nama yang bermakna lebih mudah daripada dengan alamat di memori. Pembaruan: panjang kunci tidak lebih dari 15 karakter!
Jika Anda pertama kali menulis nilai 1
ke tombol kunci, dan kemudian menulis nilai 2
ke kunci yang sama, nilai pertama tidak akan dihapus, itu hanya akan ditandai sebagai dihapus (Dihapus), dan entri baru akan ditambahkan ke log:

Jika Anda mencoba membaca data oleh somekey
terakhir dari kunci ini akan dikembalikan. Karena Karena log adalah umum, nilai kunci yang berbeda disimpan di samping satu sama lain saat ditulis.
Halaman memiliki status, Kosong - kosong, tanpa entri, Aktif - data saat ini sedang ditulis untuk itu, Penuh - penuh, Anda tidak dapat menulis untuk itu. Segera setelah halaman kehabisan ruang, dia dari
Aktif menjadi Penuh, dan halaman Kosong berikutnya menjadi Aktif.

Sejauh yang saya mengerti dari dokumentasi di situs web Espressif dan berbagai forum, pembersihan halaman dimulai ketika halaman gratis berakhir. Lebih tepatnya, menurut ini , penghapusan akan terjadi ketika hanya 1 halaman gratis yang tersisa.
Jika halaman perlu dihapus, maka catatan saat ini (Tidak terhapus) dipindahkan ke halaman lain, dan halaman tersebut ditimpa.
Dengan demikian, operasi write-erase untuk setiap halaman tertentu cukup langka, semakin banyak halaman - semakin jarang. Berdasarkan ini, saya meningkatkan ukuran partisi NVS menjadi 1 MB, pada tingkat perekaman saya ini sudah cukup untuk 170 tahun, yang secara umum sudah cukup. Tentang mengubah ukuran bagian NVS akan menjadi yang berikutnya.
Untuk pekerjaan yang mudah dengan NVS, ESP32 untuk Arduino Core memiliki pustaka preferensi yang ditulis, cara bekerja dengannya ditulis di sini .
Sedikit tentang VisualGDB
Segera setelah saya mulai bekerja dengan Arduino IDE, saya langsung dikejutkan oleh fungsionalitas yang menyedihkan dibandingkan dengan Visual Studio. Mereka mengatakan bahwa VS juga bukan air mancur, meskipun itu cocok untuk saya, tetapi menulis sesuatu lebih dari 50 baris dalam IDE Arduino sangat menyakitkan dan panjang. Maka, muncul pertanyaan untuk memilih IDE untuk pengembangan. Karena Saya kenal dengan VS, saya menetap di VisualGDB .
Setelah Arduino IDE, pengembangan untuk ESP32 hanyalah surga. Apa transisi ke definisi, pencarian panggilan dalam proyek dan kemampuan untuk mengubah nama variabel.
Mengubah Tabel Partisi ESP32 dengan VisualGDB
Seperti disebutkan di atas, tabel dapat diubah dengan partisi ESP32, kami akan mempertimbangkan bagaimana hal ini dapat dilakukan.
Tabel diedit sebagai file csv, secara default VisualGDB menulis tabel berikut:
Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, app0, app, ota_0, 0x10000, 0x140000, app1, app, ota_1, 0x150000,0x140000, spiffs, data, spiffs, 0x290000,0x170000,
Di sini kita melihat bagian di bawah NVS, dua bagian untuk aplikasi, dan beberapa bagian lagi. Dari nuansa, dapat dicatat bahwa app0 (aplikasi Anda) harus selalu ditulis pada offset 0x10000, mulai dari alamat nol, jika bootloader tidak akan mendeteksinya. Juga, offset harus dipilih sehingga bagian tidak saling "tumpang tindih". Tabel partisi itu sendiri ditulis dengan offset 0x8000. Seperti yang Anda lihat, ukuran NVS dalam hal ini adalah 0x5000 - 20KB, yang tidak terlalu banyak.
Saya memodifikasi tabel partisi sebagai berikut:
Name, Type, SubType, Offset, Size, Flags app0, app, ota_0, 0x10000, 0x140000, nvs, data, nvs, , 1M, otadata, data, ota, , 0x2000, spiffs, data, spiffs, , 0x170000,
Jangan lupa untuk menambahkan kisi sebelum Nama, jika Anda menggunakan tabel ini, Anda perlu baris ini untuk dianggap sebagai komentar.
Seperti yang Anda lihat, ukuran NVS meningkat menjadi 1 MB. Jika Anda tidak menentukan offset, maka bagian akan segera dimulai setelah yang sebelumnya, sehingga cukup untuk menunjukkan offset hanya untuk app0. File CSV dapat diedit dalam notepad sebagai txt dan kemudian mengubah izin ke csv untuk file yang disimpan.
Selanjutnya, tabel partisi harus dikonversi ke biner, karena memasuki controller dalam bentuk ini. Untuk melakukan ini, jalankan konverter:
c:\Users\userName\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.3\tools\gen_esp32part.exe part_table_name.csv part_table_name.bin
. Parameter pertama adalah CSV Anda, parameter kedua adalah biner output.
Biner yang dihasilkan harus dimasukkan ke dalam c:\Users\userName\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.3\tools\partitions\part_table_name.csv
, setelah itu perlu ditentukan bahwa dialah yang diambil untuk membangun solusi, dan tidak ada tabel partisi default. Anda dapat melakukan ini dengan menuliskan nama tabel Anda di file c:\Users\userName\Documents\ArduinoData\packages\esp32\hardware\esp32\1.0.3\boards.txt
. Dalam kasus saya, ini adalah esp32doit-devkit-v1.build.partitions=part_table_name
Setelah manipulasi ini, VisualGDB saat membangun aplikasi akan mengambil persis tabel partisi Anda dan memasukkannya ke dalam
~project_folder_path\Output\board_name\Debug\project_name.ino.partitions.bin
, dari tempat itu sudah akan dituangkan ke dalam board.
JTAG debugger CJMC-FT232H
Sejauh yang saya tahu, ini adalah debugger termurah yang dapat bekerja dengan ESP32, harganya sekitar 600 rubel, ada banyak dari mereka di Aliexpress.

Ketika Anda menghubungkan debugger, Windows menginstalnya pada driver yang tidak sesuai yang perlu diubah menggunakan program Zadig, semuanya sederhana di sana, saya tidak akan menjelaskannya.
Terhubung ke ESP32 devkit-v1 dengan cara berikut:
FT232H - ESP32
AD0 - GPIO13
AD1 - GPIO12
AD2 - GPIO15
AD3 - GPIO14
Kemudian, di Project -> VisualGDB Project Properties
Anda perlu membuat pengaturan berikut:

Kemudian klik Test. Kadang-kadang terjadi bahwa koneksi tidak dibuat pertama kali, proses tampaknya membeku, maka Anda perlu menyela dan mengulangi Tes. Jika semuanya beres, proses pengujian koneksi membutuhkan waktu sekitar 5 detik.
Saya biasanya menyusun proyek dan mengunggahnya melalui USB ke ESP32 itu sendiri (bukan melalui debugger), setelah itu saya mulai debugging menggunakan Debug -> Attach to Running Embedded Firmware
. Dalam kode, Anda dapat mengatur breakpoints, lihat nilai-nilai variabel pada saat breakdown, dan di jendela Debug -> Windows -> Threads
Anda bisa melihat kode FreeRTOS mana kode berhenti, yang berguna jika kesalahan terjadi selama debugging. Fungsi-fungsi debugger ini cukup bagi saya untuk bekerja dengan nyaman.
Ketika saya mulai bekerja dengan NVS, debugging terus-menerus terganggu oleh kesalahan yang tidak jelas. Seperti yang saya pahami, ini karena debugger perlu membuat sesuatu seperti dump di bagian NVS default, tetapi pada saat ini NVS sudah digunakan oleh controller. Tentu saja, ini dapat dielakkan dengan membuat 2 partisi NVS, satu dengan nama default untuk debugging, dan yang lainnya untuk kebutuhannya sendiri. Tapi tidak ada yang rumit di sana, dalam kode yang ditambahkan, itu berfungsi pertama kali, jadi saya tidak memeriksanya.
Gangguan ESP32
Seperti perangkat apa pun dengan Aliexpress, papan ESP32 saya memiliki kesalahan sendiri yang tidak dijelaskan di mana pun. Ketika dia tiba, saya memberi makan beberapa periferal yang bekerja pada I2C dari papan, tetapi setelah beberapa waktu, papan mulai reboot jika ada peralatan yang mengonsumsi atau bahkan hanya kapasitor yang terpasang pada kaki + 5V. Mengapa demikian benar-benar tidak dapat dipahami.
Sekarang saya menyalakan papan dari muatan Cina 0.7A, sensor ds18b20 dari kaki papan 3.3V, dan sensor relai dan gerak dari muatan lain 2A. Kaki GND papan tentu saja terhubung ke pin GND dari sisa setrika. Murah dan ceria adalah pilihan kami.
Tentang hasil proyek
Saya mendapat kesempatan untuk secara fleksibel mengontrol pemanasan di rumah, menghemat uang dan keringat yang didapat. Saat ini, jika pemanasan mempertahankan 23 derajat sepanjang hari di -5 - -7 di luar, itu adalah sekitar 11 jam operasi boiler. Jika pada siang hari mempertahankan 20 derajat dan menghangatkan hanya 23 di malam hari, maka ini sudah 9 jam pengoperasian boiler. Kapasitas boiler adalah 6 kW, dengan harga kilowatt 2.2 rubel saat ini, ini adalah sekitar 26,4 rubel per hari. Durasi musim pemanasan di daerah kami adalah 200 hari, suhu rata-rata di musim pemanasan hanya sekitar -5 derajat. Jadi, kita mendapatkan penghematan sekitar 5000r untuk musim pemanasan.
Biaya peralatan tidak melebihi 2000r, yaitu, biaya akan ditolak dalam beberapa bulan, belum lagi fakta bahwa sistem otomasi seperti itu akan menelan biaya setidaknya 20.000r. Hal lain adalah bahwa saya menghabiskan sekitar satu minggu waktu kerja murni untuk menulis firmware dan debugging, tetapi dalam pekerjaan, misalnya, saya akhirnya menyadari apa pointer di C ++ dan mendapat banyak pengalaman lain (misalnya, pengalaman berjam-jam men-debug masalah-masalah kecil yang tidak dapat dipahami). Dan pengalaman, seperti yang Anda tahu, sulit ditaksir terlalu tinggi.
Cuplikan layar aplikasi seluler Blynk:



Tentu saja, kode dalam proyek ini bukan sebuah mahakarya, tetapi saya menulisnya dalam kondisi kurangnya waktu dan berfokus terutama pada keterbacaan. Tidak ada waktu untuk memperbaiki. Secara umum, saya punya banyak alasan mengapa kode saya sangat menakutkan, tetapi ini adalah favorit saya, jadi saya akan memikirkannya, saya tidak akan mengembangkan topik lebih lanjut.
Jika tulisan saya membantu seseorang, saya akan dengan senang hati. Saya akan senang dengan komentar dan saran.