Looking for help regarding a Counter

Hi All,

I am new to Ardino and am looking to use Arduino in my next project for my students.

Final Product: I want to create a waterproof lap counter that one can use in the pool when swimming laps. I would design the product to count laps and keep track of real time.

Programming Counter (LED Display I):

  • LED display readout to increase in count everytime a button is pushed up to the hundreths place
  • reset button so that one can use this device over and over again

Time (LED Display II):

  • Real time

if anyone could help me with this programming I would greatly appreciate it. I would truly like to create these programs for my students but am unclear how to begin. Thank you.

If you're just looking for help with writing the sketch, then you would probably be better off in the Programming Questions section. In there, you will want to review the thread at the top that guides you through what your post should include (like code, what you're expecting vs what it is doing, what have you tried, etc.).

Otherwise, if you're looking to have someone write the code for you, you are in the right place. Do you have the hardware already? If so, what "LED display" are you using? Do you have an RTC module for the time? If so, which?

I am definitely looking for someone to help me write the code for me, Arrch.

I don't have anything yet, except what I want my program to successfully do. After thought a 3 segment LED display will be enough for my counting since I only want it to go to the hundreths place 0-999.

I do not have a RTC module yet. Any suggestions?

jyank747:
I don't have anything yet, except what I want my program to successfully do. After thought a 3 segment LED display will be enough for my counting since I only want it to go to the hundreths place 0-999.

7-Segment LEDs sound like they would work just fine in this project, but you'll have to consider how big you want them. The more common ones are around 1 inch in height. Those tend to require very little external components to drive them. Depending on the environment,though, that might not be big enough.

I do not have a RTC module yet. Any suggestions?

How accurate do you want it to be? Is a couple seconds a day OK? If so, I would recommend something like the DS1307 kit that adafruit sells for about $10. If you want poinpoint accuracy, you could invest in a WiFi/Ethernet shield and update using NTP.

I am looking for them to be a bit larger than 1 inch, rather 2-3 inch.

It is okay if they RTC is not 100% accurate, your inital suggestion will be just fine, thanks!

jyank747:
I am looking for them to be a bit larger than 1 inch, rather 2-3 inch.

I would go to some on the production sites like DigiKey, Mouser or Newark and see if you can find one in the size you are looking for. I doubt you'll be able to find a 3 or 4 digit ones, so they will likely have to hooked up individually. Keep an eye on the forward voltage and current requirements. Bigger displays often have multiple LEDs within each segment which increases the total forward voltage.

One of my projects has these 7 segments for example.

It would be easy to connect a MAX7219 to 8 common-cathode 7-segment displays, 6 showing time & 2 showing lap count for instance.
H:MM:SSS, DD
Look at taydaelectronics (Thailand)for MAX7219, $1.25 each
If need larger digits there are other sources such as futurlec (Australia), 2.3", 3", 4", 5" available.

1.5-2 weeks for inexpensive shipping.

After looking at the website you both provided perhaps a Double Digit Seven-Segment LED Display for the laps 0-99.

And a Four Digit Seven-Segment LED Display for the real time module.

Wouldn't it be simplier if the two counts were on seperate LED displays?

jyank747:
Wouldn't it be simplier if the two counts were on seperate LED displays?

That was what I was thinking. They also have 4-digit 7-segment "clock" devices that include the middle colon, although those may be harder to find in the larger sizes.

that is okay i rather have the counter to be displayed larger than the real time, thanks for all your help.

now if i could get some help coding that would be great.

If you have the MAX7219 driving the displays, and you wanted larger 2-3" digits, then seperate common cathode displays is the way to go.
You said you wanted time to hundreths, so MM:SS.TH + 99 would be one way to occupy 8 digits.

CrossRoads:
If you have the MAX7219 driving the displays, and you wanted larger 2-3" digits, then seperate common cathode displays is the way to go.
You said you wanted time to hundreths, so MM:SS.TH + 99 would be one way to occupy 8 digits.

Does the Arduino come with MAX7219?

I have decided that I would have two sets of displays:

  1. 4-Digit 7-Segment LED Display for the real time
  2. 2-Digit 7-Segment LED Display for the counting (0-99)

2 buttons:

  1. Couting button for the 2-Digit 7-Segment LED Display
  2. Reset Button (not from the Arduino)

Is this possible?

Easily.
You can do it with SPI.transfer() commands to set up the MAX7219 and send it the 6 digits you want to display, or use some library to do it.
This is a much larger version that uses a Promini for control and a MAX7221 (MAX7219 is identical but with faster signal edges) driving countdown timer display (and countup is easier) in the middle and 2 set of 00-99 digits at the upper sides.
The '328P based promini does the timing, no external clock needed.

I think your hardest part will be making it all watertight.
Can make it rechargeable-battery powered with sealed connectors for the pushbutton for the lap counter and the external reset.
Or go fancier and make the reset wireless, so the only connection is for the lap button.

Here's a pricey connector, there are lower cost versions too, this one had nice picture

CrossRoads:
Easily.
You can do it with SPI.transfer() commands to set up the MAX7219 and send it the 6 digits you want to display, or use some library to do it.
This is a much larger version that uses a Promini for control and a MAX7221 (MAX7219 is identical but with faster signal edges) driving countdown timer display (and countup is easier) in the middle and 2 set of 00-99 digits at the upper sides.
The '328P based promini does the timing, no external clock needed.

I think your hardest part will be making it all watertight.
Can make it rechargeable-battery powered with sealed connectors for the pushbutton for the lap counter and the external reset.
Or go fancier and make the reset wireless, so the only connection is for the lap button.

CrossRoads, you really do understand what I am trying to design! I thought I was explaining it wrongly. In the image you attached, I see the two couting LEDS on the left and right as well as the bottom set couting real time. What at the 2 digit 7 segment LEDS under the large left do?

Is this image something you have made or something you found online?

found this. credit to missionduke. will this do what i am looking for as far as the counting part?

#include <SoftwareSerial.h> //for software serial communication

#define txPin 14 //change to your serial port on Arduino board
#define rxPin 15 //not used but is required

SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);
int buttonPressCount;

const int buttonPin = 2; //the pin that the pushbutton is attached to

int buttonPushCounter = 0; //counter for the number of button presses
int buttonState = 0; //current state of the button
int lastButtonState = 0; //previous state of the button

void setup() {
pinMode(buttonPin, INPUT); //initialize the button pin as a input
Serial.begin(9600); //initialize serial communication

pinMode(txPin, OUTPUT);
//the following resets the board, changes the brightness to 100%, and sets the board to '0000':
mySerial.begin(9600);
mySerial.print(0x7A,BYTE); //special character
mySerial.print(0x00,BYTE); //set brightness to full
mySerial.print(0x76,BYTE); //reset board
mySerial.print(0); //send '0' character
mySerial.print(0); //send '0' character
mySerial.print(0); //send '0' character
mySerial.print(0); //send '0' character
}

void loop(){

buttonState = digitalRead(buttonPin); //read the pushbutton input pin

// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button
// went from off to on:
buttonPushCounter++;

Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter, DEC);
updateDisplay(buttonPushCounter); //function to update the display 'requires button press count'

}

}

lastButtonState = buttonState; // save the current state as the last state, for next time through the loop

}

void updateDisplay(int buttonPushCounter){
String intString = String(buttonPushCounter); //changes integer to a string
char displayChars[4]; //create array to hold the four numbers
int stringLength = intString.length(); //get length of the string
//the following will determine if the button press count variable has 1, 2, 3, or 4 numbers in it
//and will fill the empty spaces with '0'. so if the button press count variable is '29' it will end up being '0029':
if(stringLength == 4){
displayChars[0] = intString.charAt(0);
displayChars[1] = intString.charAt(1);
displayChars[2] = intString.charAt(2);
displayChars[3] = intString.charAt(3);
}else if(stringLength == 3){
displayChars[0] = 0;
displayChars[1] = intString.charAt(0);
displayChars[2] = intString.charAt(1);
displayChars[3] = intString.charAt(2);
}else if(stringLength == 2){
displayChars[0] = 0;
displayChars[1] = 0;
displayChars[2] = intString.charAt(0);
displayChars[3] = intString.charAt(1);
}else if(stringLength == 1){
displayChars[0] = 0;
displayChars[1] = 0;
displayChars[2] = 0;
displayChars[3] = intString.charAt(0);
}
mySerial.print(0x76,BYTE); //Reset board
mySerial.print(0x76,BYTE); //Reset board
mySerial.print(displayChars[0]); //Send '0' character
mySerial.print(displayChars[1]); //Send '0' character
mySerial.print(displayChars[2]); //Send '0' character
mySerial.print(displayChars[3]); //Send '0' character

delay(100); //this will make it so you don't get double counts. you could also use this to avoid someone pressing the button repeatedly 'for fun!'

}

I programmed the top left & top right to allow score from 00 to 99.
The bottom four count down from presets of 10:00, or 3:00, or 1:00, to 00:00 (fencing specific times)

The two smaller digits are not driven by the MAX7219 (but that can easily by used, make sure to get common cathode digits).
One digit shows E,S,F for Epee, Foil, Sabre.
The other shows the period of the bout - 1,2,3 for an individual bout, with score that would end at 15, and up to 9 for a team bout, with score that would end at 45.
The decimal points from the digits were used as various indicators - penalty, priority, coin toss & result.

This one actually uses two promini's, you can see one at the left edge and one in the middle. It was built up in stages, initially just to mimic time & score lights (the large blocks) from another source, with score controlled independently, all by the middle card. Then speaker was added (amplifier on the small board on the right and a speaker below the cards), and finally detection of score touches was added with the left promini to replace the external box that provided the time & score lights, and period & weapon indicator.
I will replace both promini's with a 1284 and combine the 2 programs when I make the next one as my coding has improved a lot since I created this, and my use of SPI has really taken off.

CrossRoads:
I programmed the top left & top right to allow score from 00 to 99.

Do you still have that code? and are willing to share? If not, would the code I found above do the trick?

I'll share, score keeping is simple enough.
How are you connected up? I use SPI exclusively to MAX7219. What do you have?
If you don't see me post it, its because I forgot - ping me tonight.

CrossRoads:
How are you connected up? I use SPI exclusively to MAX7219. What do you have?

crossroads, this is embarassing to admit, but i have no idea what i have. all i know is that i bought the arduino starter kit.