Raspberry Pi e-Paper Uygulaması

4 minute read

Merhabalar, bu yazıda Raspbery Pi Zero kullanarak anlık olarak Saati, Tarihi, IP bilgisini, Hostname’i ve Download/Upload değerlerini gösteren bir proje yapacağım.

Bu proje için Raspberry Pi Zero’ya uygun 2.13Inch bir e-Paper Display kullanacağım.

Kullanacağım donanım ve yazılımlar aşağıdaki gibidir.

Donanımlar görüntü itibariyle aşağıdaki gibidir: raspberrypi

İlk olarak Raspberry Pi Imager kullanarak işletim sistemini SD Kart’a yazdıracağım

Kurulum adımları aşağıdaki gibidir.

“Raspberrt Pi Device” kısmında “Raspberry Pi Zero” yu, “Operating System” kısmında “Raspberry Pi OS (32-bit)” olan seçeneği, “Storage” kısmında ise SD Kartımı seçerek “NEXT” diyorum.

raspberrypi

Bu kısmında “EDIT SETTINGS” diyerek WiFi ayarlarını ve SSH ayarlarını yapmak için devam ediyorum.

raspberrypi

“GENERAL” kısmında; hostname, username, password, WLAN SSID, WLAN Password, Wireless LAN country, Time zone, Keyboard layout.

Seçeneklerini aşağıdaki gibi kendime göre dolduruyorum.

raspberrypi

“SERVICES” kısmında; “Use password authentication” seçeneğini seçerek “SAVE” ile kaydediyorum.

raspberrypi

Daha sonra “YES” diyerek devam ediyorum.

raspberrypi

Son olarak doğru SD kartı seçtiğimden emin olduktan sonra “YES” ile kurulumu başlatıyorum.

raspberrypi

Ve kurulum işlemi başlıyor.

raspberrypi

“CONTINIUE” ile bitiriyorum.

raspberrypi

Şimdi Raspberry Pi’a E-Paper ekranı ve UPS’i takalım.

E-Paper gayet basit bir şekilde Raspberry Pi pinlerine oturtulabiliyor.

raspberrypi

raspberrypi

UPS için ise küçük vidalardan kullanacağım. UPS de Raspberry Pi’nin alt kısmına konumlanacak.

Bağlantı aşağıdaki gibi olacaktır:

raspberrypi

raspberrypi

raspberrypi

Şimdi sırada cihaza güç vermekte.

UPS’i “ON” konumuna getiriyorum ve Raspberry Pi’ı başlatıyorum.

Raspberry Pi Modemden IP alacağı için ilk olarak hangi IP adresini aldığını bulmamız gerek. IP adresini öğrenmenin birkaç yolu var:

  • Modem arayüzünden,
  • Terminalden.

Ben Linux kullanıyorum ve bana daha kolay geldiği için terminalden yapacağım.

Aşağıdaki 2 yöntemle terminalden hangi IP adresini aldığını bulabiliriz.

sudo nmap -sn 192.168.0.0/24
sudo netdiscover -r 192.168.0.0/24

Benim networkümde Raspberry Pi “192.168.0.98” IP adresini aldı.

Şimdi terminalden bir SSH bağlantısı yapıyorum. Windows için Putty veya benzeri terminal programları kullanabilirsiniz.

raspberrypi

SSH ile cihaza erişim sağladık.

İlk olarak sistemi bir güncelleyelim. Bu işlem biraz zaman alacaktır. Cihazın Modem’e yakın olması süreci hızlandıracaktır.

sudo apt update -y && sudo apt upgrade -y

Gerekli kütüphane ve bağımlılıkları yüklüyorum.

sudo apt-get install python3-pip python3-pil python3-numpy python3-psutil

Şimdi e-Paper Display için gerekli olan kütüphaneyi Github’dan klonluyorum. Ve yüklüyorum.

git clone https://github.com/waveshare/e-Paper.git 
cd e-Paper/RaspberryPi_JetsonNano/python 
sudo python3 setup.py install
cd ~

Daha sonra Raspberry Pi’nin SPI Interface’sini “Enable” ediyorum.

sudo raspi-config

raspberrypi

raspberrypi

raspberrypi

raspberrypi

Şimdi cihazı bir kere Reboot edeceğim.

sudo reboot

Bu işlemler de bittikten sonra artık kodumuzu çalıştırabiliriz.

Kod aşağıdaki gibidir. Kodu ChatCPT’ye yazdırdım kopyalayıp aynı şekilde kullanabilirsiniz.

Öncelikle bir Python dosyası oluşturuyorum.

cd ~
sudo nano project.py
  1import sys
  2import os
  3import time
  4import datetime
  5import socket
  6import psutil  # psutil kütüphanesi kullanarak sistem bilgilerini alacağız
  7from PIL import Image, ImageDraw, ImageFont
  8from waveshare_epd import epd2in13_V4
  9
 10def get_ip_address():
 11    try:
 12        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 13        s.connect(("8.8.8.8", 80))
 14        ip_address = s.getsockname()[0]
 15        s.close()
 16        return ip_address
 17    except OSError:
 18        return "N/A"
 19
 20def get_hostname():
 21    try:
 22        hostname = socket.gethostname()
 23        return hostname
 24    except OSError:
 25        return "N/A"
 26
 27def format_bytes(bytes):
 28    # Byte cinsinden veriyi okunabilir bir formata dönüştüren fonksiyon
 29    if bytes < 1024:
 30        return f"{bytes} B"
 31    elif bytes < 1048576:
 32        return f"{bytes / 1024:.2f} KB"
 33    else:
 34        return f"{bytes / 1048576:.2f} MB"
 35
 36def draw_centered_text(draw, text, font, y_position, width):
 37    text_width, text_height = draw.textsize(text, font=font)
 38    x_position = (width - text_width) // 2
 39    draw.text((x_position, y_position), text, font=font, fill=0)
 40
 41def draw_clock(draw, width, height, previous_upload, previous_download):
 42    now = datetime.datetime.now()
 43    current_time = now.strftime("%H:%M:%S")
 44    current_date = now.strftime("%d.%m.%Y")  # Gün.Ay.Yıl formatı (nokta ile ayrılmış)
 45    hostname = get_hostname()
 46    ip_address = get_ip_address()
 47    
 48    net_io = psutil.net_io_counters()
 49    upload = net_io.bytes_sent
 50    download = net_io.bytes_recv
 51    
 52    upload_speed = upload - previous_upload
 53    download_speed = download - previous_download
 54    
 55    upload_speed_formatted = format_bytes(upload_speed) + "/s"
 56    download_speed_formatted = format_bytes(download_speed) + "/s"
 57
 58    font_time = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 28)
 59    font_date = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 22)
 60    font_info = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 13)
 61
 62    draw.rectangle((0, 0, width, height), fill=255)  # Ekranı temizle
 63
 64    draw_centered_text(draw, current_time, font_time, 2, width)
 65    draw_centered_text(draw, current_date, font_date, 30, width)
 66    draw_centered_text(draw, f"IP: {ip_address}", font_info, 59, width)
 67    draw_centered_text(draw, f"Hostname: {hostname}", font_info, 73, width)
 68    draw_centered_text(draw, f"Download: {download_speed_formatted}", font_info, 87, width)
 69    draw_centered_text(draw, f"Upload: {upload_speed_formatted}", font_info, 101, width)
 70    
 71    return upload, download
 72
 73try:
 74    epd = epd2in13_V4.EPD()
 75    epd.init()
 76    epd.Clear()
 77
 78    width, height = epd.height, epd.width
 79    image = Image.new('1', (width, height), 255)  # 255: Beyaz arka plan
 80
 81    previous_upload = 0
 82    previous_download = 0
 83
 84    while True:
 85        draw = ImageDraw.Draw(image)
 86        previous_upload, previous_download = draw_clock(draw, width, height, previous_upload, previous_download)
 87        epd.display(epd.getbuffer(image))
 88        time.sleep(1)
 89
 90except IOError as e:
 91    print(e)
 92
 93except KeyboardInterrupt:
 94    print("Ctrl+C")
 95    epd2in13_V4.epdconfig.module_exit()
 96    exit()
 97except Exception as e:
 98    print(f"Hata: {e}")
 99    epd2in13_V4.epdconfig.module_exit()
100    exit()

Kodu kaydetmek için “CTRL + O” tuşlarına bastıktan sonra “Enter"a basarak kaydediyorum.

Çıkmak için “CTRL + X” tuşlarına basıyorum.

Son olarak kodu çalıştırıyorum.

python3 project.py

Görüntü aşağıdaki gibi olacaktır:

raspberrypi

Buraya kadar her şey güzeldi.

Şimdi de bu kodu bir servis haline getirelim. Yani cihaz her kapanıp açıldığında bu kod çalışsın.

Bunun için bu kodu bir Linux servisi haline getireceğim.

Aşamalar şu şekildedir:

“project.service” adında bir servis dosyası oluşturuyorum.

sudo nano /etc/systemd/system/project.service

Dosyayı aşağıdaki gibi düzenliyorum.

[Unit]
Description=Display System Info on e-Paper
After=multi-user.target

[Service]
ExecStart=/usr/bin/python3 /home/pi/project.py
WorkingDirectory=/home/pi
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

Son olarak servisi yükleme ve etkinleştirme işlemlerini yapıyorum.

sudo systemctl daemon-reload
sudo systemctl enable project.service
sudo systemctl start project.service

Artık cihaz kapanıp açılsa bile bu servis otomatik olarak çalışacaktır.

Umarım faydalı bir içerik olmuştur.

Teşekkürler,

İyi Çalışmalar.