Ir al contenido principal

TOMTUN V2 , AHORA CON EL CODIGO




En poco tiempo tendré listo este nuevo gps casero,

Esta vez el chasis elegido ha sido el de una lata de huevas de bacalao. La lata anterior, de conservas de otra marca , es cojononudamente sólida , pero la forma en si , ovalada, dificulta un poco el montaje.

Esta lata es mas blandita, con la dremel se trabaja mejor y tiene unas dimensiones en las que se aprovecha mejor el espacio interior. La unica pega es que es mas blandita y se puede bollar con mas facilidad.

Incorporará las características de su predecesor:

- Mostrar la posicion gps en coordenadas.
- Fecha y hora de los satélites.
- Mostrar número de satélites adquiridos.
- Velocidad, en km/h.
- Pitada por exceso de velocidad, configurable.

Pero además, gracias a las nuevas funciones de la libreria TinyGps, que es la que estoy utilizando, se van a añadir las siguientes funcionalidades:

- Memorizar un lugar.
- Visualizar la distancia de la que nos alejamos de esa coordenada.
- Sistema de orientacion por flechas en la pantalla de la dirección que debemos seguir para regresar a   ese punto.

Otra mejora que está ya incorporada es que el modulo gps sobresale de la lata, asi la recepción debe mejorar notablemente y seguro que se elimina la pequeña velocidad que salía en el anterior modelo a pesar de estar en reposo.

Estoy contento por que Mikal Hart, autor de la libreria que utilizo, me felicitó al mostrarle a través del foro de su página el trabajo realizado con la otra lata-gps.


 En breve estará funcionando.


EDICION 31 DE OCTUBRE 2013:



El gps funciona al pelo. aqui esta el codigo:


 #include <SoftwareSerial.h>
 #include <LiquidCrystal.h>
 #include <TinyGPS.h>
 #include<stdlib.h>
 TinyGPS gps;
 // initialize the library with the numbers of the interface pins
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 SoftwareSerial nss(6, 7);// RX, TX
 int botc = 8;
 int bota = 9;
 int botb = 10;
 float flat, flon, falt;
 float POS_LAT , POS_LON;
 int year;
 byte month, day, hour, minutes, second, hundredths;
 unsigned long fix_age;
 char buf[12];
 char buf2[12];
 byte modo = 0;
 float fkmph = 0 ;
 byte LIMvel = 50;
 int distancia = 0 ;



void setup() {
 // set up the LCD's number of columns and rows:
 lcd.begin(16, 2);
 // Print a message to the LCD.
 lcd.print("TOMTUN V2.1");
 delay(3000);
 lcd.clear();
 nss.begin (4800);
 lcd.print("BUSCANDO...");
 pinMode(bota, INPUT);
 pinMode(botb, INPUT);
 pinMode(botc, INPUT);




 }
 void loop()
 {
 
 if (digitalRead(bota) == HIGH) { // CAMBIAR DE MODO
 tone(13,3500,200);
 modo = modo + 1;
 delay (200);
 if (modo  == 7 ){ modo = 0 ;}
 } // FIN DE COMPROBAR BOTON A (modo)
 
 
 while (nss.available())
 {


 if (gps.encode(nss.read()))
 {

 // adquirir valores de la sentencia NMEA
 gps.f_get_position(&flat, &flon, &fix_age);
 gps.crack_datetime(&year, &month, &day, &hour, &minutes, &second, &hundredths, &fix_age);
 fkmph =  gps.f_speed_kmph();



 switch (modo){
  case 0:
  dtostrf(flat, 3, 7, buf);
  dtostrf(flon, 3, 7, buf2);
   lcd.clear();
   lcd.setCursor (0,0);
   lcd.print(buf);     //era buff
   lcd.setCursor (0,1);
   lcd.print(buf2);      // erar buff2
 break;
 
 case 1:


 lcd.clear();
 lcd.setCursor (0,0);
 lcd.print("SATELITES: ");
 lcd.print(gps.satellites());
 //delay(500);
 break;

 case 2:

 lcd.clear();
 lcd.setCursor (0,0);
 lcd.print(day);
 lcd.print("/");
 lcd.print(month);
 lcd.print("/");
 lcd.print(year);
 lcd.setCursor (0,1);
 lcd.print(hour + 2);
 lcd.print(":");
 lcd.print(minutes);
 lcd.print(":");
 lcd.print(second);
// delay(200);


 break;



 case 3:

 lcd.clear();
 lcd.setCursor (0,0);
 lcd.print("VELOC: ");
 lcd.print(int (fkmph));
 lcd.print(" Km/h");
 lcd.setCursor (0,1);
 lcd.print("ALTITUD: ");
 falt = gps.f_altitude();
 lcd.print(int (falt));
 lcd.print(" m");
 //delay(1000);
 break;

 case 4:
 lcd.clear();
 lcd.setCursor (0,0);
 lcd.print ("AVISO V.max");
 lcd.setCursor (0,1);
 lcd.print (LIMvel);

 if (digitalRead(botb) == HIGH  ||  digitalRead(botc) == HIGH)  {
 
 delay (200);

 for ( int x = 0 ; x < 10; x++) { // durante unos segundos que se pueda cambiar el limite de LIMvel.
 lcd.clear();

 if ((digitalRead(botb) == HIGH) && (LIMvel > 0) ){

 LIMvel = LIMvel - 10;

 }

delay (200);

 if (digitalRead(botc) == HIGH) {
 LIMvel = LIMvel + 10;

 }

delay (200);

lcd.print(LIMvel);
delay (500);

if (digitalRead(bota) == HIGH){
 lcd.clear();
 lcd.print("NUEVO LIMITE");
 lcd.setCursor (0,1);
 lcd.print(LIMvel);
 delay (500);
 modo = 5;
// aqui habia un break
}


 } //fin de proceso editar limite de LIMvel


 }// fin de comprobar si ha pulsado botones para editar limite de LIMvel



 break;




 case 5:    // fijar posicion actual

 lcd.clear();
 lcd.setCursor (0,0);
 lcd.print("GUARDAR");
 lcd.setCursor (0,1);
 lcd.print("POSICION?");
 delay(1000);


 if ((digitalRead(botb) == HIGH) && (digitalRead(botc) == HIGH) ){
 
 POS_LAT = flat;
 POS_LON = flon;
   
 lcd.clear();
 lcd.setCursor (0,0);
 lcd.print("OK, POSICION");
 lcd.setCursor (0,1);
 lcd.print("GUARDADA");
 delay (1000);
 modo = 6;
 }
 break;

 case 6:
 if (int (POS_LAT) != 0 && int (POS_LON) != 0) {


 lcd.clear();

 distancia  = gps.distance_between(flat, flon, POS_LAT, POS_LON) ;

 lcd.setCursor (0,0);
 lcd.print("DIST ");
 lcd.setCursor (5,0);
 lcd.print(int(distancia));
 lcd.print("m ");
 lcd.print(gps.cardinal( gps.course_to(flat, flon, POS_LAT, POS_LON)));

 lcd.setCursor (0,1);
 lcd.print("VEL ");
 lcd.setCursor (4,1);
 //fkmph = gps.f_speed_kmph();
 lcd.print(int(fkmph));
 lcd.print("Km/h ");

 lcd.print (gps.cardinal(gps.course()));


// tema de la flechita , falta revisar.
// if (dir < 0) { dir += 360; }
// if (dir > 180) { dir -= 360; }
//
//
// if (dir < 0) {
//    lcd.print("< ");  // destination is to your left
// } else {
//    lcd.print("> ");  // destination is to your right
// }
// delay ?



 } else {

   modo = 0;

 }

 break;

// case 7:     // MODO VARIO
//if (swvario == 0)
//{  
//  muestra = int (gps.f_speed_kmph());
//  swvario = 1;
//
//    } else    
//{  
//  muestra2 = int (gps.f_speed_kmph());
//  swvario = 0 ;
//      }
//    
////habia un delay
//
//
//   if (muestra != muestra2)  {  
//
//  //   delay (1000);
//
// muestra2 = int(gps.f_speed_kmph());
//    
//      if (muestra2 - muestra > 5)
// {tone (13,3500,200);}
//  
//      if (muestra2 - muestra < 5)
// {tone (13,1000,200);}
//      }
//
//
//
//
//
//lcd.clear();
//lcd.setCursor (0,0);
//lcd.print ("MODO VARIO");
//    
//      lcd.setCursor (0,1);
//      lcd.print (muestra2);
//      lcd.print ("Km/h");
// break;



 } // fin de modo

//delay (100);            // editado era 500

 // VAMOS MAS RAPIDO DE LA CUENTA?

 if ((LIMvel > 0) && ( int (fkmph) > LIMvel)) {
 tone(13,2500,100);
 delay (200);
 tone(13,2500,100);
 lcd.clear();
 lcd.setCursor (0,0);
 lcd.print("MODERE VELOCIDAD");
 lcd.setCursor (0,1);
 lcd.print("LIMITE ALCANZADO");
 delay (500);
 tone(13,2500,100);
 lcd.clear();
 lcd.setCursor (0,0);
 lcd.print("IBAS A:");
 lcd.setCursor (0,1);
 lcd.print(int (fkmph));
 lcd.print(" Km/h");
 delay (500);

 } // FIN DE POSIBLE PITADA POR EXCESO DE LIMvel
 nss.flush();

 } // FIN SENTENCIA DECODIFICADA

 } // FIN DE PUERTO DISPONIBLE
// nss.flush();
 } // FIN DE VOID LOOP


SE EDITARA ESTA ENTRADA MAS ADELANTE PARA AÑADIR VIDEO DEL GPS FUNCIONANDO.