Layar pelanggan telah muncul. Menjadi menarik untuk mencoba menggunakannya sebagai papan informasi untuk menampilkan informasi tentang hari saat ini, waktu hingga akhir hari kerja / minggu, informasi cuaca, dan nilai tukar.
Pada saat yang sama, saya tidak ingin menggunakan aplikasi sumber daya intensif dan PC saya. Dia berhenti di sekelompok Display Pelanggan mini-PC Raspberry + Linux +.


Diperlukan komentar
Saya tidak mempertimbangkan menginstal dan mengkonfigurasi OS Linux pada perangkat Raspberry di artikel ini.
Untuk mengedit teks di Linux, saya menggunakan editor nano dan mcedit.
Untuk mengakses PC mini berbasis Linux OS dari lingkungan Windows, saya menggunakan klien untuk akses jarak jauh melalui protokol SSH - KiTTY / PuTTY.
Untuk mentransfer file antara Windows dan Linux, saya menggunakan WinSCP.
Bash - shell (shell).
Bash adalah singkatan dari "Bourne-Again Shell" ("dihidupkan kembali" shell). Kata kunci, sintaksis, dan fitur dasar lainnya dari bahasa tersebut dipinjam dari shell sh lain (kependekan dari shell).
Bash juga merupakan bahasa pemrograman yang kuat.
Saya terlibat dalam pemeliharaan produk perangkat lunak berdasarkan 1C dan bagi saya itu adalah kesempatan untuk berkenalan dengan pemrograman di lingkungan Linux sendiri.
Untuk yang terbaik dari pemahaman saya, saya akan menjelaskan perintah yang sedang dieksekusi. Ini dilakukan dengan tujuan menjangkau audiens yang besar.
Apa yang kamu gunakan
- Raspberry Pi 2 Model B v1.1 komputer papan tunggal dengan Raspbian GNU / Linux 9.4 (stretch) diinstal.
- Tampilan Pelanggan POSUA LPOS-VFD USB.
- Shell bash
Tahap 1. Hubungkan dan atur tampilan pelanggan
Setelah memasang tampilan pelanggan (DP) ke port USB, kami akan mencari tahu parameter perangkat yang terhubung. Di terminal, jalankan perintah:
usb-devices
Dapatkan daftar perangkat USB yang terpasang ke Raspberry:
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev
Dari informasi yang diterima oleh perintah, kami menemukan baris Product = POSua LPOS-II-VFD USB CDC . Ini adalah tampilan pelanggan kami. Pada bagian ini, kita membutuhkan Vendor = 0000 ProdID = 0131 Rev = 01.00. Yaitu vendor = 0000 prodID = 0131 . Jadi perangkat mengidentifikasi dirinya sendiri.
Untuk operasi yang benar dengan DP, perlu memuat modul operasi USB ke dalam inti sistem. Jalankan perintah dengan hak istimewa yang ditinggikan:
sudo modprobe usbserial vendor=0x0000 product=0x0131
modprobe
adalah program untuk menambahkan modul ke kernel Linux. usbserial
adalah modul kernel yang mengemulasi port COM pada perangkat USB. 0x - berarti format heksadesimal.
Karena saya memiliki satu perangkat USB yang terhubung, pada sistem Linux, secara otomatis ia menerima file ttyUSB0 . Ini adalah fitur penting untuk berinteraksi dengan perangkat di Linux - bekerja dengan perangkat sebagai file. File perangkat disimpan di /dev
.
Untuk bekerja dengan DP, atur kecepatan transfer data:
stty -F /dev/ttyUSB0 9600
stty
- perintah mengatur parameter input / output terminal untuk perangkat. -F
adalah perangkat. Dalam kasus kami, tampilan pembeli adalah /dev/ttyUSB0
. Dan untuk perangkat ini, kecepatan 9600 baud diatur.
Sekarang Anda dapat mencoba menampilkan pesan sambutan (dalam bahasa Inggris sejauh ini):
echo "Hello!" > /dev/ttyUSB0
Jika semuanya dilakukan dengan benar, maka pesan kami akan muncul di layar. Lebih detail tentang tim di bawah ini.
2 tahap. Pemrograman
Pada tahap sebelumnya, kami menampilkan pesan dalam bahasa Inggris di atas layar splash perangkat. Dan itu tidak terlalu indah.
Untuk menghapus layar tampilan, jalankan perintah:
echo -e -n "\x0c\x0b" > /dev/ttyUSB0
perintah keluaran echo
- terminal. Opsi -e
- memungkinkan dukungan untuk output dari urutan escape, -n
- menunjukkan bahwa tidak perlu untuk mengumpankan feed line. Entri -en
diizinkan.
Kombinasi karakter yang terdiri dari garis miring terbalik \
diikuti oleh huruf atau serangkaian angka disebut urutan melarikan diri.
0
- membersihkan tampilan layar dan membatalkan mode garis, 0b
- memindahkan kursor ke posisi paling kiri atas. Simbol >
- kontrol aliran (mengarahkan ulang output). Dalam hal ini, file / dev / ttyUSB0 perangkat kami. Jika Anda hanya menjalankan echo "Hello!"
, maka teks yang ditunjukkan dalam tanda kutip akan muncul di jendela terminal.
Omong-omong, perintah untuk mengubah kecepatan pengiriman data ke perangkat dapat ditulis sebagai berikut:
stty 9600 < /dev/ttyUSB0
Nah, untuk menampilkan pesan dalam bahasa Rusia, lakukan:
echo -n "!" | iconv -f UTF-8 -t CP866 > /dev/ttyUSB0
|
- Mengarahkan output dari satu perintah ke input yang lain (pipa). Dalam kasus kami, urutan karakter "Halo!" itu bukan keluaran ke file perangkat segera, tetapi ditransfer ke ikon utilitas "konversi". iconv
- mengkonversi dari satu pengkodean ke yang lain.
Bash shell memungkinkan Anda untuk tidak hanya mengeksekusi perintah langsung di terminal, tetapi juga menulis file skrip.
Script adalah file teks biasa dengan urutan perintah yang dieksekusi.
Agar bash memahami bahwa itu adalah "miliknya", tanda #! / Bin / bash ditunjukkan di awal file. Dan untuk menjalankan skrip secara langsung, Anda perlu menjalankan perintah:
sudo chmod u+x namefile.sh
Di mana namefile.sh adalah file skrip. Ekstensi sh - berarti file skrip bash. chmod
adalah program untuk mengubah hak akses ke file dan direktori. u+x
- mengatur hak untuk mengeksekusi file untuk pengguna saat ini.
Kami akan memecahkan masalah dengan dua skrip. Script pertama adalah yang utama ( dispos.sh ). Ini menampilkan semua informasi yang diperlukan pada layar pembeli. Auxiliary ( parse.sh ) kedua menerima data cuaca, layanan kutipan mata uang, dan menulis data ke file perantara. File data antara digunakan dalam skrip pertama.
Agar skrip dapat dijalankan, Anda harus menjalankan perintah berikut:
sudo chmod +x dispos.sh sudo chmod +x parse.sh
Perhatikan bahwa hanya +x
. Ini adalah versi singkat dari u+x
.
Skrip harus dijalankan secara berkala. Untuk melakukan ini, gunakan penjadwal crontab standar. Untuk mengedit, gunakan perintah:
crontab -e
Tambahkan dua baris ke penjadwal:
*/20 * * * * /home/pi/parse.sh */1 * * * * /home/pi/dispos.sh
Skrip parse.sh berjalan setiap 20 menit, dan skrip dispos.sh setiap menit.
Sebelum tampilan awal pelanggan pada layar, Anda harus terlebih dahulu menjalankan skrip parse.sh, yang akan menerima data cuaca dan mata uang utama.
./parse.sh
Selanjutnya, saya akan memberikan skrip lengkap dengan komentar singkat.
Deskripsi file skrip
File Dispos.sh
Komentar
Untuk menampilkan tanggal saat ini, gunakan perintah date
. Contoh
echo `date "+%d.%m.%Y %H:%M"`
Setelah eksekusi, kami mendapatkan tanggal formulir: 05/20/2019 12:11.
Untuk menghitung waktu hingga akhir hari, kami menggunakan variabel tambahan TIME_OF_WORKDAY
dan mengatur nilai TIME_OF_WORKDAY="18:00:00"
. Baiklah, lalu kami menghitung jam dan menit sampai akhir hari kerja:
HOURS=$(( ( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) / 3600 )) MINUTES=$(( (( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) - $HOURS * 3600) / 60 ))
Simbol $
menunjukkan bahwa itu adalah variabel.
Simbol #
adalah komentar.
date +%s
- dapatkan tanggal dan waktu saat ini dalam detik.
date +%s --date=$TIME_OF_WORKDAY
- dapatkan waktu dalam detik hingga TIME_OF_WORKDAY ("18:00:00")
.
Perhitungan waktu hingga akhir minggu kerja:
DAYS=$(( ($DAY_OF_WEEKEND-$(date +%s)) / (24*3600) )) HOURS=$(( (($DAY_OF_WEEKEND-$(date +%s)) - ($DAYS*24*3600)) / 3600 )) MINUTES=$(( (($DAY_OF_WEEKEND-$(date +%s)) - ($DAYS*24*3600) - ($HOURS*60*60)) / 60 ))
Di mana DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"`
adalah waktu dalam detik dari waktu saat ini hingga Jumat 17:00:00.
Bagian dari skrip diimplementasikan menggunakan fungsi. Sebagai contoh
disp_clear()
adalah nama fungsi. Di {}
, perintah yang dapat dieksekusi ditunjukkan.
Variabel DEV_DISPLAY
adalah "global" dan diatur pada awal skrip dan karenanya DEV_DISPLAY="/dev/ttyUSB0"
.
Membaca data dari file, misalnya baris tertentu (1):
LINE1=$(sed -n '1{p;q}' /tmp/weather.txt)
sed
adalah editor teks yang melakukan operasi pengeditan informasi dalam aliran input atau file standar. -n
menampilkan baris yang saat ini dipilih. '1{p;q}'
- mencetak 1 baris dan keluar tanpa membaca sisanya ( p
- print, q
- output).
Opsi lain untuk membaca dari file (baris demi baris):
while read line do BTC=${line:0:13} done </tmp/bitcoin.txt
Dan demikian DISPLAY_LINE1=${LINE1:0:14}
dari baris LINE1
mengekstraksi substring yang panjangnya 14 karakter mulai dari 0.
Karakter digantikan oleh kombinasi //
, misalnya, DOLLAR//–/-
. Simbol "-" diganti oleh "-".
File parse.sh
Komentar
Perintah wget
memungkinkan Anda untuk mengunduh file, halaman, dll. Dari jaringan. Opsi -q
- menampilkan informasi minimum, -O
- menyimpan ke file yang ditentukan.
Baris di bawah ini menulis ke file:
echo "${WEATHER1}" > /tmp/weather.txt echo ${WEATHER2%.*} >> /tmp/weather.txt
Selain itu, jika pengalihan aliran output ke file >
, maka isi file ditimpa, dan menggunakan >>
menambahkan data ke file.
Contoh menggunakan parameter dalam suatu fungsi:
conv 6
Langsung berfungsi:
CURRENCY=$(sed -n '1!G;h;$p' /tmp/ex.xml | sed -n "${1}{p;q}")
Di mana {1}
adalah parameter. Angka 6 dilewatkan.
Perhatikan fungsi penggantian substring yang rumit, misalnya:
LINEBTC//[^.^0-9]/
Hanya "." dan semua angka dari 0 hingga 9.
Kata penutup
Dalam bash, hampir semua fitur bahasa pemrograman "biasa" tersedia. Dan beberapa tim, dibandingkan dengan analog dalam 1C, terkejut dengan singkatnya dan fungsionalitasnya.
Saat ini, tampilan pelanggan sebagai papan buletin telah bekerja dengan mantap selama lebih dari enam bulan.
Daftar sumber daya
- Halaman Tampilan Pembeli LPOS-VFD
- Simbol mata uang program untuk tampilan pelanggan
- Dasar-dasar BASH (Bagian 1)
- Dasar-dasar BASH (Bagian 2)
- Cara menggunakan Putty
- Editor teks Linux nano untuk pemula
- Manual untuk pengguna WinSCP