Rastreador GPS con arduino

Publicado el: 23 de junio de 2019
Intermedio
Acerca de este proyecto
Rastreador de personas u objetos en tiempo real usando la tarjeta arduino, modulo GPS y modulo SIM800l, se usa un mapa de open-layers.
gps rastreador localizador
Publicidad
DETALLES

Proyecto de un rastreador de personas u objetos en tiempo real usando la tarjeta arduino, modulo GPS y modulo SIM800l. En  una ocasi贸n realice este mismo proyecto utilizando la tarjeta linkit one aprovechando que ya viene con todos los m贸dulos incluidos,pero presenta una desventaja y es que tiene a la fecha de hoy (junio de 2019) un precio de 60 dolares mas el envio, por tal raz贸n se les dificulta a varias personas conseguirla. Por eso hice esta versi贸n que es mas econ贸mica y cuyos componentes son f谩ciles de conseguir.

Proyecto final


LISTA DE MATERIALES

  • Tarjeta arduino Uno, nano, micro o sequivalente.
  • Modulo GPS NEO6M.
  • Modulo SIM 800L.
  • SIM CARD con saldo para conectarse a la red.
  • Modulo elevador de voltaje (boost Up)
  • Bateria de 3,7v @2700 mAh.
  • Cables de conexion
  • Dominio y hosting web para alojar el mapa.

Arduino

Gps

Sim800l

Sim card

Modulo elevador

Bateria




DIAGRAMA ESQUEM脕TICO


Diagrama


VIDEO DE FUNCIONAMIENTO



CONSIDERACIONES IMPORTANTES:


El modulo SIM800L puede alcanzar picos de corriente de hasta 2A, por eso se recomienda utilizar una bateria LIPO que suministre por lo menos 2000mAh, si no, se va a estar reiniciando el modulo constantemente.

El modulo SIM800l trabaja con voltajes entre 3,4V y 4,4V, por tal raz贸n no se le debe conectar una fuente de voltaje de 5V porque se da帽a.

Si se usa una versi贸n de arduino que trabaje con 3,3 V, se puede eliminar el modulo elevador de voltaje.

Se recomienda contratar un dominio y hosting as铆 sea gratuito, ya que si se prueba en un servidor local (localhost) es posible que no funcione debido a restricciones o bloqueos de ese servidor.


En modo general, el GPS obtiene las coordenadas (latitud y longitud de donde se encuentre), se las pasa al arduino a trav茅s del puerto serial, este las procesa y se las envia al modulo SIM800L, este a su vez conectado a Internet, se conecta al sitio web encargado de recibir dichas coordenadas (archivo guardar.php en este proyecto). Este archivo almacena esas coordenadas en la base de datos; hay una pagina llamada funciones.js cuyo c贸digo javascript se encarga de cada cierto tiempo leer los datos de la base de datos (latitud y longitud ) y pasar esos datos a la funcion encargada de mostrar el marcador en el mapa de open-layers.

Los c贸digos se encuentran en la secci贸n de codificaci贸n, si desea descargar los c贸digos para la pagina web haga clic en este enlace.

Si tiene dudas o comentarios puedes escribirme a mi whatsap: (+57) 3205341673.








CODIFICACI脫N
Codigo arduino-
Este es el codigo que se debe cargar en la tarjeta arduino.
//  Declaracion de variables
#include 

String lat = '0.00';
String lon = '0.00';

#include   //Para el manejo de varios puertos seriales

//SoftwareSerial variables
static const int gpsRX = 3, gpsTX = 4;  //Gps
static const int simRX = 8, simTX = 9;  //Gprs (GSM)-sim card

static const uint32_t gpsBaud = 9600;
static const uint32_t simBaud = 9600;

//SoftwareSerial instances
NeoSWSerial gpsPort(gpsRX, gpsTX);
NeoSWSerial Sim800l(simRX, simTX);

//GPS instance
TinyGPSPlus gps;

//Reemplazar con sus datos de operador m贸vil
#define APN_CLARO  'internet.comcel.com.co'
#define APN_TIGO = 'web.colombiamovil.com.co'
#define APN_MOVISTAR 'internet.movistar.com.co'
#define APN_UFF = 'web.uffmovil.com'
#define APN_UNE = 'www.une.net.co'

//  Para el envio de datos al servidor
String servidor = 'www.misitioweb.com/rastreador/open-layers'; //  Colocar aca la URL del servidor donde se guardaran los datos
String APN = APN_MOVISTAR;

String response = '';
static long maxResponseTime = 5000;
unsigned long lastTime;

//  Frecuencia de peticiones HTTP (seconds)
int refreshRate = 15; //  Segundos

unsigned long last;
unsigned long current;
unsigned long elapsed;

//if there is an error in sendLocation() function after the GPRS Connection is setup - and the number of errors exceeds 3 - the system reboots. (with the help of the reboot pin) 
int maxNumberOfErrors = 3;
boolean gprsConnectionSetup = false;
boolean reboot = false;
int errorsEncountered = 0; // numero de erores encontrados luego que se configure el gprs, si se excede ese numero,se reinicia el modulo

void setup(){

  //Inicio
  Serial.begin(9600);
  gpsPort.begin(gpsBaud);
  Sim800l.begin(simBaud);
    
  Serial.println('Comenzando...');
  delay(15000); //  Esperamos que el modulo SIM consiga se帽al  
  
  Sim800l.listen(); //  Colocamos al modulo SIM a escuchar
  setupGPRSConnection(); // Habilita la conexiona a la red
  Serial.println('Conexion configurada');
  
  gpsPort.listen(); //  Colocamos al modulo GPS a escuchar

  last = millis();
  
}

void loop(){

  current = millis();
  elapsed += current - last;
  last = current;
  
  //Serial.println(elapsed);
  
  while (gpsPort.available()>0) {
      gps.encode(gpsPort.read());
    }
  if(elapsed >= (refreshRate * 1000)) {
    sendData();
    elapsed -= (refreshRate * 1000);
  } 
}

void sendData(){
 
  if (gps.location.isUpdated()){
     
      lat = String(gps.location.lat(),6);
      lon = String(gps.location.lng(),6);

    sendLocation(lat, lon);
  } else {
    sendLocation('-1', '-1');
    
  }
}

void setupGPRSConnection(){
 Sim800l.println('AT+SAPBR=3,1,\'Contype\',\'GPRS\''); // tipo de conexion: GPRS
 waitUntilResponse('OK');
 Sim800l.println('AT+SAPBR=3,1,\'APN\',\'' + APN + '\''); // Configuramos el APN
 waitUntilResponse('OK');
 Sim800l.println('AT+SAPBR=1,1'); //  
 waitUntilResponse('OK');
 Sim800l.println('AT+HTTPINIT'); // Habilita el modo HTTP
 waitUntilResponse('OK');
 gprsConnectionSetup = true;
}

//  Manejado de errores, informa si hubo un error o todo esta OK
void waitUntilResponse(String resp){ 
  lastTime = millis();
  response='';
  String totalResponse = '';
  while(response.indexOf(resp) < 0 && millis() - lastTime < maxResponseTime)
  { 
    readResponse();
    totalResponse = totalResponse + response;
    Serial.println(response);
  }
  
  if(totalResponse.length() <= 0)
  { 
    Serial.println('SIN RESPUESTA');
    
    if (gprsConnectionSetup == true){
      Serial.println('error');
      errorsEncountered++;
    }
  }
  else if (response.indexOf(resp) < 0)
  { 
    if (gprsConnectionSetup == true){
      Serial.println('error');
      errorsEncountered++;
    }
    Serial.println('RESPUESTA INESPERADA');
    Serial.println(totalResponse);
    
  }else{
    Serial.println('EXITOSO');    
    errorsEncountered = 0;
  }

  //if there are more errors or equal than previously set ==> reboot!
  if (errorsEncountered>= maxNumberOfErrors){
    reboot = true;
  }
}

//  Aca se realiza el envio de los datos a la pagina web
void sendLocation(String lat, String lon){
 Sim800l.listen();
 // La URL a la cual nos vamos a conectar
 Sim800l.println('AT+HTTPPARA=\'URL\', \'http://' + servidor +  '/guardar.php?dev_id=13&lati=' + lat + '&longi=' + lon + '\'');
 waitUntilResponse('OK');
 //GO
 Sim800l.println('AT+HTTPACTION=0');
 waitUntilResponse('200');
 Serial.println('Posicion enviada');
 gpsPort.listen();
}

void readResponse(){
  response = '';
  while(response.length() <= 0 || !response.endsWith('\n'))
  {
    tryToRead();
    if(millis() - lastTime > maxResponseTime)
    {
      return;
    }
  }
}

void tryToRead(){ 
  while(Sim800l.available()){
    char c = Sim800l.read();  //gets one byte from serial buffer
    response += c; //makes the string readString
  }
}


funciones.js-
Archivo javascript que se encarga de leer los datos devueltos por la pagina que toma las coordenadas almacenadas en la base de datos para visualizar esa posicion en el mapa.
   var flickrSource = new ol.source.Vector();


    function flickrStyle(feature) {
      var style = new ol.style.Style({
        image: new ol.style.Circle({
          radius: 7,
          stroke: new ol.style.Stroke({
            color: 'green',
            width: 2
          }),
          fill: new ol.style.Fill({
            color: 'red'
          })
        })
      });
      return [style];
    }

    var flickrLayer = new ol.layer.Vector({
      source: flickrSource,
      style: flickrStyle
    });

    var layer = new ol.layer.Tile({
      source: new ol.source.OSM()
    });

    var center = ol.proj.transform([-74.79296939370965,11.006678425874313], 'EPSG:4326', 'EPSG:3857');

    var view = new ol.View({
      center: center,
      zoom: 18
    });

    var map = new ol.Map({
      target: 'map',
      layers: [layer, flickrLayer],
      view: view
    });

     setInterval(leer,10000);

    // when jQuery has loaded the data, we can create features for each photo
    function successHandler(data) {
      // we need to transform the geometries into the view's projection
        var transform = ol.proj.getTransform('EPSG:4326', 'EPSG:3857');
      // loop over the items in the response
        data.items.forEach(function(item) {
        // create a new feature with the item as the properties
        var feature = new ol.Feature(item);
        // add a url property for later ease of access
        //feature.set('url', item.media.m);
        // create an appropriate geometry and add it to the feature
                
        var coordinate = transform([parseFloat(item.longitude), parseFloat(item.latitude)]);
        var geometry = new ol.geom.Point(coordinate);
        feature.setGeometry(geometry);
        // add the feature to the source
        flickrSource.addFeature(feature);
        setCenter();
      });
    }

    function setCenter() {
     
    var view = map.getView();
    var center = view.getCenter();
    var centerInPx = map.getPixelFromCoordinate(center);
    var newCenterInPx = [centerInPx[0] + 50, centerInPx[1]];
    var newCenter = map.getCoordinateFromPixel(newCenterInPx);
    view.setCenter(newCenter);
    }

    function pan() {

      setCenter('11.006678425874313','-74.79296939370965');
    }

    function leer() {
    flickrSource.clear()
    $.ajax({
      url: 'data.json',
      dataType: 'jsonp',
      jsonpCallback: 'jsonFlickrFeed',
      success: successHandler
    });
  }



Coordenadas.php-
Pagina con las funcione para actualizar y obtener las coordenadas
latitud;
}

public function set_latitud($latitud)
{
	$this->latitud = $latitud;
}

public function get_longitud()
{
	return $this->longitud;
}

public function set_longitud($latitud)
{
	$this->longitud = $longitud;
}

//constructor de la clase
public function __construct()
    {
        parent::__construct();
    } 

function grabarCoordenadas($latitud,$longitud)

{
	
	$tabla = 'td_coordenadas';	
		
	$stmt = $this->_db->prepare('UPDATE  $tabla SET latitud=?,longitud=?');
				
	$stmt->bind_param('ss',$latitud,$longitud);

	$retorno=$stmt->execute();

	if($retorno)
	{
	
	}

	
}

function obtener_coordenadas()

{
	
	$table = 'td_coordenadas';

	$consulta ='SELECT * FROM $table';
		
	$resultado = $this->_db->query($consulta);
	        
	//$coordenadas = $respuesta->fetch_all(MYSQLI_ASSOC);  

	//return $coordenadas;
	$datos = array();
        
      while($fila = $resultado->fetch_all(MYSQLI_ASSOC))
        {
            $datos[] = $fila;
        }

      echo json_encode($datos);
	
}


}
Guardar.php-
Esta es la pagina a la cual se conecta el modulo SIM800L para enviarle las coordenadas del GPS, este archivo las recibe y las guarda en la base de datos.
grabarCoordenadas($latitud,$longitud);


?>
index-
Esta es la pagina de inicio
<!DOCTYPE html>
<html>
  <head>

    <title>Rastreador con open layers</title>

     <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>

    <!-- Latest compiled JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script> 

    <link rel="stylesheet" href="http _openlayersbook.github.io_openlayers_book_samples_assets_ol3_css_ol.css" type="text/css" />
    <link rel="stylesheet" href="http _openlayersbook.github.io_openlayers_book_samples_assets_css_samples.css" type="text/css" />

    <link rel="stylesheet" type="text/css" href="estilos/estilos.css">
  </head>

  <body>

    <div class="container">

      <div class="row">

        <div class="col-md-8">

        <div class="contenedor">
          <div class="text-center bg-success">
          <span  class="text-bold">Suscribete a mi canal </span>
          <span class="text-primary">sistemasymicros</span>
        </div>

          <div id="map" class="map">
            
          </div>  <!-- End DIV map -->

        </div>  <!-- End DIV contenedor -->

      </div>

      <div class="col-md-4">
        
      </div>

      </div>  <!-- End DIV row -->

    </div>  <!-- End DIV container -->

    <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script src="ruta/http%20_openlayersbook.github.io_openlayers_book_samples_assets_ol3_js_ol-debug.js"></script>

    <script type="text/javascript" src="jquery/funciones.js"></script>
    
  </body>

</html>
Download me
Autor: sistemasymicros
24 proyectos 1 seguidores 0 siguiendo

Ingeniero en electronica, desarrollador de software. Desarrollo de proyectos con microcontroladores.

COMENTARIOS
Para publicar un comentario debes