Gerd50:
Es ist noch das, wie in #15.
Das andere mit den sehr dunklen 7-Segmentanzeigen auch noch wie oben beschrieben. Div. Änderungen brachten nix, so dass ich diese wieder verworfen habe.
Ich glaube, du meinst #13 (denn der Code von #15 hat nichts mit einer Siebensegmentanzeige zu tun).
In der Tat, wenn ich den Code von #13 verwende, dann ist auch bei mir die Einerstelle der vierstelligen Siebensegmentanzeige deutlich heller als die anderen:

Es wurde ja schon erklärt, warum es dazu kommt: Durch Verzögerungen (z.B. durch delay() oder langsame serielle Ausgaben) leuchtet eine Stelle länger (=heller) als die anderen.
Wenn ich aber die seriellen Ausgaben entferne (und damit die Verzögerungen so gering wie möglich halte) wie bei diesem leicht geänderten Code:
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
#define Pot1 0
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1, 0xF2, 0xF4, 0xF8};
void setup () {
Serial.begin(9600);
/* Set DIO pins to outputs */
pinMode(LATCH_DIO, OUTPUT);
pinMode(CLK_DIO, OUTPUT);
pinMode(DATA_DIO, OUTPUT);
}
/* Main program */
void loop() {
int PotValue;
PotValue = analogRead(Pot1);
// Serial.print("Potentiometer: "); // serielle Ausgaben verzögen - weg damit
// Serial.println(PotValue); // serielle Ausgaben verzögen - weg damit
/* Update the display with the current counter value */
WriteNumberToSegment(0 , PotValue / 1000);
WriteNumberToSegment(1 , (PotValue / 100) % 10);
WriteNumberToSegment(2 , (PotValue / 10) % 10);
WriteNumberToSegment(3 , PotValue % 10);
}
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value) {
digitalWrite(LATCH_DIO, LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO, HIGH);
}
...dann sieht es bei mir so aus und alle vier Stellen leuchten ziemlich gleich hell:

Variante 2:
Wenn ich die "Geschwindigkeit" der seriellen Ausgabe deutlich vergrößere, wie in diesem, auch nur wenig veränderten Code, auch dann leuchten alle 4 Stellen annähernd gleich hell - zumindest ist das bei mir so:
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
#define Pot1 0
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1, 0xF2, 0xF4, 0xF8};
void setup () {
Serial.begin(500000); // schnellere Ausgabe --> weniger Verzögerung
/* Set DIO pins to outputs */
pinMode(LATCH_DIO, OUTPUT);
pinMode(CLK_DIO, OUTPUT);
pinMode(DATA_DIO, OUTPUT);
}
/* Main program */
void loop() {
int PotValue;
PotValue = analogRead(Pot1);
Serial.print("Pot: ");
Serial.println(PotValue);
/* Update the display with the current counter value */
WriteNumberToSegment(0 , PotValue / 1000);
WriteNumberToSegment(1 , (PotValue / 100) % 10);
WriteNumberToSegment(2 , (PotValue / 10) % 10);
WriteNumberToSegment(3 , PotValue % 10);
}
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value) {
digitalWrite(LATCH_DIO, LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO, HIGH);
}