# Datei ble_broadcast_1.py

# Stand: 08.05.2021

# TTGO als Broadcaster: Überträgt Temperaturen, die mit dem BME280 gemessen werden.
# Das zugehörige Modul Bme280.py muss in den ESP32 hochgeladen sein.

# Benutze weiteren TTGO als Observer (ble_observe_1.py)

# Anschlüsse:
#-------------------------#
# BME/P280  ---  TTGO     #
#-------------------------#
# VIN       ---  3V       #
# GND       ---  G        #
# SCL       ---  22       #
# SDA       ---  21       #
#-------------------------#

# Das Modul Bme280.py muss zunächst auf den ESP323 hochgeladen werden!


# Importe und Konstanten:

from machine import Pin, I2C, SPI
from time import sleep
import Bme280  # Original-Modul (s. o.) geringfügig modifiziert (Einheiten bei den Properties entfernt)
import vga2_bold_16x16 as font1 # mit Sonderzeichen (für °)
import vga1_bold_16x32 as font2
import st7789

import ubluetooth
from micropython import const

_ADV_TYP_NAME = const(9)
_ADV_TYP_MSG = const(250) # Eigener ADV_Typ für Messages


# Funktionen:

def advertiser(name, msg):
  adv_data = b'\x02\x01\x06'
  name = bytes(name, 'UTF-8')
  adv_data = adv_data +  bytearray((len(name) + 1, _ADV_TYP_NAME)) + name
  msg = bytes(msg, 'UTF-8')
  adv_data = adv_data + bytearray((len(msg)+1, _ADV_TYP_MSG)) + msg
  ble.gap_advertise(200000, adv_data, connectable=False)      

   

# Hauptprogramm:

# Vorbereitung des Displays:
spi = SPI(2, baudrate=20000000, polarity=1, sck=Pin(18), mosi=Pin(19))
display = st7789.ST7789(spi, 135, 240,  reset=Pin(23, Pin.OUT), cs=Pin(5, Pin.OUT), dc=Pin(16, Pin.OUT), backlight=Pin(4, Pin.OUT), rotation=3)
# Landscape
display.init()
display.fill(0)  # loeschen; Bildschirm schwarz
display.text(font2, 'Broadcaster', 10, 10, st7789.GREEN) # Überschrift

# Vorbereitung des BME280:
i2c = I2C(1, scl=Pin(22), sda=Pin(21), freq=10000)

ble = ubluetooth.BLE()
name = 'ESP32'
ble.active(True)

while True:
    bme = Bme280.BME280(i2c=i2c) 
    temp = bme.temperature
    print(temp, ' °C')
    temp_displ = b'Temp: ' + bytes(temp, 'utf-8') + b' \xF8C '
    display.text(font1, temp_displ, 10, 60)
    advertiser(name, temp)
    sleep(1)




