Raspberry Pi ile PyQt5 Açılış Uygulaması

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.

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.

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.

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.

sudo nano /etc/X11/xinit/xinitrc

Ekrandaki bütün satırları silip aşağıdaki satırları ekleyeceğiz.

#!/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;

sudo nano /etc/rc.local

Gelen ekranda exit 0 dan önce aşağıdaki satırı yazacağız.

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.

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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.