7 segment and incremental encoder

The arduino set contains a special building block, which is known from
operating panels of instruments. In former time only potentiometers were
available, for example to be used for audio settings, but when selecting
a menue a different way is ncessary. In game consoles incremental
devices are also used. The main advantage is that you get a left or
right pulse, which a CPU can use directly to get the turn direction and
position. In addition there is also a press button is integrated, for
example to select something. Our example shows a counter on the two 7
segement displays, which are incremented or decremented when turning the
knob. The devices deliver around 18 pulsed per revolution.

Code:

// 7segment Incrementalgeber
#include

// 8574T
#define i2cseg7x2alsb1 (0x40>>1)
#define i2cseg7x2amsb1 (0x42>>1)
#define i2cseg7x2blsb1 (0x44>>1)
#define i2cseg7x2bmsb1 (0x46>>1)
#define i2cseg7x2clsb1 (0x48>>1)
#define i2cseg7x2cmsb1 (0x4A>>1)
#define i2cseg7x2dlsb1 (0x4C>>1)
#define i2cseg7x2dmsb1 (0x4E>>1)

// 8574AT optional
#define i2cseg7x2alsb2 (0x70>>1)
#define i2cseg7x2amsb2 (0x72>>1)
#define i2cseg7x2blsb2 (0x74>>1)
#define i2cseg7x2bmsb2 (0x76>>1)
#define i2cseg7x2clsb2 (0x78>>1)
#define i2cseg7x2cmsb2 (0x7A>>1)
#define i2cseg7x2dlsb2 (0x7C>>1)
#define i2cseg7x2dmsb2 (0x7E>>1)

// *************************
// 01
// 20 02
// 40
// 10 04
// 08
// 80
// ************************

// UMrechnungstabelle ASCI -> 7 Segment

// OFFSET code 32..5F
const unsigned char siebensegtable[] =
{
0, // 20 Space
0x30, // 21 !
0x22, // 22 ”
0x7f, // 23 #
0, // 24 $
0, // 25 %
0, // 26 &
0x02, // 27 ‘
0x39, // 28 (
0x0f, // 29 )
0, // 2A *
0x7f, // 2B +
0x04, // 2C ,
0x40, // 2D –
0x80, // 2E .
0x30, // 2F /
0x3f, // 30 0
0x06, // 31 1
0x5b, // 32 2
0x4f, // 33 3
0x66, // 34 4
0x6d, // 35 5
0x7c, // 36 6
0x07, // 37 7
0x7f, // 38 8
0x67, // 39 9
//
0, // 3A :
0, // 3B ;
0, // 3C < 0x48, // 3D = 0, // 3E >
0, // 3F ?
0x5c, // 40 @
0x77, // 41 A
0x7c, // 42 B
0x39, // 43 C
0x5e, // 44 D
0x79, // 45 E
0x71, // 46 F
0x67, // 47 G
0x76, // 48 H
0x06, // 49 I
0x86, // 4A J
0x74, // 4B K
0x38, // 4C L
0x37, // 4D M
0x54, // 4E N
0x5c, // 4F O
0x73, // 50 P
0xbf, // 51 Q
0x50, // 52 R
0x6d, // 53 S
0x70, // 54 T
0x3e, // 55 U
0x1c, // 56 V
0x9c, // 57 W
0x24, // 58 X
0x36, // 59 Y
0x5b, // 5A Z
0x39, // 5B [
0x30, // 5C
0x0f, // 5D ]
0x08, // 5E _
0 // 5F
};

//
unsigned int get_7seg(unsigned char asciicode)
{
// Umrechnen 0..255 auf
// 7seg
// Dabei nur Zahlen und Grossbuchstaben
// 20..5F
// rest wird gemappt
asciicode = asciicode & 0x7f; // 7 bit only
if (asciicode < 0x20) return (0); if (asciicode >= 0x60) asciicode = asciicode – 0x20;
return((~siebensegtable[asciicode-0x20])&0xff);
}

void display_seg1x(unsigned char i2cbaseadr, unsigned char ch1)
{
Wire.beginTransmission(i2cbaseadr);
Wire.write(get_7seg(ch1));
Wire.endTransmission();
}

void display_seg1xbin(unsigned char i2cbaseadr, unsigned char ch1)
{
Wire.beginTransmission(i2cbaseadr);
Wire.write(ch1);
Wire.endTransmission();
}

// Code neu:
#define SWITCHA 2
#define SWITCHB 3
#define SWITCHT 4
#define PULLUP 5

void setup() {
Wire.begin();

pinMode(SWITCHA,INPUT_PULLUP);
pinMode(SWITCHB,INPUT_PULLUP);
pinMode(SWITCHT,INPUT_PULLUP);

}

void loop() {
char buffer[10];
//
static int counter = 0;
static int oldcounter = -999;
int a= digitalRead(SWITCHA);
int b= digitalRead(SWITCHB);
int state = 0;
static int oldstate = 99;
int sw = digitalRead(SWITCHT);
if (sw == LOW) counter = 0; // RESET
if (a==HIGH) {
state = 1;
} else {
state = 0;
}
if (b==HIGH) {
state += 2;
} else {
state += 0;
}
switch(state) {
case 0:
if (oldstate == 1) {
counter–;
} else if (oldstate == 2) {
counter++;
}
break;
case 1:
if (oldstate == 0) {
counter++;
} else if (oldstate == 3) {
counter–;
}

break;
case 2:
if (oldstate == 3) {
counter++;
} else if (oldstate == 0) {
counter–;
}
break;
case 3:
if (oldstate == 2) {
counter–;
} else if (oldstate == 1) {
counter++;
}
break;
}
oldstate = state;
sprintf(buffer,”%04d”,counter);
// Counter ausgeben nur bei aenderung
if (oldcounter != counter) {
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;
}
}

Leave a Reply

Your email address will not be published. Required fields are marked *