Os presento mi primer proyecto.
Es un gestor de carreras para mi pista de scalextric. Aún está verde, especialmente la parte electrónica. Aunque me está valiendo para aprender (hasta que empecé no tenia ni idea de electrónica ni casi de programación).
Lo que pretendo es que se puedan definir el número de vueltas, se encienda un semáforo como el de la F1 y que de la salida. Una vez dadas las vueltas definidas se muestra el tiempo de vuelta mas rápida y vuelta a empezar.
Pues sin alargarme mas, aquí os dejo el código y el esquema eléctrico que estoy usando para hacer pruebas:
Y este es el código:
/*
Cuentavueltas y crono
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int Nvueltas = 1; //Numero de vueltas
int control = 10; //Pin de control (Boton A)
int control2 = 5; //Pin ANALOGICO de control 2 (Boton B)
int rojo1 = 6; //Pin led rojo 1
int rojo2 = 7; //Pin led rojo 2
int rojo3 = 8; //Pin led rojo 3
int verde = 9; //Pin led verde
int intervalo = 1000; //Intervalo de la secuencia
int paso = 13; //Pin de paso de vuelta
int vuelta = 0; //Contador de vueltas
unsigned long tiempoF = 0; // Tiempo de fin de vuelta
unsigned long tiempoS = 0; //Tiempo de salida de vuelta
unsigned long tiempoV = 0; //Tiempo de vuelta
unsigned long tiempoR = 99999; //Vuelta rapida
void setup() {
pinMode(rojo1, OUTPUT);
pinMode(rojo2, OUTPUT);
pinMode(rojo3, OUTPUT);
pinMode(verde, OUTPUT);
pinMode (paso, INPUT);
pinMode (control, INPUT);
// set up the LCD's number of rows and columns:
lcd.begin(16, 2);
lcd.print("Vuelta:");
lcd.setCursor(0, 1);
lcd.print("Tiempo:");
}
void semaforo()
{
digitalWrite(rojo1, HIGH); //Encendido secuencial de los rojos
delay(intervalo);
digitalWrite(rojo2, HIGH);
delay(intervalo);
digitalWrite(rojo3, HIGH);
delay(intervalo);
digitalWrite(rojo1, LOW); //Apaga los leds rojos
digitalWrite(rojo2, LOW);
digitalWrite(rojo3, LOW);
digitalWrite(verde, HIGH); // Enciende el verde
delay(intervalo*2);
digitalWrite(verde, LOW); //Apaga verde
tiempoS = millis();
}
void pasoDEvuelta(){
vuelta = vuelta + 1; //Conteo de vuelta
tiempoF = millis(); //Calculo de tiempo de vuelta
tiempoV = tiempoF - tiempoS;
tiempoS = tiempoF; //Pone el tiempo de salida nuevo
if (tiempoR > tiempoV) {
tiempoR = tiempoV;
}
delay(250); //Espera para para no contar varias veces por paso
}
void pantalla(){
//Mostrar el numero de vuelta y tiempo
lcd.clear();
lcd.print("Vuelta:");
lcd.setCursor(0, 1);
lcd.print("Tiempo:");
lcd.setCursor(10, 0); //Situar el cursor
lcd.print(vuelta);
lcd.setCursor(10, 1); //Situar el cursor
lcd.print(" ");
lcd.setCursor(10, 1); //Situar el cursor
lcd.print(tiempoV/1000);
}
void fin() {
//Muestra vuelta rapida
lcd.clear();
lcd.print("Vuelta rapida:");
lcd.setCursor(0, 1);
lcd.print(tiempoR / 1000);
delay(5000);
Nvueltas = 1;
}
void numeroDEvueltas() {
lcd.clear();
lcd.print("Cuantas vueltas?");
lcd.setCursor(0, 1);
lcd.print(Nvueltas);
//Definir el numero de vueltas de carrera
while(analogRead(control2) < 256) {
if (digitalRead(control) == HIGH ) {
++Nvueltas;
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(Nvueltas);
delay(250);
}
}
lcd.clear();
lcd.print("Preparados?");
lcd.setCursor(0,1);
lcd.print("A");
while(digitalRead(control) == 0) {
delay(5);
}
delay(5);
}
void loop() {
lcd.clear();
lcd.print(" BUENA");
lcd.setCursor(0, 1);
lcd.print(" CARRERA!");
delay(3000);
numeroDEvueltas();
semaforo();
vuelta = 0;
//Cuenteo de vueltas y tiempos
while(vuelta < Nvueltas){
if (digitalRead(paso) == HIGH ) {
pasoDEvuelta();
pantalla();
}
}
fin();
Los planes de futuro incluyen mejorar la parte electrónica, cambiando el pulsador de paso de vuelta por un sistema de led + resistencia fotoelectrica, implementar el corte de corriente a la pista, añadir un segundo corredor y un sistema de simulacion de repostaje. Tambien le añadiré comunicacion con el PC por el puerto serie para usar programas de gestion de carreras. Y si se me ocurre algo mas tambien irá cayendo.
Gracias por leerlo y espero vuestros comentarios.
PD: Cuando pueda pongo un video del funcionamiento.