Aufzug Modell (Code Kombinieren geht nicht)

Hallo zusammen,

Ich baue gerade ein Aufzugsmodell, bei dem ein Schrittmotor durch zwei Taster gesteuert wird. Zusätzlich gibt es einen Entfernungsmesser, der die Position des Aufzugs erfasst und damit vier LEDs ansteuert, die je nach Höhe leuchten sollen.

Ich habe zwei funktionierende Codes:

  1. Einen für den Schrittmotor und die Taster → Funktioniert einwandfrei.
  2. Eines für das Entfernungsmesser und die LEDs → Funktioniert ebenfalls.

Das Problem entsteht, wenn ich beide Codes zusammenführe: Der Aufzug fährt dann automatisch hoch und runter, ohne dass ich die Taster betätige.

Wie kann ich die beiden Codes so kombinieren, dass der Schrittmotor ausschließlich durch die Taster aktiviert wird, während der Entfernungsmesser nur zur LED-Steuerung dient?

Danke für eure Hilfe!

Programm läuft auf einem Arduino Mega

**#include <Arduino.h>**

**#include <Stepper.h>**

**// Schrittmotor Einstellungen**

**int _SPU_S = 2048; // Schritte pro Umdrehung des Motors**

**Stepper _stepper_S(_SPU_S, 11, 9, 10, 8); // Motor Pin 6, 4, 5, 3**

**int _taster_T = 4; // Pin für Taster 1**

**int _taster_T2 = 1; // Pin für Taster 2**

**void setup()**

**{**

**pinMode(_taster_T, INPUT);**

**pinMode(_taster_T2, INPUT);**

**}**

**void loop()**

**{**

**// Schrittmotorsteuerung**

**if (digitalRead(_taster_T2) == HIGH) { // Wenn Taster 2 gedrückt wird**

**_stepper_S.setSpeed(12); // Geschwindigkeit auf 10 RPM setzen**

**_stepper_S.step(-6150); // 5000 Schritte rückwärts**

**}**

**if (digitalRead(_taster_T) == HIGH) { // Wenn Taster 1 gedrückt wird**

**_stepper_S.setSpeed(12); // Geschwindigkeit auf 10 RPM setzen**

**_stepper_S.step(6150); // 5000 Schritte vorwärts**

**}**

**}**
#include <Arduino.h>

// Ultraschallsensor Pins
const int _trigger_U = 34;
const int _echo_U = 35;

// LED Pins
const int _led_L = 25;
const int _led_L2 = 22;
const int _led_L3 = 23;
const int _led_L4 = 24;

// Funktion zur Entfernungsmessung mit Ultraschallsensor
double _getUltrasonicDistance(int trigger, int echo)
{
    digitalWrite(trigger, LOW);
    delay(5);  // Kurze Pause, um sicherzustellen, dass der Trigger funktioniert
    digitalWrite(trigger, HIGH);
    delay(10);  // Trigger-Puls
    digitalWrite(trigger, LOW);

    long duration = pulseIn(echo, HIGH);  // Messung der Pulsdauer
    double distance = (duration / 2.0) * 0.03432;  // Umrechnung in cm
    return distance;
}

void setup()
{
    // Ultraschallsensor-Pins als Ausgänge/Eingänge festlegen
    pinMode(_trigger_U, OUTPUT);
    pinMode(_echo_U, INPUT);

    // LED-Pins als Ausgänge festlegen
    pinMode(_led_L, OUTPUT);
    pinMode(_led_L2, OUTPUT);
    pinMode(_led_L3, OUTPUT);
    pinMode(_led_L4, OUTPUT);
}

void loop()
{
    // **Ultraschallsensor misst die Entfernung**
    double distance = _getUltrasonicDistance(_trigger_U, _echo_U);

    // **LEDs steuern je nach gemessener Entfernung**
    if (distance > 22) {
        digitalWrite(_led_L, HIGH);  // LED an Pin 13 an
    } else {
        digitalWrite(_led_L, LOW);  // LED an Pin 13 aus
    }

    if (distance < 22) {
        digitalWrite(_led_L2, HIGH);  // LED an Pin 10 an
    } else {
        digitalWrite(_led_L2, LOW);  // LED an Pin 10 aus
    }

    if (distance < 6) {
        digitalWrite(_led_L3, HIGH);  // LED an Pin 11 an
    } else {
        digitalWrite(_led_L3, LOW);  // LED an Pin 11 aus
    }

    if (distance > 4) {
        digitalWrite(_led_L4, HIGH);  // LED an Pin 12 an
    } else {
        digitalWrite(_led_L4, LOW);  // LED an Pin 12 aus
    }

    delay(100);  // Warten, bevor erneut gemessen wird (Stabilität)
}

Ja, sehr gerne.....nur wie sollen wir helfen, wenn wir deine Sketche nicht kennen ?

ich habs grad au bemerkt. warte :joy:

Du möchtest endliche Automaten bauen.

Setze deinen Code bitte in Code-Tags und trenne beide. Mach das bitte noch nachträglich am obigen Code.

Und damit das überhaupt funktiert, darfst du keine delays verwenden.

ist erledigt. aber wieso kein delay ?

Ein delay blockiert den Sketchdurchlauf. Da wird z.B. kein Tastendruck erkannt.

ok, aber das ändert ja nichts an dem Problem der Zusammenführung oder ?

#include <Arduino.h>

#include <Stepper.h>

// Schrittmotor Einstellungen

int _SPU_S = 2048; // Schritte pro Umdrehung des Motors

Stepper _stepper_S(_SPU_S, 11, 9, 10, 8); // Motor Pin 6, 4, 5, 3

int _taster_T = 4; // Pin für Taster 1
int _taster_T2 = 1; // Pin für Taster 2

byte status = 0;
int allStep = 0;


// Ultraschallsensor Pins
const int _trigger_U = 34;
const int _echo_U = 35;

// LED Pins
const int _led_L = 25;
const int _led_L2 = 22;
const int _led_L3 = 23;
const int _led_L4 = 24;


const int stepTik = 50;

// Funktion zur Entfernungsmessung mit Ultraschallsensor
double _getUltrasonicDistance(int trigger, int echo)
{
  digitalWrite(trigger, LOW);
  delay(5);  // Kurze Pause, um sicherzustellen, dass der Trigger funktioniert
  digitalWrite(trigger, HIGH);
  delay(10);  // Trigger-Puls
  digitalWrite(trigger, LOW);
  long duration = pulseIn(echo, HIGH);  // Messung der Pulsdauer
  double distance = (duration / 2.0) * 0.03432;  // Umrechnung in cm
  return distance;
}


void setup()

{
  pinMode(_taster_T, INPUT);
  pinMode(_taster_T2, INPUT);
  // Ultraschallsensor-Pins als Ausgänge/Eingänge festlegen
  pinMode(_trigger_U, OUTPUT);
  pinMode(_echo_U, INPUT);
  // LED-Pins als Ausgänge festlegen
  pinMode(_led_L, OUTPUT);
  pinMode(_led_L2, OUTPUT);
  pinMode(_led_L3, OUTPUT);
  pinMode(_led_L4, OUTPUT);
}

void loop()
{
  antrieb();
  ampel();
}

void ampel()
{
  // **Ultraschallsensor misst die Entfernung**
  double distance = _getUltrasonicDistance(_trigger_U, _echo_U);
  // **LEDs steuern je nach gemessener Entfernung**
  if (distance > 22)
  {
    digitalWrite(_led_L, HIGH);  // LED an Pin 13 an
  }
  else
  {
    digitalWrite(_led_L, LOW);  // LED an Pin 13 aus
  }
  if (distance < 22)
  {
    digitalWrite(_led_L2, HIGH);  // LED an Pin 10 an
  }
  else
  {
    digitalWrite(_led_L2, LOW);  // LED an Pin 10 aus
  }
  if (distance < 6)
  {
    digitalWrite(_led_L3, HIGH);  // LED an Pin 11 an
  }
  else
  {
    digitalWrite(_led_L3, LOW);  // LED an Pin 11 aus
  }
  if (distance > 4)
  {
    digitalWrite(_led_L4, HIGH);  // LED an Pin 12 an
  }
  else
  {
    digitalWrite(_led_L4, LOW);  // LED an Pin 12 aus
  }
}

void antrieb()
{
  // Schrittmotorsteuerung
  switch (status)
  {
    case 0:
      if (digitalRead(_taster_T) == HIGH)   // Wenn Taster 2 gedrückt wird
      {
        allStep = 6150;
      }
      if (digitalRead(_taster_T2) == HIGH)   // Wenn Taster 2 gedrückt wird
      {
        allStep = -6150;
      }
      if (allStep != 0)
      {
        _stepper_S.setSpeed(12); // Geschwindigkeit auf 10 RPM setzen
        status = 1;
      }
      break;
    case 1:
      if (allStep > stepTik)
      {
        _stepper_S.step(stepTik);
        allStep -= stepTik;
      }
      else if (allStep <= stepTik && allStep > 0)
      {
        _stepper_S.step(allStep);
        allStep = 0;
        status = 2;
      }
      if (allStep < stepTik * -1)
      {
        _stepper_S.step(stepTik * -1);
        allStep += stepTik;
      }
      else if (allStep >= stepTik * -1 && allStep < 0)
      {
        _stepper_S.step(allStep);
        allStep = 0;
        status = 2;
      }
      break;
    case 2:
      status = 0;
      break;
  }
}

ungetestet

In der Regel schon, weil sich dann die Programmteile gegenseitig blockieren können. Das gilt übrigens auch für die Stepper.h. Die blockiert auch während der Bewegung, und ist daher nur für ganz einfache Aufgaben geeignet. Oder man muss solche Klimmzüge machen wie @my_xy_projekt in seinem Vorschlag.
Aber mal eine ganz andere Frage. Wozu brauchst Du einen Entfernungsmesser um die Position der Aufzugskabine zu bestimmen. Du betreibst das ganze doch mit einem Schrittmotor. Da weis man doch die jeweilge Position anhand der Schritte.

Naja, ich wollts mal einfach probieren, ob das was wird. :wink:

Schwierig. Ohne wenigstens einen Endschalter.....

Das sollte ja wohl nicht so schwierig sein - auf jeden Fall einfacher als ein US Entfernungsmesser :wink:.

Der Bau des Aufzugs ist ein Teil einer Prüfungsarbeit. Und es ist verlangt ein Bauteil zur Messung eines physikalischen Wertes einzubauen und da hab ich nunmal den Ultraschallsensor gewählt um durch ihn die Position des Aufzugs zu ermitteln und so die LEDs zu steuern

Eine mechanische Betrachtung:
Du hast auf der Achse der Kettenrolle 3 Lager.

Eine Achse soll nie mehr als 2 Lager haben da bei 3 Lager die Achse 100% gerade sein muß und die 3 Lager auch perfekt ausgerichtet werden muß. ist das nicht der Fall treten Radiale Ausgleichskräfte auf die die Lager und Achse unnötig belasten. Falls mann doch mal 3 oder 4 Lager braucht ( zB Elektromotor und angetriebenes agregat wie zB eine Pumpe) dann muß man in der mitte ein elastisches Element einbauen, das den Achsversatz und die mangelde Achsflucht ausgleicht.

Paß auf, Ultraschallsensore funktionieren nicht gut in engen Räumen.
Grüße Uwe

Hallo jonnycode99

Poste den Schaltplan von deinem Projekt.

Woher kommt die Vorgabe Variablen und Funktionen mit Underscore beginnen zu lassen?

Und ob ihr es glaubt oder nicht. Das wird bei wirklichen Aufzügen so gemacht.
Weil ein doppelt ausgeführter hochwertiger Ultraschallsensor weniger störungsanfällig ist als Schalter oder was auch immer für Sensoren auf jedem Stockwerk

Da stimme ich Uwe zu. Die Alternative zum Abstand messen ist ein ToF-Sensor. Time of Flight
So was zum Beispiel:
https://eckstein-shop.de/PololuVL53L0XTime-of-FlightDistanceSensorCarrierwithVoltageRegulator2C200cmMax
Für den Sensor gibt es auch eine Library

Democode sieht recht simpel aus

Auflösung 1 mm.

hat leider nicht funktioniert

ich kann kein anderes Bauteil verwenden das ich an dem Modell nichtsmehr verändern darf

Ich bin nicht bereit mich damit weiter auseinander zu setzen.

Du bist nicht einmal in der Lage dich sinnvoll zu äussern, dass einem die Chance ermöglicht wird, Dir zu helfen.

Tipp:
Lehrkräfte lesen hier bekanntermaßen auch mit.