GPS\GSM маячок отправляющий SMS сообщение с координатами местоположения и скорости движения по запросу. подробнее в видео.
Пока только код
Схема подключения:
позже
В проекте использованы железки:
GPS приемник GY-NEO6MV2
GSM модем NEOWAY M590, и для его питания DC-DC преобразователь.
Arduino leonardo и протошилд.
Код:
библиотека TinyGPS++.h
#include <TinyGPS++.h> #include <EEPROM.h> #include <SoftwareSerial.h> #define TELLNUMBER "70001112233" // номен телефона для команды #define SMSNUMBER "AT+CMGS=\"+70001112233\"" // номер на который будем отправлять SMS #define LED 13 boolean GSMSMSflag = 0; // команда на отправку SMS TinyGPSPlus gps; SoftwareSerial gsm(9, 8); // программный UART для GSM модема //SoftwareSerial ss(3, 4); // программный UART для GPS приемника #define ss Serial1 // аппаратный UART в леонардо для GPS приемника void setup() { delay(1000); Serial.begin(9600); ss.begin(9600); // скорость GPS gsm.begin(9600); // скорость GSM M590 delay(100); Serial.println("start"); pinMode(LED, OUTPUT); pinMode(5, OUTPUT); digitalWrite(5, LOW); pinMode(A0, INPUT_PULLUP); GSMSMSflag = EEPROM.read(0); // достаем флаг Serial.println("modem"); // нужно дождатся включения модема и соединения с сетью delay(2000); // while(gsm.find("STARTUP")); /// ждем команды от модема gsm.println("ATE0"); // выключаем эхо while(1){ // ждем подключение модема к сети gsm.println("AT+COPS?"); if (gsm.find("+COPS: 0")) break; digitalWrite(LED, LOW); // блымаем светодиодом delay(50); digitalWrite(LED, HIGH); delay(500); } gsm.println("AT+CMGF=1"); //настройки для SMS delay(100); gsm.println("AT+CSCS=\"GSM\""); Serial.println("Modem OK"); digitalWrite(LED, LOW); // блымаем светодиодом delay(1500); digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); } void loop(){ if (GSMSMSflag == 0){ // если флаг ожидания команды от модема // ищим RING if(gsm.find("RING")){ // если нашли RING gsm.println("AT+CLIP=1"); // включаем АОН, while(1){ // в цикле if (gsm.find(TELLNUMBER)){ // ищим номер телефона, если нашли GSMSMSflag = 1; // меняем режим EEPROM.write(0, GSMSMSflag); // пишим его в еепром break; // и выходим } else{ // иначе gsm.println("AT+CPAS"); // спрашиваем состояние модема delay(100); if (gsm.find("+CPAS: 0")) break; // и если он в "готовности", выходим из цикла } // если звонок в процессе, возвращает +CPAS: 3 } // и крутимся дальше gsm.println("AT+CLIP=0"); // выключаем АОН, delay(500); gsm.println("ATH0"); // сбрасываем вызов digitalWrite(LED, LOW); // сигнализируем об этом delay(500); digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); } } //////////// GPS if (GSMSMSflag == 1){ // если сменился режим do{ do{ // в цикле забераем данные от GPS while (ss.available() > 0) gps.encode(ss.read()); displayInfo(); // !!! это тут только для проверки }while (!gps.location.isUpdated() && gps.location.age() > 1500); }while (!gps.location.isValid()); // циклЫ крутим пока не убедимся что получили свежие данные Serial.println("SMS!"); GSMsendSMS(); // отправляем SMS GSMSMSflag = 0; // меняем режим EEPROM.write(0, GSMSMSflag); // пишим его в еепром } // //if(!digitalRead(A0)) GSMSMSflag = 1; // если нажали кнопку, для отладки } ////// /// // отправляет SMS void GSMsendSMS(){ delay(100); gsm.println(SMSNUMBER); // отправляем команду на отправку смс delay(100); gsm.print(gps.location.lat(), 6); // передаем координаты gsm.print(","); gsm.print(gps.location.lng(), 6); gsm.print(" S:"); // передаем скорость движения gsm.print(gps.speed.kmph()); gsm.print(" T:"); // передаем время с GPS if (gps.time.hour() < 10) gsm.print("0"); gsm.print(gps.time.hour()); gsm.print(":"); if (gps.time.minute() < 10) gsm.print(F("0")); gsm.print(gps.time.minute()); gsm.print((char)26); // символ завершающий передачу Serial.println("ok"); } /// отправляет в сериал инфу с GPS приемника, оставлено для проверки и отладки void displayInfo(){ Serial.print(F("Location: ")); if (gps.location.isValid()) { Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print(gps.location.lng(), 6); } else { Serial.print(F("INVALID")); } Serial.print(F(" Date/Time: ")); if (gps.date.isValid()) { Serial.print(gps.date.month()); Serial.print(F("/")); Serial.print(gps.date.day()); Serial.print(F("/")); Serial.print(gps.date.year()); } else { Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(F(":")); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(F(":")); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print(F(".")); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.print(gps.time.centisecond()); } else { Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.speed.isValid()) { Serial.print(gps.speed.kmph()); } Serial.println(); }