# A script for the bme280 temperature/pressure/humidity sensor (non-Adafruit version)
# and the inky pHAT - black version
#
# version Dec 01 2018, Dr H
#
# Requires Adafruit Blinka and Circuit Phython BME280 libraries
# and the Pimoroni Inky pHAT library

import time
import datetime
import board
import busio
from adafruit_bme280 import Adafruit_BME280
from adafruit_bme280 import Adafruit_BME280_I2C

import inkyphat
import sys
from PIL import ImageFont

inkyphat.set_colour('black')  # for b/w inky phat
inkyphat.set_rotation(180)  # turn display 180°

font1 = ImageFont.truetype(inkyphat.fonts.FredokaOne, 27) # Select standard font
font2 = ImageFont.truetype(inkyphat.fonts.FredokaOne, 19) # Select standard font data

# lang ="DE" # set langage parameter, default ("") -> english
lang ="EN"

i2c = busio.I2C(board.SCL, board.SDA)

bmp = Adafruit_BME280_I2C(i2c, address=0x76) # default i2c address (for Adafruit BMP280) 0x77 (default), 0x76 for bangood

#set reference pressure
# required for altitute calculation, please adjust. Standard value 1013.25 hPa
# manual input:
#reference_hPa =input ("Enter reference pressure in hPa: ") 

# or
# set pressure at starting time as reference, e.g. for  relative height measurements
time.sleep (1) # wait a second before 1st measurement
j= 0
pres_norm_sum = 0
while j in range (5): # take five measurements to define reference value
    pres_norm_sum = pres_norm_sum + bmp.pressure
    j= j+1
    time.sleep (1)
reference_hPa=(pres_norm_sum/j) # set inital measurement as reference point to enable height measurements

bmp.sea_level_pressure = float (reference_hPa)
print ()

while True:                 #runs forever, modify for crontab-version
    # measured values
    t=bmp.temperature
    p=bmp.pressure
    h=bmp.humidity
    a=bmp.altitude   # calculated by adafruit library from pressure
    
    #timestamp
    ts = datetime.datetime.now() # timestamp
    ts0_EN ='{:%Y-%m-%d}'.format(ts) # timestamp - date, EN format
    ts0_DE ='{:%d.%m.%Y}'.format(ts) # timestamp - date, German format
    ts1='{:%H:%M:%S}'.format(ts) # timestamp - time

    tmp = "{0:0.1f}".format(t)
    pre = "{0:0.1f}".format(p)
    hyg = "{0:0.1f}".format(h) 
    alt = "{0:0.1f}".format(a)

    tText = "Temp.: "
    
    pText_EN = "Pressure: "
    pText_DE = "Luftdruck: "
    
    hText_EN = "Humidity: "
    hText_DE = "rel. LF: "
    
    aText_EN = "Altitude: "
    aText_DE = "Höhe üNN: "  # exakt: ü. NHN, über Normal Höhen Null

    if (lang =="DE"):
        ts0 = ts0_DE
        aText = aText_DE
        pText = pText_DE
        hText = hText_DE
        
    else:                                    # default english
        ts0 = ts0_EN
        aText = aText_EN
        pText = pText_EN
        hText = hText_EN

    # print values to display 
    print (ts)
    print (tText, tmp, "°C")
    print (pText, pre, " hPa")
    print (hText, hyg, " %")
    print (aText, alt, " m")
    print ()

    # print values to Inky pHAT
    t1 = 5   # tab 1, frist column, simplifies optimization of layout
    t2 = 110 # tab 2, second column
   
    inkyphat.clear()
    
    inkyphat.text((t1, 0), ts0, inkyphat.BLACK, font2) # write timestamp date
    inkyphat.text((t2, 0), ts1, inkyphat.BLACK, font2) # write timestamp time
    inkyphat.line ((t1,25, 207,25), 1,3)  # draw a line
    
    inkyphat.text((t1, 30), tText, inkyphat.BLACK, font2)
    inkyphat.text((t2, 30), (tmp + "°C"), inkyphat.BLACK, font2)

    inkyphat.text((t1, 55), pText, inkyphat.BLACK, font2)
    inkyphat.text((t2, 55), (pre + " hPa"), inkyphat.BLACK, font2)

    inkyphat.text((t1, 80), hText, inkyphat.BLACK, font2)
    inkyphat.text((t2, 80), (hyg + " %"), inkyphat.BLACK, font2)

#    alternatively display calculated height
#    inkyphat.text((t1, 80), aText, inkyphat.BLACK, font2)
#    inkyphat.text((t2, 80), (alt + " m"), inkyphat.BLACK, font2)

    inkyphat.show()
    time.sleep(51) # wait some seconds before next measurements, +19 sec per cycle
    
inkyphat.clear() # empty Inky pHAT display procedure,
inkyphat.show()  # silence for crontab-version  

