So würde es auch funktionieren.
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
unsigned long aktuelleZeit;
unsigned long vergangeneZeit_A;
unsigned long interval_1 = 2000;
int messungPin1 = HIGH;
int messungPin1Alt = HIGH;
byte encoderWert = 0; // -1 ( eins weniger als 0 ) == 255
const byte hal = 3;
const byte encoderPinA = 10; // Phase A vom Drehencoder
const byte encoderPinB = 11; // Phase B vom Drehencoder
const byte tasterEnter = 12; // Pin an dem der Encoder Taster angeschlossen ist
int wertSpeichern = 0; // gespeicherter Encoderwert
int encoderGedrueckt = 0; // Statusspeicher ob Encodertaster betätigt wurde
int encoderTaster = HIGH; // Taster im Encoder
int gleisAlt = 0; // Scheibe Position alt
int gleisNeu = 0; // Position welche die Scheibe anfahren soll
bool enter = false; // Bestätigung das der Encoder gedrückt wurde
int schritte = 0; // Schritte die deer Motor (Hallsensor betätigt) zurücklegen muss
int sensor = LOW;
bool start = false;
bool ergebnis = false;
unsigned long encoderDruckzeit; // Zeit wann der Encodertaster betätigt wurde
unsigned long entprellZeit = 200; // Zeit die nach der betätigung eines Tasters gewartet wird
unsigned long startZeit; // Abfrage begin Sensor an Bühne
unsigned long interval = 2000; // Zeitabstand nachdem ein Zustand des Sensors erkannt wird
unsigned long vergangeneZeit = 0; // Speichervariable um die Vergangene Zeit zu speichern
bool nullStellung = false; // Speichervariable ob Referenzfahrt erfolgt ist
int pin_motor_links = A1; // Richtungspin an H-Brücke für Links
int pin_motor_rechts = A2; // Richtungspin an H-Brücke für Rechts
const byte sensor_referenz = 2; // Pin für Sensor Referenz aussen an der Grube (Nullstellung)
int status_sensor_referenz; // Speichervariable für Status von Sensor für Referenzfahrt
byte linksRum = 0; // Anzahl Schritte Drehrichtung links
byte rechtsRum = 0; // Richtungsflag Drehrichtung rechts
void setup() {
pinMode(sensor_referenz, INPUT);
pinMode(pin_motor_links, OUTPUT);
pinMode(pin_motor_rechts, OUTPUT);
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
pinMode(tasterEnter, INPUT);
pinMode(hal, INPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Drehscheiben-");
lcd.setCursor(0, 1);
lcd.print("steuerrung");
delay (2000);
//lcd.clear();
//lcd.begin(16, 2);
//lcd.setCursor(0, 0);
//lcd.print("Wert");
//lcd.setCursor(0, 1);
//lcd.print(encoderWert);
}
void loop() {
referenzFahrt();
encoder_lesen();
schritt();
schritteZaehlen();
//Motor();
}
void referenzFahrt() {
aktuelleZeit = millis();
status_sensor_referenz = digitalRead(sensor_referenz);
if ((nullStellung == false) && (status_sensor_referenz == HIGH)) {
digitalWrite (pin_motor_rechts, HIGH);
digitalWrite (pin_motor_links, LOW);
if (millis() - vergangeneZeit_A >= interval_1) {
Serial.println("2 Sekunden abgelaufen");
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Referenzfahrt");
lcd.setCursor(0, 1);
lcd.print("gestartet");
vergangeneZeit_A = millis();
}
}
else if ((nullStellung == false) && (status_sensor_referenz == LOW)) {
Serial.println(nullStellung);
Serial.println(status_sensor_referenz);
Serial.println(vergangeneZeit_A);
nullStellung = true;
digitalWrite(pin_motor_rechts, LOW);
digitalWrite(pin_motor_links, LOW);
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Referenzfahrt");
lcd.setCursor(0, 1);
lcd.print("beendet");
delay(2000);
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Wert");
lcd.setCursor(0, 1);
lcd.print(encoderWert);
}
}
void encoder_lesen () {
messungPin1 = digitalRead(encoderPinA);
if ((messungPin1 == LOW) && (messungPin1Alt == HIGH) && (nullStellung == true)) {
if (digitalRead(encoderPinB) == HIGH) {
if (encoderWert < 48) encoderWert++ ;
} else {
if (encoderWert > 1) encoderWert-- ;
}
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Wert");
lcd.setCursor(0, 1);
lcd.print(encoderWert);
}
encoderTaster = digitalRead(tasterEnter);
if (encoderTaster == LOW)
{
encoderDruckzeit = millis();
encoderGedrueckt = 1;
}
if ((millis() - encoderDruckzeit > entprellZeit) && encoderGedrueckt == 1) {
wertSpeichern = encoderWert;
Serial.println(wertSpeichern);
encoderGedrueckt = 0;
enter = true;
}
messungPin1Alt = messungPin1;
}
void schritt () {
if (enter == true) {
gleisNeu = wertSpeichern;
schritte = abs (gleisNeu - gleisAlt);
if (gleisNeu > gleisAlt) {
Serial.println ("rechts");
}
else if (gleisNeu < gleisAlt){
Serial.println ("links");
}
Serial.print ("benoetigte Schritte ");
Serial.println(schritte);
Serial.println(gleisNeu);
Serial.println(gleisAlt);
Serial.println(enter);
enter = false;
ergebnis = true;
}
}
void schritteZaehlen () {
sensor = digitalRead (hal);
startZeit = millis();
if ((schritte != 0) && (ergebnis == true)) {
start = true;
if ((startZeit - vergangeneZeit >= interval) && (sensor == LOW) && (start == true)) {
vergangeneZeit = startZeit;
schritte--;
Serial.println("Schritte");
Serial.println(schritte);
}
}
else if ((schritte == 0) && (start == true)) {
start = false;
Serial.println("Ziel");
ergebnis = false;
gleisAlt = wertSpeichern;
}
}
void best_Richtung() {
}
void motor() {
}
nur wie bekomme ich das hin, das die Scheibe, wenn ich von Gleis 1 auf Gleis 48 fahren möchte, nur 1 Schritt nach links fährt anstatt 48 Schritte nach rechts fährt?