Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800
|
GPS треккер для собачек
Собственно появилась необходимость одеть на своих собачек GPS треккер. Перебрав предложения на ali - чет они меня не впечатлили. Собственно решено было попробовать сделать.
Закуплены модули, аккумулятор и разъем
модули доработаны "отрежь все лишнее"
напечатана коробочка
и засунуто все в нее
по железу пока все
написан скетч в настоящее время он в большей мере сырой и отладочный - позволяет понять как работать с GSM и GPS модулями
PHP код:
//Подключение библиотек
#include <SoftwareSerial.h>
SoftwareSerial SerialGPS(10, 11); // RX, TX
#include <AltSoftSerial.h>
AltSoftSerial SerialGsm;
#include <CyberLib.h>// быстрое управление пинами
//#include <leOS2.h>// многозадачность
//leOS2 myOS; //создать экземпляр класса
/**********************Переменные************************/
// Общие
String NumberTelefone="+7хххххххххххх" ;// номер управляющего телефона
int x=0; //счетчик для всяких циклов
//UART
String InputUART = "";// строка для чтения UART модуля GSM
//GSM
String InputGSM = "";// строка для чтения UART модуля GSM
//GPS
String IPTrack = "5.9.136.109"; // IP для передачи данных
String PortTrack = "3355"; // порт прередачи данных
String InputGPS = "";// строка для чтения UART модуля GPS
String IDDataGPS;//Индетификатор данных
String TimeGPS;//170840.00 Время UTC: 17ч. 08м. 40.00 сек.
String reliabilityGPS;//A Статус достоверности: A – достоверные данные, V – недостоверные данные
String LatitudeData;//5509.68339 Широта: 55 градусов, 09.68339 минут
String LatitudeDir;//N N – северная, S – южная
String LongitudeData;//06125.49498 Долгота: 061 градусов, 25.49498 минут
String LongitudeDir;//E E – восточная, W – западная
String HSpeed;//0.204 Горизонтальная скорость (узлов в час)
String Course;//– Направление курса относительно истинного севера (градусы)
String DataGPS;//311015 Дата: 31 октября 2015 года
String MDeclination;//– Магнитное склонение (градусы)
String MDeclinationDir;//– Направление склонения: E – восточное, W – западное
String ModeGPS;//A Режим: A – автономный, D – дифференциальный, E – аппроксимация, N – недостоверные данные
String ChecksumGPS;//*7D Контрольная сумма
void setup()
{
D12_Out; D12_Low; // пин перезагрузки GSM
//открытие портов
Serial.begin(115200);
settinggsm(); //настройка GSM модуля//
settingps(); // настройка GPS модуля
// запускаем задачи
//myOS.addTask (battery, myOS.convertMs(10000));// запускаем задачу проверки заряда 16*600 = раз в 10 секунд
Serial.println ("Setup end");
//SmsSend("Zapusk OK", NumberTelefone);
}
void loop()
{ /*_________________________Проверка буферов UART________________________________________*/
if (SerialGPS.available()) { gpsread();}; //если есть данные GPS уходим в подпрограмму чтения
if (Serial.available()) { pcread(); }; //если есть данные c компа уходим в подпрограмму чтения
if (SerialGsm.available()) { gsmread();}; //если есть данные GSM/GPRS уходим в подпрограмму чтения
}
и отдельно функции -они на разных вкладках -потому немного отдельно
PHP код:
void settinggsm()
{ Serial.println("Reset GSM");
D12_High; delay(5000); D12_Low; delay(5000); //перезагрузка GSM
SerialGsm.begin(115200);// поднятие соединения
//настройка модуля
CommandGSMR("AT\r", "OK", 500); // проверка связи с модемом
CommandGSMR("AT+IPR=9600\r", "OK", 500); //Изменение скорости UART
SerialGsm.begin(9600); delay(2000); // перезапуск соединения
CommandGSMR("AT+CMEE=2\r", "OK", 500); //режим сообщений ошибок
CommandGSMR("ate0\r", "OK", 500); //отключение эха порта
CommandGSMR("AT+CREG?\r", "+CREG: 1", 500); //проверка регистрации в сети
//CommandGSMR("AT+CREG=0", "OK", 500);// запрет выдачи сообщений о смене регистрации сети
//настройка СМС
CommandGSMR("AT+CMGF=1\r", "OK", 500); //включение текстового режима СМС
CommandGSMR("AT+CSCS=\"GSM\"\r", "OK", 500); //включение режима кодировки СМС
CommandGSMR("AT+CNMI=2,2\r", "OK", 500); //включение режима СМС сразу в монитор
// ///*+++++++++++++++++++Настройка GPRS++++++++++++++++++++*/
// //CommandGSM("AT+CIPSHUT\r", "OK",500);//Сброс всех подключений
//CommandGSMR("AT+CSTT= \"internet\", \"gdata\", \"megafon\"\r", "OK", 500); //Настройка точки доступа сети GPRS
//CommandGSMR("AT+CIICR\r", "OK", 5000); //Соединение с точкой доступа GPRS
//CommandGSMR("AT+CGATT?\r", "CGATT:1", 2000); //проверка регистрации в сети GPRS
//CommandGSMR("AT+CIFSR\r", "OK", 500); //Получение IP GPRS
};
void settingps()
{ SerialGPS.begin(9600);
uint8_t buf[] = {0xB5, 0x62, 0x06, 0x08, 0x06, 0x00, 0x60, 0xEA, 0x01, 0x00, 0x01, 0x00, 0x60, 0x8C}; SerialGPS.write(buf, sizeof(buf)); // данные 60 сек
delay(1000);
while(SerialGPS.available()) { delay(2); SerialGPS.read(); };// очищаем буфер
};
void battery(){
Serial.print("Battery=");
Serial.println(A3_Read);
};
void CommandGSMR(String S, String S1, int t){
delay(100);// делаем паузу на предудущие всякие
while(SerialGsm.available()) { delay(2); SerialGsm.read(); }// очищаем буфер
SerialGsm.println(S); // шлем команду
delay(t);// пауза на ожидание ответа
for (int x = 0; x < 10; x ++)
{
while (SerialGsm.available() > 0)//если в буфере что есть -читаем
{ char c = SerialGsm.read();
if (c == '\n') { break;} else { InputGSM += c;}}
if ( InputGSM.indexOf(S1) >= 0 ){InputGSM = ""; Serial.print (S); Serial.println ("-OK"); break; }else {InputGSM = "";};
if (x == 9) {Serial.print (S); Serial.println ("-NO");settinggsm();};
delay(300);
};};
void CommandGSM(String S, String S1, int t){
delay(100);// делаем паузу на предудущие всякие
while(SerialGsm.available()) { delay(2); SerialGsm.read(); }// очищаем буфер
SerialGsm.println(S); // шлем команду
delay(t);// пауза на ожидание ответа
for (int x = 0; x < 10; x ++)
{
while (SerialGsm.available() > 0)//если в буфере что есть -читаем
{ char c = SerialGsm.read();
if (c == '\n') { break;} else { InputGSM += c;}}
if ( InputGSM.indexOf(S1) >= 0 ){InputGSM = ""; Serial.print (S); Serial.println ("-OK"); break; }else {InputGSM = "";};
if (x == 9) {Serial.print (S); Serial.println ("-NO");};
delay(300);
};};
void UartGsm(){
InputUART = InputUART.substring(4);
Serial.print("Command GSM-");
Serial.println(InputUART);delay(300);
SerialGsm.println(InputUART);
delay(300);
InputUART = "";
};
void SmsSend(String textSMS, String numberSMS){
SerialGsm.println("AT+CMGS=\""+numberSMS+"\"");
delay(1000);
SerialGsm.print(textSMS); // отправляем текст
SerialGsm.println((char)26); // символ завершающий передачу
};
void SmsSend2(){
InputUART = InputUART.substring(4);
Serial.println("SMSka");delay(300);
SerialGsm.println("AT+CMGS=\""+NumberTelefone+"\"");
delay(1000);
SerialGsm.print(InputUART); // отправляем текст
SerialGsm.print((char)26); // символ завершающий передачу
Serial.println("ok");
InputUART = "";
};
void HttpSend(){
InputUART = InputUART.substring(5);
Serial.println("HTTPeshka!!!");delay(300);
CommandGSM("AT+CIPSHUT\r", "OK",500);//Сброс всех подключений
CommandGSM("AT+CIPSTART=\"TCP\",142804.dyn.ufanet.ru,100\r", "OK",2000);
SerialGsm.write("AT+CIPSEND");
delay(6000);
SerialGsm.print(InputUART); // отправляем текст
SerialGsm.print((char)26); // символ завершающий передачу
Serial.println("ok");
InputUART = "";
SerialGsm.write("AT+CIPCLOSE ");
};
void GpsSend(){
Serial.println("GPSka!!!");delay(300);
CommandGSM("AT+CIPSTART=\"TCP\",5.9.136.109,3355\r", "CONNECT OK", 2000);
SerialGsm.println("AT+CIPSEND");
delay(6000);
SerialGsm.print("imei:9969609,tracker,1310210424,,F,042445.000,A,5444.3184,N,5601.4117,E,10.00,50,20,20,20,20,20,20,20,20,20");
delay(1000);
SerialGsm.println((char)26); // символ завершающий передачу
delay(1000);
Serial.println("ok GPS");
delay(1000);
SerialGsm.println("AT+CIPCLOSE");
InputUART = "";
};
void gpsread()
{ while (SerialGPS.available() > 0)
{ char d = SerialGPS.read();
if (d == '\n')
{ Serial.print("Input_string is: "); Serial.println(InputGPS);
if ( InputGPS.indexOf("GPRMC") >= 0 )
{
char q1 = InputGPS.indexOf(","); char q2 = 0; IDDataGPS = InputGPS.substring(0, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); TimeGPS = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); reliabilityGPS = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); LatitudeData = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); LatitudeDir = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); LongitudeData = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); LongitudeDir = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); HSpeed = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); Course = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); DataGPS = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); MDeclination = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf(",", q2); MDeclinationDir = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf("*", q2); ModeGPS = InputGPS.substring(q2, q1);
q2 = q1 + 1; q1 = InputGPS.indexOf("\n", q2); ChecksumGPS = InputGPS.substring(q2, q1);
InputGPS = "";
CommandGSM("AT+CIPSTART=\"TCP\","+IPTrack+","+PortTrack+"\r", "CONNECT OK", 5000);
SerialGsm.println("AT+CIPSEND");
delay(6000);
SerialGsm.print("imei:9969609,tracker,1310210424,,F,"+TimeGPS+","+reliabilityGPS+","+LatitudeData+","+LatitudeDir+","+LongitudeData+","+LongitudeDir+","+HSpeed+","+Course+",1,2,3,4,");
delay(1000);
SerialGsm.println((char)26); // символ завершающий передачу
delay(1000);
Serial.println("ok GPS");
delay(1000);
SerialGsm.println("AT+CIPCLOSE");
Serial.print("Battery=");
Serial.println(A3_Read);
};
}
else {
InputGPS += d;
}
}
};
void gsmread()
{ while (SerialGsm.available() > 0)
{ char c = SerialGsm.read();
if (c == '\n')
{ Serial.println(InputGSM);
if ( InputGSM.indexOf("+CMT") >= 0 ){InputGSM = ""; smsread();}
else if ( InputGSM.indexOf("+CREG: 2") >= 0 ){InputGSM = ""; settinggsm();}
else {InputGSM = "";};
}
else { InputGSM += c;}
}
};
void pcread()
{ while (Serial.available() > 0)
{ char d = Serial.read();
if (d == '\r')
{ Serial.print("Polucheno-");Serial.println(InputUART);
if (InputUART.substring(0,3) == "GSM"){UartGsm();}
else if (InputUART.substring(0,3) == "GPS"){InputUART = ""; Serial.println("GPSU");GpsSend();}
else if (InputUART.substring(0,3) == "SMS"){SmsSend2();}
else if (InputUART.substring(0,4) == "HTTP"){Serial.println("HTTPeshka");HttpSend();}
else {InputUART = "";};
}
else { InputUART += d;}
};
};
void smsread()
{
InputGSM = "";
Serial.println("SMSKA!!!!!!!!");
delay(100);
while (SerialGsm.available() > 0)
{ char c = SerialGsm.read();
if (c == '\n')
{
Serial.print("Text SMS - ");
Serial.print(InputGSM);
Serial.println("**");
if (InputGSM.indexOf("fittnes")>= 0 )
{uint8_t buf[] = {0xB5, 0x62, 0x06, 0x08, 0x06, 0x00, 0xE8, 0x03, 0x01, 0x00, 0x01, 0x00, 0x01, 0x39}; SerialGPS.write(buf, sizeof(buf));} // данные 1 сек
else if(InputGSM.indexOf("beacon")>= 0 ){uint8_t buf[] = {0xB5, 0x62, 0x06, 0x08, 0x06, 0x00, 0x88, 0x13, 0x01, 0x00, 0x01, 0x00, 0xB1, 0x49}; SerialGPS.write(buf, sizeof( buf));} // данные 5 сек
else if(InputGSM.indexOf("tracker")>= 0){uint8_t buf[] = {0xB5, 0x62, 0x06, 0x08, 0x06, 0x00, 0x60, 0xEA, 0x01, 0x00, 0x01, 0x00, 0x60, 0x8C}; SerialGPS.write(buf, sizeof( buf));} // данные 60 сек
else if(InputGSM.indexOf("location")>= 0){SmsSend(LongitudeData, NumberTelefone);} // смс с оординатами
else if(InputGSM.indexOf("battery")>= 0){SmsSend(String(A3_Read, DEC), NumberTelefone);} // смс с оординатами
else if(InputGSM.indexOf("server")>= 0){GpsSend();} // координаты на сайт
else {SmsSend(InputGSM, NumberTelefone);};
}
else {InputGSM += c;};
};
};
В общем на настоящий момент мы умеем определять координаты, слать их на треккер сайт(который показывает на карте и строит трек), обмениваться разными смсками.
Все выложено в сыром виде, потому как есть вопросы (ну куда же без них). А самый главный - вообще чего он должен уметь делать -так сказать функционал
|