Raspberry Pi e-Paper Uygulaması
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.
- Raspberry Pi Zero,
- 2.13 Inch E-Paper Display,
- 3.7V 1000mah UPS,
- SD Card,
- Card Reader,
- Raspberry Pi Imager,
- Ve birkaç vida.
Donanımlar görüntü itibariyle aşağıdaki gibidir:
İ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.
Bu kısmında “EDIT SETTINGS” diyerek WiFi ayarlarını ve SSH ayarlarını yapmak için devam ediyorum.
“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.
“SERVICES” kısmında; “Use password authentication” seçeneğini seçerek “SAVE” ile kaydediyorum.
Daha sonra “YES” diyerek devam ediyorum.
Son olarak doğru SD kartı seçtiğimden emin olduktan sonra “YES” ile kurulumu başlatıyorum.
Ve kurulum işlemi başlıyor.
“CONTINIUE” ile bitiriyorum.
Şimdi Raspberry Pi’a E-Paper ekranı ve UPS’i takalım.
E-Paper gayet basit bir şekilde Raspberry Pi pinlerine oturtulabiliyor.
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:
Ş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.
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
Ş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:
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.