Go Down

Topic: Drehscheibe Modellbahn mit RF24 (Read 4942 times) previous topic - next topic

Acki1985

#75
Jan 13, 2019, 08:58 pm Last Edit: Jan 13, 2019, 08:59 pm by Acki1985
Stimmt. Habe es geändert. Wie könnte das aussehen wenn ich anstatt der Delay's millis() einsetze? Gibt es eine Möglichkeit eine globale Wartezeit für Anzeige Referenzfahrt gestartet und für Referrenzfahrt beendet?

Code: [Select]


void referenzFahrt(){
  status_sensor_referenz = digitalRead(sensor_referenz);
  if ((nullStellung == false) && (status_sensor_referenz == HIGH)) {
    lcd.clear();
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Referenzfahrt");
    lcd.setCursor(0, 1);
    lcd.print("gestartet");
    digitalWrite (pin_motor_rechts, HIGH);
    digitalWrite (pin_motor_links, LOW);
  delay(2000);
  }
  else {
Serial.println(nullStellung);
Serial.println(status_sensor_referenz);
   
    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);
  }
 
}


Tommy56

Da kann ich Dir nur die Standardantwort geben: Schaue Dir BlinkWithoutDelay an und verstehe es. Lies dazu die Nachtwächtererklärung.
Das kann Dir keiner abnehmen, das musst Du selbst verstehen. Das brauchst Du in vielen Anwendungen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Acki1985

Jetzt habe ich es mit millis() geschrieben. Die Zeit läuft auch ab. der Text 2 Sekunden abgelaufen kommt alle 2 Sekunden. Ich habe nur das Gefühl das er die zeit nicht als Wartezeit für die LCD Anzeige nutzt. Es wird so schnell gelöscht und neu geschrieben das man kaum was erkennt. Woran liegt das. Müsste die LCD Anzeige nicht jetzt auch für 2 Sekunden stehen bleiben?

Code: [Select]


#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;
unsigned long interval = 2000;
unsigned long vergangeneZeit = 0;
bool nullStellung = false;
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;
int status_sensor_referenz;
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();

}

void referenzFahrt(){
  aktuelleZeit = millis();
  status_sensor_referenz = digitalRead(sensor_referenz);
  if ((nullStellung == false) && (status_sensor_referenz == HIGH)) {
    lcd.clear();
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Referenzfahrt");
    lcd.setCursor(0, 1);
    lcd.print("gestartet");
    digitalWrite (pin_motor_rechts, HIGH);
    digitalWrite (pin_motor_links, LOW);
  if (millis() - vergangeneZeit_A >= interval_1){
    Serial.println("2 Sekunden abgelaufen");
     vergangeneZeit_A = millis();
  }
  }
  else {
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)) {
    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);
      Serial.print ("benoetigte Schritte  ");
      Serial.println(schritte);
      //gleisAlt = wertSpeichern;
      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(){
 
}



Tommy56

Du gibst in der 2-Sekunden-Steuerung doch nur die Serielle Ausgabe aus. Wenn Du die Ausgaben auf dem lcd auch in diesem Teitraster haben willst, dann müssen sie in das
Code: [Select]
if (millis() - vergangeneZeit_A >= interval_1){
mit rein. Millis ist kein delay-Ersatz sondern ein "Mache etwas, wenn die Zeit vorbei ist" und das "etwas" muss dan halt in das if mit rein.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Acki1985

#79
Jan 13, 2019, 10:29 pm Last Edit: Jan 13, 2019, 10:30 pm by Acki1985
Ah jetzt habe ich es glaube verstanden. Danke Tommy

Jetzt muss ich noch das mit der richtungswahl hinbekommen. Durch den Code bin ich ehrlich gesagt noch nicht wirklich durchgestiegen.

Acki1985

vielleicht kann mir da noch jemand helfen.

Hab dann noch ein weiteres Problem. Möchte dann auch per Tastendruck um 180 Grad (24 Schritte) drehen können.

Wenn die Scheibe aber zum Beispiel auf Position 3 steht und ich dann 180 Grad linksrum drücke wird ja normaler weise  3-24 gerechnet. das wäre ja dann Pos. -21 und nicht nicht Pos. 27. Wie könnte man das lösen?

postmaster-ino

Hi

Wenn das Ziel negativ ist, einfach 48 dazu zählen.
Wenn das Ziel >48 ist, einfach 48 abziehen.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Acki1985

Das sagst du so einfach. Ich verstehe das aber irgendwie nicht. Wie kommst du da drauf?

Acki1985

Schade keiner ne idee?

Acki1985

Hab mal versucht die Richtngsbestimmung einzubauen. Wenn ich mir dei Werte im Serial Monitor augeben lasse, nimmt er immer rchtsrum, egal ob ich von Gleis 11 zu Gleis 12 oder von Gleis 12 zu Gleis 11 fahren will.


Ausgabe Serieller Monitor:
Schritte rechts   1       rechtsrum das stimmt
Schritte links    47
benoetigte Schritte  1
11  // gleisAlt
12  // gleisNeu
1   // Schrittzähler
Schritte
0
Ziel  // Ziel erreicht
12
Schritte rechts   1       immer rechtsrum obwohl linksrum gefahren werden soll
Schritte links    47
benoetigte Schritte  1
12  // gleisAlt
11  // gleisNeu

Bei dem Code:
Code: [Select]

#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);
    rechtsRum = abs(gleisAlt - gleisNeu);                //Weg rechts herum
    linksRum = 48 - abs(gleisAlt - gleisNeu); //Weg links herum
    schritte = min(rechtsRum, linksRum);                      //kürzeren Weg nehmen
    Serial.print("Schritte rechts   ");
    Serial.println(rechtsRum);
    Serial.print("Schritte links    ");
    Serial.println(linksRum);
   
    Serial.print ("benoetigte Schritte  ");
    Serial.println(schritte);
    //gleisAlt = wertSpeichern;
    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() {

}



Woran könnte das liegen?



postmaster-ino

Hi

Probier Mal was in der Richtung:
Gleis_neu < Gleis_alt XOR rechtsrum<linksrum
(wobei in der Berechnung die Namen links/rechtsrum wohl so nicht stimmen)

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Acki1985

Guten Abend,

aber müsste das nicht auch mit dieser min funktion funktionieren?

Acki1985

So würde es auch funktionieren.

Code: [Select]

#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?

postmaster-ino

Hi

Was sagt dazu meine neueste Kreation?
Gleis_neu<Gleis_Alt wird wohl hier false sein (48<1 -> false)
rechtsrum müsste abs(48-1) = 47 sein - bleibt in beiden Konstellationen gleich
linksrum müsste 48-rechtsrum=1 sein - hier auch, Namen irreführend!!

Bei 1->48 und bei 48->1 müsste
(Gleis_neu<Gleis_Alt XOR rechtsrum<linksrum) 1x true und 1x false werden

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Acki1985

Hm... Verstehe leider nicht wie du das mit dem XOR meinst.

Müsste ich in die eine Richtung mit absoluten Werten rechnen und in die andere mit normalen Werten?

Go Up