Wyświetlacz LCD 16×2 pod Domoticz na Raspberry Pi [DIY]

Prosty skrypt pobierający dane za pomocą JSONa z Domoticza i wyświetlający je na wyświetlaczu 16×2 hd44780 na GPIO.

EDIT: Adafruit zmienił biblioteki i ten tutorial może być  już nieaktualny

Jak to działa

Domoticz zapisuje dane z czujników. Następnie zapisane dane pobieramy i parasujemy za pomocą JSONa. Później nasza pętla pobiera dane i rotatuje dane w górnym rzędzie wyświetlacza, w dolnym natomiast mamy datę oraz godzinę – możemy oczywiście to zmienić. Po 15 sekundach kolejna pobrana informacja zostanie wyświetlona w górnym rzędzie na wyświetlaczu.

Jak to zainstalować

Kiedy mamy już zainstalowany nasz Domoticz oraz podpięte i skonfigurowane czujniki, to czas zabrać się za nasz wyświetlacz. Najszybsza metodą będzie pobranie i skonfigurowanie sobie swojego wyświetlacza pod tutorial z adafruit. Uwaga! W Tutorialu przy testowaniu przy pinach zasugerowali Raspberry pi 2, jednak chodzi o wersje większe od B oraz B, czyli na Raspberry Pi B, B+ (nie wiem jak z Raspberry pi 2, prawdopodobnie tak samo) trzeba zmienić pin z 21 na 27.

Myślę, że większych problemów z konfiguracją oraz uruchomieniem skryptu nie było.

Teraz możemy dostać się ponownie do naszego skryptu, nazwać go można różnie. Domyślnie to Adafruit_CharLCD_IPclock_example.py

sudo nano Adafruit_CharLCD_IPclock_example.py 

I wstawiamy taki o to kod:

#!/usr/bin/python

from Adafruit_CharLCD import Adafruit_CharLCD
from subprocess import *
from time import sleep, strftime, time
from datetime import datetime
import RPi.GPIO as GPIO
import json
import urllib2

GPIO.setmode(GPIO.BCM)
GPIO.setup(13,GPIO.IN)

lcd = Adafruit_CharLCD()

lcd.begin(16, 1)

i=0

#poprawny adres do parasu
def json_url(id):
    output  = urllib2.urlopen('http://localhost:8080/json.htm?type=devices&rid=%s' % (id))
    return output

#pobieranie konkretnych danych
def show_data(idu, type):
        data = json.load(json_url(idu))
        show = data["result"][0][type]
        return show

#Wyswietlanie prognozy na podstawie BMP085
def showf_room(idu):
        data_room = json.load(json_url(idu))
    for post in data_room["result"]:
        if post.get('Forecast'):
            showf_room = data_room["result"][0]["Forecast"]
        else:
            showf_room = 0

    if showf_room == 0:
        info = "Brak prognozy"
    elif showf_room == 1:
        info = "Prog: slonecznie"
    elif showf_room == 2:
        info = "Czesc. pochmurnie"
    elif showf_room == 3:
        info = "Prog: pochmurnie"
    elif showf_room == 4:
        info = "Bedzie padac :("
    else:
        info = "Brak danych"
        return info

#petelka
while 1:
    
    lcd.clear()

    if i == 0:
       lcd.message('Na zew.  %s' % (show_data(13, "Temp")) +chr(223) + 'C' )
       i=i+1
       sleep(0.5)
    elif i == 1:    
       lcd.message('Cisn %s' % (show_data(10, "Barometer")) + ' hPa')
       i=i+1
        sleep(0.5)
    elif i == 2:
        lcd.message(showf_room(10))
        i=i+1
        sleep(0.5)
    else:
       lcd.message('W pokoju %s' % (show_data(10, "Temp")) +chr(223) + 'C' )
        i=0
       sleep(0.5)

    for x in range(15):
       lcd.message(datetime.now().strftime('\n%b %d  %H:%M:%S\n'))
       sleep(1)

Konfiguracja

Dla bardziej zaciętych polecam lekturę, jednak lepiej jeśli krótko wyjaśnię jak wygląda konfiguracja.

Logujemy się do naszego Domoticza i przechodzimy do działu urządzenia. Widzimy urządzenia. w drugiej kolumnie naszej tabeli pojawia się ID naszych czujników. Teraz musimy przejść pod adres http://IP Domoticza:8080/json.htm?type=devices&rid=X – gdzie X będzie ID naszego czujnika np. temperatury.

Wyświetli nam się Array np.


{ "5MinuteHistoryDays" : 1, "ActTime" : 1427052049, "AllowWidgetOrdering" : true, "DashboardType" : 0, "Latitude" : "51.543922", "Longitude" : "20.009509", "MobileType" : 0, "TempScale" : 1.0, "TempSign" : "C", "WindScale" : 1.0, "WindSign" : "m/s", "dontcachehtml" : true, "result" : [ { "AddjMulti" : 1.0, "AddjValue" : 0.0, "BatteryLevel" : 100, "CustomImage" : 0, "Data" : "-2.1 C", "Favorite" : 1, "HardwareID" : 7, "HardwareName" : "DS18B20", "HaveTimeout" : false, "ID" : "65424", "LastUpdate" : "2015-03-22 20:20:19", "Name" : "Temp zewnetrzna", "Notifications" : "false", "PlanID" : "0", "Protected" : false, "ShowNotifications" : true, "SignalLevel" : 12, "SubType" : "TFA 30.3133", "Temp" : -2.10, "Timers" : "false", "Type" : "Temp", "TypeImg" : "temperature", "Unit" : 144, "Used" : 1, "XOffset" : "0", "YOffset" : "0", "idx" : "13" } ], "status" : "OK", "title" : "Devices" }

teraz odszukujemy konkretną daną np. temperaturę. w tym przypadku będzie prosto, wiemy, że temperatura zewnętrzna to -2.1 stopnia. Znajdujemy naszą zmienną i widzimy, że stoi przy kluczu “Temp” – wielkość liter jest ważna.

Wywołujemy dane.

lcd.message('W pokoju %s' % (show_data(10, "Temp")) +chr(223) + 'C' )

funkcja show_data(IDX naszego czujnika, “Klucz array”) – przykład wyżej.

Jeśli chcemy dodać kolejne wiadomości, które chcemy wyświetlić dodajemy następną opcję elif i zmieniamy i o jeden wyżej np.


elif i == 3:
lcd.message('NO ELO')
i=i+1
sleep(0.5)

Napisałem obsługę dla prognozy pogody na podstawie BMP085. Wyświetlanie prognozy wywołuje się za pomocą showf_room(IDX naszego czujnika).

Możemy zmienić czas rotatora zmieniając liczbę 15 w funkcji range.

for x in range(15):

Myślę, że niedługo dodam jakieś dodatkowe opcję. W kodzie powyżej są użyte przykłady.

Już niedługo więcej w temacie domoticz. Jeśli pojawi się potrzeba, abym dokładniej opisał jak skonfigurować domoticz czy podłączyć czujniki, to piszcie komentarze.

Inne zastosowanie dla wyświetlacza możecie poczytać na MalinowePi.

6 komentarzy

    1. Trudno mi powiedzieć 🙂 Nie budowałem pod OLED i projekt jest już stary, ale to co jest napisane można wykorzystać, tylko podstawić pod nowe funkcje odpowiedzialne za wyświetlanie. Proszę poszukać samej obsługi wyświetlacza gdzieś na githubie może coś się znajdzie. Jeśli będę miał okazję napisze taki tutorial pod OLEDa

        1. Sprawdz czy przy zmianie wartosci image w 125 lini da jakas wartosc jesli tak to sproboj zmienic. Jesli to cos da sproboj dac w linii 104 (i w kazdym kolejnym ifie/elsie podmienic) taka wartosc np. image = draw.(…) 🙂 Nie wiem czy to zadziala, ale moze sie uda.

  1. from lib_oled96 import ssd1306
    import time
    import sys
    import json
    import urllib2
    from time import sleep
    from PIL import ImageFont
    from smbus import SMBus

    font = ImageFont.load_default()
    i2cbus = SMBus(1)
    oled = ssd1306(i2cbus)
    draw = oled.canvas

    i=0

    def json_url(id):
    output = urllib2.urlopen(‘http://192.168.1.119:8080/json.htm?type=devices&rid=22’)
    return output

    def show_data(idu, type):
    data = json.load(json_url(idu))
    show = data[“result”][0][type]
    return show

    while True:
    draw.rectangle((0, 0, oled.width-1, oled.height-1), outline=20, fill=0)
    font = ImageFont.truetype(‘FreeSans.ttf’, 12)
    draw.text((0, 0),’Temperatura : %s’ % show_data (15, ‘Temp’) , font=font, fill=255)

Dodaj komentarz