Самодельный GPS трекер на базе SIM808 и Arduino nano

by alielectroadmin19.08.20160 комментарии
SIM808

Всем привет!

В данном видео я постарался описать примерный принцип работы прототипа системы самодельного GPS трекера на базе многофункционального модуля SIM808.

Этот модуль содержит в себе сразу три устройства — GSM, GPS и Bluetooth. Что позволяет использовать его в самых различных назначениях.
В моем примере запуск определения координат и отправка на сервер происходит по нажатию кнопки, подключенной к порту A1. Думаю, ни для кого даже из начинающих не составит труда изменить этот код таким образом, чтобы данные отправлялись регулярно через определенный промежуток времени или по внешнему воздействию(например при появлении сигнала на одном из входов платы Ардуино).
Что потребуется:
Модуль — SIM808
Плата Arduino nano — переходники(5шт.)
Можно использовать вот такой вариант антенны GSM
Керамическая антенна GPS

Схема подключения крайне проста, нужно лишь подобрать источник питания напряжением 6-12В и током не менее 2-х Ампер.
схема подключения

В видео подробный обзор работы скетча и программ для загрузки на сервер:

Ниже привожу скетч из видео и файлы для загрузки на сервер:

#include <SoftwareSerial.h>
SoftwareSerial GSMport(3, 2); // RX, TX

typedef struct {
    String latitude;
    String longitude;
    String datetime;
} MyDataGPS;

MyDataGPS dataGPS;
void gprs_init(void);
MyDataGPS getGPSLocation(void);
void gprs_send(String dataa, String datab, int dataA0, int dataA1);
String ReadGSM();

void setup() {

  Serial.begin(9600);
  GSMport.begin(9600);
  GSMport.println("AT+CLIP=1"); //устанавливаем чтобы номер входящего звонка определялся
  delay(300);
  GSMport.println("AT+DDET=1"); //устанавливаем прием DTMF
  delay(300);
  gprs_init();

  digitalWrite(A1,1); //подтяжка к 1
}

void loop() {
  char c;
  String str;

if (analogRead(A1)<100) {
  dataGPS = getGPSLocation();
  Serial.println("Level A1: "+String(analogRead(A1)));
  gprs_send(dataGPS.latitude, dataGPS.longitude, analogRead(A0), analogRead(A1));
}

  while (GSMport.available()) {  //отправляем данные с GSM в Serial
    c = GSMport.read();
    Serial.write(c);
    delay(10);
  }
  while (Serial.available()) {  //сохраняем входную от консоли строку в переменную str пока не конец строки
    c = Serial.read();
    GSMport.write(c);
    //str += c;
    //if (c == '\n') {
    // AnalyseCmd(&str);
    // str = "";
    delay(10);
  }
}


MyDataGPS getGPSLocation(void) {  //функция определения местоположения по GPS
  String v,v1,v2;
  String data[5];
  MyDataGPS d;
  int a = 0,b = 0;
  GSMport.println("AT+CGNSPWR=1");
  delay(1000);
  Serial.println(ReadGSM());
  GSMport.println("AT+CGNSINF");
  delay(400);
  delay(400);
  v = ReadGSM();
  Serial.println(v);
    
 for(int i=0;i<5;i++){ //парсинг данных между запятыми в массив строк
  a = v.indexOf(",",a);  //первое вхождение запятой
  if(a!=-1){
    b = v.indexOf(",",a+1);  //второе вхождение запятой после нашей первой запятой если a не -1
    data[i] = v.substring(a+1,b);
    Serial.println(String("Poluchennaya data: " + String(i)+" - "+ data[i]));
    a = b;
  }
 }
  d.datetime = data[1];
  d.latitude = data[2];
  d.longitude = data[3];
  return d;
}

void gprs_init(void) {  //Процедура начальной инициализации GSM модуля для GPRS
  int d = 500;
  Serial.println("---------------GPRS init start----------------");
  delay(d * 4);
  GSMport.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");  //Установка настроек подключения
  delay(d * 5);
  Serial.println(ReadGSM());  //показываем ответ от GSM модуля
  delay(d * 5);
  GSMport.println("AT+SAPBR=3,1,\"APN\",\"internet.ltmsk\""); //Установка APN
  delay(d);
  Serial.println(ReadGSM());  //показываем ответ от GSM модуля
  delay(d * 2);
  GSMport.println("AT+SAPBR=3,1,\"USER\",\"\""); //Установка имени пользователя для сети
  delay(d);
  Serial.println(ReadGSM());  //показываем ответ от GSM модуля

  GSMport.println("AT+SAPBR=3,1,\"PWD\",\"\""); //Установка пароля для сети
  delay(d);
  Serial.println(ReadGSM());  //показываем ответ от GSM модуля
  delay(d * 2);
  GSMport.println("AT+SAPBR=1,1");  //Устанавливаем соединение GPRS
  delay(d * 2);
  Serial.println(ReadGSM());  //показываем ответ от GSM модуля
  delay(d * 2);
  GSMport.println("AT+SAPBR=2,1"); //Проверяем как настроилось
  delay(d);
  Serial.println(ReadGSM());  //показываем ответ от GSM модуля
  delay(d * 5);

  Serial.println("----------------GPRS init complete-------------");
  Serial.println("");
}

void gprs_deinit(){
  
}

String ReadGSM() {  //функция чтения данных от GSM модуля
  char c;
  String str;
  while (GSMport.available()) {  //сохраняем входную строку в переменную str
    c = GSMport.read();
    str += c;
    delay(20);
  }
  str = "<<< " + str;
  return str;
}


void gprs_send(String dataa, String datab, int dataA0, int dataA1) {  //Процедура отправки данных на сервер
  //отправка данных на сайт
  String tempstr;
  Serial.println("Send start");
  GSMport.println("AT+HTTPINIT");
  delay(1000);
  Serial.println(ReadGSM());
  GSMport.println("AT+HTTPPARA=\"CID\",1");
  delay(1000);
  Serial.println(ReadGSM());
  Serial.println("setup url");
  tempstr = String("AT+HTTPPARA=\"URL\",\"alielectronics.ru/gps/write.php?a=" + dataa + "&b=" + datab + "&a0=" + String(dataA0) +"&a1=" + String(dataA1) +"\"");
  GSMport.println(tempstr);
  Serial.println(tempstr);
  delay(4000);
  Serial.println(ReadGSM());
  Serial.println("GET url");
  GSMport.println("AT+HTTPACTION=0");
  delay(5000);
  Serial.println(ReadGSM());
  Serial.println("Send done");
  GSMport.println("AT+HTTPTERM");
  delay(200);
  Serial.println(ReadGSM());
}

 

Создайте файл write.php на веб-сервере, к которому будет обращаться наш модуль SIM808 для отправки данных методом GET, со следующим содержимым:

 <?php
  $ip = $_SERVER['REMOTE_ADDR']; //получаем IP адрес клиента
  $client = $_SERVER['HTTP_USER_AGENT']; //получаем идентификатор HTTP клиента
  $today = date("Y.m.d H:i:s"); //получаем текущие дату и время
  $f = fopen("log.csv","a"); //открываем файл для добавления данных
  $parama = $_REQUEST['a']; //получаем значение переменной "а"
  $paramb = $_REQUEST['b']; //получаем значение переменной "b"
  $parama0 = $_REQUEST['a0']; //получаем значение переменной "a0"
  $parama1 = $_REQUEST['a1']; //получаем значение переменной "a1"  
  fwrite($f,"<div class='row'><div class='cell1'> $today </div> <div class='cell2'> $ip </div><div class='cell3'> $client </div><div class='cell4'> $parama </div><div class='cell5'> $paramb </div><div class='cell6'><a href='https://yandex.ru/maps/?source=serp_navig&text=$parama + $paramb'>Яндекс.Карты</a></div><div class='cell6'>$parama0</div><div class='cell6'>$parama1</div></div>"); //запись данных в файл
  fclose($f); //закрываем файл
?>

 

 

А также файл read.php, который и будем нам красиво выводить записи, оставленные GPS модулем:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html class="no-js" itemscope itemtype="http://schema.org/WebPage">
<head>
<meta charset="utf-8">
<meta content="True" name="HandheldFriendly">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Читаем лог GPS</title>
<meta name="description" content="Данные с модуля GPS"/>
<meta name="keywords" content="GPS GPRS SIM808"/>
<style type="text/css">
.row {
border: 1px;
border-style: solid;
border-color: #59e;
OVERFLOW: hidden;
margin: 5px 5px 5px 5px;
padding: 0px;
background: rgba(0, 0, 0, 0.5);
}
.cell1, .cell2, .cell3,.cell4,.cell5,.cell6{
border: 1px;
border-style: solid;
border-color: #59e;
display: table-cell;
padding: 5px;
//min-width: 10%;
display: block;
float: left;
border-bottom: 0px;
border-left: 0px;
border-top: 0px;
min-height: 18px;
}
.cell1{
width:150px;
}
.cell2{
width:110px;
}
.cell3{
width:200px;
}
.cell4{
width:140px;
}
.cell5{
width:140px;
}
.cell6{
width:170px;
}

.panel{
width: 80%;
//  text-align:left;
margin-top: 60px;
}
.header{
position: fixed;
top: -5px;
margin-left: auto;
margin-right: auto;
background-color: #03030b;
font-size: 1.4em;
box-shadow: -2px 19px 34px #000000;
width: 80%;
}

body {
background-image: url(planeti1920x1080.jpg); /* Путь к фоновому изображению */
background-attachment: fixed;
color: #EEEEFF;
font-family: sans-serif;
}
</style>
</head>
<body>
<div style="width: 100%;"><img src=""></div>
<div style="text-align: -webkit-center;">
<div class="panel">
<div class="row header"><div class="cell1">Время</div> <div class="cell2">IP</div><div class="cell3"> Устройство </div><div class="cell4"> долгота</div><div class="cell5"> широта</div><div class="cell6">ссылка на карту</div><div class="cell6">A0</div><div class="cell6">A1</div></div>

<?php
$handle = @fopen("log.csv", "r");
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
echo $buffer;
//echo "</br>";
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
?>

</div>
</div>

</body>

Последние записи

Полезная информация!

А Вы знаете как можно сэкономить 10,5% от любой покупки на AliExpress?

ЧИТАТЬ ПОДРОБНЕЕ