Merhaba arkadaşlar, bu yazımda sizlere Raspberry Pi ile masaüstü versiyon olmadan lite versiyon ile PyQT de yapacağımız bir formu açılışta çalıştıracağız. Bu gibi programlar ile, lite versiyon kullanarak sadece bir program çalıştırıp genellikle dokunmatik LCD kullanarak çeşitli cihazlar yapılabilir. Ben Raspberry Pi 3 e piyasada yaygın olarak satılan 3,5″ Dokunmatik LCD yi kullandım.
https://www.robolinkmarket.com/35-inch-raspberry-pi-dokunmatik-lcd-ekran
İlk olarak Raspberry Pi nin sitesinden lite versiyon image ı indirip pi ye attıktan sonra aşağıdaki komutları uygulayacağız.
Raspberry Pi OS Lite
https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit
Daha sonra LCD yi takıp pi ye enerji verdiğimizde uzaktan bağlanarak güncellememiz i yapacağız.
1 2 |
sudo apt-get update sudo apt-get upgrade |
LCD yi çalıştırmak için kendi uygulamasını indirip çalıştıracağız. Tabi git ile indireceğimiz için ilk önce git kurmalıyız.
1 2 3 4 5 6 7 8 9 10 11 |
sudo apt install git sudo rm -rf LCD-show git clone https://github.com/goodtft/LCD-show.git chmod -R 755 LCD-show cd LCD-show/ sudo ./LCD35-show |
LCD ayarlarını yaptıktan sonra sistemi yeniden başlattığınızda LCD ekrandan açılacağını göreceksiniz.
Artık LCD hazır şimdi gelelim lite versiyon da QT formu açmak için gerekli programları sırası ile yükleyelim.
1 2 3 4 5 6 7 8 9 |
sudo apt-get -f install veya sudo apt --fix-broken install sudo apt-get -y install nodm matchbox-window-manager sudo apt-get install matchbox xorg x11-xserver-utils ttf-mscorefonts-installer xwit sqlite3 libnss3 sudo apt-get install pyqt5-dev-tools sudo apt-get install python-pip |
Daha sonra x11 için hangi qt formun yani hangi py dosyasını açacağız onu ayarlayacağız.
1 |
sudo nano /etc/X11/xinit/xinitrc |
Ekrandaki bütün satırları silip aşağıdaki satırları ekleyeceğiz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/sh # /etc/X11/xinit/xinitrc # # global xinitrc file, used by all X sessions started by xinit (startx) # invoke global X session script # Disable any form of screen saver / screen blanking / power management xset s off xset s noblank xset -dpms exec matchbox-window-manager -use_titlebar no -use_cursor no & while true; do python3 /home/pi/mainform_480x320.py done |
Burada while içinde çalışacak olan PyQt programını yazıyoruz. Programı aşağıda vereceğim.
Artık X11 ekranımız hazır açılışta startx lcd ye yönlendireceğiz;
1 |
sudo nano /etc/rc.local |
Gelen ekranda exit 0 dan önce aşağıdaki satırı yazacağız.
1 |
sudo FRAMEBUFFER=/dev/fb1 startx & |
Artık yaptığımız program açılışta ekrana gelecektir. Program için ben basit bir ekran yaptım ve işlemci disk ram gibi bilgileri yazdırdım. Siz tasarım kısmında istediğiniz programı yapabilirsiniz.
PyQt için ilk önce QT Designer ı indireceğiz. Burada yapacağımız görsel formu belirliyoruz ve .ui dosyası olarak kaydediyoruz.
Şimdi gelelim python kodlarına, bunun için ben Visual Studio Code u kullanıp ilk önce Windows ortamında çalıştırıp denedikten sonra raspberry e yükledim.
Artık programına geçebiliriz aşağıdaki programı windows ortamında çalıştırıp hatasız denedikten sonra /home/pi/ nin içine yükleyeceksiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
from PyQt5 import QtWidgets, uic from PyQt5.QtWidgets import QMessageBox from PyQt5.QtCore import QTimer, QTime from PyQt5.QtGui import QPixmap from PyQt5.QtGui import QMovie import sys import os import socket import psutil barcount = 0 class Ui(QtWidgets.QMainWindow): def __init__(self): super(Ui, self).__init__() uic.loadUi(os.path.dirname(__file__) + '/mainForm_480x320.ui', self) self.movie = QMovie(os.path.dirname(__file__) + '/digitalruh3.gif') self.btnsysclose = self.findChild(QtWidgets.QPushButton, 'pushButton') self.btnsysclose.clicked.connect(shutdownmsg) self.btnreboot = self.findChild(QtWidgets.QPushButton, 'pushButton_2') self.btnreboot.clicked.connect(self.btn_reboot) self.btnexit = self.findChild(QtWidgets.QPushButton, 'pushButton_3') self.btnexit.clicked.connect(showDialog) self.lblpix = self.findChild(QtWidgets.QLabel, 'label_20') self.lblip = self.findChild(QtWidgets.QLabel, 'label_2') self.lbltime = self.findChild(QtWidgets.QLabel, 'label_8') self.lbltemp = self.findChild(QtWidgets.QLabel, 'label_4') self.pbarcpu = self.findChild(QtWidgets.QProgressBar, 'progressBar_2') self.pbarram = self.findChild(QtWidgets.QProgressBar, 'progressBar_3') self.lblram = self.findChild(QtWidgets.QLabel, 'label_9') self.lblfreq = self.findChild(QtWidgets.QLabel, 'label_13') self.lbltest = self.findChild(QtWidgets.QLabel, 'label_10') self.lblip2 = self.findChild(QtWidgets.QLabel, 'label_15') self.lbldisk = self.findChild(QtWidgets.QLabel, 'label_17') self.timer = QTimer() self.timer.timeout.connect(self.lcdupdate) self.timer.start(1000) self.lblpix.setMovie(self.movie) self.movie.start() self.show() def lcdupdate(self): current_time = QTime.currentTime() label_time = current_time.toString('hh:mm:ss') self.lbltime.setText(label_time) self.lbltemp.setText("%4.2f°C" % get_cpu_temp()) self.lblip.setText(get_ip_address_2("eth0")) self.lblip2.setText(get_ip_address_2("wlan0")) self.pbarcpu.setValue(int(psutil.cpu_percent())) self.pbarram.setValue(int(psutil.virtual_memory().percent)) ramtoplam = str(round(float((psutil.virtual_memory().total/1024)/1024), 2)) ramkul = str(round(float((psutil.virtual_memory().used/1024)/1024), 2)) self.lblram.setText(ramtoplam + ' / ' + ramkul + ' MB') self.lblfreq.setText(str(psutil.cpu_freq().current) + ' MHz') hdd = psutil.disk_usage('/') strdisktotal = "%d" % (hdd.total / (2**30)) strdiskusage = "%d" % (hdd.used / (2**30)) self.lbldisk.setText(strdisktotal + " GiB / " + strdiskusage + " GiB") def btn_reboot(self): os.system("sudo reboot now") def btn_shutdown(self): os.system("sudo shutdown now") def btn_temp_goster(self): self.label_2.setText("%4.2f°C" % get_cpu_temp()) def shutdownmsg(): sdmsgbox = QMessageBox() sdmsgbox.setIcon(QMessageBox.Information) sdmsgbox.setText("Kapatmak istediğinizden eminmisiniz?") sdmsgbox.setWindowTitle("Sistem Uyarı !") sdmsgbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) retsd = sdmsgbox.exec() if retsd == sdmsgbox.Ok: os.system("sudo shutdown now") def showDialog(): msgBox = QMessageBox() msgBox.setIcon(QMessageBox.Information) msgBox.setText("Message box pop up window") msgBox.setWindowTitle("QMessageBox Example") msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) msgBox.buttonClicked.connect(msgButtonClick) returnValue = msgBox.exec() if returnValue == QMessageBox.Ok: print('OK clicked') exit() def msgButtonClick(i): print("Button clicked is:", i.text()) def get_ip_address(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) return s.getsockname()[0] def get_ip_address_2(conval): try: interfaces = psutil.net_if_addrs() ip = interfaces[conval][0][1] return ip except: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) return s.getsockname()[0] def get_cpu_temp(): try: tempFile = open("/sys/class/thermal/thermal_zone0/temp") cpu_temp = tempFile.read() tempFile.close() return round(float(cpu_temp) / 1000, 2) except: return 0 def cpu(): return str(psutil.cpu_percent()) + '%' app = QtWidgets.QApplication(sys.argv) window = Ui() app.exec_() |
Artık raspberry pi yi yeniden başlattığımızda ekrana oluşturduğumuz form gelecektir.
Program ve UI dosyası için tıklayın: PyQtStart
Bir sonraki uygulamada görüşmek üzere,
Kolay gelsin.