/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////// dBTRIP v1.1 - Rubén López - Febreiro '25 ///////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* CONEXIONADO
---LCD--- ---Keypad--- ---Leds conductor--- ---Sensor magnetico---
A4 - SDA D5 hasta D12 D1 Positivo led rojo (Sensor Hall) D2, VCC e COM
A5 - SCL D2 Positivo led amarillo
D3 Positivo led verde
*/
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
//#define HALL_PIN 2 // Define o Pin D2 con interrupcion
///////////////////////////////////////////////////// PANTALLA LCD /////////////////////////////////////////////////////
LiquidCrystal_I2C lcd(0x27,20,4); //Crear o obxeto lcd dirección 0x3F e 20 columnas x 4 filas
///////////////////////////////////////////////////// KEYPAD TECLADO ///////////////////////////////////////////////////
const byte FILAS = 4; // Define numero de filas
const byte COLUMNAS = 4; // Define numero de columnas
char teclas [FILAS] [COLUMNAS] = { // Define la distribución de teclas
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'F', '0', 'E', 'D'}
};
byte pinesFilas [FILAS] = {12,11,10,9}; // Pines correspondentes ás filas
byte pinesColumnas [COLUMNAS] = {8,7,6,5}; // Pines correspondentes ás columnas
Keypad teclado = Keypad (makeKeymap (teclas), pinesFilas, pinesColumnas, FILAS, COLUMNAS); //Crea obxeto
//////////////////////////////////////////////////// VARIABLES GLOBALES ////////////////////////////////////////////////
int conta; // Condición nivel de menú
//int impulsos = 0;
float roda;
int voltas = 0;
float trip = 0; // Iniciamos TRIP en 0
float correccion = 0; // Valor acumulable de corrección por teclado
float distanciareal = 1000; // Valor de arranque distancia de calibración (1km)
float impulsos2 = 1800; // Valor de arranque avance da roda por volta (1,88998m)-Valor rueda fuego 205/60/R14
float sel = 40.0;
float actual = 0;
float tablasm = 100; //valor de arranque dos metros que nos dan as tablas (100m por defecto)
float distanciant = 0; //Distancia recorrida gardada antes de cambiar de media
float ideal = 0.000;
float diferencialeds;
int periodo = 1000; //Periodo actualizción piramide (1 segundo)
int diferenciaT = 0;
unsigned long TiempoAhora = 0;
unsigned long TiempoAntes = 0;
uint32_t impulsos;
float impulsosmm; //valor que calcula os impulsos en función os mm da roda
////////////////////////////////////////////////////Función contar impulsos dixitais/////////////////////////////////////////////
void increaseCount(){
impulsos++;
voltas++;
}
/////////////////////////////////////////////////////////// SETUP //////////////////////////////////////////////////////
void intro_0(){
lcd.print(" TERRATRIP AUTO ");
delay(1000);
lcd.clear();
delay(500);
lcd.setCursor(3, 1);
lcd.print("IES LAURO"); // Mensaxe de arranque pantalla
lcd.setCursor(7, 2);
lcd.print("OLMO");
delay(2000);
lcd.clear();
}
void menu_1(){
lcd.setCursor(8, 0);
lcd.print("MENU");
lcd.setCursor(0, 1);
lcd.print("1. Calibrar ");
lcd.setCursor(0,2);
lcd.print("2. INICIAR Tramo");
lcd.setCursor(0,3);
lcd.print("3. INICIAR Tablas");
}
void setup() {
lcd.init(); // Inicializar o LCD
lcd.backlight(); // Encender a luz de fondo
// pinMode(2, OUTPUT); // Configuración pines como unha salida de señal (LEDS conductor)
pinMode(3, OUTPUT);
pinMode(1, OUTPUT);
conta=0;
actual=sel;
intro_0();
menu_1();
//Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), increaseCount, RISING); ///conta os pulsos do pin D2 cando pasa de LOW a HIGH
//pinMode(HALL_PIN, INPUT);
}
/////////////////////////////////////////////////////////// BUCLE //////////////////////////////////////////////////////
void loop() {
char pulsacion = teclado.getKey(); // Lectura entrada keypad
if (pulsacion == '1' && conta == 0){ // Condición Menú 1
conta=1;
lcd.clear();
calibracion();
}
if (pulsacion == '2' && conta == 0){ // Condición Menú 2
conta=2;
lcd.clear();
tramo();
}
if (pulsacion == '5' && conta == 0){ // Condición Menú 3
conta=3;
lcd.clear();
tablas();
}
if(pulsacion == '7' && conta == 1){ // Condición de salida Menú 1
lcd.clear();
conta=0;
menu_1();
}
if(pulsacion == '7' && conta == 2){ // Condición de salida Menú 2
lcd.clear();
conta=0;
menu_1();
}
if(pulsacion == '7' && conta == 3){ // Condición de salida Menú 3
lcd.clear();
conta=0;
menu_1();
}
//////////////////////////////////////////////////// CÁLCULOS DENTRO DO BUCLE ///////////////////////////////////////////
if(conta==1){ // Operacións dentro do Menú 1
impulsosmm=(distanciareal/impulsos2)*1000; //Función Calcular os impulsos en función os mm da roda
// if(increaseCount > 1) {
// impulsos++;
//}
// else{
// delay(100);
//}
// if (analogRead (A0) < 300){ // Lectura analogica sensor hall
// delay(100);
// if(analogRead (A0) > 300) {
// impulsos++;
// }
// }
if (pulsacion == 'A' && distanciareal >= 0){ // Funcións por pulsación teclado
distanciareal = distanciareal + 1;
}
if (pulsacion == 'B' && distanciareal >= 1) {
distanciareal = distanciareal - 1;
}
if (pulsacion == '8' && impulsos2 >= 0){
impulsos2 = impulsos2 + 1;
}
if (pulsacion == '0' && impulsos2 >= 1){
impulsos2 = impulsos2 - 1;
}
if (pulsacion == 'F'){
impulsos=0;
lcd.setCursor(10,0);
lcd.print(" ");
}
lcd.setCursor(10,0); //Parte gráfica Menú 1
lcd.print(impulsos);
lcd.setCursor(16,2);
lcd.print(distanciareal,0);
lcd.setCursor(4,3);
lcd.print(impulsosmm,0);
lcd.setCursor(16,3);
lcd.print(impulsos2,0);
if(distanciareal < 1000){ //Limpieza LCD para menores de 1000
lcd.setCursor(19,2);
lcd.print(" ");
}
if(impulsos2 < 1000){
lcd.setCursor(19,3);
lcd.print(" ");
}
}
// == == == == == == == == == == == == == == == == == == == == == == == == == == == == ==
if(conta==2){ // Operacións dentro do Menú 2
if(trip>0){
if(millis() > TiempoAhora + periodo){ // FUNCIÓN PIRAMIDE
TiempoAhora = millis();
diferenciaT ++;
ideal=distanciant+(actual*0.278*(diferenciaT)/1000);
}
}
roda=abs(impulsos2/distanciareal); // FUNCIÓN TRIP
trip=(voltas*roda)/1000 + correccion;
//Serial.println(A0);
if (analogRead (A0) < 300){
lcd.setCursor(19,2);
lcd.print("s");
delay(100);
if(analogRead (A0) > 300) {
voltas++;
lcd.setCursor(19,1);
lcd.print(" ");
}
}
// Funcións por pulsación teclado
if (pulsacion=='C'){ // Ó presionar A aumenta a distancia en 10m
if (trip >= 0) {
correccion= correccion + 0.01;
}
}
if (pulsacion=='D'){ // Ó presionar B disminúe a distancia en 10m
if (trip >= 0.01){
correccion = correccion - 0.01;
}
}
if (pulsacion=='9'){ // Ó presionar A aumenta a distancia en 100m
if (trip >= 0) {
correccion= correccion + 0.1;
}
}
if (pulsacion=='E'){ // Ó presionar B disminúe a distancia en 100m
if (trip >= 0.01){
correccion = correccion - 0.1;
}
}
if (pulsacion=='F'){ // Ó presionar 0 faise reset
correccion=0;
trip=0;
voltas=0;
ideal=0;
diferenciaT=0;
distanciant=0;
}
if (pulsacion=='A'){
sel=sel+0.1;
}
if(pulsacion=='B'){
sel=sel-0.1;
}
if (pulsacion=='3'){
sel=sel+1;
}
if (pulsacion=='6'){
sel=sel-1;
}
if(pulsacion=='4'){
distanciant=ideal;
actual=sel;
diferenciaT=0;
}
//diferencialeds = ideal - trip; // FUNCIÓN LEDS CONDUCTOR
//if(diferencialeds>0.075){ //Pronto
// digitalWrite(1,HIGH);
// digitalWrite(3,LOW);
// digitalWrite(2,LOW);
//}
//if(diferencialeds<-0.075){ //Tarde
// digitalWrite(3,HIGH);
// digitalWrite(1,LOW);
// digitalWrite(2,LOW);
//}
// if(diferencialeds < 0.075 && diferencialeds > -0.075){ //En tempo
// digitalWrite(2,HIGH);
// digitalWrite(1,LOW);
// digitalWrite(3,LOW);
// }
lcd.setCursor(11,3); //Parte gráfica Menú 2
lcd.print(trip,3);
lcd.setCursor(7,0);
lcd.print(actual,1);
lcd.setCursor(16,0);
lcd.print(sel,1);
lcd.setCursor(11,1);
lcd.print(ideal,3);
lcd.setCursor(1,2);
lcd.print(distanciant,4);
}
if(conta==3){ // Operacións dentro do Menú 3 Tablas
if(trip>0){
if(millis() > TiempoAhora + periodo){ // FUNCIÓN PIRAMIDE
TiempoAhora = millis();
diferenciaT ++;
}
}
roda=abs(impulsos2/distanciareal); // FUNCIÓN TRIP
trip=(voltas*roda)/1000 + correccion;
//Serial.println(A0);
if (analogRead (A0) < 300){
lcd.setCursor(19,2);
lcd.print("s");
delay(100);
if(analogRead (A0) > 300) {
voltas++;
lcd.setCursor(19,1);
lcd.print(" ");
}
}
// Funcións por pulsación teclado
if (pulsacion=='C'){ // Ó presionar A aumenta a distancia en 10m
if (trip >= 0) {
correccion= correccion + 0.01;
}
}
if (pulsacion=='D'){ // Ó presionar B disminúe a distancia en 10m
if (trip >= 0.01){
correccion = correccion - 0.01;
}
}
if (pulsacion=='9'){ // Ó presionar A aumenta a distancia en 100m
if (trip >= 0) {
correccion= correccion + 0.1;
}
}
if (pulsacion=='E'){ // Ó presionar B disminúe a distancia en 100m
if (trip >= 0.01){
correccion = correccion - 0.1;
}
}
if (pulsacion=='F'){ // Ó presionar 0 faise reset
correccion=0;
trip=0;
voltas=0;
ideal=0;
diferenciaT=0;
distanciant=0;
}
if (pulsacion=='3'){
tablasm=tablasm+10;
}
if (pulsacion=='6'){
tablasm=tablasm-10;
}
lcd.setCursor(11,3); //Parte gráfica Menú 3
lcd.print(trip,3);
lcd.setCursor(7,0);
lcd.print(tablasm,0);
lcd.setCursor(16,0);
//lcd.print(sel,1);
lcd.setCursor(11,1);
lcd.print(ideal,3);
lcd.setCursor(1,2);
lcd.print(diferenciaT,4);
}
}
//////////////////////////////////////////////////// MENÚS /////////////////////////////////////////////////////////////
void calibracion (){
if(conta==1);{ // Arranque gráfico menú Calibración
lcd.setCursor(0,0);
lcd.print("Impulsos:");
lcd.setCursor(0,1);
lcd.print("--Introduce datos---");
lcd.setCursor(0,2);
lcd.print("Metros reales -");
lcd.setCursor(0,3);
lcd.print("Imp-");
lcd.setCursor(8,3);
lcd.print("mmRueda-");
}
}
void tramo (){
if(conta==2){ // Arranque gráfico menú Tramo
lcd.setCursor(0,0);
lcd.print("Actual: ");
lcd.setCursor (12,0);
lcd.print("Sel: ");
lcd.setCursor(0,1);
lcd.print("Ideal ---- ");
lcd.setCursor(0,3);
lcd.print("TRIP -----");
lcd.setCursor(18,3);
lcd.print("km");
lcd.setCursor(18,1);
lcd.print("km");
}
}
void tablas (){
if(conta==3){ // Arranque gráfico menú Tablas
lcd.setCursor(0,0);
lcd.print("Tablas: ");
lcd.setCursor (12,0);
lcd.print("Sel: ");
lcd.setCursor(0,1);
lcd.print("Ideal ---- ");
lcd.setCursor(0,3);
lcd.print("TRIP -----");
lcd.setCursor(18,3);
lcd.print("km");
lcd.setCursor(18,1);
lcd.print("km");
}
}
////////////////////////////////////////////////////////////// END /////////////////////////////////////////////////////