Hola, que gran trabajo, quiero ver la velocidad como en el minuto 4:07 y que me cuente los kilómetros sin que se borren aunque desconecten la batería, para poderle dar mantenimiento a mi vehículo, es una camioneta que se le cambio motor y transmisión, me podrías orientar como hacer solo esa parte por favor. ya vi que el sensor es de efecto hall.
Hola Eduardo gracias, puedes utilizar la función EEPROM.put, y te permite almacenar datos en la memoria no volátil, solo cuida de que el guardado sea cada minuto o más para que no consumas los ciclos de vida de la memoria, en mi caso lo tengo cada minuto, y para recuperar la distancia total recorrida y almacenada puedes usar la función EEPROM.get. En la pagina de arduino viene mejor explicado como usar ambas funciones. Saludos amigo
@@Christopher-kp4nx Que tienes en mente hacer, o que llevas de tu proyecto? El código sería más o menos como el siguiente: void PUERTAS () { if ((DIST_PUERTA >= 0.01)&& (DIST
@@EliudUrba basicamente busco automatizar mi auto , como es uno de los 90s no trae funciones automáticas como esa. Tambien queria ver si se puede hacer algun tipo de barrido de agujas al abrir switch con arduino.
Genial tu proyecto podrias facilitar el diagrma y codigo ? Yo estoy con un proyecto que se complementaria podriamos compartir proyectos . Si proyecto se basa en el funcionamiento del kit boton start stop adapyable a autos sin ecu basado en arduino mi limitacion radica en que no soy un experto en programacion y me baso a prueva y error
Hola, a día de hoy con ChatGPT se puede desarrollar buenos proyectos, ya lo puse en práctica mejorando el código de ese proyecto de hace 4 años (Por lo que ya no tiene sentido que te comparta el código viejo) . Te recomiendo que busques videos de Arduino + ChatGPT. Saludos
@@EliudUrba estuve probando ChatGPT pero me da mas problemas que soluciones. si cuentas con tu código aun podrías compartírmelo? o alguno mas actual que tengas como para partir de alguna base....
@@lucianolobo8041 #include // EEPROM library #include #include U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8); /*-----------display----------- #include int SCLK = 7; int RCLK = 6; int DIO = 5; TM74HC595Display disp(SCLK, RCLK, DIO); unsigned char LED_0F[29]; -----------display----------- */ volatile unsigned long lastturn, time_press; volatile unsigned long lastturnodo; //volatile unsigned long TIMEH; //volatile float KMS; volatile float SPEED; volatile float SPEEDMAX; //volatile float SPEEDPROM; volatile float DISTV=0; //Distancia viaje volatile float DIST; //Distancia odometro volatile boolean eeprom_flag; boolean flag; float w_length = 0.22; // un giro de rueda equivale a 8 tiks, cada tik equivale a 0.22 metros /*---------filtros de salida de velocidad */ float Y = 0.0; float ALPHA = 0.14; // Cercano a 0 la respuesta es lenta, en 0.20 la respuesta es media mientras que en 0.50 la respuesta es rapida, casi similar a la señal. float S = Y ;
float DIST_MEMORIA; void setup() { Serial.begin(9600); // configure serial for debug u8g2.begin(); u8g2.enableUTF8Print(); u8g2.setFont(u8g2_font_luBIS19_tf); // u8g2_font_t0_22_mf //u8g2.setFont(u8g2_font_VCR_OSD_tf); //u8g2.setFont(u8g2_font_logisoso16_tf); //u8g2.setFont(u8g2_font_luRS18_tr); u8g2.setColorIndex(1); u8g2.firstPage(); do { intro(); } while( u8g2.nextPage() );
attachInterrupt(digitalPinToInterrupt(3), sens, RISING); // hall sensor interrupt // pinMode(2, INPUT); // boton reset odometro // pinMode(5, OUTPUT); // control puertas // pinMode(6, OUTPUT); // control bomba hidraulica // digitalWrite (PUERTA, HIGH); // high es igual a apagado - low es igual a encendido // digitalWrite (BOMBA, LOW); // high es igual a apagado - low es igual a encendido delay(5000);
// DIST_PUERTA = 0; //DIST_MEMORIA = 9106.1; //EEPROM.put (2, DIST_MEMORIA); DIST = EEPROM.get(2, DIST_MEMORIA); // remember some distance } void sens() { if (millis() - lastturn > 7) { SPEED = w_length / ((float)(millis() - lastturn) / 1000) * 3.6; // calculate speed lastturn = millis(); // remember time of last revolution DISTV = DISTV + w_length / 1000; // DIST = DIST + w_length / 1000; // calculate distance } } void loop() { if ((millis() - lastturn) > 500) { // if there is no signal more than 1 seconds SPEED = 0; // so, speed is 0 }
Y = SPEED ; S = (ALPHA * Y) + ((1-ALPHA)*S); if (S>SPEEDMAX){
SPEEDMAX = S; }
CONVERTIR(); u8g2.firstPage(); do { draw(); } while( u8g2.nextPage() ); DIST_MEMORIA = DIST + DISTV; if ((millis() - lastturnodo) > 30000) { // Guarda la distancia cada 30 segundos para no gastar la memoria del arduino
EEPROM.put(2, DIST_MEMORIA); // write ODO in EEPROM
#include // EEPROM library #include #include U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8); volatile unsigned long lastturn, time_press; volatile float SPEED; volatile float DIST_PUERTA; //Distancia para puertas volatile float DIST; //Distancia odometro volatile boolean eeprom_flag; float w_length = 0.231; // un giro de rueda equivale a 8 tiks, cada tik equivale a 0.231 metros boolean flag; boolean state, button; int BOTON_RESET = 2; int PUERTA = 5; int BOMBA = 6; /*---------filtros de salida de velocidad */ float Y = 0.0; float ALPHA = 0.25; float S = Y ; char VELOCIDAD [5]; char DISTANCIA [5]; void setup() { Serial.begin(9600); // Poder calibrar con la pc u8g2.begin(); u8g2.enableUTF8Print(); u8g2.setFont(u8g2_font_t0_22_mf); //u8g2.setFont(u8g2_font_VCR_OSD_tf); //u8g2.setFont(u8g2_font_logisoso16_tf); //u8g2.setFont(u8g2_font_luRS18_tr); u8g2.setColorIndex(1); u8g2.firstPage(); do { intro(); } while( u8g2.nextPage() ); attachInterrupt(digitalPinToInterrupt(3), sens, RISING); // paso de bajo a alto del sensor hall pinMode(2, INPUT); // boton reset odometro pinMode(5, OUTPUT); // control puertas pinMode(6, OUTPUT); // control bomba hidraulica digitalWrite (PUERTA, HIGH); digitalWrite (BOMBA, HIGH); delay(7000); DIST_PUERTA = 0; DIST = (float)EEPROM.read(0) / 10.0; // Memorizar la distancia } void sens() { if (millis() - lastturn > 2) { // Filtro de ruido en la linea SPEED = w_length / ((float)(millis() - lastturn) / 1000) * 3.6; // calculate speed lastturn = millis(); // tiempo entre pasos bajo-alto del sensor hall DIST_PUERTA = DIST_PUERTA + w_length / 1000; DIST = DIST + w_length / 1000; // Sumas la distancia, en mi caso 23 centímetros cada paso bajo-alto } eeprom_flag = 1; } void loop() { Serial.print(" Dist: "); Serial.print( DIST ); Serial.print( " km"); Serial.print(" Vel_filtro: "); Serial.print( S ); Serial.println( " km/h"); PUERTAS(); //CONTROL_BOMBA (); // Lo tengo desactivado, pero podrías tener un relay que active alguna función, una alarma en caso de rebasar el limite de velocidad, etc. if ((millis() - lastturn) > 1000) { // if there is no signal more than 1 seconds SPEED = 0; // so, speed is 0 if (eeprom_flag) { // if eeprom flag is true EEPROM.write(0, (float)DIST * 10.0); // write ODO in EEPROM eeprom_flag = 0; // flag down. To prevent rewritind } } BOTON_RESET = digitalRead (2); if (BOTON_RESET == HIGH) { // Borras la distancia del odometro DIST = 0; // } Y = SPEED ; S = (ALPHA * Y) + ((1-ALPHA)*S); // suaviza el aumento o decremento de la velocidad, dando tiempo a tener números legibles en el tablero. CONVERTIR(); u8g2.firstPage(); do { draw(); } while( u8g2.nextPage() ); } void draw(){ u8g2.drawFrame(0,0,128,42); u8g2.drawFrame(0,44,128,20); u8g2.setFont(u8g2_font_t0_15b_mf); u8g2.drawStr(5, 13, "Velocidad"); u8g2.setFont(u8g2_font_fub20_tf); u8g2.drawStr( 15, 38, VELOCIDAD); u8g2.setFont(u8g2_font_t0_15b_mf); u8g2.drawStr(90, 38, "km/h"); u8g2.drawStr(8,59, "Dist: "); u8g2.drawStr(55, 59, DISTANCIA); u8g2.drawStr(105,59, "km"); } void PUERTAS () { if ((DIST_PUERTA >= 0.01)&& (DIST = 5) { digitalWrite (BOMBA, LOW); } else {digitalWrite (BOMBA, HIGH); } } void CONVERTIR(){ dtostrf(S, 3, 0, VELOCIDAD); dtostrf(DIST, 3, 2, DISTANCIA); } void intro() { u8g2.drawFrame(0,0,128,64); u8g2.setFont(u8g2_font_fub20_tf); u8g2.drawStr(14, 26, "DODGE"); u8g2.drawStr(2, 58, "NEON EV"); } La señal del sensor la haces como un arreglo de boton pull up, en mi caso con una resistencia de 1K, con la de 10K no me funcionaba muy bien. Saludos.
Excelente video, te quedó muy bien presentados los instrumentos! 👏👏
wooooooow, te quedó genial
tendrás la simulación?
Hola, que gran trabajo, quiero ver la velocidad como en el minuto 4:07 y que me cuente los kilómetros sin que se borren aunque desconecten la batería, para poderle dar mantenimiento a mi vehículo, es una camioneta que se le cambio motor y transmisión, me podrías orientar como hacer solo esa parte por favor. ya vi que el sensor es de efecto hall.
Hola Eduardo gracias, puedes utilizar la función EEPROM.put, y te permite almacenar datos en la memoria no volátil, solo cuida de que el guardado sea cada minuto o más para que no consumas los ciclos de vida de la memoria, en mi caso lo tengo cada minuto, y para recuperar la distancia total recorrida y almacenada puedes usar la función EEPROM.get. En la pagina de arduino viene mejor explicado como usar ambas funciones. Saludos amigo
Hola , se puede hacer solo esa funcion de avanzar 10 metros y que se cierren los seguros?
Si, o al pasar de 15 km/hr también se podría, por distancia o por velocidad.
@@EliudUrba y eso como se podria hacer?
@@Christopher-kp4nx Que tienes en mente hacer, o que llevas de tu proyecto? El código sería más o menos como el siguiente:
void PUERTAS () {
if ((DIST_PUERTA >= 0.01)&& (DIST
@@EliudUrba basicamente busco automatizar mi auto , como es uno de los 90s no trae funciones automáticas como esa. Tambien queria ver si se puede hacer algun tipo de barrido de agujas al abrir switch con arduino.
Están excelentes esos instrumentos se ve que le sabes muy bien a todo lo arduino, gran trabajo
Gracias, ahora vamos a instalarlo en el coche.
Wow, qué cool. Haría algo así para mi carro... SI TUVIERA UNO!
Gracias, si vieras el cogido te llevarías las manos a la cabeza con tantos errores, pero funcionó!!
@@EliudUrba Jaja, el día que vayas a vender tu código, lo optimizas. Si es para tí sólo, con que funcione vale 😜
@@EliudUrba yo quisiwra uno haci para mi moto
Que me marque rpm, kilometros por hora, temperatura, hora vivel de gasolina
Genial tu proyecto podrias facilitar el diagrma y codigo ? Yo estoy con un proyecto que se complementaria podriamos compartir proyectos .
Si proyecto se basa en el funcionamiento del kit boton start stop adapyable a autos sin ecu basado en arduino mi limitacion radica en que no soy un experto en programacion y me baso a prueva y error
Hola, a día de hoy con ChatGPT se puede desarrollar buenos proyectos, ya lo puse en práctica mejorando el código de ese proyecto de hace 4 años (Por lo que ya no tiene sentido que te comparta el código viejo) . Te recomiendo que busques videos de Arduino + ChatGPT. Saludos
@@EliudUrba estuve probando ChatGPT pero me da mas problemas que soluciones. si cuentas con tu código aun podrías compartírmelo? o alguno mas actual que tengas como para partir de alguna base....
@@lucianolobo8041
#include // EEPROM library
#include
#include
U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8);
/*-----------display-----------
#include
int SCLK = 7;
int RCLK = 6;
int DIO = 5;
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char LED_0F[29];
-----------display-----------
*/
volatile unsigned long lastturn, time_press;
volatile unsigned long lastturnodo;
//volatile unsigned long TIMEH;
//volatile float KMS;
volatile float SPEED;
volatile float SPEEDMAX;
//volatile float SPEEDPROM;
volatile float DISTV=0; //Distancia viaje
volatile float DIST; //Distancia odometro
volatile boolean eeprom_flag;
boolean flag;
float w_length = 0.22; // un giro de rueda equivale a 8 tiks, cada tik equivale a 0.22 metros
/*---------filtros de salida de velocidad */
float Y = 0.0;
float ALPHA = 0.14; // Cercano a 0 la respuesta es lenta, en 0.20 la respuesta es media mientras que en 0.50 la respuesta es rapida, casi similar a la señal.
float S = Y ;
char VELOCIDAD [5];
char VELMAX [10];
//char VELPROM [15];
char DISTANCIAV [20];
char DISTANCIA [25];
float DIST_MEMORIA;
void setup() {
Serial.begin(9600); // configure serial for debug
u8g2.begin();
u8g2.enableUTF8Print();
u8g2.setFont(u8g2_font_luBIS19_tf); // u8g2_font_t0_22_mf
//u8g2.setFont(u8g2_font_VCR_OSD_tf);
//u8g2.setFont(u8g2_font_logisoso16_tf);
//u8g2.setFont(u8g2_font_luRS18_tr);
u8g2.setColorIndex(1);
u8g2.firstPage();
do {
intro();
} while( u8g2.nextPage() );
attachInterrupt(digitalPinToInterrupt(3), sens, RISING); // hall sensor interrupt
// pinMode(2, INPUT); // boton reset odometro
// pinMode(5, OUTPUT); // control puertas
// pinMode(6, OUTPUT); // control bomba hidraulica
// digitalWrite (PUERTA, HIGH); // high es igual a apagado - low es igual a encendido
// digitalWrite (BOMBA, LOW); // high es igual a apagado - low es igual a encendido
delay(5000);
// DIST_PUERTA = 0;
//DIST_MEMORIA = 9106.1;
//EEPROM.put (2, DIST_MEMORIA);
DIST = EEPROM.get(2, DIST_MEMORIA); // remember some distance
}
void sens() {
if (millis() - lastturn > 7) {
SPEED = w_length / ((float)(millis() - lastturn) / 1000) * 3.6; // calculate speed
lastturn = millis(); // remember time of last revolution
DISTV = DISTV + w_length / 1000;
// DIST = DIST + w_length / 1000; // calculate distance
}
}
void loop() {
if ((millis() - lastturn) > 500) { // if there is no signal more than 1 seconds
SPEED = 0; // so, speed is 0
}
Y = SPEED ;
S = (ALPHA * Y) + ((1-ALPHA)*S);
if (S>SPEEDMAX){
SPEEDMAX = S;
}
CONVERTIR();
u8g2.firstPage();
do {
draw();
} while( u8g2.nextPage() );
DIST_MEMORIA = DIST + DISTV;
if ((millis() - lastturnodo) > 30000) { // Guarda la distancia cada 30 segundos para no gastar la memoria del arduino
EEPROM.put(2, DIST_MEMORIA); // write ODO in EEPROM
lastturnodo = millis();
}
}
void draw(){
u8g2.drawFrame(0,0,128,64);
u8g2.setFont(u8g2_font_streamline_computers_devices_electronics_t); //u8g2_font_emoticons21_tr
u8g2.drawStr( 2, 33,"1");
u8g2.setFont(u8g2_font_fub30_tn);
u8g2.drawStr( 28, 36, VELOCIDAD);
u8g2.setFont(u8g2_font_t0_11_tf);
u8g2.drawStr(94, 33, "km/h");
u8g2.drawFrame(0,39,128,14);
u8g2.drawStr(2,50, "Vmax: ");
u8g2.drawStr(37, 50, VELMAX);
u8g2.drawStr(60, 50, "km/h");
// u8g2.drawStr(60,50, "Vprom: ");
// u8g2.drawStr(101, 50, VELPROM);
//u8g2.drawStr(55, 50, "km/h");
u8g2.drawFrame(0,52,128,12);
u8g2.drawStr(2,62, "D1: ");
u8g2.drawStr(25, 62, DISTANCIAV);
//u8g2.drawStr(50,62, "km");
u8g2.drawStr(58,62, "ODO: ");
u8g2.drawStr(82, 62, DISTANCIA);
// u8g2.drawStr(117,63, "km");
}
void CONVERTIR(){
dtostrf(S, 3, 0, VELOCIDAD);
dtostrf(SPEEDMAX, 3, 0, VELMAX);
//dtostrf(SPEEDPROM, 3, 1, VELPROM);
dtostrf(DISTV, 5, 2, DISTANCIAV);
dtostrf(DIST_MEMORIA, 5, 1, DISTANCIA);
}
void intro() {
u8g2.setFont(u8g2_font_luBIS19_tf); //u8g2_font_bubble_tr , u8g2_font_luBIS19_tf
u8g2.drawStr(10, 26, "DODGE");
u8g2.drawStr(0, 58, "NEON EV");
}
Avisame cuando lo copies para poder borrarlo
Muy bueno
Hola Jose, estoy buscando un bms con pantalla LCD para adaptarla también al tablero, crees que sea posible?? Saludos!
Podrías pasar el código y cicuito
#include // EEPROM library
#include
#include
U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8);
volatile unsigned long lastturn, time_press;
volatile float SPEED;
volatile float DIST_PUERTA; //Distancia para puertas
volatile float DIST; //Distancia odometro
volatile boolean eeprom_flag;
float w_length = 0.231; // un giro de rueda equivale a 8 tiks, cada tik equivale a 0.231 metros
boolean flag;
boolean state, button;
int BOTON_RESET = 2;
int PUERTA = 5;
int BOMBA = 6;
/*---------filtros de salida de velocidad */
float Y = 0.0;
float ALPHA = 0.25;
float S = Y ;
char VELOCIDAD [5];
char DISTANCIA [5];
void setup() {
Serial.begin(9600); // Poder calibrar con la pc
u8g2.begin();
u8g2.enableUTF8Print();
u8g2.setFont(u8g2_font_t0_22_mf);
//u8g2.setFont(u8g2_font_VCR_OSD_tf);
//u8g2.setFont(u8g2_font_logisoso16_tf);
//u8g2.setFont(u8g2_font_luRS18_tr);
u8g2.setColorIndex(1);
u8g2.firstPage();
do {
intro();
} while( u8g2.nextPage() );
attachInterrupt(digitalPinToInterrupt(3), sens, RISING); // paso de bajo a alto del sensor hall
pinMode(2, INPUT); // boton reset odometro
pinMode(5, OUTPUT); // control puertas
pinMode(6, OUTPUT); // control bomba hidraulica
digitalWrite (PUERTA, HIGH);
digitalWrite (BOMBA, HIGH);
delay(7000);
DIST_PUERTA = 0;
DIST = (float)EEPROM.read(0) / 10.0; // Memorizar la distancia
}
void sens() {
if (millis() - lastturn > 2) { // Filtro de ruido en la linea
SPEED = w_length / ((float)(millis() - lastturn) / 1000) * 3.6; // calculate speed
lastturn = millis(); // tiempo entre pasos bajo-alto del sensor hall
DIST_PUERTA = DIST_PUERTA + w_length / 1000;
DIST = DIST + w_length / 1000; // Sumas la distancia, en mi caso 23 centímetros cada paso bajo-alto
}
eeprom_flag = 1;
}
void loop() {
Serial.print(" Dist: ");
Serial.print( DIST );
Serial.print( " km");
Serial.print(" Vel_filtro: ");
Serial.print( S );
Serial.println( " km/h");
PUERTAS();
//CONTROL_BOMBA (); // Lo tengo desactivado, pero podrías tener un relay que active alguna función, una alarma en caso de rebasar el limite de velocidad, etc.
if ((millis() - lastturn) > 1000) { // if there is no signal more than 1 seconds
SPEED = 0; // so, speed is 0
if (eeprom_flag) { // if eeprom flag is true
EEPROM.write(0, (float)DIST * 10.0); // write ODO in EEPROM
eeprom_flag = 0; // flag down. To prevent rewritind
}
}
BOTON_RESET = digitalRead (2);
if (BOTON_RESET == HIGH) { // Borras la distancia del odometro
DIST = 0; //
}
Y = SPEED ;
S = (ALPHA * Y) + ((1-ALPHA)*S); // suaviza el aumento o decremento de la velocidad, dando tiempo a tener números legibles en el tablero.
CONVERTIR();
u8g2.firstPage();
do {
draw();
} while( u8g2.nextPage() );
}
void draw(){
u8g2.drawFrame(0,0,128,42);
u8g2.drawFrame(0,44,128,20);
u8g2.setFont(u8g2_font_t0_15b_mf);
u8g2.drawStr(5, 13, "Velocidad");
u8g2.setFont(u8g2_font_fub20_tf);
u8g2.drawStr( 15, 38, VELOCIDAD);
u8g2.setFont(u8g2_font_t0_15b_mf);
u8g2.drawStr(90, 38, "km/h");
u8g2.drawStr(8,59, "Dist: ");
u8g2.drawStr(55, 59, DISTANCIA);
u8g2.drawStr(105,59, "km");
}
void PUERTAS () {
if ((DIST_PUERTA >= 0.01)&& (DIST = 5) {
digitalWrite (BOMBA, LOW);
}
else {digitalWrite (BOMBA, HIGH);
}
}
void CONVERTIR(){
dtostrf(S, 3, 0, VELOCIDAD);
dtostrf(DIST, 3, 2, DISTANCIA);
}
void intro() {
u8g2.drawFrame(0,0,128,64);
u8g2.setFont(u8g2_font_fub20_tf);
u8g2.drawStr(14, 26, "DODGE");
u8g2.drawStr(2, 58, "NEON EV");
}
La señal del sensor la haces como un arreglo de boton pull up, en mi caso con una resistencia de 1K, con la de 10K no me funcionaba muy bien.
Saludos.
Cuánto me cuesta , que me hagas uno para mi auto ? Gracias bro
Hola, excelente presentación tengo el código, podrías proporcionarnos el diagrama de conexión arduino, pantalla y gps, de antemano muchas gracias