OK ... I spend over one hour with code analysis and found weir behaviour. I thought it is a problem of reading on serial but I was wrong. I try to describe it:
- Turn ON an Arduino with 4 digit 7 segment display. It will show 9999 on 7segment display. All looks good at this moment.
- Open Arduino Serial Monitor to see if data is sending correctly. BUT from this moment, when I close Serial Montor, 7segment display start to flickering (switching digits with slow frequency).
- Re-open Serial Monitor remove flickering to normal.
... so, after Arduino start is all in normal. First open of Serial Monitor will "crash" something in Arduino and it starts to behave weirdly!
Please take a look on AKTUALNI_DIGIT. This variable will rotate from 4 to 1 and represent which 7segment digit will be ON at one loop cycle. If I place line "AKTUALNI_DIGIT = 1" before "switch (AKTUALNI_DIGIT) {", flickering never happen...
Maybe I have a mistake in a code but I not see where. Any idea?
Thanks!
Code:
int SENZOR = 1;
int AKTUALNI_DIGIT = 4;
int HODNOTA = 9999;
const byte SEG_D1 = A4;
const byte SEG_C = A3;
const byte SEG_D2 = A2;
const byte SEG_B = A1;
const byte SEG_D = A0;
const byte SEG_DP = 13;
const byte SEG_E = 5;
const byte SEG_F = 10;
const byte SEG_G = 9;
const byte SEG_D3 = 8;
const byte SEG_A = 6;
const byte SEG_D4 = 12;
void setup() {
Serial.begin(115200);
delay(1000);
pinMode(SEG_D1, OUTPUT);
pinMode(SEG_C, OUTPUT);
pinMode(SEG_D2, OUTPUT);
pinMode(SEG_B, OUTPUT);
pinMode(SEG_D, OUTPUT);
pinMode(SEG_DP, OUTPUT);
pinMode(SEG_E, OUTPUT);
pinMode(SEG_F, OUTPUT);
pinMode(SEG_G, OUTPUT);
pinMode(SEG_D3, OUTPUT);
pinMode(SEG_A, OUTPUT);
pinMode(SEG_D4, OUTPUT);
}
void loop() {
Nastav_7segment(HODNOTA);
Serial.print(SENZOR);
Serial.print("R=");
Serial.print(HODNOTA);
Serial.print(";");
delay(1);
}
void Nastav_7segment(int HODNOTA) {
// zobrazení hodnot 7segmentu
if (HODNOTA < 0) {
HODNOTA = 0;
} else if (HODNOTA > 9999) {
HODNOTA = 9999;
}
// separace jednotlivých znaků
int DIGIT = 0;
int DIGIT_1 = HODNOTA / 1000;
int DIGIT_2 = (HODNOTA - (DIGIT_1 * 1000)) / 100;
int DIGIT_3 = (HODNOTA - (DIGIT_1 * 1000 + DIGIT_2 * 100)) / 10;
int DIGIT_4 = HODNOTA % 10;
// zhasnutí všech segmentů
digitalWrite(SEG_D1, HIGH);
digitalWrite(SEG_D2, HIGH);
digitalWrite(SEG_D3, HIGH);
digitalWrite(SEG_D4, HIGH);
// cyklování znaků 7segmentu
switch (AKTUALNI_DIGIT) {
case 1:
if (HODNOTA > 999) {
DIGIT = DIGIT_1;
digitalWrite(SEG_D1, LOW);
}
AKTUALNI_DIGIT = 4;
break;
case 2:
if (HODNOTA > 99) {
DIGIT = DIGIT_2;
digitalWrite(SEG_D2, LOW);
}
AKTUALNI_DIGIT = 1;
break;
case 3:
if (HODNOTA > 9) {
DIGIT = DIGIT_3;
digitalWrite(SEG_D3, LOW);
}
AKTUALNI_DIGIT = 2;
break;
case 4:
if (HODNOTA >= 0) {
DIGIT = DIGIT_4;
digitalWrite(SEG_D4, LOW);
}
AKTUALNI_DIGIT = 3;
break;
}
// rozsvícení daného znaku
switch (DIGIT) {
case 0:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, LOW);
digitalWrite(SEG_DP, LOW);
break;
case 1:
digitalWrite(SEG_A, LOW);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, LOW);
digitalWrite(SEG_DP, LOW);
break;
case 2:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, LOW);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_DP, LOW);
break;
case 3:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_DP, LOW);
break;
case 4:
digitalWrite(SEG_A, LOW);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_DP, LOW);
break;
case 5:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_DP, LOW);
break;
case 6:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_DP, LOW);
break;
case 7:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, LOW);
digitalWrite(SEG_DP, LOW);
break;
case 8:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, HIGH);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_DP, LOW);
break;
case 9:
digitalWrite(SEG_A, HIGH);
digitalWrite(SEG_B, HIGH);
digitalWrite(SEG_C, HIGH);
digitalWrite(SEG_D, HIGH);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, HIGH);
digitalWrite(SEG_G, HIGH);
digitalWrite(SEG_DP, LOW);
break;
default:
digitalWrite(SEG_A, LOW);
digitalWrite(SEG_B, LOW);
digitalWrite(SEG_C, LOW);
digitalWrite(SEG_D, LOW);
digitalWrite(SEG_E, LOW);
digitalWrite(SEG_F, LOW);
digitalWrite(SEG_G, LOW);
digitalWrite(SEG_DP, LOW);
break;
}
}