User manual

73 74
9.3 Incrementalgeber und Siebensegement-Anzeigen zur Ausgabe
Hier eine besonders komfortable Art, die Werte des Zählerstands auszugeben. Es werden einfach die Sieben-
segment-Anzeigen dazu verwendet. Dann brauchen wir auch die Konsolen-Ausgabe nicht mehr. Der Zähl-
vorgang wird wie vorher über das Statesystem durchgeführt. Aber die Ausgabe erfolgt nun auf den beiden
Siebensegment-Anzeigen. Achtung, der Code ist sehr umfangreich, daher haben wir den allgemeinen Teil mit
der Bibliothek hier weggelassen, im Anhang ist er zu nden.
Eine Besonderheit ist die Verwendung von „oldcounter“. Die Ausgabe auf der Siebensegment-Anzeige wird
nur dann durchgeführt, wenn sich der Zählerstand ändert. Damit wird erreicht, dass keine unnötigen Ausgaben
erfolgen die Rechenzeit brauchen, da die Abfrage der AB Kontakte zeitkritisch ist. Bei schnellen Drehbewe-
gungen kann das Programm unter Umständen den Änderungen nicht mehr folgen, da es bei der Abfrage zu
langsam ist und Änderungen übersieht. Die Taste hat noch eine Zusatzfunktion, damit läßt sich der Zäherstand
auf 0 setzen.
+
-
9V
1A
Downsi de
UP
C 7-Segment-LED
SCL
SDA
SCL
SDA
+9V
Adr:40,44,48,4C
PCF8574 T
+9V
C 7-Segment-LED
SCL
SDA
SCL
SDA
+9V
Adr:40,44,48,4C
PCF8574 T
+9V
SCLS DA
+9V
A0
A1
Tx
Rx
PD2
SCLKMOSI
PD3
PD 6
PD 4
PD 5
PD 7
A7
A3
A2
A6
NANO
to
Br ick`R`
3,3V 5V
USB
B0
SS
MISC
B1
C
// DE_26 7segment Incrementalgeber mit
Wertausgabe auf 7Segment
#include <Wire.h>
... wie gehabt bei der 7-Segmentanzei-
ge...
// Code neu:
#dene SWITCHA 2 // A
#dene SWITCHB 3 // B
#dene SWITCHT 4 // Taste
#dene PULLUP 5 // Extra
void setup() {
Wire.begin(); // i2C Init
pinMode(SWITCHA,INPUT_PULLUP);
pinMode(SWITCHB,INPUT_PULLUP);
pinMode(SWITCHT,INPUT_PULLUP);
}
void loop() { // Schleife
char buffer[10]; // Ascii fuer 7Seg
static int counter = 0; // Zaehler-
stand
static int oldcounter = -999; // al-
ter Zaehler
int a= digitalRead(SWITCHA); // A le-
sen
int b= digitalRead(SWITCHB); // B le-
sen
int state = 0; // State merker
static int oldstate = 99; // alter
State
int sw = digitalRead(SWITCHT); //
Taste
if (sw == LOW) counter = 0; // RESET
damit !
if (a==HIGH) { // state denieren
state = 1;
} else {
state = 0;
}
if (b==HIGH) { // auch fuer B
state += 2;
} else {
state += 0;
}
switch(state) { // Statediagramm
case 0: // wie vorher abarbeiten 00
if (oldstate == 1) {
counter--;
} else if (oldstate == 2) {
counter++;
}
break;
case 1: // AB = 10
if (oldstate == 0) {
counter++;
} else if (oldstate == 3) {
counter--;
}
break;
case 2: // AB = 01
if (oldstate == 3) {
counter++;
} else if (oldstate == 0) {
counter--;
}
break;
case 3: // AB = 11
if (oldstate == 2) {
counter--;
} else if (oldstate == 1) {
counter++;
}
break;
}
oldstate = state; // und wieder merken
sprintf(buffer,“%04d“,counter); // in ASCII
// Counter ausgeben nur bei Aenderung
if (oldcounter != counter) { // nur wenn
neuer Wert da
display_seg1x(i2cseg7x2bmsb1,buffer[0]);
// msb zeichen/ LINKE Anzeige
display_seg1x(i2cseg7x2blsb1,buffer[1]);
// ..
display_seg1x(i2cseg7x2amsb1,buffer[2]);
display_seg1x(i2cseg7x2alsb1,buffer[3]);
// lsb zeichen
oldcounter = counter; // als Merker wich-
tig
}
}
Was passiert? Hier wird der Zählerstand auf der
7-Segment-Anzeige ausgegeben. Dieser wird je
nach Drehrichtung erhöht oder verringert.
A
B
Enter
10 k
Incremental
Encoder