Отследить меня
Компоненты и расходные материалы
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Некоторое время назад я решил создать автомобильный / личный трекер.
Это был мой первый прототип в этом направлении.
Сама система очень проста. Просто Arduino Mega, GPS, GPRS Shield и SD-карта. Это необязательно, но я добавил, потому что я думал, что, запустив вызов своим друзьям в Facebook, они позвонят в систему и получат SMS с моей позицией или моей последней известной позицией.
Система всегда ищет фактическое положение. Если кто-то позвонит на номер SIM-карты, система пришлет SMS с актуальным местоположением и ссылкой на карты Google. Например:
Местоположение Хьюго сейчас:широта 54.315010, лог:10.130997. http://maps.google.com/maps?q=54.315010,+10.130997
Если GPS не получает данные о местоположении, система отправит последнее известное положение. Например:
Кажется, я не могу найти Хьюго. Последний раз я видел его в:Lat:54.315010, Log:10.130997. http://maps.google.com/maps?q=54.315010,+10.130997
Дата, время, положение и статус SMS сохраняются на SD-карте.
Компоненты
Я использовал:
1x Arduino MEGA
1x GPRS Shield (также можно использовать другие GSM-экраны, доступные на рынке)
1x GPS (я использовал NEO 6, очень популярный на ebay)
1x экран SD-карты
1x батарея 9 В
1x пластиковая коробка
Некоторые провода

Соедините компоненты
Поскольку Arduino Mega использует другую распиновку, необходимо немного изменить схему подключения.
Сначала SD Card Shield, который был разработан для Arduino Uno, использует контакты с 10 по 13 для SPI, поэтому для того, чтобы это работало на Mega, их необходимо «передать» на контакты SPI на MEGA.
Контакты Arduino UNO SPI - контакты Arduino MEGA SPI
MOSI - с 11 по 51
MISO - от 12 до 50
SCK - от 13 до 52
СС - с 10 до 53

На GPRS Shield сначала необходимо настроить контакты связи на Software Serial в перемычке J7 на щите.

Затем с помощью нескольких проводов я подключил контакты 7 и 8 экрана GPRS к порту Serial 1 (контакты 18 и 19 в Arduino Mega).

Для получения дополнительных сведений о том, как подключить SIM-карту к GPRS Shield, см. Другой мой проект в Hackster.
GPS подключен к последовательному порту 2 (контакты 16 и 17) в Arduino Mega.

Также питание, необходимое для GPS, снимается с контакта 5V SD-карты и контакта GND.
Батарею 9 В можно подключить к контакту Vin или к разъему питания.



Подготовка к закрытию коробки и полевые испытания.

Код
Я оставляю здесь несколько заметок о коде.
Я использовал эту библиотеку для GPRS Shield.
Для использования Arduino Mega необходимо внести некоторые изменения:
1) Откройте GSM.h и закомментируйте соответствующие строки, как показано ниже, например. для Arduino Mega:
// # определяем UNO
#define MEGA
2) В HWSerial.h разложите строку для определения Mega, например. для Arduino Mega:
#define MEGA
Для GPS я использую эту библиотеку.
Сама программа работает очень просто. После всех процедур запуска (GPRS, GPS и инициализация SD-карты) GPS попытается определить количество доступных спутников и действительную точку с координатами GPS.
Если звонок будет сделан в течение этого периода, звонок будет автоматически отклонен и ничего не произойдет.
Когда GPS имеет действительное местоположение и обнаруживает более 3 спутников (я предполагаю, что GPS имеет хороший прием), при вызове система отправит SMS на номер вызова с моим местоположением. Все эти данные будут храниться на SD-карте.
Если у GPS менее 3 спутников, действительное положение не может быть получено, поэтому, если будет сделан звонок, на номер вызова будет отправлено SMS с моим последним известным местоположением. Опять же, все данные хранятся на SD-карте.
Плюсы и минусы
Поскольку это прототип, есть много вещей, которые не работали нормально. Но цель всегда в том, чтобы стать лучше.
Во-первых, батареи хватает всего на один час !! Никаких механизмов энергосбережения в программе я не реализовал. Так что для будущих улучшений просто необходим «спящий режим».
Размер также был пересмотрен, и я разработал совершенно новую плату. Первый взгляд таков:

Пожалуйста, напишите мне, если вы обнаружили какую-либо ошибку или у вас есть предложения / улучшения или вопросы.
Спасибо за чтение.
Уго Гомеш
Код
- Код
Код Arduino
#include "SIM900.h" #include#include "sms.h" #include "call.h" #include // Чтобы изменить контакты для программного / аппаратного последовательного порта, используйте 27, 28 строк в GSM.cpp. // Чтобы использовать Arduino Mega, определите MEGA в строке 5 в GSM.h. # include #include // Mega CS pinconst int chipSelect =53; // Нам нужно создать классы для SMS и звонков. CallGSM call; SMSGSM sms; char number [20]; byte stat =0; int value =0; char value_str [5]; // Переменная GPS // Объект TinyGPS ++ TinyGPSPlus gps; const char * googlePrefix ="http://maps.google.com/maps?q=";double Lat; double Long; int день, месяц, год; int час, минута, секунда; int num_sat; логическое one_point_true =false; void setup () {// Последовательное соединение. Serial.begin (9600); // GPRS соединение Serial.print (F ("Запуск GSM ...")); // Начинаем настройку щита со скоростью передачи. if (gsm.begin (9600)) Serial.println (F ("ГОТОВ")); иначе Serial.println (F ("IDLE")); // Подключение GPS Serial.println (F ("Запуск GPS")); // COM-порт GPS Serial2.begin (9600); // SD-карта запускает Serial.print (F ("Инициализация SD-карты ...")); // убедитесь, что вывод выбора микросхемы по умолчанию установлен на // вывод, даже если вы его не используете:pinMode (53, OUTPUT); // посмотрим, присутствует ли карта и может ли она быть инициализирована:if (! SD.begin (chipSelect)) {Serial.println (F («Карта вышла из строя или отсутствует»)); // больше ничего не делать:return; } Serial.println (F ("карта инициализирована."));} // ******************************* ******************************************** // Главный петлевой пропуск цикл () {Get_GPS (); // Получить позицию Check_call (); // Узнаем, звонит ли кто-нибудь}; ///////////////////////////////////////// ///////////////////////////////////////// ********* ************************************************* ******************* // Получить позицию из GPSvoid Get_GPS () {while (Serial2.available ()> 0) if (gps.encode (Serial2.read ())) num_sat =gps.satellites.value (); //Serial.println(num_sat); если (gps.location.isValid () ==1) {Широта =gps.location.lat (); Long =gps.location.lng (); если (Широта! =0 &&Долгота! =0) one_point_true =true; } если (gps.date.isValid ()) {день =gps.date.day (); месяц =gps.date.month (); год =gps.date.year (); } если (gps.time.isValid ()) {час =gps.time.hour (); минута =gps.time.minute (); второй =gps.time.second (); } smartDelay (500); if (millis ()> 5000 &&gps.charsProcessed () <10) {Serial.println (F («GPS не обнаружен:проверьте проводку.»)); в то время как (правда); }} // ******************************************** ******************************* // Эта настраиваемая версия delay () гарантирует, что // объект GPS "подано" .static void smartDelay (unsigned long ms) {unsigned long start =millis (); do {while (Serial2.available ()) gps.encode (Serial2.read ()); } while (millis () - start =3 &&one_point_true ==true) {char sms_OK [160]; sprintf (sms_OK, "Теперь местоположение Hugo:Lat:% s, Log:% s.% s% s, +% s \ n", lat_print, Long_print, googlePrefix, lat_print, Long_print); Serial.println (sms_OK); error =sms.SendSMS (номер, sms_OK); задержка (500); if (error ==0) // Проверяем статус {Serial.println (F ("SMS ERROR")); } else {Serial.println (F ("SMS ОК")); }} иначе, если (num_sat <3 &&one_point_true ==true) {char sms_NOK [150]; sprintf (sms_NOK, "Я не вижу, чтобы найти Хьюго. Последний раз, когда я видел его, было:Широта:% s, Журнал:% s.% s% s, +% s \ n", lat_print, Long_print , googlePrefix, lat_print, Long_print); Serial.println (sms_NOK); int error =sms.SendSMS (номер, sms_NOK); if (error ==0) // Проверяем статус {Serial.println (F ("SMS ERROR")); } else {Serial.println (F ("SMS ОК")); }} else if (one_point_true ==false) {Serial.println (F («Нет действительной точки GPS»)); } // Сохраняем все в файле SD-карты dataFile =SD.open ("datalog.txt", FILE_WRITE); // если файл доступен, записываем в него:if (dataFile) {dataFile.print (Date); dataFile.print (""); dataFile.print (время1); dataFile.print (""); dataFile.print (число); dataFile.print (""); dataFile.print (lat_print); dataFile.print (","); dataFile.print (Длинный_принт); dataFile.print (""); dataFile.print (ошибка); dataFile.println (); dataFile.close (); } // если файл не открыт, выдается сообщение об ошибке:else {Serial.println (F ("ошибка открытия файла datalog.txt")); }} //////////////////////////////////////////////// ////////////////////////////////
Схема


Производственный процесс