Dieses E-Paper Display dient dazu, gewisse Messwerte vom openHAB Server schnell und einfach abzulesen, ohne das Smartphone hervorzunehmen, die App öffenen und zur gewünschten Information zu navigieren. Zum Beispiel kann man das Display im Eingangsbereich platzieren wo man Zeit und Temperatur schnelle ablesen möchte.
So sieht das Gehäuse mit dem eingbauten Display aus. Es ist absichtlich 45 Grad geneigt, damit es optimal lesbar ist. Die Datei für den 3D-Druck kann hier heruntergeladen werden: https://www.printables.com/model/1045546-epaper-213-pi-pico-3xaa-case
Das Gehäuse ist so kompakt, dass es gerade die Länge des Displays und die Breite des Batteriehalters hat. Alle Komponenten passen so genau hinein, dass sie nicht befestigt werden müssen.
Ein Batteriehalter für 3 AA Mignon Batterien versorgt den Pico und das Display für viele Tage mit Energie, sofern das ganze richtig programmiert ist. Verbunden wird der Pico am VSYS mit dem Pluspol und GND mit dem Minuspol.
Als Beispiel unten mein Python Code. Die Lib vom Display kann hier heruntergeladen werden: https://github.com/waveshareteam/Pico_ePaper_Code/blob/main/python/Pico_ePaper-2.13_V4.py
from epaper2in13v4 import EPD_2in13_V4_Landscape
import network, requests, re, array, machine, time, json, gc
epd = EPD_2in13_V4_Landscape()
epd.Clear()
# draws black decimal numbers in the 7 segment format
# start_x and start_y are the coords for the upper left start point
# text ist the chars to display. only the chars '0123456789,.:°%' are supported
# digit_width the width in pixels of one digit, the height is always twice the width
# line_width ist the thickness in pixel of the char lines
# space ist the amount of pixels inbetween the cahrs
def drawNumber(start_x, start_y, text, digit_width, line_width, space):
r1 = int(digit_width//2-line_width)
r2 = int(digit_width//2-line_width-line_width//2)
for digit in text:
if digit in ['2','3','5','6','7','8','9','0']:
#horizontal top
epd.fill_rect(start_x, start_y, digit_width+line_width, line_width, 0x00)
if digit in ['-','2','3','4','5','6','8','9']:
#horizontal middle
epd.fill_rect(start_x, start_y+digit_width, digit_width, line_width, 0x00)
if digit in ['2','3','5','6','8','9','0']:
#horizontal bottom
epd.fill_rect(start_x, start_y+digit_width*2, digit_width+line_width, line_width, 0x00)
if digit in ['1','4','5','6','8','9','0']:
#vertical left top
epd.fill_rect(start_x, start_y, line_width, digit_width, 0x00)
if digit in ['1','2','6','8','0']:
#vertical left bottom
epd.fill_rect(start_x, start_y+digit_width, line_width, digit_width+line_width, 0x00)
if digit in ['2','3','4','7','8','9','0']:
#vertical right top
epd.fill_rect(start_x+digit_width, start_y, line_width, digit_width+line_width, 0x00)
if digit in ['3','4','5','6','7','8','9','0']:
#vertical right bottom
epd.fill_rect(start_x+digit_width, start_y+digit_width, line_width, digit_width+line_width, 0x00)
if digit == ',':
epd.fill_rect(start_x, start_y + digit_width*2, line_width, line_width+line_width, 0x00)
if digit == '.':
epd.ellipse(start_x, start_y+digit_width*2, r1, r1, 0x00, True)
if digit == ':':
epd.ellipse(start_x, int(start_y+digit_width/2), r1, r1, 0x00, True)
epd.ellipse(start_x, int(start_y+digit_width+digit_width/2), r1, r1, 0x00, True)
if digit in ['°','%']:
epd.ellipse(start_x+r1, start_y+r1, r1, r1, 0x00, True)
epd.ellipse(start_x+r1, start_y+r1, r2, r2, 0xFF, True)
if digit == '%':
epd.ellipse(start_x+digit_width, start_y+digit_width*2+line_width-r1, r1, r1, 0x00, True)
epd.ellipse(start_x+digit_width, start_y+digit_width*2+line_width-r1, r2, r2, 0xFF, True)
coords = array.array('I', [digit_width+line_width//2, 0, digit_width+line_width, 0, line_width, digit_width*2+line_width, line_width//2, digit_width*2+line_width])
# print("Array: ", coords)
epd.poly(start_x, start_y, coords, 0x00, True)
if digit in ['1',',', '.',':', ' ']:
start_x += space
else:
start_x += digit_width+space
while True:
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("<your_wlan_ssid>", "<your_wlan_password>")
print("Connecting")
time.sleep(3)
print(f"WLAN connected: {wlan.isconnected()}")
if wlan.isconnected():
try:
epd.fill(0xff)
response = requests.get("https://timeapi.io/api/time/current/zone?timeZone=Europe%2FZurich", timeout=3)
print("response.status_code: ", response.status_code)
print("response.text: ", response.text)
reading = json.loads(response.content)
hour = reading['hour']
minute = reading['minute']
day = reading['day']
month = reading['month']
dayOfWeek = reading['dayOfWeek']
dateTime = f"{day}.{month}. {hour}:{minute:02d}"
print("dateTime: ",dateTime)
epd.text(dayOfWeek,10,18,0x00)
drawNumber(90,10,dateTime,10,3,8)
response = requests.get("http://192.168.178.50:8080/rest/items/HTTP_weatherstation_Temperatur/state", timeout=3)
print("response.text: ", response.text)
aussen = re.search("\\d+(.\\d)?", response.text).group(0)+"°"
aussen = aussen.replace(".",",")
print("aussen: ", aussen)
epd.text("Outside",10,48,0x00)
drawNumber(90,40,aussen,10,3,8)
response = requests.get("http://192.168.178.50:8080/rest/items/myStromPlug5_Temperature/state", timeout=3)
print("response.text: ", response.text)
innen = re.search("\\d+(.\\d)?", response.text).group(0)+"°"
innen = innen.replace(".",",")
print("innen: ", innen)
epd.text("Inside",10,78,0x00)
drawNumber(90,70,innen,10,3,8)
response = requests.get("http://192.168.178.50:8080/rest/items/KOSTALPLENTICOREPlus85withBattery_BatteryCharge/state", timeout=3)
print("response.text: ", response.text)
battery = re.search("\\d+", response.text).group(0)+"%"
print("battery: ", battery)
epd.text("Battery",10,108,0x00)
drawNumber(90,100,battery,10,3,8)
epd.display(epd.buffer)
wlan.active(False)
wlan.deinit()
gc.collect()
machine.lightsleep(60*1000)
except Exception as err:
print(f"error: {err}")
Die Bauteile können beispielsweise hier erworben werden: