import machine
import network
import time
from umqtt.simple import MQTTClient
import ujson
# WLAN-Verbindung
print("Verbinde mit WLAN...")
sta_if = network.WLAN(network.STA_IF) # WLAN-Objekt
sta_if.active(True) # WLAN aktivieren
sta_if.connect('Wokwi-GUEST', '') # SSID und Passwort
# Warten, bis WLAN verbunden ist
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("\nWLAN verbunden")
# MQTT-Einrichtung
SERVER = "industrial.api.ubidots.com"
port = 1883
client_name = "Display1"
topic = b"/v1.6/devices/tictactoe/coordinate"
ubidots_token = "BBUS-ml6CuHMu7EDmyFMPILbxQBb4EJgZ0D"
client = MQTTClient(client_name, SERVER, port, user=ubidots_token, password=ubidots_token)
# LED-Konfiguration
led_pins = [
{'r': 23, 'b': 27}, # Erste LED
{'r': 22, 'b': 14}, # Zweite LED
{'r': 21, 'b': 12}, # Dritte LED
{'r': 19, 'b': 13}, # Vierte LED
{'r': 18, 'b': 15}, # Fünfte LED
{'r': 5, 'b': 32}, # Sechste LED
{'r': 17, 'b': 33}, # Siebte LED
{'r': 16, 'b': 25}, # Achte LED
{'r': 4, 'b': 26} # Neunte LED
]
leds = []
for pins in led_pins:
leds.append({
'r': machine.Pin(pins['r'], machine.Pin.OUT),
'b': machine.Pin(pins['b'], machine.Pin.OUT),
'state': False, # Zustand der LED (an/aus)
'color': 'none' # Farbe der LED (rot/blau)
})
# Funktion zur Steuerung der LEDs
def set_led(index, color):
if 0 <= index < len(leds):
leds[index]['r'].value(color[0])
leds[index]['b'].value(color[1])
leds[index]['state'] = (color[0] == 1 or color[1] == 1)
leds[index]['color'] = 'rot' if color[0] == 1 else 'blau'
def clear_leds():
for led in leds:
led['r'].value(0)
led['b'].value(0)
led['state'] = False
led['color'] = 'none'
# Zuordnung von Koordinaten zu LED-Index
coordinate_to_led = {
111: 0, 112: 1, 113: 2, # A1, A2, A3
114: 3, 115: 4, 116: 5, # B1, B2, B3
117: 6, 118: 7, 119: 8, # C1, C2, C3
211: 0, 212: 1, 213: 2, # A1, A2, A3
214: 3, 215: 4, 216: 5, # B1, B2, B3
217: 6, 218: 7, 219: 8 # C1, C2, C3
}
# Callback-Funktion zum Verarbeiten von Nachrichten vom Server
def sub_cb(topic, msg):
global temp
data = ujson.loads(msg)
temp = int(data["value"])
print(f"Empfangen: {temp}")
if temp == -1:
# Alle LEDs leuchten lila für 2 Sekunden und gehen dann aus
for i in range(len(leds)):
set_led(i, (1, 1))
time.sleep(2)
clear_leds()
elif temp == 100:
clear_leds() # Alle LEDs ausschalten
elif 111 <= temp <= 119 or 211 <= temp <= 219:
led_index = coordinate_to_led.get(temp, None)
if led_index is nicht None:
if not leds[led_index]['state']:
if 111 <= temp <= 119:
set_led(led_index, (1, 0)) # Rot
elif 211 <= temp <= 219:
set_led(led_index, (0, 1)) # Blau
# Setzen der Callback-Funktion für den MQTT-Client
client.set_callback(sub_cb)
# Funktion zum Verbinden mit MQTT und Handhaben der Wiederverbindung
def connect_and_subscribe():
try:
client.connect()
client.subscribe(topic)
print("Verbunden mit MQTT-Broker und Thema abonniert")
except Exception as e:
print(f"Fehler beim Verbinden mit MQTT-Broker: {e}")
time.sleep(5)
# Schleife
temp = -999 # Platzhalter-Temperatur
while True:
if not sta_if.isconnected():
print("Wiederverbinden mit WLAN...")
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("\nWLAN wiederverbunden")
connect_and_subscribe()
try:
client.check_msg()
except OSError as e:
print(f"Fehler beim Überprüfen von Nachrichten: {e}")
time.sleep(2)
client.disconnect()