I have set my Raspberry PI up with a BigSeg7x4 display. And I use it to show 3 values that switch a) power usage b) temperature c) wind direction.
In order to switch from one value to the other I use display.fill(0) to clean the display before showing the next one.
It runs fine and can run perfectly for days. Though at some point (sometimes after hours - sometimes after days) my code crashes and I get the error message like below.
It seems to crash on the display.fill(0) line.
This is the Code I use:>>> %Run knmi_power6.py
Traceback (most recent call last):
File "/home/erik/meter/knmi_power6.py", line 88, in <module>
display.fill(0)
File "/home/erik/.local/lib/python3.9/site-packages/adafruit_ht16k33/ht16k33.py", line 141, in fill
self.show()
File "/home/erik/.local/lib/python3.9/site-packages/adafruit_ht16k33/ht16k33.py", line 128, in show
i2c_dev.write(buffer)
File "/usr/local/lib/python3.9/dist-packages/adafruit_bus_device/i2c_device.py", line 101, in write
self.i2c.writeto(self.device_address, buf, start=start, end=end)
File "/usr/local/lib/python3.9/dist-packages/busio.py", line 174, in writeto
return self._i2c.writeto(address, memoryview(buffer)[start:end], stop=stop)
File "/usr/local/lib/python3.9/dist-packages/adafruit_blinka/microcontroller/generic_linux/i2c.py", line 52, in writeto
self._i2c_bus.write_bytes(address, buffer[start:end])
File "/usr/local/lib/python3.9/dist-packages/Adafruit_PureIO/smbus.py", line 314, in write_bytes
self._device.write(buf)
OSError: [Errno 121] Remote I/O error
>>>
Code: Select all
import requests
import re
import serial
import time
import board
from adafruit_ht16k33 import segments
custom_chars = {}
custom_chars["z"] = 0b01100011 #gradenteken
custom_chars["g"] = 0b00111001
custom_chars["y"] = 0b00001111 #rechtshaak
custom_chars["x"] = 0b00111001 #linkshaak
custom_chars["w"] = 0b00001110 #rechtsonder
custom_chars["v"] = 0b00111000 #linksonder
custom_chars["u"] = 0b00000111 #rechtsboven
custom_chars["m"] = 0b00110001 #linksboven
custom_chars["n"] = 0b00000001 #boven
custom_chars["q"] = 0b00001000 #onder
custom_chars["k"] = 0b00001001 #onder en boven
i2c = board.I2C()
#display = segments.BigSeg7x4(i2c)
display = segments.BigSeg7x4(i2c, char_dict=custom_chars)
display.brightness = 0.1
# Seriele poort confguratie
ser = serial.Serial()
# DSMR 4.0/4.2 > 115200 8N1:
ser.baudrate = 115200
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.xonxoff = 0
ser.rtscts = 0
ser.timeout = 12
ser.port = "/dev/ttyUSB0"
ser.close()
erik_temp = 99
erik_dir = 99
teller = 199
while True:
teller = teller + 1
if teller == 200:
res2 = requests.get('https://weerlive.nl/api/json-data-10min.php?key=BANNED&locatie=52.34838940753904,4.906978197204979')
data2 = res2.json()
erik_temp = data2['liveweer'][0]['temp']
erik_dir = int(data2['liveweer'][0]['windrgr'])
teller = 0
if 23 <= erik_dir < 68: #noordoost
erik_dir2 = '__nu'
elif 68 <= erik_dir < 113: #oost
erik_dir2 = '__ky'
elif 113 <= erik_dir <= 158: #zuidoost
erik_dir2 = '__qw'
elif 158 <= erik_dir < 203: #zuid
erik_dir2 = 'vqqw'
elif 203 <= erik_dir < 248: #zuidwest
erik_dir2 = 'vq__'
elif 248 <= erik_dir < 293: #west
erik_dir2 = 'xk__'
elif 293 <= erik_dir < 338: #noordwest
erik_dir2 = 'mn__'
else:
erik_dir2 = 'mnnu' #noord
ser.open()
checksum_found = False
#start BANNED inlees loop
while not checksum_found:
BANNED_line = ser.readline() # Lees een seriele lijn in.
#print (type(BANNED_line))
# check of het de elec regel is
if re.match(b'(?=1-0:1.7.0)', BANNED_line):
#check of de regel volledig is
#print (BANNED_line)
if re.search(b'(?=\(..\....\*kW\))', BANNED_line):
elec1 = (BANNED_line[10:16]).decode()
elec2 = int(float(elec1) * 1000)
display.fill(0)
time.sleep(0.01)
display.print (str(elec2))
time.sleep(1.6)
display.fill(0)
time.sleep(0.01)
display.print (str(int(float(erik_temp))) + "zc")
time.sleep(1.6)
display.fill(0)
time.sleep(0.01)
display.print (str(erik_dir2))
time.sleep(1.2)
else:
pass
# Check wanneer het uitroepteken ontvangen wordt (einde BANNED inlees loop)
if re.match(b'(?=!)', BANNED_line):
checksum_found = True
ser.close()
Erik