Sorry, sorry,
also daran soll's ja nun nicht im Mindesten liegen.
Ich bin für jeden Hinweis dankbar und stelle den fertigen Sketch gern hier noch einmal ein.
Ich finde Deinen Hinweis im Übrigen auch sehr "sozialkompetent" und kollegial.
Wie Du ja weist, sind meine eigenen Kompetenzen auch dem Gebiet der Programmierung
sehr übersichtlich, so dass ich an dieser Stelle auch tatsächlich bis auf einen gemeinsam erarbeiteten Sketch nur wenig zurückgeben kann.
Ich kann aber an dieser Stelle der Community gern Hilfe bei CAD Konstruktionen anbieten,
sollte dies hier mal versehentlich gewünscht sein.
//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
const byte power = 100;// Motor-Drehzahl-Normalbetrieb
const byte Drehrichtung = 10;// Pin Drehrichtungswechsel LOW/HIGH Drehrichtung
volatile long Counter;
volatile bool dir; // true: incr ; false: decr
bool setupStep = LOW;
bool Normalbetrieb = LOW;
String P;//dient nur der Kontrolle: Programmposition
void count() {
Counter += dir ? +1 : -1;
}
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 setup() {
Serial.begin(9600);
//Waage
scale.begin(dataPin, clockPin);
scale.set_scale(127.15);//es wird nur der Relativwert benötigt
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 Counts: ");
Serial.println(Counter);
// */
}
void motorSetup() {
if (!setupStep) { //Variable um den Setupvorgang vom Normalbetrieb zu trennen
Counter = 0;
dir = 1;
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)
}
static unsigned long SetupMillis;
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 auf 100 gesetzt um ein "Überfahren" in den negativen Bereich zu verhindern
}
// 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 >= 1010) {//Fahrt auf Ausgangsposition (z.B X + 10)
M_Stop ();//Setup-Phase ist beendet, Motor steht in Ausgangsposition
Normalbetrieb = HIGH;//Umschalten auf Normalbetrieb
}
}
}
void motorMatik () {
if (Normalbetrieb) {
static unsigned long m_Millis;
static unsigned long m_MillisH;
long wz = scale.get_units();
long positionM[] = {1040, 1600};
long druckPosition = map (wz, 260, 4000, 1000, 1600);
if (druckPosition > (Counter + 1) && Counter < positionM[1]) {
M_Stop();
P = 1;
if (millis() - m_Millis >= 1000) {//Pause, um M_Hoch auslaufen zu lassen
dir = 1;
M_Runter();//Druck läßt nach
m_MillisH = millis();
}
}
else if (druckPosition < (Counter - 1) && Counter > positionM[0] ) {
M_Stop();
P = 2;
if (millis() - m_MillisH >= 1000) {//Pause, um M_Runter auslaufen zu lassen
dir = 0;
M_Hoch();//Druck steigt
m_Millis = millis();
}
}
else {
m_Millis = millis();
m_MillisH = millis();
M_Stop();
P = 3;
}
/*
Serial.print("druckPosition: ");
Serial.print(druckPosition);
Serial.print("\t millis: ");
Serial.print(millis());
Serial.print("\t m_Millis: ");
Serial.print(m_Millis);
Serial.print("\t M_H: ");
Serial.print(m_MillisH);
Serial.print("\t P_Position: ");
Serial.print(P);
// */
}
}