I am new in Arduino projects, i made a digital counter that counts from 00 to 99. Here is my code below
void setup()
{
pinMode(0,OUTPUT);
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
}
void loop()
{
/* segment starts from 00*/
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(4,HIGH);
digitalWrite(0,LOW);
digitalWrite(3,LOW);
/* segment will now be 10, the 0 will continue counting up to 1*/
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(5,HIGH);
digitalWrite(4,LOW);
/* the segment will now be 20 */
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(4,LOW);
digitalWrite(6,HIGH);
digitalWrite(5,LOW);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(4,HIGH);
digitalWrite(6,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(5,HIGH);
digitalWrite(4,LOW);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(4,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(4,LOW);
digitalWrite(7,HIGH);
digitalWrite(6,LOW);
digitalWrite(5,LOW);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(4,HIGH);
/* the segment will now be 9 0 */
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(3,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(0,LOW);
digitalWrite(1,HIGH);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(2,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(1,HIGH);
digitalWrite(0,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(3,HIGH);
digitalWrite(0,LOW);
digitalWrite(1,LOW);
digitalWrite(2,LOW);
delay(500);
digitalWrite(0,HIGH);
delay(500);
digitalWrite(4,LOW);
digitalWrite(7,LOW);
/* when it gets here the segment resets to 00*/
}
arduino counter It works pretty fine but the problem i have is the code is too long, is there a method i can use to reduce the length of the codes?
2 Answers 2
What you are writing here is some sort of binary counter: a BCD (binary-coded decimal) counter to be precise. It turns out that the processor inside the Arduino already works in binary. It's its native language, so you do not have to tell it how to do binary. You just have to know what operators to use in order to access the individual bits.
My approach would be to write a function that can display any number n
between 0 and 99. The first step is to do the decimal decomposition:
divide by 10, and take the quotient (first digit) and the remainder
(second digit). These digits will be represented in binary within the
machine. The next step is to access the individual bits. This is a two
step process:
Shift the bits of the number to the right until the bit you want is at the far right. This is accomplished with the right-shift operator.
Compute the bitwise AND with the number 1 (0000000000000001 in binary). This will clear all the bits but the one you want, and result in either 0 (the same as
LOW
) or 1 (i.e.HIGH
).
For example, if you want to get bit 1 of the number 7, you do
0000000000000111 = 7 initial number
0000000000000011 = 3 shifted one potion to the right
0000000000000001 = 1 bitwise AND-ed with 1
In code:
void display(int n)
{
int digit0 = n % 10;
int digit1 = n / 10;
digitalWrite(0, (digit0 >> 0) & 1);
digitalWrite(1, (digit0 >> 1) & 1);
digitalWrite(2, (digit0 >> 2) & 1);
digitalWrite(3, (digit0 >> 3) & 1);
digitalWrite(4, (digit1 >> 0) & 1);
digitalWrite(5, (digit1 >> 1) & 1);
digitalWrite(6, (digit1 >> 2) & 1);
digitalWrite(7, (digit1 >> 3) & 1);
}
Edit: If you need more that 2 digits, you have to successively divide by 10:
Divide the number to be displayed by 10: the rest of the division is the rightmost digit
replace the original number by the quotient of the division
divide again by 10: the rest of the division is the second rightmost digit
replace the original number by the quotient of the division
etc.
For example, for three decimal digits:
void display(int n)
{
int digits[3]; // digits[0] is the rightmost digit
digits[0] = n % 10;
n /= 10;
digits[1] = n % 10;
n /= 10;
digits[2] = n % 10;
// Now make sure that n < 10 (otherwise we are missing digits),
// then display digits[0], digits[1] and digits[2].
}
The main program now only has to loop through the numbers 0 to 99, and display each one in turn:
void loop()
{
for (int n = 0; n < 100; n++) {
display(n);
delay(500);
}
}
-
Thanks a lot although I have little knowledge on itJoseph Afodu– Joseph Afodu2022年10月31日 06:32:01 +00:00Commented Oct 31, 2022 at 6:32
-
Thanks a lot for the help.But how did you get digit0=n%10 digit1=n/10, and if i want to add another bcd to it what calculations do i need to make to get it i have been trying digit2=n/100 but it didnt work well.Joseph Afodu– Joseph Afodu2022年10月31日 13:21:42 +00:00Commented Oct 31, 2022 at 13:21
-
@JosephAfodu: Re "how did you get digit0=n%10 [...]": I learned decimal counting in primary school, and then I learned the meaning of the
/
and%
operators in C++. Re "and if i want to add another bcd": see amended answer.Edgar Bonet– Edgar Bonet2022年10月31日 14:28:19 +00:00Commented Oct 31, 2022 at 14:28 -
1@JosephAfodu, The greater part of your confusion may be in not recognizing
%
as something you're probably already familiar with which is not conventional in math but is fairly conventional in coding. You'll need to be familiar with the bitwise operators as well.timemage– timemage2022年10月31日 14:42:57 +00:00Commented Oct 31, 2022 at 14:42 -
Is there a way i can make it with 3 bcd's without the middle one displaying letters 🔠, I tried but when the last one counts 1, the middle one will be displaying letters.Joseph Afodu– Joseph Afodu2022年11月02日 08:39:56 +00:00Commented Nov 2, 2022 at 8:39
I suggest you look up how to do loops in a C or C++ programming tutorial. For example you can replace:
void setup()
{
pinMode(0,OUTPUT);
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
}
with:
void setup()
{
for (int i = 0; i <= 9; i++)
pinMode(i,OUTPUT);
}
-
Also, what Edgar Bonet said. :)2022年10月31日 06:01:51 +00:00Commented Oct 31, 2022 at 6:01