ShIoTiny: jam tanpa pegas atau waktu nyata dan cara bekerja dengannya



Tentang apa artikel ini

Kami melanjutkan serangkaian artikel tentang ShIoTiny - pengontrol yang dapat diprogram secara visual berdasarkan chip ESP8266 .

Artikel ini berbicara tentang jam waktu-nyata dalam pengontrol ShIoTiny , sinkronisasi waktu dan penggunaan simpul untuk bekerja dengan jam.

Situs Proyek ShIoTiny

Artikel sebelumnya dalam seri.

ShIoTiny: otomatisasi kecil, Internet, atau "enam bulan sebelum liburan"

ShIoTiny: node, tautan, dan acara atau fitur program menggambar

ShIoTiny: ventilasi kamar basah (contoh proyek)

ShIoTiny dan dunia sekitarnya: menghubungkan sensor ke input biner, pantulan kontak, dan masalah lainnya

ShIoTiny dan dunia: sensor analog atau ADC untuk yang terkecil

Firmware biner, sirkuit pengontrol, dan dokumentasi

Entri


Hari ini kita berbicara tentang waktu. Bukan tentang waktu, dalam arti di mana para filsuf telah berdebat tentang hal itu selama berabad-abad dan ujung-ujungnya tidak terlihat dalam perdebatan ini. Dan tentang waktu yang kita lihat pada jam dan menurut mana kita pergi bekerja, ke sekolah atau terburu-buru berkencan.

Masalahnya adalah bahwa jam real-time non-volatile dalam chip ESP8266 dan pengontrol ShIoTiny hilang. Cidera kelahiran kontroler ShIoTiny ini sepenuhnya salahku. Tapi apa yang sudah dilakukan sudah dilakukan.

Segera setelah firmware melihat cahaya, publik, yang marah dengan sikap saya waktu nyata, mulai menyodok hidung saya pada cacat ini.

Karena kesalahan perlu diperbaiki, dan kali ini setidaknya tidak dengan darah, saya pergi untuk memenuhi peningkatan jumlah pengguna firmware saya dan melakukan apa yang saya bisa. Yaitu, saya menambahkan node ke firmware controller ShIoTiny yang membuatnya lebih atau kurang nyaman untuk bekerja dengan ini secara real time.

Tentang ShIoTiny Watch


Seperti yang telah disebutkan, tidak ada "jam dengan baterai" di ShIoTiny . Tetapi pada saat yang sama, hitungan mundur mulai dari 1 Januari 1970 diterapkan.

Ini adalah waktu yang sama yang disebut UNIX-time, disimpan dalam variabel tipe time_t dalam bahasa C / C ++ dan yang akan berakhir pada 19 Januari 2038 dalam sistem 32-bit.

Tapi jangan takut. Saya pikir pada tahun 2038 setiap orang akan memiliki waktu untuk membuat tipe time_t 64-bit dan masalah akan diselesaikan dalam 292 miliar tahun ke depan. Ya, ada hal lain yang akan kami buat.

Perhatikan bahwa waktu dalam format time_t kadang-kadang disebut (dalam artikel saya juga) - timestamp atau, dalam bahasa Rusia, timestamp .

Tetapi kembali ke controller kita. Jadi, ada jam di dalamnya, tetapi jam ini diatur ulang ke 0 setelah mematikan daya. Ini mengarah pada kesimpulan sepele bahwa masalah utama penghitungan waktu pada pengontrol ShIoTiny adalah kebutuhan untuk menyinkronkan jam pengontrol ketika daya dihidupkan. Sisanya murni masalah teknis.

Sinkronisasi waktu


Cara lama untuk menyinkronkan waktu di Internet adalah server NTP . Dan ide pertama adalah membuat simpul yang menyinkronkan waktu dengan server NTP yang diberikan.

Tetapi, menghirup udara segar dan merenungkan labu saya, saya menyadari bahwa pendekatan ini secara ideologis salah.

Bukan fakta bahwa pengguna ingin mengeluarkan pengontrol dengan firmware ShIoTiny di Internet. Dan waktu untuk sinkronisasi dapat dikirim tidak hanya dari server NTP , tetapi juga melalui UDP-multicast, atau dengan kualitas koneksi yang diketahui - melalui MQTT .

Oleh karena itu, keputusan yang menentukan dibuat - untuk memisahkan node untuk menerima waktu dari server NTP dan mengatur waktu sistem.

Secara total, dua node dikembangkan untuk sinkronisasi waktu: node untuk menerima waktu dari server NTP Waktu NTP



dan Atur simpul instalasi jam sistem Waktu



Node menerima waktu dari server NTP sebagai parameter menerima nama atau alamat IP dari server NTP dan, dipisahkan oleh koma, periode waktu dari server NTP dalam hitungan menit. Secara default, waktu diminta dari server NTP setiap 60 menit atau 1 jam. Pada output, simpul ini menetapkan 0 hingga waktu disinkronkan atau cap waktu adalah hasil dari sinkronisasi terakhir dengan server.

Node pemasangan jam sistem menerima cap waktu sebagai input dan menyetel jam sistem sesuai dengan label ini.

Skema paling sederhana untuk menyinkronkan jam sistem dengan server NTP ditunjukkan pada gambar.



Periode sinkronisasi tidak diatur dan 60 menit secara default. Gambar menunjukkan cap waktu.

Saya perhatikan bahwa tidak boleh ada lebih dari satu simpul untuk menerima waktu dari server NTP dan lebih dari satu simpul untuk mengatur waktu sistem dalam skema program.

Jika Anda memerlukan skema sinkronisasi eksotis, maka Anda dapat menggunakan UDP-multicast atau MQTT . Skema ini sangat mirip.

Untuk sinkronisasi UDP-multicast , kira-kira sama seperti pada gambar.



Dan untuk sinkronisasi melalui MQTT (saya tidak menyarankan, tentu saja, tetapi dalam kasus yang ekstrim) - seperti itu.



Saya harap sekarang semuanya jelas dengan sinkronisasi jam sistem pengontrol ShIoTIny . Mari kita beralih ke node waktu penerimaan dan pemrosesan.

Jam berapa sekarang?


Pertanyaannya sederhana, tetapi kadang tidak mudah dijawab. Lagi pula, waktu di setiap titik di Bumi berbeda. Tanah air kami yang luas mencakup dari Kaliningrad ke Kamchatka sebanyak 11 zona waktu.

Server NTP , tergantung pada pengaturannya, dapat mengembalikan stempel waktu yang terkait dengan zona waktu yang berbeda. Biasanya, cap waktu ini terkait dengan UTC - waktu universal.

Tetapi biasanya kita membutuhkan waktu lokal di daerah di mana controller kita bekerja. Bagaimana caranya berada di sini?

Dan itu sangat sederhana - untuk mendapatkan cap waktu dari jam sistem pengontrol ShIoTIny , simpul Get Time dikembangkan, di mana Anda dapat mengatur zona waktu sebagai offset waktu dari -12 jam menjadi +12 jam relatif terhadap jam sistem pengontrol.

Misalkan kita mendapatkan waktu dari server pool.ntp.org dan menyinkronkan jam sistem, seperti dalam contoh kita sebelumnya. Server ini mengembalikan waktu universal. Kami membutuhkan lokal, seperti Tomsk, seperti milik saya. Saya tahu bahwa Tomsk berada di zona waktu UTC + 7 . Jadi, mari kita atur unit penerima waktu untuk mengimbangi +7 atau hanya 7. Seperti pada gambar di bawah ini.



Dan jika kita tinggal di provinsi Alberta Kanada, shiftnya adalah -7 jam. Ingat hal utama - zona waktu diatur dalam simpul untuk memperoleh waktu dalam jam . Dan diatur dalam bentuk offset relatif terhadap waktu jam sistem. Cap waktu diatur pada output unit penerima waktu. Mungkin ada beberapa node untuk mendapatkan waktu di sirkuit.

Periksa jamnya


Sangat nyaman bagi mesin untuk bekerja dengan waktu dalam format timestamps time_t . Bagaimanapun, ini hanya bilangan bulat yang menunjukkan jumlah detik relatif ke titik awal - 1 Januari 1970. Dalam format ini, Anda dapat dengan mudah menemukan jarak antara dua titik waktu, menghitung titik dan sebagainya. Ini hanya penambahan dan pengurangan bilangan bulat.

Tetapi manusia bukanlah mesin. Dia jauh lebih nyaman dengan representasi waktu yang biasa dalam bentuk satu tahun, bulan, hari, jam, menit dan detik. Jadi kita manusia diatur.

Oleh karena itu, simpul-simpul terjemahan cap waktu ke dalam satuan-satuan perubahan waktu yang akrab bagi orang tersebut diperkenalkan, dan sebaliknya, sintesis cap waktu dari satuan-satuan perubahan waktu yang dapat dimengerti oleh orang tersebut. Node-node ini disebut, masing-masing, Split Time dan Synth Time .

Bagaimana semua ini bekerja jelas dari gambar di bawah ini.



Saya perhatikan bahwa node Membagi Waktu dan Waktu Sintasi bulan (bulan) dan hari dalam seminggu (wday) dihitung dari nol. Untuk bulan: 0-Januari, 11-Desember. Selama berhari-hari dalam minggu 0-Minggu, 6-Sabtu.
Output lain: hari dalam sebulan (hari), tahun (tahun), jam (jam), min (menit), detik (detik) - dihitung dalam bentuk yang biasa. Jam, menit, detik - dari 0 hingga 59. Hari dalam sebulan - tergantung pada bulan dari hari pertama hingga tanggal 30 atau 31 dan, untuk bulan Februari, hingga tanggal 28 atau 29.
Ya, setahun - dia tahun. 2019 sekarang.
Saya harap semuanya jelas.

Contoh sistem


Agar tidak berdasar, saya akan memberikan contoh penggunaan jam tangan. Tentu saja disederhanakan.

Misalkan kita memiliki ruang lembab yang ingin kita paksa ventilasi. Tapi tidak selalu, tetapi hanya bila kelembabannya lebih tinggi dari level yang diberikan dan hanya pada malam hari. Di malam hari - agar tidak mengganggu orang di siang hari dengan suara kipas. Nah, di sini kita estetika dan kita peduli pada orang.

Mari kita coba implementasikan ini.



Semua bagian sirkuit sudah tidak asing lagi bagi kami. Waktu disinkronkan dari server NTP . Meskipun tidak disinkronkan, simpul Waktu NTP mengembalikan 0 dan kipas memungkinkan relai dinonaktifkan. Untuk ini, elemen teratas dan menurut skema bertanggung jawab.

Setelah waktu disinkronkan, nyala / mati kipas ditentukan oleh waktu saat ini dan tingkat kelembaban. Segera setelah tingkat kelembaban melebihi 70% dan waktunya dari pukul 23:00 hingga 06:00 , kipas angin akan menyala dan tidak akan mengeringkan ruangan.

Tentu saja, lebih baik untuk mengganti konstanta waktu dan kelembaban dalam proyek nyata dengan parameter yang disimpan dalam FLASH dan ditetapkan, misalnya, menurut MQTT . Ya, dan kondisi sistem saat ini - tingkat kelembaban, arus, waktu, status kipas - juga tidak ada salahnya untuk mempublikasikan di jaringan untuk mengontrol sistem dari smartphone. Tapi ini sudah saya tinggalkan ruang untuk imajinasi Anda.

Kesimpulan


Jadi kami memperkenalkan pengontrol kami dengan waktu nyata lebih dekat.

Saya ingin mengucapkan terima kasih kepada semua orang yang mengirimi saya surat kritik membangun dan saran tentang peningkatan perangkat lunak. Terima kasih teman-teman!

Seperti biasa - kritik konstruktif disambut. Selain itu, komentar dan saran dipersilahkan.

Anda dapat mengirim semua kritik, komentar, saran seperti biasa dalam komentar atau melalui surat: shiotiny@yandex.ru .

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


All Articles