С момента покупки 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

Затем перезагружаем компьютер и больше не беспокоимся что экран может быстро выгореть.


Следующая запись Предыдущая запись