Problem mit Zählfunktion

Hallo,
wie so viele hab auch ich ein Problem mit meinem Sketch.
Eigentlich funktioniert alles so wie ich es möchte, bis auf die Vergleichsfunktion, die nur zur Hälfte richtig zählt. Es geht um die Steuerung einer Hebebühne mit 2 Motoren.
diese laufen nicht synchron.
Der Hersteller hatte dafür eine spezielle Platine verbaut. Die ist leider abgeraucht. Die Bühne ist 35 Jahre alt, somit gibt es keinen Ersatz.
Dafür hab ich diesen Sketch für einen Arduino Nano erstellt. Er bekommt Steuerimpulse von den beiden Lichtschranken, die die Umdrehungen messen. je nach dem welchen Motor schneller dreht wird so lange durch Relais abgeschaltet bis alle Impulse gleich sind. Beim Hochfahren funktioniert alles richtig, jedoch zählt er beim runterfahren nicht richtig.
Ich hab den Code mal angehängt. Evtl. hat jemand eine Idee was ich falsch gemacht habe.
Danke im Voraus.
Dieter

// Zähler 30.10 läuft, pinmode geändert


#include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 20, 4);
int button_li = 3;     // Lichtschranke 1, links
int button_re = 4;     // Lichtschranke 2, rechts
int Motor_li = 5;      // Relais 1 zum Motor links
int Motor_re = 6;      // Relais 2 zum Motor rechts
int Relais_auf = 7;  // Relais 3 auf
int Relais_ab = 8;  // Relais 4 
int Schalter_auf = 9;
int Schalter_ab = 10;
long zaehler_li;
long zaehler_re;
int zaehler_liLastState = 1;
int zaehler_reLastState = 1;

void setup() {
  pinMode(button_li, INPUT_PULLUP);
  pinMode(button_re, INPUT_PULLUP);    
  digitalWrite(Relais_auf, HIGH);
  digitalWrite(Relais_ab, HIGH);
  digitalWrite(Motor_li,HIGH);
  digitalWrite(Motor_re, HIGH);
   pinMode(Motor_li, OUTPUT);      // links Relais 1 links
  pinMode(Motor_re, OUTPUT);      // rechts Relais 2 rechts
  pinMode(Relais_auf, OUTPUT);  // Relais 3 auf
  pinMode(Relais_ab, OUTPUT);   // Relais 4 ab
  pinMode(Schalter_auf, INPUT_PULLUP);
  pinMode(Schalter_ab, INPUT_PULLUP);

     zaehler_li = 500;
  zaehler_re = 500;
  zaehler_liLastState = 1;
  zaehler_reLastState = 1;
     lcd.init();
     lcd.backlight();
     lcd.clear(); }

 void loop() {
      if (digitalRead(Schalter_auf) == LOW)          
         {digitalWrite(Relais_auf,LOW);}
         if (digitalRead(Schalter_auf) == HIGH)  
          {digitalWrite(Relais_auf, HIGH);}                         

   if (digitalRead(Schalter_ab) == LOW)          
         {digitalWrite(Relais_ab,LOW);}
         if (digitalRead(Schalter_ab) == HIGH)  
          {digitalWrite(Relais_ab, HIGH);}            
 
      // Zählen Lichtschranke 1 
  byte zaehler_liNewState = digitalRead(button_li);
  if (zaehler_liNewState == 0 && zaehler_liLastState == 1 && digitalRead(Schalter_auf))
       { zaehler_li++ ; } 
  if (zaehler_liNewState == 0 && zaehler_liLastState == 1 && digitalRead(Schalter_ab))
       { zaehler_li-- ; } 
      zaehler_liLastState = zaehler_liNewState;
     lcd.setCursor(0, 0);
      lcd.print(zaehler_li);
      lcd.setCursor(4, 0);
     lcd.print("Motor l inks");
 
  //Zählen Lichtschranke 2 
  byte zaehler_reNewState = digitalRead(button_re);
  if (zaehler_reNewState == 0 && zaehler_reLastState == 1 && digitalRead(Schalter_auf))
    { zaehler_re++ ; }
  if (zaehler_reNewState == 0 && zaehler_reLastState == 1 && digitalRead(Schalter_ab))
    { zaehler_re-- ; }
      zaehler_reLastState = zaehler_reNewState;
     lcd.setCursor(0, 1);
     lcd.print(zaehler_re);
      lcd.setCursor(4, 1);
     lcd.print("Motor 2 rechts");
  
      // Vergleichen Lichtschrankee 1-------------------------
 if (zaehler_li > (zaehler_re+6))
    {digitalWrite(Motor_li, HIGH); }
    if (zaehler_re == zaehler_li)
    {digitalWrite(Motor_li, LOW);}   

// Vergleichen Lichtschranke 2 -----------
  if (zaehler_re > (zaehler_li+6))
   {digitalWrite(Motor_re, HIGH); }
   if (zaehler_re == (zaehler_li))  
  { digitalWrite(Motor_re,LOW);}}   

```cpp
// Zähler 30.10 läuft, pinmode geändert


#include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 20, 4);
int button_li = 3;     // Lichtschranke 1, links
int button_re = 4;     // Lichtschranke 2, rechts
int Motor_li = 5;      // Relais 1 zum Motor links
int Motor_re = 6;      // Relais 2 zum Motor rechts
int Relais_auf = 7;  // Relais 3 auf
int Relais_ab = 8;  // Relais 4 
int Schalter_auf = 9;
int Schalter_ab = 10;
long zaehler_li;
long zaehler_re;
int zaehler_liLastState = 1;
int zaehler_reLastState = 1;

void setup() {
  pinMode(button_li, INPUT_PULLUP);
  pinMode(button_re, INPUT_PULLUP);    
  digitalWrite(Relais_auf, HIGH);
  digitalWrite(Relais_ab, HIGH);
  digitalWrite(Motor_li,HIGH);
  digitalWrite(Motor_re, HIGH);
   pinMode(Motor_li, OUTPUT);      // links Relais 1 links
  pinMode(Motor_re, OUTPUT);      // rechts Relais 2 rechts
  pinMode(Relais_auf, OUTPUT);  // Relais 3 auf
  pinMode(Relais_ab, OUTPUT);   // Relais 4 ab
  pinMode(Schalter_auf, INPUT_PULLUP);
  pinMode(Schalter_ab, INPUT_PULLUP);

     zaehler_li = 500;
  zaehler_re = 500;
  zaehler_liLastState = 1;
  zaehler_reLastState = 1;
     lcd.init();
     lcd.backlight();
     lcd.clear(); }

 void loop() {
      if (digitalRead(Schalter_auf) == LOW)          
         {digitalWrite(Relais_auf,LOW);}
         if (digitalRead(Schalter_auf) == HIGH)  
          {digitalWrite(Relais_auf, HIGH);}                         

   if (digitalRead(Schalter_ab) == LOW)          
         {digitalWrite(Relais_ab,LOW);}
         if (digitalRead(Schalter_ab) == HIGH)  
          {digitalWrite(Relais_ab, HIGH);}            
 
      // Zählen Lichtschranke 1 
  byte zaehler_liNewState = digitalRead(button_li);
  if (zaehler_liNewState == 0 && zaehler_liLastState == 1 && digitalRead(Schalter_auf))
       { zaehler_li++ ; } 
  if (zaehler_liNewState == 0 && zaehler_liLastState == 1 && digitalRead(Schalter_ab))
       { zaehler_li-- ; } 
      zaehler_liLastState = zaehler_liNewState;
     lcd.setCursor(0, 0);
      lcd.print(zaehler_li);
      lcd.setCursor(4, 0);
     lcd.print("Motor l inks");
 
  //Zählen Lichtschranke 2 
  byte zaehler_reNewState = digitalRead(button_re);
  if (zaehler_reNewState == 0 && zaehler_reLastState == 1 && digitalRead(Schalter_auf))
    { zaehler_re++ ; }
  if (zaehler_reNewState == 0 && zaehler_reLastState == 1 && digitalRead(Schalter_ab))
    { zaehler_re-- ; }
      zaehler_reLastState = zaehler_reNewState;
     lcd.setCursor(0, 1);
     lcd.print(zaehler_re);
      lcd.setCursor(4, 1);
     lcd.print("Motor 2 rechts");
  
      // Vergleichen Lichtschrankee 1-------------------------
 if (zaehler_li > (zaehler_re+6))
    {digitalWrite(Motor_li, HIGH); }
    if (zaehler_re == zaehler_li)
    {digitalWrite(Motor_li, LOW);}   

// Vergleichen Lichtschranke 2 -----------
  if (zaehler_re > (zaehler_li+6))
   {digitalWrite(Motor_re, HIGH); }
   if (zaehler_re == (zaehler_li))  
  { digitalWrite(Motor_re,LOW);}}   

 




Pardon hab aus Versehen 2 mal gepostet. Sorry

Kannst du in der IDE mal Strg-T drücken und den neu formatierten Code einfügen? Das ist so schwer lesbar. Du kannst den Post auch editieren.

// Zähler 30.10 läuft, pinmode geändert


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int button_li = 3;   // Lichtschranke 1, links
int button_re = 4;   // Lichtschranke 2, rechts
int Motor_li = 5;    // Relais 1 zum Motor links
int Motor_re = 6;    // Relais 2 zum Motor rechts
int Relais_auf = 7;  // Relais 3 auf
int Relais_ab = 8;   // Relais 4
int Schalter_auf = 9;
int Schalter_ab = 10;
long zaehler_li;
long zaehler_re;
int zaehler_liLastState = 1;
int zaehler_reLastState = 1;

void setup() {
  pinMode(button_li, INPUT_PULLUP);
  pinMode(button_re, INPUT_PULLUP);
  digitalWrite(Relais_auf, HIGH);
  digitalWrite(Relais_ab, HIGH);
  digitalWrite(Motor_li, HIGH);
  digitalWrite(Motor_re, HIGH);
  pinMode(Motor_li, OUTPUT);    // links Relais 1 links
  pinMode(Motor_re, OUTPUT);    // rechts Relais 2 rechts
  pinMode(Relais_auf, OUTPUT);  // Relais 3 auf
  pinMode(Relais_ab, OUTPUT);   // Relais 4 ab
  pinMode(Schalter_auf, INPUT_PULLUP);
  pinMode(Schalter_ab, INPUT_PULLUP);

  zaehler_li = 500;
  zaehler_re = 500;
  zaehler_liLastState = 1;
  zaehler_reLastState = 1;
  lcd.init();
  lcd.backlight();
  lcd.clear();
}

void loop() {
  if (digitalRead(Schalter_auf) == LOW) { digitalWrite(Relais_auf, LOW); }
  if (digitalRead(Schalter_auf) == HIGH) { digitalWrite(Relais_auf, HIGH); }

  if (digitalRead(Schalter_ab) == LOW) { digitalWrite(Relais_ab, LOW); }
  if (digitalRead(Schalter_ab) == HIGH) { digitalWrite(Relais_ab, HIGH); }

  // Zählen Lichtschranke 1
  byte zaehler_liNewState = digitalRead(button_li);
  if (zaehler_liNewState == 0 && zaehler_liLastState == 1 && digitalRead(Schalter_auf)) { zaehler_li++; }
  if (zaehler_liNewState == 0 && zaehler_liLastState == 1 && digitalRead(Schalter_ab)) { zaehler_li--; }
  zaehler_liLastState = zaehler_liNewState;
  lcd.setCursor(0, 0);
  lcd.print(zaehler_li);
  lcd.setCursor(4, 0);
  lcd.print("Motor l inks");

  //Zählen Lichtschranke 2
  byte zaehler_reNewState = digitalRead(button_re);
  if (zaehler_reNewState == 0 && zaehler_reLastState == 1 && digitalRead(Schalter_auf)) { zaehler_re++; }
  if (zaehler_reNewState == 0 && zaehler_reLastState == 1 && digitalRead(Schalter_ab)) { zaehler_re--; }
  zaehler_reLastState = zaehler_reNewState;
  lcd.setCursor(0, 1);
  lcd.print(zaehler_re);
  lcd.setCursor(4, 1);
  lcd.print("Motor 2 rechts");

  // Vergleichen Lichtschrankee 1-------------------------
  if (zaehler_li > (zaehler_re + 6)) { digitalWrite(Motor_li, HIGH); }
  if (zaehler_re == zaehler_li) { digitalWrite(Motor_li, LOW); }

  // Vergleichen Lichtschranke 2 -----------
  if (zaehler_re > (zaehler_li + 6)) { digitalWrite(Motor_re, HIGH); }
  if (zaehler_re == (zaehler_li)) { digitalWrite(Motor_re, LOW); }
}

Da ändert sich aber nix

OK, habs geschnallt, sorry.

Auf den ersten Blick sehe ich kein Problem.

Da musst du schauen, ob die Signale

int Schalter_auf = 9;
int Schalter_ab = 10;

richtig kommen.

Genau, er zählt bei hoch und auch bei runter richtig. aber er soll ja vergleichen. das macht er bei hoch auch richtig. Er stoppt wenn die Differenz erreicht ist den schnelleren Motor und fährt bei Gleichstand mit beiden weiter. Bei runter stopp er bei Ungleichheit auch, aber der falsche Motor fährt weiter und der langsamere bleibt stehen. Das wäre im richtigen Betrieb ja fatal.
Die Impulse generiere ich mit 2 Rechteckgeneratoren, simuliere praktisch die Lichtschranken anden Motoren. Hab noch nicht erwähnt das alles auf einem Steckbrett aufgebaut ist. Kann ich auch Fotos hochladen?

Zählt er nicht richtig? Oder ist diese Abfrage falsch?

Diese Abfrage muss bei Herunter anders sein!

Der Ansatz ist wohl der Beste. Er zählt ja richtig in beiden Richtungen. Das Heisst wohl, ich muss die Anweisung zum Vergleichen 2 mal schreiben und trennen. Also eine komplette so wie sie jetzt ist zum hochfahren, und eine zweite zum runterfahren, wo die Motoren geändert werden müssen. Wäre das so richtig?
Also eine if, wenn schalter auf, dann die komplette Anweisung und eine neue, auch mit if wenn Schalter runter. Ich habe eben, wo er bei hoch richtig vergleicht, die Anweisung geändert und die Motoren getauscht dann gent es.

ja, das würde dann dein Problem lösen

OK, werde ich so machen. Weil es so beim umstecken der Kabel funktioniert mes einwandfrei. Vielen Dank für Deine Hilfe. Hab schon an meinem Gehirn gezweifelt. Mit 73 ist man ja nicht mehr so fit. Manchmal sieht man den Wald vor lauter Bäumen nicht. Und mein Beruf ist, oder war Baumaschinen Techniker. Da muss man recht wenig programmieren. Dank nochmal und bleib Gesund
Dieter Schmidt

Hmmm...
Du scheinst mir ein "Freund des if" zu sein.
Für mich gilt eigentlich eher das Gegenteil.

If, gut und schön. Aber keine überflüssigen, ist meine Devise .

Beispiel:

  if (digitalRead(Schalter_auf) == LOW) { digitalWrite(Relais_auf, LOW); }
  if (digitalRead(Schalter_auf) == HIGH) { digitalWrite(Relais_auf, HIGH); }

  if (digitalRead(Schalter_ab) == LOW) { digitalWrite(Relais_ab, LOW); }
  if (digitalRead(Schalter_ab) == HIGH) { digitalWrite(Relais_ab, HIGH); }

Würde bei mir zu:

digitalWrite(Relais_auf, digitalRead(Schalter_auf));
digitalWrite(Relais_ab, digitalRead(Schalter_ab)); 

Soweit ich das sehe, sollte das das selbe tun.

Vielleicht gefällt dir das ja....

Hallo,
danke für Deine Antwort. sieht einfacher aus, aber die Relais sollen erst schalten wenn einer der beiden Taster gedrückt sind.
Ungedrückt sind sie HIGH, gedrückt dann LOW.
Mit der if frage ich ab welchen Zustand die schalter oder Taster haben, mit der jeweiligen 2. if stelle sicher das der Nano den Zustand erkennt. Sonst bleiben die Pegel nämlich LOW wenn ich den Taster loslasse. Mir wäre ein kürzerer Code auch lieber. Hab aber nicht so viel Erfahrung mit C++.
Da in meinem bisherigen Sketch bei der Funktion "runter" in dem Teil "vergleichen" ein Motor nicht umschaltet, muss ich mit einem weiteren "if" das Problem lösen.

Pardon, hab nicht richtig gelesen. ich werde Deinen Vorschlag gleich mal umsetzen. Danke erst mal

Hallo Werner,
ich dachte das ich mit den unterschiedlichen Anweisungen jetzt klar komme. Aber leider ist das nicht so.
Nachdem ich die beiden Anweisungen umgeschrieben habe funktionieren beide. Aber nur einzeln, wenn ich die eine oder andere auskommentiere.
Wenn beide zusammenlaufen werden der ein oder andere Motor abgeschaltet, sodas er nicht weiterzählt.
Ich habe versucht die beiden Anweisungen für "rauf" und "runter" zu trennen. Aber leider funktioniert das nicht.
Es werden immer alles gelesen und dann gibt es halt den Fehler. Hast Du evtl. einen Vorschlag wie ich die trennen kann damit beim Taster nur der jeweilige Programmteil gelesen wird?
Grüsse
Dieter

if (rauf){
//Code für rauf
}
if (runter){
//Code für runter
}
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int button_li = 3;   // Lichtschranke 1, links
int button_re = 4;   // Lichtschranke 2, rechts
int Motor_li = 5;    // Relais 1 zum Motor links
int Motor_re = 6;    // Relais 2 zum Motor rechts
int Relais_auf = 7;  // Relais 3 auf
int Relais_ab = 8;   // Relais 4
int Schalter_auf = 9;
int Schalter_ab = 10;
long zaehler_li;
long zaehler_re;
int zaehler_liLastState = 1;
int zaehler_reLastState = 1;

void setup() {
  pinMode(button_li, INPUT_PULLUP);
  pinMode(button_re, INPUT_PULLUP);
  digitalWrite(Relais_auf, HIGH);
  digitalWrite(Relais_ab, HIGH);
  digitalWrite(Motor_li, HIGH);
  digitalWrite(Motor_re, HIGH);
  pinMode(Motor_li, OUTPUT);    // links Relais 1 links
  pinMode(Motor_re, OUTPUT);    // rechts Relais 2 rechts
  pinMode(Relais_auf, OUTPUT);  // Relais 3 auf
  pinMode(Relais_ab, OUTPUT);   // Relais 4 ab
  pinMode(Schalter_auf, INPUT_PULLUP);
  pinMode(Schalter_ab, INPUT_PULLUP);

  zaehler_li = 500;
  zaehler_re = 500;
  zaehler_liLastState = 1;
  zaehler_reLastState = 1;
  lcd.init();
  lcd.backlight();
  lcd.clear();
}

void loop() {
  if (digitalRead(Schalter_auf) == LOW) { digitalWrite(Relais_auf, LOW); }
  if (digitalRead(Schalter_auf) == HIGH) { digitalWrite(Relais_auf, HIGH); }

  if (digitalRead(Schalter_ab) == LOW) { digitalWrite(Relais_ab, LOW); }
  if (digitalRead(Schalter_ab) == HIGH) { digitalWrite(Relais_ab, HIGH); }

  // Zählen Lichtschranke 1
  byte zaehler_liNewState = digitalRead(button_li);
  if (zaehler_liNewState == 0 && zaehler_liLastState == 1 && digitalRead(Schalter_auf)) { zaehler_li++; }
  if (zaehler_liNewState == 0 && zaehler_liLastState == 1 && digitalRead(Schalter_ab)) { zaehler_li--; }
  zaehler_liLastState = zaehler_liNewState;
  lcd.setCursor(0, 0);
  lcd.print(zaehler_li);
  lcd.setCursor(4, 0);
  lcd.print("Motor l inks");

  //Zählen Lichtschranke 2
  byte zaehler_reNewState = digitalRead(button_re);
  if (zaehler_reNewState == 0 && zaehler_reLastState == 1 && digitalRead(Schalter_auf)) { zaehler_re++; }
  if (zaehler_reNewState == 0 && zaehler_reLastState == 1 && digitalRead(Schalter_ab)) { zaehler_re--; }
  zaehler_reLastState = zaehler_reNewState;
  lcd.setCursor(0, 1);
  lcd.print(zaehler_re);
  lcd.setCursor(4, 1);
  lcd.print("Motor 2 rechts");

  // Vergleichen Lichtschrankee 1-------------------------
  if (zaehler_li > (zaehler_re + 6)) { digitalWrite(Motor_li, HIGH); }
  if (zaehler_re == zaehler_li) { digitalWrite(Motor_li, LOW); }

  // Vergleichen Lichtschranke 2 -----------
  if (zaehler_re > (zaehler_li + 6)) { digitalWrite(Motor_re, HIGH); }
  if (zaehler_re == (zaehler_li)) { digitalWrite(Motor_re, LOW); }
}

Egal wohin ich diese setze, kommen Fehler

Zeige mal den ganzen Code in Code Tags