Abschluss von Informationen auf dem Display des Käufers

Die Kundenanzeige wurde angezeigt. Es wurde interessant zu versuchen, es als Informationstafel zu verwenden, um Informationen über den aktuellen Tag, die Uhrzeit bis zum Ende des Arbeitstages / der Woche, Wetterinformationen und Wechselkurse anzuzeigen.


Gleichzeitig wollte ich keine ressourcenintensiven Anwendungen und meinen PC verwenden. Er blieb bei einem Haufen Mini-PC Raspberry + Linux + Customer Display stehen.


@ Kundenanzeige mit Informationen | Mitte | 700x0


@ Himbeer Pi 2 | Mitte | 300x0


Erforderliche Kommentare


Ich denke in diesem Artikel nicht daran, Linux OS auf einem Raspberry-Gerät zu installieren und zu konfigurieren.

Zum Bearbeiten von Text unter Linux habe ich die Editoren nano und mcedit verwendet.
Um über die Windows-Umgebung auf Mini-PCs mit Linux-Betriebssystem zuzugreifen, habe ich Clients für den Remotezugriff über das SSH-Protokoll KiTTY / PuTTY verwendet.
Um Dateien zwischen Windows und Linux zu übertragen, habe ich WinSCP verwendet.

Bash - Shell (Shell).
Bash ist eine Abkürzung für "Bourne-Again Shell" ("wiederbelebte" Shell). Schlüsselwörter, Syntax und andere grundlegende Funktionen der Sprache wurden von einer anderen sh-Shell (kurz für shell) entlehnt.
Bash ist auch eine leistungsstarke Programmiersprache.

Ich beschäftige mich mit der Wartung von Softwareprodukten auf Basis von 1C und für mich war es eine Gelegenheit, mich selbst mit der Programmierung in der Linux-Umgebung vertraut zu machen.
Nach meinem besten Verständnis werde ich die Befehle erklären, die ausgeführt werden. Dies geschieht mit dem Ziel, ein großes Publikum zu erreichen.

Was hast du benutzt?


  • Raspberry Pi 2 Model B v1.1 Single Board Computer mit installiertem Raspbian GNU / Linux 9.4 (Stretch).
  • Kundenanzeige POSUA LPOS-VFD USB.
  • Die Bash-Shell

1. Stufe. Schließen Sie die Kundenanzeige an und richten Sie sie ein


Nachdem Sie das Display (DP) des Kunden an den USB-Anschluss angeschlossen haben, werden die Parameter des angeschlossenen Geräts ermittelt. Führen Sie im Terminal den folgenden Befehl aus:


usb-devices 

Holen Sie sich eine Liste der an Raspberry angeschlossenen USB-Geräte:


 T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 1 D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=1d6b ProdID=0002 Rev=04.14 S: Manufacturer=Linux 4.14.69-v7+ dwc_otg_hcd S: Product=DWC OTG Controller S: SerialNumber=3f980000.usb C: #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 5 D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=02 MxPS=64 #Cfgs= 1 P: Vendor=0424 ProdID=9514 Rev=02.00 C: #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=2mA I: If#= 0 Alt= 1 #EPs= 1 Cls=09(hub ) Sub=00 Prot=02 Driver=hub T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=ff(vend.) Sub=00 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0424 ProdID=ec00 Rev=02.00 C: #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=2mA I: If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=ff Driver=smsc95xx T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#= 4 Spd=12 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=0000 ProdID=0131 Rev=01.00 S: Manufacturer=www.posua.com S: Product=POSua LPOS-II-VFD USB CDC C: #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=16mA I: If#= 0 Alt= 0 #EPs= 3 Cls=02(commc) Sub=02 Prot=01 Driver=usbserial_generic I: If#= 1 Alt= 0 #EPs= 2 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid 

Aus den vom Befehl empfangenen Informationen ergibt sich die Zeile Produkt = POSua LPOS-II-VFD USB CDC . Dies ist unsere Kundenanzeige. In diesem Abschnitt benötigen wir die Zeile Vendor = 0000 ProdID = 0131 Rev = 01.00. Nämlich Hersteller = 0000 prodID = 0131 . Das Gerät identifiziert sich also.


Für den korrekten Betrieb mit dem DP muss das USB-Betriebsmodul in den Systemkern geladen werden. Führen Sie den Befehl mit erhöhten Berechtigungen aus:


 sudo modprobe usbserial vendor=0x0000 product=0x0131 

modprobe ist ein Programm zum Hinzufügen von Modulen zum Linux-Kernel. usbserial ist ein Kernelmodul, das einen COM-Port auf USB-Geräten emuliert. 0x - bedeutet hexadezimales Format.


Da auf einem Linux-System ein USB-Gerät angeschlossen ist, empfängt es automatisch die ttyUSB0- Datei. Dies ist eine wichtige Funktion bei der Interaktion mit Geräten unter Linux - das Arbeiten mit dem Gerät als Datei. Gerätedateien werden im /dev gespeichert.


Um korrekt mit DP zu arbeiten, stellen Sie die Datenübertragungsrate ein:


 stty -F /dev/ttyUSB0 9600 

stty - Der Befehl legt die Terminal-Ein- / Ausgabeparameter für das Gerät fest. -F ist das Gerät. In unserem Fall lautet die Anzeige des Käufers /dev/ttyUSB0 . Und für dieses Gerät ist eine Geschwindigkeit von 9600 Baud eingestellt.


Jetzt können Sie versuchen, eine Begrüßungsnachricht anzuzeigen (bisher auf Englisch):


 echo "Hello!" > /dev/ttyUSB0 

Wenn alles richtig gemacht wurde, erscheint unsere Meldung auf dem Bildschirm. Weitere Details zum Team unten.


2 Stufe. Programmierung


In der vorherigen Phase haben wir oben auf dem Begrüßungsbildschirm des Geräts eine Meldung in englischer Sprache angezeigt. Und es ist nicht sehr schön.


Führen Sie den folgenden Befehl aus, um den Bildschirm zu löschen:


 echo -e -n "\x0c\x0b" > /dev/ttyUSB0 

echo - Terminal Ausgabebefehl. Die Option -e - aktiviert die Unterstützung für die Ausgabe von Escape-Sequenzen, -n - gibt an, dass keine Zeilenvorschübe ausgegeben werden müssen. Der Eintrag -en ist zulässig.


Kombinationen von Zeichen, die aus einem Backslash \ gefolgt von einem Buchstaben oder einer Reihe von Zahlen bestehen, werden als Escape-Sequenzen bezeichnet.

0 - löscht den Bildschirm und bricht den 0b - bewegt den Cursor an die Position ganz links oben. Symbol > - Flusskontrolle (leitet die Ausgabe um). In diesem Fall die Datei / dev / ttyUSB0 unseres Geräts. Wenn Sie nur das echo "Hello!" Anschließend wird der in Anführungszeichen angegebene Text im Terminalfenster angezeigt.


Übrigens könnte der Befehl, der die Geschwindigkeit für die Übertragung von Daten an das Gerät ändert, wie folgt geschrieben werden:


 stty 9600 < /dev/ttyUSB0 

Um Nachrichten auf Russisch anzuzeigen, gehen Sie wie folgt vor:


 echo -n "!" | iconv -f UTF-8 -t CP866 > /dev/ttyUSB0 

| - Leitet die Ausgabe eines Befehls auf die Eingabe eines anderen (Pipeline) um. In unserem Fall ist die Zeichenfolge "Hallo!" Es wird nicht sofort in die Gerätedatei ausgegeben, sondern an das Dienstprogramm "Konvertierung" iconv übertragen. iconv - konvertiert von einer Codierung in eine andere.
Mit der Bash-Shell können Sie nicht nur Befehle direkt im Terminal ausführen, sondern auch Skriptdateien schreiben.


Ein Skript ist eine Nur-Text-Datei mit einer Folge von ausgeführten Befehlen.

Damit bash versteht, dass es "sein" ist, wird #! / Bin / bash am Anfang der Datei angezeigt. Um das Skript direkt auszuführen, müssen Sie den folgenden Befehl ausführen:


 sudo chmod u+x namefile.sh 

Wobei namefile.sh die Skriptdatei ist. Die Erweiterung sh - bedeutet, dass es sich um eine Bash-Skriptdatei handelt. chmod ist ein Programm zum Ändern der Zugriffsrechte auf Dateien und Verzeichnisse. u+x - legt das Recht fest, die Datei für den aktuellen Benutzer auszuführen.


Wir werden das Problem mit zwei Skripten lösen. Das erste Skript ist das Hauptskript ( dispos.sh ). Es zeigt alle notwendigen Informationen auf dem Display des Käufers an. Das zweite Hilfsmittel ( parse.sh ) empfängt Wetterdaten, Währungsnotierungsdienste und schreibt Daten in Zwischendateien. Zwischendatendateien werden im ersten Skript verwendet.


Damit Skripte ausgeführt werden können, müssen Sie die folgenden Befehle ausführen:


 sudo chmod +x dispos.sh sudo chmod +x parse.sh 

Beachten Sie, dass nur +x . Dies ist eine verkürzte Version von u+x .


Skripte müssen in regelmäßigen Abständen ausgeführt werden. Verwenden Sie dazu den Standard-Crontab-Scheduler. Verwenden Sie zum Bearbeiten den folgenden Befehl:


 crontab -e 

Fügen Sie dem Scheduler zwei Zeilen hinzu:


 */20 * * * * /home/pi/parse.sh */1 * * * * /home/pi/dispos.sh 

Das Skript parse.sh wird alle 20 Minuten und das Skript dispos.sh jede Minute ausgeführt.


Vor der ersten Anzeige des Kunden auf dem Display müssen Sie zuerst das Skript parse.sh ausführen, das die primären Wetter- und Währungsdaten empfängt.


 ./parse.sh 

Als nächstes werde ich die vollständigen Skripte mit kurzen Kommentaren geben.


Beschreibung der Skriptdateien


Dispos.sh-Datei


dispos.sh-Datei
 #!/bin/bash #        POSua LPOS-VFD. # -  ttyUSB0. #     tty  : # modprobe usbserial vendor=0x0000 product=0x0131. #  0x0000  0x0131  ,   # usb-devices, lsusb  dmesg. #    stty 9600 < /dev/ttyUSB0. #          parse.sh #     crontab      . # **************************************************************** #   # ttyUSB -      (POS-) DEV_DISPLAY="/dev/ttyUSB0" #        #   ,  ,   18:00:00 #    17:00:00 TIME_OF_WORKDAY="18:00:00" if (( $(date "+%u") >= 5 )); then TIME_OF_WORKDAY="17:00:00" fi #      ( 17:00:00) #      DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"` # **************************************************************** #       #    disp_clear(){ echo -en "\x0c\x0b" > "${DEV_DISPLAY}" } #       disp_cr(){ echo -e "\x0b" > "${DEV_DISPLAY}" } #       disp_print(){ echo -n $1 | iconv -f UTF-8 -t CP866 > "${DEV_DISPLAY}" } # **************************************************************** #    # 1.    disp_clear #   disp_print ": `date "+%A"`" disp_cr #     disp_print " `date "+%d.%m.%Y %H:%M"`" sleep 8 # **************************************************************** # 2.       disp_clear disp_print "   . :" disp_cr HOURS=$(( ( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) / 3600 )) MINUTES=$(( (( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) - $HOURS * 3600) / 60 )) #       if (( $MINUTES > -1 )); then OUTPUT_TIME=" ${HOURS} . ${MINUTES} ." else OUTPUT_TIME=" !" fi #       disp_print "${OUTPUT_TIME}" sleep 8 # **************************************************************** # 3.       disp_clear disp_print "  . :" disp_cr 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 )) #       if (( $MINUTES > -1 )); then OUTPUT_TIME="${DAYS} . ${HOURS} . ${MINUTES} " else OUTPUT_TIME=" !" fi #       disp_print "${OUTPUT_TIME}" sleep 8 # **************************************************************** # 4.     # 4.1.      LINE1=$(sed -n '1{p;q}' /tmp/weather.txt) DISPLAY_LINE1=${LINE1:0:19} DISPLAY_LINE2=${LINE1:19:19} #     (2 ) disp_clear disp_print "${DISPLAY_LINE1}" disp_cr disp_print "${DISPLAY_LINE2}" sleep 4 # 4.2.    LINE1=$(sed -n '2{p;q}' /tmp/weather.txt) DISPLAY_LINE1=${LINE1:0:14} DISPLAY_LINE2=${LINE1:14:19} #     (2 ) disp_clear disp_print " ${DISPLAY_LINE1}" disp_cr disp_print "${DISPLAY_LINE2}" sleep 8 # **************************************************************** # 5.      #      #  DOLLAR=$(sed -n '1{p;q}' /tmp/ex.txt) DOLLAR=${DOLLAR//–/-} #  EURO=$(sed -n '2{p;q}' /tmp/ex.txt) EURO=${EURO//–/-} #     disp_clear disp_print ": ${DOLLAR}" disp_cr disp_print ": ${EURO}" sleep 8 # **************************************************************** # 6.      #      # BTC while read line do BTC=${line:0:13} done </tmp/bitcoin.txt # ETH while read line do ETH=${line:0:13} done </tmp/ethereum.txt #     #      disp_clear disp_print "BTC: ${BTC//./,}" disp_cr disp_print "ETH: ${ETH//./,}" #sleep 8 # **************************************************************** # 7.      #      (.  20 ) #DISPLAY_LINE1="  !" #DISPLAY_LINE2="  !" #      #disp_clear #disp_print "${DISPLAY_LINE1:0:19}" #disp_cr #disp_print "${DISPLAY_LINE2:0:19}" 

Kommentare


Verwenden Sie den Befehl date, um das aktuelle Datum anzuzeigen. Beispiel


 echo `date "+%d.%m.%Y %H:%M"` 

Nach der Ausführung erhalten wir das Datum des Formulars: 20.05.2019 12:11.


Um die Zeit bis zum Ende des Tages zu berechnen, verwenden wir die zusätzliche Variable TIME_OF_WORKDAY und setzen den Wert TIME_OF_WORKDAY="18:00:00" . Dann berechnen wir die Stunden und Minuten bis zum Ende des Arbeitstages:


 HOURS=$(( ( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) / 3600 )) MINUTES=$(( (( $(date +%s --date=$TIME_OF_WORKDAY) - $(date +%s) ) - $HOURS * 3600) / 60 )) 

Das $ -Symbol zeigt an, dass es sich um eine Variable handelt.
Das # -Symbol ist ein Kommentar.


date +%s - Ermittelt das aktuelle Datum und die aktuelle Uhrzeit in Sekunden.
date +%s --date=$TIME_OF_WORKDAY - date +%s --date=$TIME_OF_WORKDAY die Zeit in Sekunden bis TIME_OF_WORKDAY ("18:00:00") .


Berechnung der Zeit bis zum Ende der Arbeitswoche:


 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 )) 

Wobei DAY_OF_WEEKEND=`date +"%s" --date="friday 17:00:00"` die Zeit in Sekunden von der aktuellen Zeit bis Freitag 17:00:00 ist.


Ein Teil des Skripts wird mithilfe von Funktionen implementiert. Zum Beispiel


 #    disp_clear(){ echo -en "\x0c\x0b" > "${DEV_DISPLAY}" } 

disp_clear() ist der Name der Funktion. In {} werden ausführbare Befehle angezeigt.


Die Variable DEV_DISPLAY ist "global" und wird am Anfang des Skripts und entsprechend DEV_DISPLAY="/dev/ttyUSB0" .


Lesen von Daten aus einer Datei, z. B. einer bestimmten Zeile (1):


 LINE1=$(sed -n '1{p;q}' /tmp/weather.txt) 

sed ist ein Texteditor, der Bearbeitungsvorgänge für Informationen in einem Standardeingabestream oder einer Standarddatei ausführt. Die -n zeigt die aktuell ausgewählte Zeile an. '1{p;q}' - druckt 1 Zeile und wird beendet, ohne den Rest zu lesen ( p - print, q - output).


Eine weitere Option zum Lesen aus einer Datei (Zeile für Zeile):


 while read line do BTC=${line:0:13} done </tmp/bitcoin.txt 

Und so DISPLAY_LINE1=${LINE1:0:14} LINE1 DISPLAY_LINE1=${LINE1:0:14} aus der Zeile LINE1 einen Teilstring mit einer Länge von 14 Zeichen ab 0.


Die Zeichen werden durch die Kombination // , z. B. DOLLAR//–/- . Das Symbol "-" wird durch ein "-" ersetzt.


Datei parse.sh


Datei parse.sh
 #!/bin/bash #      RSS   http://rp5.ru/rss/1859/ru # 1859 -    #       conv(){ #        CURRENCY=$(sed -n '1!G;h;$p' /tmp/ex.xml | sed -n "${1}{p;q}") CURRENCY=${CURRENCY//[^,^(^)^0-9^–^+]/} echo $CURRENCY } #   c     # 1.  wget -q -O /tmp/rp5weather.xml http://rp5.ru/rss/1859/ru # 2.      wget -q -O /tmp/ex.xml http://currr.ru/rss/ # 3.   bitcoin/ethereum wget -q -O /tmp/bitcoin.json https://api.coinmarketcap.com/v1/ticker/bitcoin/ wget -q -O /tmp/ethereum.json https://api.coinmarketcap.com/v1/ticker/ethereum/ #   #   ,  ,    #     LINE31=$(sed -n '31{p;q}' /tmp/rp5weather.xml) LINE33=$(sed -n '33{p;q}' /tmp/rp5weather.xml) WEATHER1=${LINE31//"</title>"} WEATHER1=${WEATHER1//" °C"} WEATHER1=${WEATHER1//"  "} WEATHER1=${WEATHER1:29} WEATHER2=${LINE33##*} WEATHER2=${WEATHER2//"°"} echo "${WEATHER1}" > /tmp/weather.txt echo ${WEATHER2%.*} >> /tmp/weather.txt #   Bitcoin LINEBTC=$(sed -n '7{p;q}' /tmp/bitcoin.json) echo "${LINEBTC//[^.^0-9]/}" > /tmp/bitcoin.txt #   Ethereum LINEETH=$(sed -n '7{p;q}' /tmp/ethereum.json) echo "${LINEETH//[^.^0-9]/}" > /tmp/ethereum.txt #   DOLLAR=$(conv 8) echo $DOLLAR > /tmp/ex.txt EURO=$(conv 6) echo $EURO >> /tmp/ex.txt 

Kommentare


Mit dem Befehl wget können Sie Dateien, Seiten usw. aus dem Netzwerk herunterladen. Die Option -q - zeigt ein Minimum an Informationen an, -O - speichert in der angegebenen Datei.


Die folgenden Zeilen schreiben in die Datei:


 echo "${WEATHER1}" > /tmp/weather.txt echo ${WEATHER2%.*} >> /tmp/weather.txt 

Wenn außerdem die Umleitung des Ausgabestreams in die Datei > , wird der Inhalt der Datei überschrieben, und mit >> werden Daten an die Datei angehängt.


Ein Beispiel für die Verwendung eines Parameters in einer Funktion:


 conv 6 

Direkt in Funktion:


 CURRENCY=$(sed -n '1!G;h;$p' /tmp/ex.xml | sed -n "${1}{p;q}") 

Wobei {1} der Parameter ist. Die Nummer 6 wird übergeben.


Beachten Sie die komplizierte Funktion zum Ersetzen von Teilzeichenfolgen, zum Beispiel:


 LINEBTC//[^.^0-9]/ 

Nur das "." und alle Zahlen sind von 0 bis 9.


Nachwort


In bash sind fast alle Funktionen "gewöhnlicher" Programmiersprachen verfügbar. Und einige Teams überraschen im Vergleich zu Analoga in 1C mit ihrer Lakonizität und Funktionalität.


Derzeit ist die Anzeige des Kunden als Schwarzes Brett seit mehr als sechs Monaten stabil.


Liste der Ressourcen


  1. LPOS-VFD Käuferanzeigeseite
  2. Programmieren Sie Währungssymbole für die Kundenanzeige
  3. BASH-Grundlagen (Teil 1)
  4. BASH-Grundlagen (Teil 2)
  5. Wie benutzt man PuTTY?
  6. Linux Nano Text Editor für Anfänger
  7. Handbuch für WinSCP-Benutzer

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


All Articles