from machine import Pin, I2C
import ssd1306
import time
import math
import network # für WLAN Object
from umqtt.robust import MQTTClient #für den MQTT Client
import ujson #zum generieren eines JSON Strings
#display einrichten
i2c = I2C(0, scl = Pin(22), sda= Pin(21))
oled_widht= 128
oled_height =64
display = ssd1306.SSD1306_I2C(oled_widht, oled_height, i2c)
#WIFI connection
display.text('Connecting', 0, 0)
display.show()
sta_if = network.WLAN(network.STA_IF) #WLAN Object
sta_if.active(True) #activate Wlan
sta_if.connect('Wokwi-GUEST','')
punkt='.'
while not sta_if.isconnected():
display.text(punkt, 0, 15)
display.show()
punkt=punkt + '.'
if len(punkt)>3:
punkt='.'
display.fill(0)
display.text('Connecting', 0, 0)
print(".", end = "")
time.sleep(0.1)
display.fill(0)
display.show()
display.text('Wifi Connected', 0, 0)
display.show()
print("WIFI connected")
#MQTT Setup
SERVER = "industrial.api.ubidots.com"
port = 1883
client_name = "Display2"
topic_x = b"/v1.6/devices/raumlage/angle_x"
topic_y = b"/v1.6/devices/raumlage/angle_y"
topic_z = b"/v1.6/devices/raumlage/angle_z"
token = "BBUS-4BrQmCUCJ42jwe0UOC9goTfYD3QDld"
#MQTT client Object
client = MQTTClient(client_name, SERVER, port, user=token, password=token)
#Deklaration der Winkel:
angle_y = -998
angle_x =-997
angle_z=-999
#callbackfunktion, liest die msg von server aus und übergibt die var
def sub_cb(topic, msg):
#abfrage welches topic, um die msg dem richtigen Winkel zuzuordnen
if topic==topic_x:
a=ujson.loads(msg)
global angle_x
angle_x= a["value"]
elif topic==topic_y:
b=ujson.loads(msg)
global angle_y
angle_y= b["value"]
elif topic==topic_z:
c=ujson.loads(msg)
global angle_z
angle_z= c["value"]
#funktion um in der Programmierung 0|0 in der mitte zu haben, hilfe für mich
def sys(x,y):
x_display=(128/2)+x
y_display=(64/2)-y
return x_display, y_display
#berechnung der x koordinate der Linie
def x_coordinate(rot_y):
rot_y_rad=math.radians(rot_y)
x=30*math.cos(rot_y_rad)
return x
#berechnung der y koordinate der Linie
def y_coordinate(rot_y):
rot_y_rad=math.radians(rot_y)
y=30*math.sin(rot_y_rad)
return y
client.set_callback(sub_cb)
#loop
while True:
#verbindung mit server und subscribtions zu den topics
client.connect()
client.subscribe(topic_x)
client.check_msg()
time.sleep(0.1)
client.subscribe(topic_y)
client.check_msg()
time.sleep(0.1)
client.subscribe(topic_z)
client.check_msg()
client.disconnect()
time.sleep(2)
#am display
display.fill(0)
#variablen für die koordinaten der Grundline
x1, y1 = sys(x_coordinate(angle_y), y_coordinate(angle_y))
x2, y2 = sys(-x_coordinate(angle_y), -y_coordinate(angle_y))
#variablen für die koordinaten der 2. linie, steht im rechten winkel auf die erste, versuch 2. drehachse
x1_2, y1_2 = sys(x_coordinate(angle_y+90), y_coordinate(angle_y+90))
x2_2, y2_2 = sys(-x_coordinate(angle_y+90), -y_coordinate(angle_y+90))
#zeichen der linien am Bilschirm
display.line(int(x1), int(y1), int(x2), int(y2), 1)
display.line(int(x1_2), int(y1_2), int(x2_2), int(y2_2), 1)
display.show()
print(x1, y1)