Tentang apa artikel iniKami 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 ShIoTinyArtikel sebelumnya dalam seri.ShIoTiny: otomatisasi kecil, Internet, atau "enam bulan sebelum liburan"ShIoTiny: node, tautan, dan acara atau fitur program menggambarShIoTiny: ventilasi kamar basah (contoh proyek)ShIoTiny dan dunia sekitarnya: menghubungkan sensor ke input biner, pantulan kontak, dan masalah lainnyaShIoTiny dan dunia: sensor analog atau ADC untuk yang terkecilFirmware biner, sirkuit pengontrol, dan dokumentasiEntri
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 .