Mit diesem soll es möglich sein, in einem Menü zu scrollen und Werte zu veränder.
Ich habe jetzt schon alles mögliche im Netz gesucht, aber nichts brauchbares gefunden. Gibt es dafür eine fertige Libary? Oder kann mir jemand sagen wie ich vorgehen muss.
Hihi,
hab jetzt nicht allzu genau in das Datenblatt geschaut, aber in der Regel ist´s rlativ einfach.
Beide Schalter haben einen gemeinsamen Anschluss, beim nach links drehen schließt/öffnet dann zuerst z.B. Schalter 1 und anschließend Schalter 2. Dreht man nach rechts ist´s genau anders rum.
Wie es bei dir genau ist musst mal Datenblatt nachschauen bzw. nachmessen.
Eine Libary wird´s dafür wohl eher nicht geben, das wäre mit Kanonen auf Spatzen schießen.
#include <Bounce.h>
#define encoder0PinA 2
#define encoder0PinB 3
Bounce bouncerA = Bounce (encoder0PinA, 2);
Bounce bouncerB = Bounce (encoder0PinB, 2);
int valueA;
int valueB;
volatile unsigned int encoder0Pos = 0;
void setup() {
pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);
// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, doEncoderB, CHANGE);
Serial.begin (9600);
}
void loop()
{
}
void doEncoderA(){
bouncerA.update();
bouncerB.update();
valueA = bouncerA.read();
valueB = bouncerB.read();
// look for a low-to-high on channel A
if (digitalRead(valueA) == HIGH) {
// check channel B to see which way encoder is turning
if (digitalRead(valueB) == LOW) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
else // must be a high-to-low edge on channel A
{
// check channel B to see which way encoder is turning
if (digitalRead(valueB) == HIGH) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
Serial.println (encoder0Pos, DEC);
// use for debugging - remember to comment out
}
void doEncoderB(){
// look for a low-to-high on channel B
if (digitalRead(valueB) == HIGH) {
// check channel A to see which way encoder is turning
if (digitalRead(valueA) == HIGH) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
// Look for a high-to-low on channel B
else {
// check channel B to see which way encoder is turning
if (digitalRead(valueA) == LOW) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
}
Ich habe es mal mit der Bounce libary versucht, aber die verstehe ich nicht richtig. Jetzt zählt er nur noch quatsch.
#define encoder0PinA 2
#define encoder0PinB 3
volatile unsigned int encoder0Pos = 0;
void setup() {
pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);
// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, doEncoderB, CHANGE);
Serial.begin (9600);
}
void loop(){ //Do stuff here }
void doEncoderA(){
// look for a low-to-high on channel A
if (digitalRead(encoder0PinA) == HIGH) {
// check channel B to see which way encoder is turning
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
else // must be a high-to-low edge on channel A
{
// check channel B to see which way encoder is turning
if (digitalRead(encoder0PinB) == HIGH) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
Serial.println (encoder0Pos, DEC);
// use for debugging - remember to comment out
}
void doEncoderB(){
// look for a low-to-high on channel B
if (digitalRead(encoder0PinB) == HIGH) {
// check channel A to see which way encoder is turning
if (digitalRead(encoder0PinA) == HIGH) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
// Look for a high-to-low on channel B
else {
// check channel B to see which way encoder is turning
if (digitalRead(encoder0PinA) == LOW) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
}
Das ist der Orginal Code, der nicht richtig zählt.
Ich kann mir ehrlich gesagt nicht vorstellen, dass eine Interrupt-Lösung vernünftig mit softwareseitigem debouncen funktionieren kann. Der Interrupt ist doch dafür da, dass wirklich alle Impulse registriert werden, es wird dann unmittelbar die Interruproutine aufgerufen. Jedes Kontaktprellen wird also registriert, daher muss dieses schon vorher ausgeschlossen werden, geht also nicht softwareseitig.
Also das "==HIGH", bzw. "==LOW" muss aus der Klammer des digitalRead() raus, da sonst immer erst der innere Teil "A==HIGH" ausgewertet wird und das Ergebnis davon dann als Wert für digitalRead() verwendet wird. Intern werden "true" und "false" als "0" und "1" dargestellt. Damit machst du dann immer ein digitalRead(0) oder digitalRead(1), je nachdem welchen Wert A und B gerade haben. Du wirst aber NIE von Pin5 und Pin 6 lesen, sondern immer nur von Pin0 und Pin1.
Mario.
Ich dachte, du schließt den Spaß nach dem Datenblatt an, da sind die Pullups doch auch dargestellt. Hab auch nur auf das Datenblatt Bezug nehmen wollen.