Enviolo (Nuvinci) + Arduino für Rollstuhl

//Waage
#include "HX711.h"
HX711 scale;
uint8_t dataPin = 6;
uint8_t clockPin = 7;
//Motor
const int SensorPin = 2;  //Interrupt Pin (nur 2 oder 3 @ Arduino Uno)
const byte Brake = 8;//Pinausgang Bremse, HIGH = Vollbremsung
const byte PWM = 9;// Pinausgang für Drehzahl
byte power = 200;// Motor-Drehzahl-Normalbetrieb
const byte Drehrichtung = 10;// Pin Drehrichtungswechsel LOW/HIGH Drehrichtung
unsigned long FlagMillis;
unsigned int Counter;
bool setupStep = LOW;
bool Normalbetrieb = LOW;
String Programmposition;

void motor(bool Stop, bool Richtung, int pwmSignal) {
  digitalWrite (Brake, Stop);
  digitalWrite (Drehrichtung, Richtung);
  analogWrite (PWM, pwmSignal);
}
void M_Stop() {
  motor(HIGH, LOW, 0);
}
void M_Hoch() {
  motor(LOW, HIGH, power);
}
void M_Runter() {
  motor(LOW, LOW, power);
}
void count () {
  Counter++;
}
void setup() {
  Serial.begin(9600);
  //Waage
  scale.begin(dataPin, clockPin);
  scale.set_scale(127.15);
  scale.tare();
  pinMode(dataPin, INPUT);
  pinMode(clockPin , OUTPUT);

  //Motor
  pinMode(SensorPin, INPUT); //definiertes Potenzial (HIGH/LOW) von einem Hall-Sensor
  pinMode(Brake , OUTPUT);
  pinMode(PWM , OUTPUT);
  pinMode(Drehrichtung , OUTPUT);//Drehrichung
}
void loop() {
  motorSetup();
  motorMatik();
  Serial.print("\t Programmposition: ");
  Serial.print(Programmposition);
  Serial.print("\t Counts: ");
  Serial.print(Counter);
  Serial.print("\t setupStep: ");
  Serial.println(setupStep);
}
void motorSetup() { //MIT WÄGEZELLE WIRD DIESE ANWEISUNG KOMPLETT ÜBERSPRUNGEN
  if (!setupStep) {  //Variable um den Setupvorgang vom Normalbetrieb zu trennen
    Counter = 0;
    attachInterrupt(digitalPinToInterrupt(SensorPin), count, CHANGE);
    delay(500);//kann delay sein, weil motorSetup nur einmal und ohne Wägezelle durchlaufen wird
    detachInterrupt(digitalPinToInterrupt(SensorPin));//Stop zur Ermittlung der Drehzahl über 500ms
    motor(LOW, LOW, 30); //Kriechgang (30) zum Anfahren der Endposition (Anschlag)
    Programmposition = 1;
  }
  static  unsigned long SetupMillis = 0;
  if ((Counter < 10) && ((millis() - SetupMillis >= 1000))) {// 1s um den Anlaufprozess zu überbrücken
    M_Stop (); // Drehzahl sinkt am Anschlag unter (10) , der Motor stopt
    setupStep = HIGH;
    Counter = 1000;// Counter wir af 1000 gesetzt um ein "Überfahren" in den negativen Bereich zu verhindern
    Programmposition = 2;
  }
  // Der Zähler wird auf Positionsmods umgestellt, absolute Werte werden gespeichert
  if (setupStep && !Normalbetrieb) {
    attachInterrupt(digitalPinToInterrupt(SensorPin), count, CHANGE);
    motor (LOW, HIGH, 120); //Richtungswechsel nach Anschlag
    if (Counter >= 1100) {//Fahrt auf Ausgangsposition (z.B X + 100)
      M_Stop ();//Setup-Phase ist beendet, Motor steht in Ausgangsposition
      Normalbetrieb = HIGH;//Umschalten auf Normalbetrieb
      Programmposition = 3;
    }
  }
}
void motorMatik () {//muss noch erweitert werden, die Grundfunktion ist ok
  if (Normalbetrieb) {
    attachInterrupt(digitalPinToInterrupt(SensorPin), count, CHANGE);
        float wz = scale.get_units();
    long druck[] = {2000, 3000, 4000, 6000};
    long positionM[] = {1000, 12000, 1600, 1800, 1900};
        if (wz > druck[0] && wz < druck[1] && Counter < positionM[1]) {
    M_Runter();
    Programmposition = 4;
  }
      if (Counter >= positionM[2]) {
  M_Stop();
  Programmposition = 5;
}
    Serial.print("\t UNIT wz: ");
    Serial.print(wz);
  }
}