Go Down

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

Acki1985

Dec 31, 2018, 12:46 pm Last Edit: Feb 10, 2019, 12:03 pm by Acki1985
Hallo alle zusammen,

ich spiele gerade mal ein wenig mit dem Drehencoder. Ziel ist es mir Werte von 0-23 auf dem Display anzeigen zu lassen. Das funktioniert auch schon ganz gut. Nur habe ich ein Problem:

Wenn ich den Arduino starte und dann am Encoder drehe, geht dieser Wert zuerst nur bis 15. Wenn ich einmal die 15 erreicht habe dann geht er komischerweise bis Wert 23. Drehe ich ihn dann wieder auf 0 zurück, springt er nach Wert 0 wieder auf Wert 15 und nicht auf Wert 23.

Habt ihr ne Idee woran das liegen könnte?

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int messungPin1 = LOW;
int messungPin1Alt = LOW;
int encoderWertA = 0;
byte encoderWert = 0;

 void setup() {
 pinMode(10, INPUT);
 pinMode(11, INPUT);
 Serial.begin(9600);
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Encoder");
 lcd.setCursor(0, 1);
 lcd.print("Test");
 delay (2000);
 lcd.clear();
 
 }

 void loop() {
 messungPin1 = digitalRead(10);
 if ((messungPin1 == HIGH) && (messungPin1Alt == LOW)) {
 if (digitalRead(11) == HIGH) {
 encoderWertA = (encoderWert++)%24;
 } else {
 encoderWertA =(encoderWert--)%24;
 }
 Serial.println (encoderWertA);
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Wert");
 lcd.setCursor(0, 1);
 lcd.print(encoderWertA);
 
 }
 messungPin1Alt = messungPin1;
 }

postmaster-ino

#1
Dec 31, 2018, 12:56 pm Last Edit: Feb 10, 2019, 01:37 pm by postmaster-ino
Hi

Du lässt zwar encoderWertA auf 23 begrenzen, aber Deine eigentliche Zähl-Variable encoderWert zählt 25 ... 26 ... 27 ...
Oder 1 ... 0 ... -1 ... -2 ...

MfG

*Edit*
Der RF24 kam erst bei Post 120 dazu - Link:#120.
Dort klappt die Drehbühne anscheinend bereits, wie hier zu Beginn angedacht.
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

Hi,

Danke für den Hinweis, aber wie könnte ich das ändern?

michael_x

#3
Dec 31, 2018, 01:01 pm Last Edit: Dec 31, 2018, 01:18 pm by michael_x
byte encoderWert = 0xff; // -1 ( eins weniger als 0 ) == 255
int encoderWertA = encoderWert %24;  // 255 % 24 =15

encoderWertA braucht man nicht:
Code: [Select]
if (digitalRead(11) == HIGH) {
 if (encoderWert < 23) encoderWert++ ;
} else {
 if (encoderWert > 0) encoderWert-- ;
}
mit Begrenzung auf 0 .. 23

postmaster-ino

Hi
Danke für den Hinweis, aber wie könnte ich das ändern?
Indem Du den begrenzten encoderWertA auf Deinen encoderWert kopierst.

encoderWert=encoderWertA;

Sollte 'tun'.

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 ...

uwefed

#5
Dec 31, 2018, 01:13 pm Last Edit: Dec 31, 2018, 01:13 pm by uwefed
andere Fallstricke:

Hast Du Pullup/Pulldown Widerstände an den Pins 10 und 11?
Vieleicht solltest Du ein delay(10); nach if ((messungPin1 == HIGH) && (messungPin1Alt == LOW)) {" einfügen um den Kontakt zu entprellen.

Grüße Uwe

Acki1985

Hi,

es sind Pullup Wiederstände eingebaut. Das es am Prellen liegt kann ich mir eigentlich nicht vorstellen. Es geht ja nur beim ersten mal drehen bis Wert 15 und dann von 0 bis 23.


Acki1985

HiIndem Du den begrenzten encoderWertA auf Deinen encoderWert kopierst.

encoderWert=encoderWertA;

Sollte 'tun'.

MfG
Wenn ich das mache erhalte ich immer Wert 0.

Rentner

Wenn ich das mache erhalte ich immer Wert 0.
Hallo,

die Lösung von Michael in #3 hast Du gesehen , die wäre auch mein Vorschlag gewesen.

Heinz

postmaster-ino

Hi
Wenn ich das mache erhalte ich immer Wert 0.
Kommt drauf an, WO Du Das machst.
Aber kein Problem, in Salami-Taktik bin ich lernfähig.
Dein Problem: Dein Tempo

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

Wenn ich das so wie in #3 mache, ist der Startwert 255. Diesen muss ich dann auf 0 runter regeln. Danach geht der Wert von 0 bis 23 und von 23 bis 0.

Code: [Select]

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int messungPin1 = LOW;
int messungPin1Alt = LOW;
byte encoderWert = 0xff; // -1 ( eins weniger als 0 ) == 255
int encoderWertA = encoderWert %24;  // 255 % 24 =15


 void setup() {
 pinMode(10, INPUT);
 pinMode(11, INPUT);
 Serial.begin(9600);
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Encoder");
 lcd.setCursor(0, 1);
 lcd.print("Test");
 delay (2000);
 lcd.clear();
 
 }

 void loop() {
 messungPin1 = digitalRead(10);
 if ((messungPin1 == HIGH) && (messungPin1Alt == LOW)) {
 if (digitalRead(11) == HIGH) {
 if (encoderWert < 23) encoderWert++ ;
} else {
 if (encoderWert > 0) encoderWert-- ;

  }
 Serial.println (encoderWertA);
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Wert");
 lcd.setCursor(0, 1);
 lcd.print(encoderWert);
 
 }
 
 messungPin1Alt = messungPin1;
 }

Acki1985

#11
Dec 31, 2018, 02:38 pm Last Edit: Dec 31, 2018, 04:04 pm by Acki1985
Hab es rausbekommen. Liegt an dem Variablentyp Byte. Der kann ja nur psitive Zahlen. Wenn ich da eine negative Zahl eingebe, ist der Startwert = 255. Gebe ich da 0 ein Startet er bei 1. Muss dann aber auch null runteregeln bevor ich den Wertebereich 0 bis 23 nutzen kann.

Hat da noch wer ne Idee?

Acki1985

Hab es hinbekommen :-)

Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int messungPin1 = HIGH;
int messungPin1Alt = HIGH;
byte encoderWert = 0; // -1 ( eins weniger als 0 ) == 255
int encoderWertA = encoderWert %24;  // 255 % 24 =15
int 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

unsigned long encoderDruckzeit;       // Zeit wann der Encodertaster betätigt wurde
unsigned long entprellZeit = 200;     // Zeit die nach der betätigung eines Tasters gewartet wird


 void setup() {
 pinMode(10, INPUT);
 pinMode(11, INPUT);
 pinMode(12, INPUT);
 Serial.begin(9600);
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Encoder");
 lcd.setCursor(0, 1);
 lcd.print("Test");
 delay (2000);
 lcd.clear();
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Wert");
 lcd.setCursor(0, 1);
 lcd.print(encoderWert);
 }

 void loop() {
 
 messungPin1 = digitalRead(10);
 if ((messungPin1 == LOW) && (messungPin1Alt == HIGH)) {
 if (digitalRead(11) == HIGH) {
 if (encoderWert < 23) encoderWert++ ;
} else {
 if (encoderWert > 0) encoderWert-- ;

  }
 
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print("Wert");
 lcd.setCursor(0, 1);
 lcd.print(encoderWert);
 
 }

 {
  encoderTaster = digitalRead(12);
  if (encoderTaster == LOW)
  {
    encoderDruckzeit = millis();
    encoderGedrueckt = 1;
  }

  if ((millis() - encoderDruckzeit > entprellZeit) && encoderGedrueckt ==1) {
   
   
    wertSpeichern = encoderWert;
    Serial.println(wertSpeichern);
    encoderGedrueckt=0;
  }


 
 }
 
 messungPin1Alt = messungPin1;

 
  }
 
 

uwefed

Es kommt darauf an was man will.

Code: [Select]
if (digitalRead(11) == HIGH) {
 if (encoderWert < 23) encoderWert++ ;
} else {
 if (encoderWert > 0) encoderWert-- ;
}

bringt Dir Werte zwischen 0 und 23

wenn man nach der 23 die null kommen soll dann muß man es anders machen
Grüße Uwe

postmaster-ino

Hi
Code: [Select]

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Hier wäre Es übersichtlicher, wenn man den
                                     //Zahlen sprechende Namen geben würde, um ein
                                     //Anpassen an andere Pins einfacher zu gestallten
int messungPin1 = HIGH;
int messungPin1Alt = HIGH;
byte encoderWert = 0; // -1 ( eins weniger als 0 ) == 255
//int encoderWertA = encoderWert % 24; // 255 % 24 =15  //Wird im Sketch nicht benutzt - wohl nicht angemeckert, da eine Zuweisung stattfindet
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
byte encoderGedrueckt = 0;              // Statusspeicher ob Encodertaster betätigt wurde
byte encoderTaster = HIGH;             // Taster im Encoder
unsigned long encoderDruckzeit;       // Zeit wann der Encodertaster betätigt wurde
unsigned long entprellZeit = 200;     // Zeit die nach der betätigung eines Tasters gewartet wird

void setup() {
  pinMode(encoderPinA, INPUT);
  pinMode(encoderPinB, INPUT);
  pinMode(tasterEnter, INPUT);
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Encoder");
  lcd.setCursor(0, 1);
  lcd.print("Test");
  delay (2000);
  lcd.clear();
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Wert");
  lcd.setCursor(0, 1);
  lcd.print(encoderWert);
}

void loop() {
  messungPin1 = digitalRead(encoderPinA);
  if ((messungPin1 == LOW) && (messungPin1Alt == HIGH)) {
    if (digitalRead(encoderPinB) == HIGH) {
      if (encoderWert < 23) encoderWert++ ;
    } else {
      if (encoderWert > 0) 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;
    }
  }  // <-- ???
  messungPin1Alt = messungPin1;
}

Compiliert ohne Wqarnungen.
Ich habe mir gestattet, die Pins außerhalb einzustellen und im Code die 'magic numbers' durch sprechende Namen zu ersetzen.
Da sich die Pinzuweisungen wohl während der Laufzeit nicht mehr ändern, sind Diese als const deklariert - der Compiler kann Diese somit fest im Code verbauen - wenn Er mag.
Entfernen unnötiger Leerzeilen und ein STRG+T brachten bessere Lesbarkeit.
Woher hast Du die Klammerung innerhalb loop()? Von mir mit // <-- ?? gekennzeichnet?
Diese Klammerung sollte - überhaupt Nichts - bewirken (lasse mich Da gerne korrigieren)

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 ...

Go Up