ES32D26 CircuitPython-Testcode, Zustände über einen MQTT-Server veröffentlichen, unter Verwendung des Adafruit CircuitPython 10.0.0 Builds: doit_esp32_devkit_v1

## CircuitPython-Beispiel für den ES32D26
## Einige Bibliotheken werden möglicherweise nicht verwendet, ich habe dies aus einem anderen Projekt bereinigt.
# boot_out.txt
## Adafruit CircuitPython 10.0.0 am 2025-10-01; ESP32 Devkit V1 mit ESP32
## Board-ID:doit_esp32_devkit_v1
## UID:8875121BD145
## MAC:88:57:21:B1:1D:54
#config.json
#{
#  "wifi_info":{
#      "hostname":"ES32D26",
#      "ssid":    "myNetwork",
#      "psk":     "lookattheceiling"
#  },
#  "mqtt_info":{
#    "broker": "mosquitto.local",
#    "user":   "myuser",
#    "pass":   "dumbpassword",
#    "topic":  "ES32D26/"  
#  }
#}

import wifi
import adafruit_74hc595
import wws_74hc165 ## https://github.com/WoolseyWorkshop/WoolseyWorkshop_CircuitPython_74HC165
import board
import microcontroller
import busio
import digitalio
import time
import json
import os
import adafruit_simplemath
import adafruit_connection_manager
import socketpool
import adafruit_minimqtt.adafruit_minimqtt as MQTT
import analogio

# Meter in Fuß
def mtf(meters):
  return meters * 3.28084

# Fuß in Meter
def ftm(feet):
  return feet * 0.3048

# Diese zuerst ausführen, damit wir die Konfiguration in anderen Funktionen verwenden können.
def load_config_json():
  try:
    # Die JSON-Datei im Lesemodus ('r') öffnen
    f = open("/config.json", 'r') 
    config = json.loads(f.read())
    f.close
    return config
  except:
    pass

def save_config_json(config):
  try:
    f = open("/config.json", 'w')
    f.write(config)
    f.close
  except:
    pass

# Mein fauler Logger TODO: Dies etwas intelligenter machen. Ein Loglevel in der Konfiguration speichern, nichts über dem Loglevel protokollieren
def log(level,log_msg):
    # Loglevels
    # debug
    # verbose
    # default
    # none
    mqtt_client.publish(config["mqtt_info"]["topic"]+"log/"+level, log_msg)

## MQTT-Callbacks
def connected(client, userdata, flags, rc):
    # Diese Funktion wird aufgerufen, wenn der Client erfolgreich
    # mit dem Broker verbunden ist.
    #print(f"Verbunden mit "+config["mqtt_info"]["broker"]+"! Höre auf Änderungen des Topics "+config["mqtt_info"]["topic"])
    # Abonniere alle Änderungen des folgenden Topics. Dies sollte vielleicht eine eigene Konfigurationsvariable erhalten.
    client.subscribe(config["mqtt_info"]["topic"]+"listenHere/#")

def disconnected(client, userdata, rc):
    # Diese Methode wird aufgerufen, wenn der Client getrennt ist
    #print("Getrennt von "+config["mqtt_info"]["Broker"]+"!")
    pass
    
def message(client, topic, message):
    # Diese Methode wird aufgerufen, wenn ein Topic, an dem der Client abonniert ist,
    # eine neue Nachricht hat.
    # Füge hier deinen Code ein, um etwas zu tun, wenn eine Nachricht eingeht.
    # Achte darauf, nicht dasselbe Topic zu abonnieren, an das du publizierst 
    # , es gibt keinen Loopback-Schutz.
    print("Topic:"+topic+"  Nachricht:"+message)
    
def map_range(value,input_upper,input_lower,output_upper,output_lower):
    # Dies skaliert deine Eingaben auf den gewünschten Ausgang
    # input_lower ist 0 und input_upper ist 8195 für den ESP32
    return adafruit_simplemath.map_range(value, input_lower, input_upper, output_lower, output_upper)

# Konfigurationsdatei laden
config = load_config_json()

# Netzwerk einrichten
wifi.radio.hostname = config["wifi_info"]["hostname"]
wifi.radio.connect(config["wifi_info"]["ssid"], config["wifi_info"]["psk"])
pool = socketpool.SocketPool(wifi.radio)
ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio)
# E/A einrichten
## 74HC595-Relais einrichten
relay_pin_data   = board.D12
relay_pin_clk    = board.D22
relay_pin_latch  = digitalio.DigitalInOut(board.D23)
relay_pin_oe     = digitalio.DigitalInOut(board.D13) ## active_low
relay_spi = busio.SPI(relay_pin_clk, MOSI=relay_pin_data)
sr = adafruit_74hc595.ShiftRegister74HC595(relay_spi, relay_pin_latch)
relay_pin_oe.direction = digitalio.Direction.OUTPUT
## Jetzt den Pin in einer Variable definieren
relay1 = sr.get_pin(0)
relay2 = sr.get_pin(1)
relay3 = sr.get_pin(2)
relay4 = sr.get_pin(3)
relay5 = sr.get_pin(4)
relay6 = sr.get_pin(5)
relay7 = sr.get_pin(6)
relay8 = sr.get_pin(7)
## Aufräumen
relay1.value = False       # Setze ein Relais auf Aus, bevor die Ausgänge aktiviert werden, damit wir einen bekannten Status haben, wenn der Ausgang aktiviert wird
relay_pin_oe.value = False # Dieser Ausgang ist active low

## 74HC165-Diskrete Eingänge einrichten
## Erinnerung, diese geben false zurück, wenn sie an Masse angeschlossen sind.
inputs_pin_data  = board.D15
inputs_pin_clk   = board.D2
inputs_pin_load  = digitalio.DigitalInOut(microcontroller.pin.GPIO0)

inputs_spi = busio.SPI(inputs_pin_clk, MISO=inputs_pin_data)
inputs_sr  = wws_74hc165.ShiftRegister74HC165(inputs_spi, inputs_pin_load)

input1 = inputs_sr.get_pin(0)
input2 = inputs_sr.get_pin(1)
input3 = inputs_sr.get_pin(2)
input4 = inputs_sr.get_pin(3)
input5 = inputs_sr.get_pin(4)
input6 = inputs_sr.get_pin(5)
input7 = inputs_sr.get_pin(6)
input8 = inputs_sr.get_pin(7)

# Analoge Eingänge
## 4-20mA Eingänge
analog_i_1 = analogio.AnalogIn(microcontroller.pin.GPIO34)
analog_i_2 = analogio.AnalogIn(microcontroller.pin.GPIO39)
analog_i_3 = analogio.AnalogIn(microcontroller.pin.GPIO35)
analog_i_4 = analogio.AnalogIn(microcontroller.pin.GPIO36)
## 0-10V Eingänge
analog_v_1 = analogio.AnalogIn(microcontroller.pin.GPIO14)
analog_v_2 = analogio.AnalogIn(microcontroller.pin.GPIO33)
analog_v_3 = analogio.AnalogIn(microcontroller.pin.GPIO27)
analog_v_4 = analogio.AnalogIn(microcontroller.pin.GPIO32)

# Analoge Ausgänge
## Analoge Ausgänge, DIP-konfigurierbar für 0-10V oder 4-20mA
analog_out_1 = analogio.AnalogOut(microcontroller.pin.GPIO25)
analog_out_2 = analogio.AnalogOut(microcontroller.pin.GPIO26)

# MQTT-Client konfigurieren
mqtt_client = MQTT.MQTT(
    broker=config["mqtt_info"]["broker"],
    username=config["mqtt_info"]["user"],
    password=config["mqtt_info"]["pass"],
    is_ssl=False,
    socket_pool=pool,
    ssl_context=ssl_context,
)

# Setze unsere LWT-Nachricht
mqtt_client.will_set(config["mqtt_info"]["topic"]+'status','offline')

# Setze unsere Callbacks
mqtt_client.on_connect = connected
mqtt_client.on_disconnect = disconnected
mqtt_client.on_message = message

# Verbinde den Client mit dem MQTT-Broker.
print("Verbindung zum "+config["mqtt_info"]["broker"]+" wird hergestellt")
mqtt_client.connect()

log("default","Systemstart")

fiveSecondTimer = thirtySecondTimer = sixtySecondTimer = ninetySecondTimer = startTime = time.time()

while True:
    # Message Queue abfragen
    mqtt_client.loop()
    if fiveSecondTimer <= time.time():
      # Erstelle unsere Listen
      discrete_input_status  = [
          input1.value,
          input2.value,
          input3.value,
          input4.value,
          input4.value,
          input5.value,
          input6.value,
          input7.value,
          input8.value
      ]
      analog_input_status    = [
          analog_i_1.value,
          analog_i_2.value,
          analog_i_3.value,
          analog_i_4.value,
          #analog_v_1.value,
          #analog_v_2.value,
          #analog_v_3.value,
          #analog_v_4.value
      ]
      relay_output_status    = [
          relay1.value,
          relay2.value,
          relay3.value,
          relay4.value,
          relay5.value,
          relay6.value,
          relay7.value,
          relay8.value
      ]
      # Publiziere unsere Listen
      mqtt_client.publish(config["mqtt_info"]["topic"]+"config", json.dumps(config))
      mqtt_client.publish(config["mqtt_info"]["topic"]+"discrete_input_status", str(discrete_input_status))
      mqtt_client.publish(config["mqtt_info"]["topic"]+"analog_input_status", str(analog_input_status))
      mqtt_client.publish(config["mqtt_info"]["topic"]+"relay_output_status", str(relay_output_status))
      fiveSecondTimer = time.time()+5
    
    if thirtySecondTimer <= time.time():
        thirtySecondTimer = time.time()+30
       
    if sixtySecondTimer <= time.time():
        sixtySecondTimer = time.time()+30

    if ninetySecondTimer <= time.time():
        ninetySecondTimer = time.time()+90
    # Ende des Durchlaufs
    log("debug","Ende des Durchlaufs")
Zurück zum Blog

Hinterlasse einen Kommentar