- Sets
  7 segment and incremental encoderThe 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 5void 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;
 }
 }
 
			 en
en de
de fr
fr