Поиск приблизительных координат с помощью GSM модуля без GPS
Сегодня расскажу вам как можно приблизительно определить позицию (широту и долготу) используя только GSM модуль. Естественно позиция не точная с радиусом около 500 метров, но бывают проекты, где этого достаточно и дополнительно не нужно использовать GPS.
Берем gsm модуль, работающий на AT командах и arduino собираем и запускаем. Этот процесс я расписывать не буду, так как тут все зависит от модуля.
Кстати очень хороший и не дорогой модуль M590E (на aliexpress по 1$), и работает намного быстрее и стабильнее, чем стандартный simcom sim800, но не поддерживает звуковые функции - микрофон и динамики - их просто нет. Звонить умеет, принимать звонки тоже но будет тишина.
Нам нужны будут 2 команды:
получаем International Mobile Subscriber Identity
в ответе будет число из 15 цифр. Первые 3 это MCC - код страны. Следующие 2 - MNC - код оператора (все в десятичной системе исчисления)
получаем Network Registration
в ответе получаем что-то такого плана: +CREG: 2,1,"0715","1402"
0715 - это LAC все в шестнадцатиричной системе исчисления, при переводе в десятичную будет 1813
1402 - это CELLID все в шестнадцатиричной системе исчисления, при переводе в десятичную будет 5122
После этого подставляем все в адрес вместо больших букв и получаем карту с позицией и координаты:
hex оставляем 0 для десятичной системы или 1 - если все в шестнадцатиричной
Также есть вариант получать только координаты и радиус в json формате:
cell.php и cellapi.php - мои скрипты, если нужен будет код, могу скинуть
Arduino & Pi1.1K постов 19K подписчиков
Правила сообществаВ нашем сообществе запрещается:
• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)
• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском
• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)
• Рассуждать на темы политики
Мне показался очень смешным 3-й абзац)
Берем gsm модуль, работающий на AT командах и arduino собираем и запускаем. Этот процесс я расписывать не буду.
Я так понимаю вычисляется только конкретная сота? А триангуляцию по нескольким вышкам не пробовали? В городе до десятков метров точность можно получить
Я могу запилить пару статей о том, как работает сотовая связь и её основных KPI. Это будет кому-нибудь интересно ?
@ahhx3m, А если прицепить к модулю по UART дисплей от Nextion за 800р то можно получить вполне юзабельный, и законченный девайс.
sim900 же вроде уже сам умеет в позиционирование по сотовым вышкам
Раз уж код не жалко, вываливай на Github и сюда линк на профиль =)
спасибо, жду платки из Китая, и SIM868, там конечно встроен GNSS но по GSM не помешает тоже получать координаты, в случае отсутствия спутников, правда не знаю как я ее буду впаивать на плату. )
А базы чьи используете для геолокации ?
Серьезно? 192 плюса и 17 минусов? То есть это интересно 92% участникам сайта?
GSM модуль управления ворот
Добрый день. Хотел поделиться опытом создания модуля управления воротами через мобильную сеть. Нам понадобиться:
Для начала перемычки RX/TX на GSM модуле ставим в положение D7/D8.
Переключатель питания переключаем на питание от внешнего источника, т.к. GSM модуль очень требователен к качеству питания. Для нормальной работу нужен источник питания не менее 2А.
Можно разъемы питания запараллелить (как это сделал я) и подключать питание лишь к одному разъему.
Питание для реле берем с ардуины. Сигнал управления с аналогового выхода А2.
Собираем бутерброд из ардуины и GSM модуля.
Должно получиться примерно так:
В прошивке все достаточно подробно прокомментировано. Для отладки можно раскомментировать строчки Serial.println и мониторить через терминал.
Ссылка на прошивку. Текст необходимо скопировать и вставить в Arduino IDE.
Подключаем к компьютеру через USB и заливаем прошивку.
Данный модуль управления работает как часики уже более 4 лет.
Проект GSM/GPRS сигнализации на Arduino ч.3
Всех с праздником. Продолжаем совершенствовать нашу сигнализацию. Согласитесь, что ей очень не хватает беспроводных датчиков. Один из подписчиков попросил добавить в сигнализацию ИК-передатчик для управления кондиционером. Мы решили этот вопрос несколько иначе, но сама идея передачи данных по ИК-каналу мне понравилась. Комплектующие стоят копейки. Имеется уже готовая библиотека IRremote, позволяющая принимать и отправлять данные по ИК-каналу. Минусом данной технологии можно считать только необходимость прямой видимости между передатчиком и приёмником. При этом ИК-приёмник отлично принимает отражённый от стен и потолка инфракрасный свет. Та что не обязательно, чтобы ик-диод был направлен непосредственно на него. Таким образом, если датчики и сигнализация расположены в одной комнате, можно неплохо сэкономить на комплектующих.
Для того, чтобы сигнализация могла принимать ИК-команды, в неё нужно добавить ИК-приёмник. Я использовал TSOP31238 на 38 кГц . Можно взять любой другой, желательно этой же частоты, т.к. она применяется чаще всего.
Первая ножка модуля - земля, вторая +5В, третья - информационный выход. Его соединяем с 11 пином Ардуины в сигнализации. У других ИК-приёмников распиновка может отличаться.
Далее открываем файл настроек проекта libraries/main_type/settings.h
Подключаем библиотеку ИК-датчика через дефайн, записав в него 1.
Затем добавляем ИК-датчик в массив датчиков:
IR_SENSOR - тип датчика
"IR_0" - уникальное имя датчика. Будет выводиться в отчётах. Пишите любое своё, например "OKNO" или "KOMNATA".
0x41038C7 - 32 разрядное кодовое слово, передаваемое беспроводным датчиком при срабатывании. Можно указать любое другое. Оно будет отправляться датчиком при тревоге. Соответственно это же слово нужно зашить в датчик.
Если ИК-датчиков несколько, можно настроить их на передачу разных слов, тогда в массиве каждый датчик нужно прописать отдельно. Это позволит их различать.
Теперь настало время собрать беспроводной ИК-датчик.
Для этого нам понадобится Ардуино Нано, ИК-диод, чем мощнее, тем лучше. Его нужно подключить к 3 пину Ардуины через ограничивающий резистор 33-220 Ом. Далее начиная с 4 пина подсоединяем любые датчики. Точно так же, как мы это делали в сигнализации. Оба проекта используют одни и те же библиотеки.
Затем открываем файл настроек settings.h
Задаём код, который будет отправляться на ИК-приёмник. Мы уже указывали его при настройке датчиков сигнализации. Код должен совпадать, чтобы сигнализация могла понять, кто сработал.
Далее указываем размер отправляемого слова в битах
В примере проекта к беспроводному датчику подключено два сенсора, геркон и датчик движения. Поэтому мы сначала задаём номера пинов для сенсоров, начиная с 4 (4 и 5 в данном случае). Затем записываем в массив сенсоров два датчика.
На этом настройка проекта завершена. Можно прошиваться.
При срабатывании подключенного сенсора Ардуина ИК-датчика начнёт отправлять указанное нами слово по ИК-каналу. Количество повторов отправки определено дефайном
Отправка слова производится раз в секунду.
Сигнализация примет это слово, сравнит с заданным в своих настройках, и при совпадении сработает режим тревоги.
Иногда мощности питания от порта Ардуины не хватает ИК-диоду, чтобы послать сигнал на большое расстояние. Тогда следует питать его напрямую от источника питания через транзистор. Например по такой схеме.
Обновлённая прошивка с проектом для ИК-датчика IRsensor лежит здесь
Так же необходимо установить через Arduino IDE библиотеку IRremote
В проекте добавилась новая библиотека для работы с датчиками температуры на основе термистора. Все необходимые коэффициенты задаются в самой библиотеке.
В следующей части постараюсь показать беспроводной датчик c Wi-Fi модулем.
Проект GSM/GPRS сигнализации на Arduino ч.2
Приветствую моих читателей. В первой части https://pikabu.ru/story/proekt_gsmgprs_signalizatsii_na_ardu. я рассказал вам, как сделать простую GPRS сигнализацию на Ардуино. Проект продолжает развиваться. Сигнализация эксплуатируется около месяца, и уже можно подводить некоторые итоги. За это время не было ни одного случая отказа или зависания, как модуля SIM800L, так и самой Ардуины. Напомню, в моём проекте микроконтроллер питается напрямую от аккумулятора пониженным напряжением 4 В. К каким-то отказам, как опасались многие читатели, это не приводит. Мною был проведён эксперимент, чтобы узнать, как поведёт себя сигнализация при постепенном разряде батареи.
Так как Ардуина разряжала аккумуляторы очень медленно, я подключил её вместе с модемом к лабораторному источнику питания, выставил ограничение по току 2А, и проверил работу на различных значениях напряжения.
Что удалось выяснить. При 3,5 В и выше SIM800L работает штатно. С питанием 3,4 В иногда начинаются перезагрузки при входящих звонках. При снижении напряжения ниже 3,4 В отваливается сеть, могут начаться перезагрузки, но на AT команды модуль продолжает отвечать. Так он работает в плоть до 3В, после чего выключается.
Ардуина работает даже при напряжении 2,7 В, ниже которых отключается. Никаких сбоев отмечено не было.
Но этого нам не достаточно. Нужно было проверить работу при длительной разрядке аккумулятора. Так сказать в условиях, близких к боевым. Я отключил режим сна Ардуины, подключил дополнительную нагрузку к аккумулятору, включил Serial монитор, и отслеживал поведение сигнализации, периодически проверяя её работоспособность. Эксперимент продолжался более суток. Аккумулятор разрядился до 3,6 В. Сбоев замечено не было. Схема полностью работоспособна. Ставьте ёмкий аккумулятор и не о чём не думайте.
Для справки. Номинальное напряжение питания чипа зависит от частоты его работы. Если программно понизить частоту до 10МГц или ниже, то питание напряжением от 2,7 до 5,5В для Atmega328p будет стандартным. Если кого-то не убедили результаты эксперимента, то они могут поиграться с настройками частоты.
С этим разобрались, теперь поговорим о доработках проекта.
За прошедшие две недели проект претерпел некоторые изменения. Геркон теперь подтянут через резистор не к +5В, а к +4,2В батареи (см. фото). Что позволит сохранить на пине высокий уровень при отключении внешнего питания без программной подтяжки. Мне кажется это более надёжным решением. Резисторы можно использовать любого номинала, начиная с 2,2 кОм и выше.
Остальные доработки касаются программной части. Файл настроек settings.h получил новые опции. https://github.com/wisenheimer/Arduino/blob/master/libraries.
По рекомендации читателей, в проект был добавлен watchdog (WTD), который перезагрузит Ардуину в случае её зависания. Включен по умолчанию следующим дефайном:
Т. к. стандартный загрузчик Ардуино Нано не поддерживает watchdog, и в случае его срабатывания уходит в бесконечную перезагрузку, для его работы нужно либо сменить загрузчик на другой, либо поступить проще. Прошить Ардуину через программатор. В этом случае на Ардуине больше не будет загрузчика. И watchdog будет работать. Но вы уже не сможете прошивать Ардуину по USB. Если вас это не устраивает, не используйте watchdog.
В качестве программатора я применил Ардуино УНО с прошивкой ArduinoISP из примеров.
Следующее изменение касается способа доставки отчётов. Теперь сигнализация поддерживает SMS отправку сообщений. Ранее мы отправляли ответы сигнализации на e-mail при помощи GPRS. Теперь можно выбирать способ отправки. Для этого добавлен следующий дефайн:
По умолчанию включены оба варианта.
SET_FLAG_ONE(GPRS_ENABLE) разрешает отправку e-mail по GPRS.
SET_FLAG_ONE(SMS_ENABLE) разрешает отправку отчётов по SMS.
GPRS имеет более высокий приоритет. Если сигнализации не удалось установить GPRS соединение, и SMS режим разрешён, то сообщения будут отправлены по SMS, флаг GPRS_ENABLE выключен, и в дальнейшем будет задействована только SMS отправка. Включить или выключить оба режима можно так же в ручную DTMF командой.
Если мы хотим всегда использовать один режим, то дефайн нужно отредактировать, удалив лишнее.
Следующим нововведением стало изменение списка DTMF команд:
Команды, не вошедшие в список, будут подставлены в USSD запрос и отправлены сотовому оператору. Так что можете в режиме DTMF напирать любые USSD команды. Например запрос баланса. В случае успеха ответ оператора вернётся в виде отчёта.
Админ так же может управлять модемом SIM800L при помощи АТ команд из его даташита http://www.mt-system.ru/sites/default/files/documents/sim800. .
Например, добавлять и удалять номера из телефонной книги. Для этого достаточно с телефона Админа отправить сигнализации SMS с текстом АТ команды.
Дальше хочу подробно рассказать, как добавлять в проект датчики.
Для начала необходимо определиться с количеством пинов, требуемых для ваших датчиков. Датчики у нас подключаются, начиная с 4 пина. Первым желательно выбрать геркон, т.к. он будет будить Ардуину, если она войдёт в режим энергосбережения при отключении внешнего питания.
DIGITAL_SENSOR - любой датчик с одним цифровым выходом, на котором может быть только два состояния, 0 или 1.
CHECK_DIGITAL_SENSOR - тоже самое, только с проверкой от ложного срабатывания. Если через 10 секунд датчик сбросил своё значение, то срабатывание считается ложным. Применяется для тех датчиков, которые удерживают логическое значение на выходном пине при сохранении внешнего воздействия. Например датчик пламени.
ANALOG_SENSOR - любой датчик с аналоговым выходом. Например датчик газа MQ-2.
DHT11, DHT21, DHT22 - датчики температуры и влажности.
Конструктор класса имеет следующий вид:
В нашем файле настроек имеется целый массив таких классов для каждого датчика:
Очень важно указать точный размер массива, иначе проект не соберётся. В данном случае у меня имеется 6 датчиков, конструктор для каждого описан отдельно.
означает, что для датчика двери (геркона) задействован пин Ардуино DOOR_PIN (задан в том же в файле), тип датчика DIGITAL_SENSOR, название датчика, которое будет выводиться в отчётах - "DOOR" (можно заменить на любое другое слово), обычное состояние пина HIGH (DOOR_PIN у нас подтянут к 4,2В), время подготовки датчика при включении питания в секундах, через которое он начнёт показывать правильные значения - 0 секунд.
Для аналогового датчика газа MQ-2:
пин A0, тип датчика ANALOG_SENSOR, имя "GAS", значение на пине LOW, на прогрев датчика и выход на номинальный режим работы отводится 120 секунд. До истечения этого времени после включения датчик не опрашивается, что бы не получать неверные значения.
Для датчика температуры DHT11
в конце появилась цифра 35, которая означает уровень в градусах, при превышении которого считается, что датчик сработал. В помещении стало слишком жарко.
Внимательный читатель уже заметил, что для разных датчиков описано разное количество параметров. Дело в том, что в языке С++ можно не писать все параметры функции, если в заголовке функции указаны их значения по умолчанию. Мы пишем только то, что не имеет значения по умолчанию, или мы хотим задать другое значение. Однако никто не запрещает указать все параметры конструктора класса.
Вы можете подключать к сигнализации любые датчики, не требующие отдельной библиотеки, лишь заполнив конструктор класса, и добавив его в массив Sensor sensors[]. И это будет работать. Если для датчика требуется отдельная библиотека, то её можно добавить точно так же, как в проект была добавлена библиотека stDHT.h для датчика DHT11, который имеет свой протокол для обмена данными. Или напишите мне, я добавлю.