Counter-up program (7-segment displays)

Arduino specifieke Software
Berichten: 8
Geregistreerd: 11 Mrt 2018, 16:16

Counter-up program (7-segment displays)

Berichtdoor Peeters » 12 Mrt 2018, 22:25

Hallo,
Ik ben bezig met een project. Het doel is om 4 x 7 segment displays te laten multiplexen, dit lukt. 2 displays moeten van 1-99 kunnen tellen en de andere 2 ook zodat ik eigenlijk 2 tellers heb. Ik heb een programma gevonden om de 4 displays te laten tellen van 1-9999 en hier gebruik ik dus de 4 displays. Ik wil het programma veranderen zodat 2 displays apart kunnen optellen van de andere 2 displays maar ik zit wat vast. Weet iemand hoe dit moet? Alvast bedankt

Ik gebruik arduino voor te programmeren, de volledige code:

#define G 22
#define F 23
#define A 24
#define B 25
#define E 26
#define D 27
#define C 28
#define DP 29

// Commonn cathodes control
#define GND1 52
#define GND2 53
#define GND3 50
#define GND4 51

int timer=0;

int i=0;
// functions to display digits

void digit0 () {
// for 0 needed to turn ON F A B C D E segments, so:

digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);

//////////////////////// G segment should be turn OFF
digitalWrite(G, LOW);

};

void digit1 () {

digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
};

void digit2 () {

digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
};

void digit3 () {

digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
};

void digit4 () {

digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};

void digit5 () {

digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};

void digit6 () {

digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};

void digit7 () {

digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
};

void digit8 () {

digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);

};

void digit9 () {

digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);

};

//function to display digit from inputed int

void showdigit (int digit)

{

switch (digit) {

case 0:
digit0 ();
break;

case 1:
digit1 ();
break;

case 2:
digit2 ();
break;

case 3:
digit3 ();
break;

case 4:
digit4 ();
break;

case 5:
digit5 ();
break;

case 6:
digit6 ();
break;

case 7:
digit7 ();
break;

case 8:
digit8 ();
break;

case 9:
digit9 ();
break;

default:

break;

};

};

// showing 4 digits
void showdigits (int number)
{

// e.g. we have "1234"
showdigit(number/1000); // segments are set to display "1"
digitalWrite(GND1, HIGH); // first digit on,
digitalWrite(GND2, LOW); // other off
digitalWrite(GND3, LOW);
digitalWrite(GND4, LOW);

delay (1);

number = number%1000; // remainder of 1234/1000 is 234
digitalWrite(GND1, LOW); // first digit is off
showdigit(number/100); //// segments are set to display "2"
digitalWrite(GND2, HIGH); // second digit is on
delay (1); // and so on....

number =number%100;
digitalWrite(GND2, LOW);
showdigit(number/10);
digitalWrite(GND3, HIGH);
delay (1);

number =number%10;
digitalWrite(GND3, LOW);
showdigit(number);
digitalWrite(GND4, HIGH);
delay (1);

};

void setup()

{

pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);

pinMode(GND1, OUTPUT);
pinMode(GND2, OUTPUT);
pinMode(GND3, OUTPUT);
pinMode(GND4, OUTPUT);

};
void loop ()

{
timer++;

showdigits (i);

if (timer==10) {

timer=0;

i++;

if (i>10000) {i=0;};

if (i%2) { digitalWrite(DP, HIGH); }

else {digitalWrite(DP, LOW); };

};

};

Advertisement

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Counter-up program (7-segment displays)

Berichtdoor baco1978 » 13 Mrt 2018, 01:43

je gebruikt nu voor het hele display "number" om de getallen weer te geven

je zult dit op moeten splitsen.

als je digits ABCD zijn, gebruik je numberAB voor de eerste 2 en numberCD voor de laatste 2
Met vriendelijke groet Arjan

Berichten: 8
Geregistreerd: 11 Mrt 2018, 16:16

Re: Counter-up program (7-segment displays)

Berichtdoor Peeters » 13 Mrt 2018, 23:11

Hartelijk dank voor uw antwoord, heb dit geprobeerd en het apart aansturen werkt. Alleen het apart optellen lukt niet goed, ik zou iets moeten veranderen in bijgevoegde code. Welke delen van dit stuk code heb ik nodig om 2 displays van 1-99 te laten tellen? Heb al verschillende dingen geprobeerd maar mijn displays tellen niet op. Alvast bedankt.

Code:

void showdigits (int number)
{

// e.g. we have "1234"
showdigit(number/1000); // segments are set to display "1"
digitalWrite(GND1, HIGH); // first digit on,
digitalWrite(GND2, LOW); // other off
digitalWrite(GND3, LOW);
digitalWrite(GND4, LOW);

delay (1);

number = number%1000; // remainder of 1234/1000 is 234
digitalWrite(GND1, LOW); // first digit is off
showdigit(number/100); //// segments are set to display "2"
digitalWrite(GND2, HIGH); // second digit is on
delay (1); // and so on....

number =number%100;
digitalWrite(GND2, LOW);
showdigit(number/10);
digitalWrite(GND3, HIGH);
delay (1);

number =number%10;
digitalWrite(GND3, LOW);
showdigit(number);
digitalWrite(GND4, HIGH);
delay (1);

};

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Counter-up program (7-segment displays)

Berichtdoor shooter » 14 Mrt 2018, 11:01

haal alle delays weg, en vervang deze door een timers, verder kun je het beste je i ophogen op een timer, nu is het afhankelijk van allerlei delays.
dus heel vaak die showdigits aanroepen en af en toe de i veranderen jouw timer ook vervangen door een tijd met millis()
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Counter-up program (7-segment displays)

Berichtdoor baco1978 » 14 Mrt 2018, 11:07

Het is niet alleen dat stukje code wat je aan moet passen.

Je wil 2 nummers weergeven op je display, dat houd in dat je 2 variabelen nodig hebt.
Op dit moment gebruik je alleen variable number .

als je voor de ene helft van het display number gebruikt en de andere helft gebruik je bijvoorbeeld number2

en dan ben je er nog niet natuurlijk voor number2 moet je dan natuurlijk ook een gedeelte maken die er voor zorgt dat die ook apart wordt opgeteld (of welke andere bewerking met dit getal wil laten doen).




Dan kunnen we weer verder kijken
Met vriendelijke groet Arjan

Berichten: 8
Geregistreerd: 11 Mrt 2018, 16:16

Re: Counter-up program (7-segment displays)

Berichtdoor Peeters » 14 Mrt 2018, 21:37

Dank aan beide voor het antwoord, het werkt bijna perfect. De displays tellen apart op maar soms lichten de foute delen van mijn display even op (bv. a ipv c) maar deze branden dan niet zo fel. Weet iemand hoe ik dit kan wegwerken? Alvast bedankt.

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Counter-up program (7-segment displays)

Berichtdoor baco1978 » 14 Mrt 2018, 23:11

Kijk dat is fijn om te horen dat je het voor elkaar hebt gekregen

kan je je volledige code hier plaatsen.

dan kunnen we je misschien wijzen wat misschien een oorzaak kan zijn
Met vriendelijke groet Arjan

Berichten: 8
Geregistreerd: 11 Mrt 2018, 16:16

Re: Counter-up program (7-segment displays)

Berichtdoor Peeters » 15 Mrt 2018, 19:32

Hier is de volledige code:

#define G 8
#define Z 7
#define A 2
#define B 3
#define E 6
#define D 5
#define C 4
#define DP 29

// Commonn cathodes control
#define GND1 13
#define GND2 12
#define GND3 11
#define GND4 10

int timer=0;

int i=0;
// functions to display digits

void digit0 () {
// for 0 needed to turn ON F A B C D E segments, so:

digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(Z, HIGH);

//////////////////////// G segment should be turn OFF
digitalWrite(G, LOW);

};

void digit1 () {

digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(Z, LOW);
digitalWrite(G, LOW);
};

void digit2 () {

digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(Z, LOW);
digitalWrite(G, HIGH);
};

void digit3 () {

digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(Z, LOW);
digitalWrite(G, HIGH);
};

void digit4 () {

digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(Z, HIGH);
digitalWrite(G, HIGH);
};

void digit5 () {

digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(Z, HIGH);
digitalWrite(G, HIGH);
};

void digit6 () {

digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(Z, HIGH);
digitalWrite(G, HIGH);
};

void digit7 () {

digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(Z, LOW);
digitalWrite(G, LOW);
};

void digit8 () {

digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(Z, HIGH);
digitalWrite(G, HIGH);

};

void digit9 () {

digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(Z, HIGH);
digitalWrite(G, HIGH);

};

//function to display digit from inputed int

void showdigit (int digit)

{

switch (digit) {

case 0:
digit0 ();
break;

case 1:
digit1 ();
break;

case 2:
digit2 ();
break;

case 3:
digit3 ();
break;

case 4:
digit4 ();
break;

case 5:
digit5 ();
break;

case 6:
digit6 ();
break;

case 7:
digit7 ();
break;

case 8:
digit8 ();
break;

case 9:
digit9 ();
break;

default:

break;

};

};

// showing 4 digits
void showdigits (int AB) // GND1 & GND2
{

// e.g. we have "1234"
showdigit(AB/10); // segments are set to display "1"
digitalWrite(GND1, HIGH); // first digit on,
digitalWrite(GND2, LOW); // other off
//digitalWrite(GND3, LOW);
//digitalWrite(GND4, LOW);

delay (10);

AB = AB%10; // remainder of 1234/1000 is 234
digitalWrite(GND1, LOW); // first digit is off
showdigit(AB); //// segments are set to display "2"
digitalWrite(GND2, HIGH); // second digit is on
delay (10); // and so on....

//AB =AB%100;
//digitalWrite(GND2, LOW);
//showdigit(AB/10);
//digitalWrite(GND3, HIGH);
//delay (1);

//AB =AB%10;
//digitalWrite(GND3, LOW);
//showdigit(AB);
//digitalWrite(GND4, HIGH);
// delay (1);

};

void showdigits1 (int CD)
{

// e.g. we have "1234"
showdigit(CD/10); // segments are set to display "1"
//digitalWrite(GND1, HIGH); // first digit on,
//digitalWrite(GND2, LOW); // other off
digitalWrite(GND3, HIGH);
digitalWrite(GND4, LOW);

delay (10);

CD = CD%10; // remainder of 1234/1000 is 234
digitalWrite(GND3, LOW); // first digit is off
showdigit(CD); //// segments are set to display "2"
digitalWrite(GND4, HIGH); // second digit is on
delay (10); // and so on....

//CD =CD%100;
//digitalWrite(GND2, LOW);
//showdigit(CD/10);
//digitalWrite(GND3, HIGH);
//delay (1);

//CD =CD%10;
//digitalWrite(GND3, LOW);
//showdigit(CD);
//digitalWrite(GND4, HIGH);
// delay (1);

};

void setup()

{

pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(Z, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);

pinMode(GND1, OUTPUT);
pinMode(GND2, OUTPUT);
pinMode(GND3, OUTPUT);
pinMode(GND4, OUTPUT);

};
void loop ()

{
timer++;

showdigits (i);
showdigits1 (i);

if (timer==10) {

timer=0;

i++;

if (i>100) {i=0;};

if (i%2) { digitalWrite(DP, HIGH); }

else {digitalWrite(DP, LOW); };

};

};

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: Counter-up program (7-segment displays)

Berichtdoor baco1978 » 15 Mrt 2018, 23:50

Het enige wat op dit moment zorgt voor onnodige vertraging zijn de 4x delay(10); regels.

voor zover ik kan zien
Met vriendelijke groet Arjan

Berichten: 8
Geregistreerd: 11 Mrt 2018, 16:16

Re: Counter-up program (7-segment displays)

Berichtdoor Peeters » 02 Apr 2018, 16:15

Beste

Het probleem met dat de foute deeltjes van de segment is nog niet opgelost. Als bv een 2 wordt geprojecteerd dan gaan de juiste streepjes van de segment aan maar de andere (die normaal uit moeten staan) blijven zeer lichtjes branden. Weet iemand hoe ik dit kan oplossen of wat het probleem is?

Alvast bedankt.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 20 gasten