Project showcase

Start/Stop Chronometer © GPL3+

That's a two-module chronometer for your MTB (or any others sports) to measure your time in a determined circuit!

  • 2,043 views
  • 0 comments
  • 4 respects

Components and supplies

Apps and online services

About this project

Me and my friend are always in competition for something, in every sports, from ski to run, to MTB. I decided to build this Chronometer to have a precise measurement of the time spent to complete a pre-made circuit. You just have to choose a start and an end point, and place the two module (we 3D-printed a case for it because we soldered everything on a circuit board, you can also do this if you want something definitve) to start the competition.

Hope you have fun!

Credits for the wiring label to: https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo

Code

Code for the Start/RXC/C++
This code will make the timer start when you pass in front of the UltraSonic Sensor.
#include <LiquidCrystal.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9
#define CSN_PIN 53

LiquidCrystal lcd(12, 11, 5, 4, 3, 10);

int trigPin = 6;
int echoPin = 7;
int greenLed = 38;
int redLed = 39;
int m;
int s;
int dc;
const byte thisSlaveAddress[5] = {'R','x','A','A','A'};

RF24 radio(CE_PIN, CSN_PIN);

char dataReceived[10];
bool newData = false;

void setup() {
  lcd.begin(16, 2);
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  digitalWrite(greenLed, LOW);
  pinMode(53, OUTPUT);
  Serial.begin(9600);
  Serial.println("SimpleRx Starting");
  radio.begin();
  radio.setDataRate( RF24_250KBPS );
  radio.openReadingPipe(1, thisSlaveAddress);
  radio.startListening();
}

void loop() {
  int duration;
  int distance;
  digitalWrite(redLed, HIGH);
  digitalWrite(trigPin, HIGH);
  delay(1);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance <= 100 && distance >= 0) {
    digitalWrite(greenLed, HIGH);
    while (digitalRead(greenLed) == HIGH) {
    tempo();
    getData();
    showData();
  }
}
}

void tempo() {

  
  lcd.setCursor(0,1);
  dc = dc + 1;
  lcd.print(m);
  lcd.print(":");
  lcd.print(s);
  lcd.print(".");
  lcd.print(dc);
  delay(100);
  

  if (dc == 9) {
  dc = 0;
  s = s + 1;
  }
  
  if (s == 60) {
  s = 0;
  m = m + 1;
  }
}

void getData() {
    if ( radio.available() ) {
        radio.read( &dataReceived, sizeof(dataReceived) );
        newData = true;
    }
}

void showData() {
    if (newData == true) {
        Serial.print("Data received ");
        Serial.println(dataReceived);
        digitalWrite(ledVerde, LOW);
        newData = false;
    }
}
Code for the Stop/TXC/C++
This code will make the green led on the arrive turn on, making the timer stop and the first green led turn off.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9
#define CSN_PIN 10

int trigPin = 3;
int echoPin = 4;
int ledVerde = 5;
char dataToSend[10] = "Message 0";
char txNum = '0';

RF24 radio(CE_PIN, CSN_PIN);

const byte slaveAddress[5] = {'R','x','A','A','A'};

void setup() {
  Serial.begin(9600);
  Serial.println("SimpleTx Starting");
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT);
  pinMode(greenLed, OUTPUT);
  digitalWrite(greenLed, LOW);
  radio.begin();
  radio.setDataRate( RF24_250KBPS );
  radio.setRetries(3,5); // delay, count
  radio.openWritingPipe(slaveAddress);
}

void loop() {
  int duration;
  int distance;
  digitalWrite(greenLed, LOW);
  digitalWrite(trigPin, HIGH);
  delay(1);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance <= 100 && distance >= 0) {
    digitalWrite(greenLed, HIGH);
    while (digitalRead (greenLed == HIGH)) {
    send();
 }
}
}

void send() {

    bool rslt;
    rslt = radio.write( &dataToSend, sizeof(dataToSend) );
        // Always use sizeof() as it gives the size as the number of bytes.
        // For example if dataToSend was an int sizeof() would correctly return 2

    Serial.print("Data Sent ");
    Serial.print(dataToSend);
    if (rslt) {
        Serial.println("  Acknowledge received");
        updateMessage();
    }
    else {
        Serial.println("  Tx failed");
    }
}

void updateMessage() {
        // so you can see that new data is being sent
    txNum += 1;
    if (txNum > '9') {
        txNum = '0';
    }
    dataToSend[8] = txNum;
}

Schematics

Start/RX
Make sure to wire everything as you see, 'cause the nRF24L01 needs to be wired in a certain way! I recommend you to check the label with the appropriate wiring for your board and library that i uploaded in the photos, so you can enjoy your chronometer at its fullest.
Cattura ue7bhngton
Stop/TX
As i already said, make sure that you follow the wiring label so you won't have any errors.
Cattura1 epyyo0s3x0

Comments

Similar projects you might like

Herb Box Eco System

Project tutorial by Walter Heger

  • 3,987 views
  • 5 comments
  • 44 respects

Web-Controlled LED Animations with Raspberry Pi and Arduino

Project tutorial by Bruno Portaluri

  • 4,732 views
  • 12 comments
  • 22 respects

Use Alexa to Control Your TV!

Project tutorial by Grensom

  • 2,663 views
  • 5 comments
  • 29 respects

Talking Clock 2 - New Version (Bilingual: EN-PT)

Project tutorial by LAGSILVA

  • 587 views
  • 2 comments
  • 8 respects

Making a Cheap Aquarium Parameters Controller

Project tutorial by Boisse Martin

  • 997 views
  • 2 comments
  • 5 respects

Valentine Blink: Wireless LED Hearts

Project showcase by AdiK

  • 2,280 views
  • 13 comments
  • 20 respects
Add projectSign up / Login