С момента покупки NanoPi NEO2 с экраном NanoHat OLED прошло всего около двух недель, всё это время железка была включена и лежала на подоконнике. На экране в это время был включен 1-й экран с текущим временем, т.е. казалось бы, не такая уж и статичная картинка. Но оказалось что и этого достаточно для того чтобы начать выгорать OLED-экрану. Заметно это на 3-м экране, там где пункты меню подсвечиваются. На верхнем пункте Yes можно отчётливо прочитать Mar 2019, а на нижнем пункте No видны элементы часов.
Чтобы окончательно не угробить экран – нужно было реализовать таймер сна, для того, чтобы экран автоматически отключался через определённое время. Как оказалось такая идея посетила не только меня, и скрипта для управления экраном уже доработан. Здесь находится оригинал изменений, а здесь небольшое обсуждение.
Единственное что мне не понравилось в этих доработках – после того как экран заснул, нажатие любой клавиши не просто пробуждает экран, а пробуждает экран и сразу выполняется действие которое закреплено за кнопкой. На мой взгляд это неправильно, поэтому я немного изменил скрипт, для того чтобы первое нажатие любой кнопки просто включало экран.
--- bakebit_nanohat_oled.py.orig 2018-10-11 11:08:29.000000000 +0300
+++ bakebit_nanohat_oled.py 2019-03-14 12:40:19.083354599 +0300
@@ -45,6 +45,8 @@
import signal
import os
import socket
+import fcntl
+import struct
global width
width=128
@@ -57,6 +59,10 @@
pageIndex=0
global showPageIndicator
showPageIndicator=False
+global pageSleep
+pageSleep=120
+global pageSleepCountdown
+pageSleepCountdown=pageSleep
oled.init() #initialze SEEED OLED display
oled.setNormalDisplay() #Set display to normal mode (i.e non-inverse mode)
@@ -83,6 +89,14 @@
global lock
lock = threading.Lock()
+def get_ip_address(ifname):
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ return socket.inet_ntoa(fcntl.ioctl(
+ s.fileno(),
+ 0x8915, # SIOCGIFADDR
+ struct.pack('256s', ifname[:15])
+ )[20:24])
+
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
@@ -111,6 +125,7 @@
global width
global height
global lock
+ global pageSleepCountdown
lock.acquire()
is_drawing = drawing
@@ -120,6 +135,16 @@
if is_drawing:
return
+ # if the countdown is zero we should be sleeping (blank the display to reduce screenburn)
+ if pageSleepCountdown == 1:
+ oled.clearDisplay()
+ pageSleepCountdown = 0
+
+ if pageSleepCountdown == 0:
+ return
+
+ pageSleepCountdown = pageSleepCountdown - 1
+
lock.acquire()
drawing = True
lock.release()
@@ -149,12 +174,15 @@
elif page_index==1:
# Draw some shapes.
# First define some constants to allow easy resizing of shapes.
- padding = 2
+ padding = 0
top = padding
bottom = height-padding
# Move left to right keeping track of the current x position for drawing shapes.
x = 0
- IPAddress = get_ip()
+ try:
+ IPAddress = get_ip_address('eth0')
+ except:
+ IPAddress = get_ip()
cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
CPU = subprocess.check_output(cmd, shell = True )
cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"
@@ -218,6 +246,15 @@
def receive_signal(signum, stack):
global pageIndex
+ global pageSleepCountdown
+ global pageSleep
+
+ # check if screen is black then just return from sleep without signal processing
+ if pageSleepCountdown == 0:
+ pageSleepCountdown = pageSleep # user pressed a button, reset the sleep counter
+ return
+ else:
+ pageSleepCountdown = pageSleep
lock.acquire()
page_index = pageIndex
Как видно из изменений, скрипт не только добавляет функционал хранителя экрана, но и улучшает определение IP-адреса. Т.к. оригинальный скрипт в некоторых условиях может показывать IP-адрес не сетевой карты, а любого другого интерфейса, например интерфейса VPN-соединения tun0
.
Эти изменения можно вручную внести в файл /root/NanoHatOLED/BakeBit/Software/Python/bakebit_nanohat_oled.py
, а можно скопировать их в .diff
-файл и применить патч к оригинальному скрипту:
wakko@NanoPi-NEO2:~$ nano -w ~/sleep.diff
... вставляем сюда содержимое патча ...
wakko@NanoPi-NEO2:~$ patch -b ~/NanoHatOLED/BakeBit/Software/Python/bakebit_nanohat_oled.py < ~/sleep.diff
patching file ~/NanoHatOLED/BakeBit/Software/Python/bakebit_nanohat_oled.py
Затем перезагружаем компьютер и больше не беспокоимся что экран может быстро выгореть.