Buenos días.
Estoy intentando hacer un cronometro deportivo para descensos de carretons (carreras tipo autos locos).
La idea es tener en la salida un Arduino Uno que tendrá conectado: un semáforo para dar la salida (se accionara mediante relés lo más seguro, de momento Leds), tendrá un pulsador de cinta que colocaremos en la línea de salida y un APC 230 para comunicarse con el Arduino Mega que está situado en la línea de llegada (a un estoy pendiente de recibir el APC230).
En la línea de llegada tenemos un Arduino Mega que será el encargado de calcular el tiempo (con la función millis() ), también tendremos conectado una pantalla LCD 16x2 para mostrar los tiempo y la velocidad media, un conjunto de LEDs para monitorizar el semáforo de salida, un pulsador de cinta que se colocara en la línea de meta (el cual parara el crono) y un APC 230 para comunicarse con el Arduino de la salida.
Es mi primera incursión en el mundo de Arduino y no tengo mucha idea de programación, estado investigando un poco y este es el código que yo creo que funcionara.
Que os parece, hace aguas por algún sitio. De momento no lo he podido probar por falta de los APCs.
Un saludo y gracias
/********************************************************
* Gestor Descensos Carretons - Modulo Linea de Llegada (Arduino 2)
* v6.1 - 21/07/2012
*
* by
* Rafael Martinez (c)2012, All Rights Reserved
* rafaelmartinez32@gmail.com
*
* Plataforma:
* Arduino MEGA
* Antenas APC 230 conectado al pin RX1 y TX1
* Un pulsador (LineaLlegada) conectado al pin 22 (con una resistencia de 10kohm entre tierra y el pulsador)
* Un pulsador (reset) conectado al pin ...... (con una resistencia de 10kohm entre tierra y el pulsador)
* Un pulsador (SecSalida) conectado al pin 24 (con una resistencia de 10kohm entre tierra y el pulsador)
* 8 led rojos conectado al pin 31, 32, 33, 34 como monitores del semaforo de salida
*
* Description: Modulo Linea de Llegada "Gestor Descensos Carretons"
* Controla semaforo salida
* Muestra el tiempo del descenso y calcula la velocidad media Km/h
*
* Program free for use and redistribution. Please keep
* this info when using and/or modifying the program.
*
*********************************************************/
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Pines LCD
int LineaLlegada = 22; // define el pin 22 para el dispositivo de llegada
int SecSalida = 24; // define el pin 24 para el pulsador de la secuencia de salida
int SignalSecSalida = 3; // enviamos via TX/RX el ASCII 3 que el receptor interpreta en decimal(51)
int SignalFinCarrera = 4; // enviamos via TX/RX el ASCII 4 que el receptor interpreta en decimal(52)
int startChrono; // Variable para saber el estado del cronometro
unsigned long startTime, stopTime, elapsed; // variables para el calculo de tiempos
unsigned long centitot1 = 0; // variable para centesimas en LCD
unsigned long secotot1 = 0; // variable para segundos en LCD
unsigned long minutot1 = 0; // variable para minutos en LCD
double segundos, kmhSpeed; // variable para la velocidad
unsigned long distancia = 520; //AQUI COLOCAMOS LA DISTANCIA DEL RECORRIDO EN METROS
int rojo1 = 31; //Pin 31 led rojo 1
int rojo2 = 32; //Pin 32 led rojo 2
int rojo3 = 33; //Pin 33 led rojo 3
int rojo4 = 34; //Pin 34 led rojo 4
const int flasher = 500; // Retardo de 500 milisegundos
const int timer = 2500; // Retardo de 2.5 segundos
void setup()
{
pinMode(rojo1, OUTPUT);
pinMode(rojo2, OUTPUT);
pinMode(rojo3, OUTPUT);
pinMode(rojo4, OUTPUT);
// Arranca la comunicacion TX/RX
Serial1.begin(9600); // abre el puerto serie e inicia la comunicacion serie
// Arranca el LCD && Escribe el mensaje inicial
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Carretons Chrono");
lcd.setCursor(0, 1);
lcd.print("v6.1 - 21/07/12");
delay(2000);
lcd.setCursor(0, 0);
lcd.print("by ");
lcd.setCursor(0, 1);
lcd.print("Rafael Martinez");
delay(2000);
lcd.clear();
lcd.print("Cargando...");
delay(1000);
// Initialize Variables
startChrono = 0;
elapsed = 0;
segundos = 0;
kmhSpeed = 0;
// Print Ready Message
lcd.setCursor(0, 0);
lcd.print("Preparado... ");
}
void semaforosalida()
{
digitalWrite(rojo1, HIGH);
delay(timer);
digitalWrite(rojo2, HIGH);
delay(timer);
digitalWrite(rojo3, HIGH);
delay(timer);
digitalWrite(rojo4, HIGH);
delay(timer);
digitalWrite(rojo1, LOW);
digitalWrite(rojo2, LOW);
digitalWrite(rojo3, LOW);
digitalWrite(rojo4, LOW);
}
void semaforocarrera()//aqui la secuencia del semaforo mientras dure el descenso
{
digitalWrite(rojo1, HIGH);
digitalWrite(rojo3, HIGH);
delay(flasher);
digitalWrite(rojo1, LOW);
digitalWrite(rojo3, LOW);
delay(flasher);
digitalWrite(rojo2, HIGH);
digitalWrite(rojo4, HIGH);
delay(flasher);
digitalWrite(rojo2, LOW);
digitalWrite(rojo4, LOW);
delay(flasher);
}
void loop()
{
if(digitalRead(SecSalida) == HIGH && startChrono == 0)
{
Serial1.print(SignalSecSalida,BYTE);// enviamos un senal RF (valor 3) al otro arduino (arduino1 - emisor)
semaforosalida();
}
// Arranca el contador via TX/RX
if((Serial1.read() == 2) && startChrono == 0)
{
startTime = millis(); // Cuenta los milisegundos de salida
startChrono = 1; // Cambia el estado de la variable del cronometro
lcd.clear();
lcd.print("BAJANDO..");
semaforocarrera(); //aqui la secuencia del semaforo mientras dure el descenso
}
// Paro del contador y calculo de la velocidad
if(digitalRead(LineaLlegada) == HIGH && startChrono == 1)
{
stopTime = millis(); // Cuenta los milisegundos de llegada
startChrono = 0; // Cambia el estado de la variable del cronometro
elapsed = stopTime - startTime; // Calcula el tiempo de la carrera (el uso del loop)
centitot1 = (elapsed%1000)/10 ; //calcula las centesimas para el display
secotot1 = (elapsed/1000)%60 ; //calcula los segundos para el display
minutot1 = (elapsed/1000)/60 ; //calcula los minutos para el display
segundos = elapsed/1000;
kmhSpeed = (distancia/segundos)*3.6; // Calcula la velocidad en KM/h
digitalWrite(rojo1, LOW);//paro de la secuencia del semaforo (fin de carrera)
digitalWrite(rojo2, LOW);
digitalWrite(rojo3, LOW);
digitalWrite(rojo4, LOW);
Serial1.print(SignalFinCarrera,BYTE);
// Print obtained values
lcd.clear();
lcd.print("Tiempo: ");
//lcd.setCursor(9,0); // Posicion del cursor en el LCD
lcd.print(minutot1);
//lcd.setCursor(10,0); // Posicion del cursor en el LCD
lcd.print(":");
//lcd.setCursor(11,0);
lcd.print(secotot1);
//lcd.setCursor(13,0);
lcd.print(":");
//lcd.setCursor(14,0);
lcd.print(centitot1);
lcd.setCursor(0, 1); // Posicion del cursor en el LCD
lcd.print("Km/h: ");
lcd.print(kmhSpeed);
}
}