Stepper Motor über ESPHome steuern

Hallo!
Ich möchte einen Stepper Motor über ESPHome betreiben.
Der Stepper soll den Luftschieber meines Ofen regeln.
Hier mal die Eckdaten welche Hardware ich benutze und wie weit ich mit der Software bin.
Diesen Motor möchte ich nutzen:


Das Board ist ein ESP8266 und bereits mit ESPHome geflasht
Der Treiber ist ein A4988.
Mein Netzteil hat 30W und ist ausgangsseitig auf 12VDC eingestellt
Zusätzlich versorgt die 12V eine Platine welche die 5V für den Treiber und den ESP erzeugt
Am ESP benutze ich D6 (GPIO12) für DIR und D7 (GPIO13) für STEP
D0 (GPIO16) für ENABLE
Treiber / Motor:
B2 B- = red (Spule 2)
A2 B+ = green (Spule 2)
A1 A+ = black (Spule 1)
B1 A- = blue (Spule 1)

Der YAML Code:

# Schrittmotor Konfiguration
stepper:
  - platform: a4988  # oder 'drv8825' je nach Treiber
    id: my_stepper
    step_pin: GPIO13
    dir_pin: GPIO12
    max_speed: 250     # Maximale Schritte pro Sekunde (Geschwindigkeit)
    acceleration: 100  # Beschleunigung in Schritten pro Sekunde²
    deceleration: 100  # Abbremsen für sanftes Stoppen



# Schalter Ein Aus
switch:
  - platform: gpio
    pin: GPIO16        # Pin, der mit dem EN-Pin des Treibers verbunden ist
    name: Treiber Aus
    #id: stepper_enable # ID für den Enable-Schalter



#Taster für hochfahren     
  - platform: template
    name: "Knopf rechts"
    id: button_up
    turn_on_action:
        then:
          - stepper.report_position:
              id: my_stepper
              position: 0
          - stepper.set_target:
              id: my_stepper
              target: -5000
#Taster für runterfahren              
  - platform: template
    name: "Knopf links"
    id: button_down
    turn_on_action:
        then:
          - stepper.report_position:
              id: my_stepper
              position: 0
          - stepper.set_target:
              id: my_stepper
              target: 5000

Diese Steuerelemente konnte ich erstellen:

grafik

Der Motor läuft 5000Steps nach links/rechts!

Bei folgenden Aufgaben komme ich nicht so recht weiter:

  1. Anfangs und Endpunkt einer bestimmten Strecke festlegen
  2. Darstellung der Strecke im Dashboard
  3. Erstellung einer Automation: Bei steigender Temperatur fährt der Stepper nach rechts, bei fallender Temperatur nach links

Über ein paar Anregungen würde ich mich sehr freuen!

HAllo ich mache das gleiche Projekt mit ESP32 und den gleichen Komponenten. Habe mir ein Platine dazu gefertigt und einen Temperatursensor integriert:auch einen Rotary Encoder zum manuellen Ansteuern des Steppermotors

 substitutions:
   name: ofentemperatur
   friendly_name: Ofentemperatur
   max_steps: "2000"
   step_size: "25"
 external_components:
   - source: github://esphome/esphome
     components: \[rotary_encoder\]
 esphome:
   name: ${name}
   friendly_name: ${friendly_name}
   name_add_mac_suffix: false
   project:
     name: esphome.web
     version: dev
 esp32:
   board: esp32dev
   framework:
     type: esp-idf
 logger:
 api:
   encryption:
     key: "xyz"
 ota:
   platform: esphome
   password: "password"
 wifi:
   ssid: !secret wifi_ssid
   password: !secret wifi_password
   ap:
     ssid: "Ofentemperatur Fallback Hotspot"
     password: "password"
 improv_serial:
 captive_portal:
 web_server:
 dashboard_import:
   package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
   import_full_config: false
# ----------------------------------------------------
# ✅ Rotary Encoder Button → Ausgangsstellung
# ----------------------------------------------------
 binary_sensor:
   - platform: gpio
     pin:
       number: GPIO13
       mode: INPUT_PULLUP
       inverted: True
     name: "Stepper Encoder Button"
     on_press:
       - stepper.set_target:
           id: my_stepper
           target: 0
       - lambda: |-
           id(stepper_fine).publish_state(0);
# ----------------------------------------------------
# ✅ MAX6675 Temperatur-Sensor
# ----------------------------------------------------
 spi:
   clk_pin: GPIO19
   miso_pin: GPIO17
   mosi_pin: GPIO23
 sensor:
   - platform: max6675
     name: "Ofen Temperatur"
     cs_pin: GPIO18
     update_interval: 30s
   - platform: template
     name: "Stepper Position"
     id: stepper_position
     lambda: |-
       return id(my_stepper).current_position;
     update_interval: 1s
# Rotary Encoder → steuert Slider + Stepper
   - platform: rotary_encoder
     id: stepper_encoder
     pin_a: GPIO35
     pin_b: GPIO32
     resolution: 1
     on_clockwise:
       - lambda: |-
           int new_pos = id(stepper_fine).state + ${step_size};
           if (new_pos > ${max_steps}) new_pos = ${max_steps};
           id(stepper_fine).publish_state(new_pos);
           id(my_stepper).set_target(new_pos);
     on_anticlockwise:
       - lambda: |-
           int new_pos = id(stepper_fine).state - ${step_size};
           if (new_pos < 0) new_pos = 0;
           id(stepper_fine).publish_state(new_pos);
           id(my_stepper).set_target(new_pos);
# ----------------------------------------------------
# ✅ Buttons
# ----------------------------------------------------
 button:
   - platform: template
     name: "Stepper: Ausgangsstellung"
     id: btn_home
     on_press:
       - stepper.set_target:
           id: my_stepper
           target: 0
   - platform: template
     name: "Stepper: Endstellung"
    id: btn_end
     on_press:
       - stepper.set_target:
           id: my_stepper
           target: ${max_steps}
# ----------------------------------------------------
# ✅ Slider
# ----------------------------------------------------
 number:
   - platform: template
     name: "Stepper Feinsteuerung (25 Steps)"
     id: stepper_fine
     min_value: 0
     max_value: ${max_steps}
     step: ${step_size}
     mode: slider
     set_action:
       - stepper.set_target:
           id: my_stepper
           target: !lambda "return (int)x;"
 interval:
   - interval: 200ms
     then:
       - lambda: |-
           id(stepper_fine).publish_state(id(my_stepper).current_position);
# ----------------------------------------------------
# ✅ Stepper A4988
# ----------------------------------------------------
 stepper:
   - platform: a4988
     id: my_stepper
     step_pin: GPIO26
     dir_pin: GPIO25
     sleep_pin: GPIO33
     max_speed: 200 steps/s
     acceleration: 200 steps/s^2
     deceleration: 200 steps/s^2

:crayon:by HarryP:
. Zusammenführung Doppelpost (bei Änderungen oder hinzufügen von Inhalten bitte die „Bearbeitungsfunktion“ anstatt „Antworten“ zu nutzen)
. Code-/Logzeilen formatiert (bitte immer in </> einbinden)
. s.a.: (Neues Update & Features - Hier in der Community 🫶)

Guten Abend,

danke für deine Antwort und dafür das du dein Projekt hier so ausführlich beschrieben hast.

Eigentlich wollte ich mich ja im Sommer weiter mit dem Stepper beschäftigen. Aber da ist nichts draus geworden. Soweit bin ich mitlerweile gekommen:

# Schrittmotor Konfiguration
stepper:
  - platform: a4988  # oder 'drv8825' je nach Treiber
    id: my_stepper
    step_pin: GPIO13
    dir_pin: GPIO12
    max_speed: 100     # Maximale Schritte pro Sekunde (Geschwindigkeit)
    acceleration: 100  # Beschleunigung in Schritten pro Sekunde²
    deceleration: 100  # Abbremsen für sanftes Stoppen

spi:
  clk_pin: GPIO14   # Beispiel für SCK
  miso_pin: GPIO4  # Beispiel für MISO


sensor:
  - platform: max6675
    name: "Abgas Temperatur"
    id: abgas
    cs_pin: GPIO5
    update_interval: 5s
    on_value_range:
      - below: 40.0
        then:
          #- stepper.set_target:
          #    id: my_stepper
          #    target: -2000
          - number.set:
              id: stepper_control
              value: 0
      - above: 40.0
        below: 55.0
        then:
          #- stepper.set_target:
          #    id: my_stepper
          #    target: -1000
          - number.set:
              id: stepper_control
              value: 1000    
      - above: 65.0
        below: 85.0
        then:
          #- stepper.set_target:
          #   id: my_stepper
          #   target: 0
          - number.set:
              id: stepper_control
              value: 2000
      - above: 230.0
        below: 250.0
        then:
          #- stepper.set_target:
          #    id: my_stepper
          #    target: 500
          - number.set:
              id: stepper_control
              value: 500
      - above: 250.0
        below: 275.0
        then:
          #- stepper.set_target:
          #    id: my_stepper
          #    target: 1000
          - number.set:
              id: stepper_control
              value: 1000
      - above: 275.0
        below: 300.0
        then:
          #- stepper.set_target:
          #    id: my_stepper
          #   target: 1500
          - number.set:
              id: stepper_control
              value: 1500
      - above: 300.0
        then:
          #- stepper.set_target:
          #    id: my_stepper
          #   target: 2000
          - number.set:
              id: stepper_control
              value: 2000



number:
  - platform: template
    name: Stepper Control
    id: stepper_control
    min_value: 0
    initial_value: 0
    max_value: 4000
    step: 500
    optimistic: true
    set_action:
      then:
        - stepper.set_target:
            id: my_stepper
            target: !lambda 'return x;'


# Schalter Ein Aus
switch:
  - platform: gpio
    pin: GPIO16        # Pin, der mit dem EN-Pin des Treibers verbunden ist
    name: Treiber Aus

#Taster für Schieber zu     
  - platform: template
    name: "Schieber zu"
    id: button_up
    turn_on_action:
      - then:
          - number.set:
              id: stepper_control
              value: !lambda 'return id(stepper_control).state - 500;'

#Taster für Schieber auf             
  - platform: template
    name: "Schieber auf"
    id: button_down
    turn_on_action:
      - then:
          - number.set:
              id: stepper_control
              value: !lambda 'return id(stepper_control).state + 500;'

Mir fehlen noch die Anfangs und Endpunkte um die Strecke des Steppers zu definieren.

Kannst du mit dem Poti den Stepper manuell fahren?

Hast du die Platine selber gemacht oder irgendwo gekauft?

Hallo, ja mit dem Poti steuer ich die Potis an.

Einmal kurz Drücken auf Position 0, und pro Umdrehung 25 Steps in jede Richtung

Die Platine hab ich selber gemacht. Musste 5 Bestellen hat mich 20€ gekostet und erspart den Kabelsalat.

Den Weg hab ich über die steps definiert.o Anfang und Max Steps dann der Endpunkt

Mal eine bescheidene Frage: könntest du dir vorstellen eine deiner Platinen zu verkaufen?

Zusätzlich wäre es nett wenn du mir vielleicht dann auch noch etwas zu den anderen Bauteilen sagen könntest. So wie du das umgesetzt hast ist es schon genau das was ich eigentlich suche. Aber nur wenn du da auch wirklich bock drauf hast.

Klar ich brauch ja nur eine.