rgoo
41
//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);
}
}