Bonjour, j’ai un module OLED 0.91" que je contrôle via Python. Je l’utilise dans quelques projets et je désire améliorer certaines choses. Le script du module passe les demandes en créant une image qui envoie au module.
Selon la documentation, garder une image fixe trop longtemps va endommager les pixels du OLED, alors faudrait je me crée un genre d’écran de veille. Je veux garder mon matériel en bon état et en même temps, créer une animation permet de vérifier l’état du RPi (actif, ralenti, fermé ou planté).
Mais c’est la que j’ai besoin d’un coup de main, je visualise un peu mal comment j’arriverais à le faire correctement. C’est que je me sert aussi de l’écran pour afficher des états d’activité. Alors faudra je me crée un service en background qui attend des appels pour afficher le rendu demandé.
Dans mes projets, l’écran « stand by » est toujours une identification projet avec l’adresse réseau pour le joindre. Après quand je lance une action, il va changer avec des détails de l’action. Idéalement, il ne change pas pour le « stand by » sans qu’une commande lui soit faite, bref, il n’y a pas de « timer ».
Alors en premier temps, j’aimerais savoir comment me créer un services qui;
- Permet de garder un exécution en arrière plan et recevoir par ligne de commande les requêtes d’affichage
- Que la commande soit le plus rapide possible
- Que l’animation du mode « stand by » ne ralentisse pas trop le système et permet de laisser le service rapide en réponse (que le « timer » entre les transitions ne soit pas de quoi qui occupe le temps processeur)
Je dois déjà faire des tests pour savoir si le script du module gère mieux le chargement de bitmap ou la création en mémoire pour la rapidité d’affichage, car j’ai un « lag » qui impact la vitesse d’exécution. Mais note, je roule sur des Raspberry Pi Zero WH v1.
Dans mes projets, noter que j’utilise déjà un serveur Web par Python avec un API pour une interface Web. Et je ne sais pas si je passe par des cURL je pourrais faire mes appels, tout en répondant aux critères, car actuellement je n’ai pas de multithread et ça fait que les action « gèle » l’activité le temps qui se complète. (besoin d’optimisation dans mes gestion processus)
Alors bien sur, je ne demande pas de coder pour moi. Mais m’aligner sur quelques bout de code (j’apprend beaucoup par analyse d’exemple) ou des tutoriels sur des projets similaire de services en Python. (Je suis un peu fatigué des recherches sur Google qui aboutisse sur du code sur StackOverflow pour des réponses sur Python 2 ou que des réponses partiels)
Module OLED : https://www.waveshare.com/wiki/0.91inch_OLED_Module
Ma méthode d’installation : RPi OLED 0.91 i2c — Wiki levelKro
Exemple de mon code actuel pour créer un affichage basé sur leur démo, modifié pour usage dynamique par ligne de commande:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
import os
import logging
import time
import traceback
import getopt
from waveshare_OLED import OLED_0in91
from PIL import Image,ImageDraw,ImageFont
#logging.basicConfig(level=logging.DEBUG)
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
IPAddr=s.getsockname()[0]
path=os.path.dirname(os.path.realpath(__file__))
argv = sys.argv[1:]
opts, args = getopt.getopt(argv,"h:t:i:n:x:")
out_title="RPi-QL"
out_info=""
out_xtra=""
out_noimg=False
for opt, arg in opts:
if opt == '-h':
print("*** Help of OLED 0.91 Display")
print('Syntax: oled.py -t "title text" -i "info text" -n "extra info text"')
sys.exit()
elif opt in ("-t"):
out_title = arg
elif opt in ("-i"):
out_info = arg.replace(":ipaddr:",IPAddr)
elif opt in ("-n"):
out_xtra = arg.replace(":ipaddr:",IPAddr)
elif opt in ("-x"):
out_noimg = True
else:
print("Found: "+str(opt))
disp = OLED_0in91.OLED_0in91()
# Initialize library.
disp.Init()
# Clear display.
disp.clear()
# Create blank image for drawing.
image1 = Image.new('1', (disp.width, disp.height), "WHITE")
draw = ImageDraw.Draw(image1)
font1 = ImageFont.truetype("DejaVuSansMono.ttf", 12)
font2 = ImageFont.truetype("DejaVuSansMono.ttf", 11)
font3 = ImageFont.truetype("DejaVuSansMono.ttf", 9)
if(out_noimg):
draw.text((0,0), out_title, font = font1, fill = 0)
draw.text((2,12), out_info, font = font2, fill = 0)
draw.text((2,23), out_xtra, font = font3, fill = 0)
else:
img = Image.open(path+"/logo.jpg")
image1.paste(img, (0,0))
draw.text((32,0), out_title, font = font1, fill = 0)
draw.text((33,12), out_info, font = font2, fill = 0)
draw.text((33,23), out_xtra, font = font3, fill = 0)
image1=image1.rotate(0)
disp.ShowImage(disp.getbuffer(image1))