Поправьте, если путаю, модуль Neoway m590 тоже ведь умеет выходить в интернет, но (в отличие от SIM800L) не поддерживает AT комнанды на определение координат? Или я опять заблуждаюсь?
ну и к чему те все танцы с бубном, если в сим800 всего три ат команды нужно использовать и получаете сразу координаты в gps значениях широту и долготу и потом в карту можно вставить???
Вы чего лесапед изобретаете.. Цепляешь sim800 к ардуино и туда же цепляешь gps модуль. Вот вам и трекер с отправкой куда угодно, хоть по sms хоть в Интернет. Кстати, щас делаю сервер для приема данных с разных датчиков, замков и сигнализаций. Заказал vps. Вот думаю, нарно через MQTT буду слать и принимать.
ну и к чему те все танцы с бубном, если в сим800 всего три ат команды нужно использовать и получаете сразу координаты в gps значениях широту и долготу и потом в карту можно вставить???
Это просто ради интереса)
dioxin пишет:
Вы чего лесапед изобретаете.. Цепляешь sim800 к ардуино и туда же цепляешь gps модуль. Вот вам и трекер с отправкой куда угодно, хоть по sms хоть в Интернет. Кстати, щас делаю сервер для приема данных с разных датчиков, замков и сигнализаций. Заказал vps. Вот думаю, нарно через MQTT буду слать и принимать.
Так это получается покупать лишний модуль. Лишние затраты, лишнее занимаемое пространство. Если sim800L умеет выходить в интернет и получать координаты, то зачем лишний модуль?
Вы чего лесапед изобретаете.. Цепляешь sim800 к ардуино и туда же цепляешь gps модуль. Вот вам и трекер с отправкой куда угодно, хоть по sms хоть в Интернет. Кстати, щас делаю сервер для приема данных с разных датчиков, замков и сигнализаций. Заказал vps. Вот думаю, нарно через MQTT буду слать и принимать.
сим800 уже сам является гпс модулем одноврнменно.. только точность меньше.
но ведь не всегда обязательно до метра знать где, часто нужно например насленный пункт знать и все.
AGPS плюс\минус километр, а то и более в городе, координаты по сигналам с вышек хз даже кому может понадобиться такое ориентирование на местности, полноценный gps модуль стоит ~5ОО-6ОО рэ вроде, зато точность в метрах, опять же под определенные задачи.
Да, сегодня попробовал: в сетапе настройки GPRS, а далее в основной проге три команды, и сообщение с координатами в мониторе) Правда в моём случае погрешность оказалась больше километра....
Попутно созрел вопрос - кто нибудь пользуется ресетом на плате модуля в готовых проектах? Является ли он эквивалентом сброса питания? В мануале я нашел только то, что использовать этот ресет нужно, когда программный не помогает, причем программный ресет предполагает отключение питания, насколько я понял.
Напишу про первый опыт с sim800l, может кому то будет полезным. Подключал sim800l через DC-DC преобразователь на 3а, выставлял напряжение 4в. В качестве блока питания использовал китайский с USB выходами, заявленный ток 2,1а. Использовал нанку как мост UART-USB и мучил модуль через терминальную программу с компа АТ командами.
С первого раза модуль отказался искать сеть. Причем с разными SIM картами пробовал. При наличии сигнала сети в AT+CSQ, на команду AT+CREG? отвечал 0,0 - типа не зарегистрирован и сеть не ищет.
Предположил, что не видит SIM карту. Прозвонка ножек держателя SIM выявила короткое замыкание между первой и второй ногой, причем похоже, где то под самим держателем припой попал. Пришлось отпаивать держатель и припаивать заново. После этого проблема ушла - модуль стал стабильно регистрироваться в сети. Причем у меня он регистрируется как при питании от блока питания, так и от USB. Хотя при USB питании процесс регистрации в сети идет дольше.
Резюме - если не регистрируется в сети имеет смысл проверить пайку держателя. Ножки не должны иметь контакт друг с другом. Предпоследняя ножка держателя не припаяна - это нормально.
Есть вопрос по допустимым напряжениям на TX RX модуля. В доках прочитал, что там вообще меньше 3в максимальное напряжение высокого уровня и типо для подключения к 5в модулю нужно согласователь уровней городить. Китайцы в Али вроде пишут, что напрямую можно подключать... Нужно уровни согласовывать или нет? Кто как делает?
Возник вопрос по контролю состояния sim800l и перезагрузки модуля.
Использую AT команды, связка Мега2560 и Sim800l. Хотелось бы контролировать состояние sim800l и если он завис(нет ответа и т.д.) можно было перезагрузить Sim800l.
Возник вопрос по контролю состояния sim800l и перезагрузки модуля.
Использую AT команды, связка Мега2560 и Sim800l. Хотелось бы контролировать состояние sim800l и если он завис(нет ответа и т.д.) можно было перезагрузить Sim800l.
Возможно такое организовать?
Спасибо
Рабочий урезаный код моей проги, работает у меня уже более года)
Код для проверки работоспособности системы без каких либо часов реального времени, ну и чуть-чуть кода для отправки смс на номер( номер указан в начале кода).
Я люблю работать с памятью ардуины, т.к. хочу управлять сам своим ус-вом
я бы поспорил, что там стабильно... инициализация разбита на 6 кусков с чередованием всего цикла программы??
странно.. можно (и думаю нужно) - делать инициализацию отдельно вначале одним куском, можно с вычиткой ответов - не проблема. и уже потом переходим к программе...
проверять сеть каждые 40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
нет сети или нет ответа - перегружаем модуль..
а у вас как то получается все мухи и котлеты в одной тарелке, да и читается код без дополнительных пояснений (их просто мало) - ужасно для понимания концепции замысла программы.
я бы поспорил, что там стабильно... инициализация разбита на 6 кусков с чередованием всего цикла программы??
странно.. можно (и думаю нужно) - делать инициализацию отдельно вначале одним куском, можно с вычиткой ответов - не проблема. и уже потом переходим к программе...
проверять сеть каждые 40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
нет сети или нет ответа - перегружаем модуль..
у меня работает полная прога уже год без глюков, ну а, если сеть теряет, то и нужны эти 6 циклов, а так при нормальной работе, они пропускаются.
Состав системы: - 2 датчика температуры-влажности(один устанавливается на улице, второй в доме)
- 2 датчика движения(устанавливаются в доме)
- 1 датчик на открытие входной двери
- сирена с маяком
- Бесперебойный бокс(при отсутствии питание ваша система всегда работает)
Управление производится посредством телефона.
Возможности:
- Постановка и снятие с охраны.
- Запрос баланса (Авто режим, если на счете м.100 руб, происходит оповещение)
- Запрос состояния системы(Состояние контроля дома, напряжение 220В, напряжение аккумулятора, температура и влажность, сигнал сотовой сети)
- Квитирование тревог
- При пропадании напряжения 220В, придет смс
- При возобновлении напряжения 220В, придет смс
- При разряде аккумулятора, придет смс
- При срабатывании по датчикам, придет смс, включится сирена
- При открывании бокса, придет смс, включится сирена
40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
командами AT+CPAS и AT+CSQ?
А какой командой перезагрузить модуль?
если модуль реально зависает, то это проблема модуля
Его можно только по питанию передернуть
ха-ха-ха .. :) нет конечно, необязательно. есть масса причин когда у модуля проблемы возникают...
и и например разряды молнии..и обмен базы оператора с модулем когда у модуля ступор может возникнуть и не только. База за ваш телефон "забудет" и нужно заново "войти" в сеть, а для этого перегрузить модуль.
так что утверждение что это проблемы модуля - неверное совсем..
40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
командами AT+CPAS и AT+CSQ?
А какой командой перезагрузить модуль?
если модуль реально зависает, то это проблема модуля
Его можно только по питанию передернуть
ха-ха-ха .. :) нет конечно, необязательно. есть масса причин когда у модуля проблемы возникают...
и и например разряды молнии..и обмен базы оператора с модулем когда у модуля ступор может возникнуть и не только. База за ваш телефон "забудет" и нужно заново "войти" в сеть, а для этого перегрузить модуль.
так что утверждение что это проблемы модуля - неверное совсем..
для всего этого реализованы 6 циклов, пока прога не пройдет все, система не будет работать, как только проходит последний цикл, все отрабатываем код
40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
командами AT+CPAS и AT+CSQ?
А какой командой перезагрузить модуль?
если модуль реально зависает, то это проблема модуля
Его можно только по питанию передернуть
ха-ха-ха .. :) нет конечно, необязательно. есть масса причин когда у модуля проблемы возникают...
и и например разряды молнии..и обмен базы оператора с модулем когда у модуля ступор может возникнуть и не только. База за ваш телефон "забудет" и нужно заново "войти" в сеть, а для этого перегрузить модуль.
так что утверждение что это проблемы модуля - неверное совсем..
и нужно заново "войти" в сеть, а для этого перегрузить модуль.
заново "войти" в сеть, а для этого перегрузить модуль.
А как перегрузить модуль, можете рассказать?
Спасибо
по хорошему - ставите силовой ключ на питание gsm модуля. и ардуиной управляете этим ключом снимая питание на несколько секунд.
Это самый надежный вариант применяемый во всех проф. сигнализациях. Так как модуль может и не отвечать на ат команды вообще. поэтому только по питанию.
А вот этого нету, не делают ни в одном заводском шилде.
заново "войти" в сеть, а для этого перегрузить модуль.
А как перегрузить модуль, можете рассказать?
Спасибо
по хорошему - ставите силовой ключ на питание gsm модуля. и ардуиной управляете этим ключом снимая питание на несколько секунд.
Это самый надежный вариант применяемый во всех проф. сигнализациях. Так как модуль может и не отвечать на ат команды вообще. поэтому только по питанию.
А вот этого нету, не делают ни в одном заводском шилде.
Таким образом придется его выключать (если он конечно будет отзываться на команды АТ) командой AT+CPOWD=1, а как его после этого включить?
Именно про это я и пытался спросить в посте 417. Если я правильно понял мануал модуля, то в случае отказа АТ команд ( и соответственно невозможность перегрузить модуль командой AT+CPOWD) рекомендуют пользоваться резетом на модуле, т.е. подавать на резет минусовой импульс, из чего напрашивается вывод, что резет эквивалентен сбросу питания. Вопрос в том, как это проверить, т.к. лично у меня модули не зависали ни разу.
Я бы сделал просто и жестко. На определенный выход ардуины подал сигнал, который на 1 сек. включит миниатурное реле, которое в свою очередь разомнет и через секунду сомкнет контакты в разрыве питания модуля. Мудрите вы чет в этой теме!
Я бы сделал просто и жестко. На определенный выход ардуины подал сигнал, который на 1 сек. включит миниатурное реле, которое в свою очередь разомнет и через секунду сомкнет контакты в разрыве питания модуля. Мудрите вы чет в этой теме!
вы правы, только нужно на 5 а лучше 10сек, чтобы в самом гсм модуле все разрялилось. после 1сек может ничего не поменяться.
Я бы сделал просто и жестко. На определенный выход ардуины подал сигнал, который на 1 сек. включит миниатурное реле, которое в свою очередь разомнет и через секунду сомкнет контакты в разрыве питания модуля. Мудрите вы чет в этой теме!
можете проверять уровень сигнала, если его нет (делаем цикл, т.е. делаем 3 попытки регистрации в состовой сети), если не регистрируется gsm, то вкл. реле на 3 сек(разомкнуть питание на GSM), а дальше проходим регистрацию в сети и все остальные АТ команды для работы
Ну вы меня поняли... А какую задежку ставить легко подобрать.. Практика рулит! Дерзаем!
Проверяем в цикле есть ли сигнал, если нет даем команду сервоприводу на шевеление антенны туда-сюда, проверяем сигнал, если опять нет, шевелим контакты и тем-же сервоприводом пинаем себя, затем выключаем-включаем реле ;)
Алгоритмов куча! И вместо того, чтобы спрашивать на форумах, нужно все сперва самому проверить на практике, потом делиться этим и задавать вопросы.
Да нет проблем. Сделайте аварийную ситуацию искусственно. Понизьте питание, экранируйте антенну, соберите простенький подавитель сети в конце концов. Если уж испытывать такую вещь как сигнализация для дома, то тут нельзя пренебрегать ничем. Или вы думаете воры тупее вас?
Добрый день, никто не сталкивался при запросе NTP времени (пока юзал www.ntp-servers.net) командой AT+CNTP("AT+CNTP=\"88.147.254.227\",12") - иногда(редко) время синхронизируется неверно, например +4 или +5 часов к моему. Причем синхронизируется через минуту и все нормально. С указанного сайта я использовал ip 1 яруса, перешел на ip 2 яруса - пока не замечал глюков.
P.S. - на 2 ярусе тоже была обнаружена ошибка синхронизации - 07.02.2017 20:50:11(время до синхронизации) | 08.02.2017 01:49:47 (время после синхронизации)
скажите, а SIM800L вообще может получать координаты GPS ну хотябы используя вышки?
а даташит хоть раз прочитать. или анонсы по модулю коих в интернете валом?
а даташит хоть раз прочитать. или анонсы по модулю коих в интернете валом?
Так в том и дело, в даташите команды видел, а в видео ни одного упоминания не нашёл. Потому решил спросить на всякий случай прямо.
так не смотрите видео, все в даташиет раписано.
дподнимаете интернет на модуле, потом даете команду и в ответ получаете долготу и широту, все...
Разве без интернета он не определит координаты? Понтяно, что разброс выше будет, но всё же.
без интернета? нет конечно... база координат всех вышек мира не поместится в модуль... да и не только.
Похоже на то. Есть вариант, но не совсем удобный [https://habrahabr.ru/company/promwad/blog/223635/]
Поправьте, если путаю, модуль Neoway m590 тоже ведь умеет выходить в интернет, но (в отличие от SIM800L) не поддерживает AT комнанды на определение координат? Или я опять заблуждаюсь?
не видел я у 590 возможности выдать координаты.
ну и к чему те все танцы с бубном, если в сим800 всего три ат команды нужно использовать и получаете сразу координаты в gps значениях широту и долготу и потом в карту можно вставить???
Вы чего лесапед изобретаете.. Цепляешь sim800 к ардуино и туда же цепляешь gps модуль. Вот вам и трекер с отправкой куда угодно, хоть по sms хоть в Интернет. Кстати, щас делаю сервер для приема данных с разных датчиков, замков и сигнализаций. Заказал vps. Вот думаю, нарно через MQTT буду слать и принимать.
не видел я у 590 возможности выдать координаты.
Спасибо. Подтвердили мои наблюдения.
ну и к чему те все танцы с бубном, если в сим800 всего три ат команды нужно использовать и получаете сразу координаты в gps значениях широту и долготу и потом в карту можно вставить???
Это просто ради интереса)
Вы чего лесапед изобретаете.. Цепляешь sim800 к ардуино и туда же цепляешь gps модуль. Вот вам и трекер с отправкой куда угодно, хоть по sms хоть в Интернет. Кстати, щас делаю сервер для приема данных с разных датчиков, замков и сигнализаций. Заказал vps. Вот думаю, нарно через MQTT буду слать и принимать.
Так это получается покупать лишний модуль. Лишние затраты, лишнее занимаемое пространство. Если sim800L умеет выходить в интернет и получать координаты, то зачем лишний модуль?
Вы чего лесапед изобретаете.. Цепляешь sim800 к ардуино и туда же цепляешь gps модуль. Вот вам и трекер с отправкой куда угодно, хоть по sms хоть в Интернет. Кстати, щас делаю сервер для приема данных с разных датчиков, замков и сигнализаций. Заказал vps. Вот думаю, нарно через MQTT буду слать и принимать.
сим800 уже сам является гпс модулем одноврнменно.. только точность меньше.
но ведь не всегда обязательно до метра знать где, часто нужно например насленный пункт знать и все.
сим800 уже сам является гпс модулем одноврнменно.. только точность меньше.
Вы пробовали определять координаты с помощью sim800L? Неужели такой большой разброс?
да разброс. от 200-300-500-800 метров в городе до 0,5-1-2-3-5-15-20 км за городом. как повезет.
AGPS плюс\минус километр, а то и более в городе, координаты по сигналам с вышек хз даже кому может понадобиться такое ориентирование на местности, полноценный gps модуль стоит ~5ОО-6ОО рэ вроде, зато точность в метрах, опять же под определенные задачи.
гпс не может сразу после вкл пит найти коорд.. не может в гараже.. под капотом и т.д.. не все так просто.
Согласен. Если особая точность не нужна, то можно и по координатам вышек. Качаем базы, кидаем на сервер и пишем управляющие программы.
нафига качаем базы ?????? отправляем ТРИ!! ат команды и в ответ получаем координаты. ничего качать не нужно.
гпс модуль стоит дороже гсм модуля.
Да, сегодня попробовал: в сетапе настройки GPRS, а далее в основной проге три команды, и сообщение с координатами в мониторе) Правда в моём случае погрешность оказалась больше километра....
Попутно созрел вопрос - кто нибудь пользуется ресетом на плате модуля в готовых проектах? Является ли он эквивалентом сброса питания? В мануале я нашел только то, что использовать этот ресет нужно, когда программный не помогает, причем программный ресет предполагает отключение питания, насколько я понял.
Доброго дня всем!
Напишу про первый опыт с sim800l, может кому то будет полезным. Подключал sim800l через DC-DC преобразователь на 3а, выставлял напряжение 4в. В качестве блока питания использовал китайский с USB выходами, заявленный ток 2,1а. Использовал нанку как мост UART-USB и мучил модуль через терминальную программу с компа АТ командами.
С первого раза модуль отказался искать сеть. Причем с разными SIM картами пробовал. При наличии сигнала сети в AT+CSQ, на команду AT+CREG? отвечал 0,0 - типа не зарегистрирован и сеть не ищет.
Предположил, что не видит SIM карту. Прозвонка ножек держателя SIM выявила короткое замыкание между первой и второй ногой, причем похоже, где то под самим держателем припой попал. Пришлось отпаивать держатель и припаивать заново. После этого проблема ушла - модуль стал стабильно регистрироваться в сети. Причем у меня он регистрируется как при питании от блока питания, так и от USB. Хотя при USB питании процесс регистрации в сети идет дольше.
Резюме - если не регистрируется в сети имеет смысл проверить пайку держателя. Ножки не должны иметь контакт друг с другом. Предпоследняя ножка держателя не припаяна - это нормально.
Есть вопрос по допустимым напряжениям на TX RX модуля. В доках прочитал, что там вообще меньше 3в максимальное напряжение высокого уровня и типо для подключения к 5в модулю нужно согласователь уровней городить. Китайцы в Али вроде пишут, что напрямую можно подключать... Нужно уровни согласовывать или нет? Кто как делает?
Добрый день.
Возник вопрос по контролю состояния sim800l и перезагрузки модуля.
Использую AT команды, связка Мега2560 и Sim800l. Хотелось бы контролировать состояние sim800l и если он завис(нет ответа и т.д.) можно было перезагрузить Sim800l.
Возможно такое организовать?
Спасибо
да, возможно.
да, возможно.
1. Я нашел одну команду контроля статуса - AT+CPAS, она подойдет для этого или нужно другие использовать?
2. Каким образом нужно соединить SIM800l с мегой2560 чтобы подать команду на перезагрузку и какую команду подать для этого?
Спасибо.
Short Circuit - А можете подсказать как это реализовать?
Спасибо
Добрый день.
Возник вопрос по контролю состояния sim800l и перезагрузки модуля.
Использую AT команды, связка Мега2560 и Sim800l. Хотелось бы контролировать состояние sim800l и если он завис(нет ответа и т.д.) можно было перезагрузить Sim800l.
Возможно такое организовать?
Спасибо
Рабочий урезаный код моей проги, работает у меня уже более года)
Код для проверки работоспособности системы без каких либо часов реального времени, ну и чуть-чуть кода для отправки смс на номер( номер указан в начале кода).
Я люблю работать с памятью ардуины, т.к. хочу управлять сам своим ус-вом
В данном примере нет работы с памятью.
001
#include <SoftwareSerial.h>
002
SoftwareSerial gsm(2, 3);
// 2-txd, 3-rxo
003
#define led 13 // светодиод
004
005
String NBoss =
"79817425566"
;
006
007
int
i = 0;
008
int
Automatic = 0;
009
int
StartGSM = 0;
010
011
// Переменные для чтения смс
012
String currStr =
""
;
013
String dataSmsN =
""
;
014
int
flag1 = 0;
015
int
flag2 = 0;
016
String currStrN =
""
;
017
char
currSymb = 0;
018
String dataSms =
""
;
019
String dataBalance =
""
;
020
//String dataBalanceNumber = "";
021
String dataBalanceTemp =
""
;
022
String val =
""
;
023
int
ch = 0;
024
char
data = 0;
025
026
// Переменные для обработки смс +CSQ
027
int
intNumberLevelFirst = 0;
028
int
intNumberLevelSecond = 0;
029
int
IntSignalLevel = 0;
030
int
FlagSignal = 0;
031
032
int
countLed = 0;
033
long
counter = 0;
034
long
timerForSignalGSM = 1000000;
035
int
timerSearchGSM = 20;
// таймер для регистрации сети GSm 20*2000=40 сек
036
037
int
tempBalans = 0;
// переменная, хранящая метку о запросе баланса
038
int
tempZaprosBalansa = 0;
// переменная, хранящая метку о запросе каждый день баланса
039
040
int
SendSmsDeviceOn = 0;
041
042
void
setup
() {
043
// Мигание светодиода на плате, говорит о работоспособности системы
044
pinMode(led, OUTPUT); digitalWrite(led, LOW);
045
046
// Читаем из памяти данные о состоянии системы
047
Automatic = 1;
//EEPROM.read(0); // Убрал для примера
048
049
050
// делаем задержку на поиск сотовой сети
051
for
(i=0; i<=timerSearchGSM; i++){
052
if
(Automatic == 1){digitalWrite(led, HIGH);delay(250);}
053
if
(Automatic == 1){digitalWrite(led, LOW);delay(250);}
054
}
055
}
056
057
void
loop
() {
058
// Запускаем GSM
059
if
(StartGSM == 0){
060
gsm.begin(9600);
061
gsm.write(
"AT+CMGF=1\r"
);
// устанавливает текстовый режим смс-сообщения
062
delay(300);
063
}
064
if
(StartGSM == 1){
065
gsm.write(
"AT+IFC=1, 1\r"
);
//устанавливает программный контроль потоком передачи данных
066
delay(300);
067
}
068
if
(StartGSM == 2){
069
gsm.write(
"AT+CPBS=\"SM\"\r"
);
//открывает доступ к данным телефонной книги SIM-карты
070
delay(300);
071
}
072
if
(StartGSM == 3){
073
gsm.write(
"AT+CNMI=1,2,2,1,0\r"
);
// включает оповещение о новых сообщениях, новые сообщения
074
delay(500);
075
}
076
if
(StartGSM == 4){
077
gsm.write(
"AT+GSMBUSY=1\r\n"
);
// запрет всех входящих звонков.
078
delay(300);
079
}
080
if
(StartGSM == 5){
081
gsm.write(
"AT+CMGDA=DEL ALL\r\n"
);
// команда удалит все сообщения
082
delay(500);
083
}
084
if
(FlagSignal == 0 && StartGSM == 6){
085
gsm.println(
"AT+CSQ"
);
// Проверяем уровень сигнала
086
delay(800);
087
}
088
089
// Работоспособность системы
090
countLed++;
091
if
(countLed >= 500){
092
digitalWrite(led, HIGH);
093
}
094
if
(countLed >= 1000){
095
digitalWrite(led, LOW);
096
countLed = 0;
097
}
098
099
// Проверяем включено ли было устройство, если система на охране или снята с охраны и сеть есть
100
if
(Automatic <=1 && SendSmsDeviceOn == 1 && FlagSignal == 1 && StartGSM == 6){
101
smsSendAlarm(
"Hi, Device on!"
);
102
SendSmsDeviceOn = 0;
103
}
104
105
106
// Проверка уровня сигнала во время работы системы каждые 20сек(400000)
107
// Смысл этой процедуры: проверка по таймеру и если уровень сигнала нормальный и вроде бы сиситема работает нормально,
108
// делаем проверку уровня сигнала для проверки работоспособности системы, если сигнала нет, смотрим код, где все начинается заново
109
110
counter++;
111
if
(counter >= timerForSignalGSM && FlagSignal == 1 && StartGSM == 6){
112
gsm.println(
"AT+CSQ"
);
113
delay(300);
114
// Обнуляем счетчик
115
counter = 0;
116
}
117
118
//*********************
119
if
(gsm.available()) {
//есть данные от GSM модуля
120
121
currStr =
""
;
//выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
122
currStrN =
""
;
123
dataBalanceTemp =
""
;
124
dataSms =
""
;
125
val =
""
;
126
flag1 = 0;
127
flag2 = 0;
128
while
(gsm.available()) {
//сохраняем входную строку в переменную val
129
ch = gsm.read();
//int
130
val +=
char
(ch);
// String
131
data = ch;
// char = int
132
if
(
'\r'
== data) {
133
currStr =
""
;
134
}
else
if
(
'\n'
!= data) {
135
currStr += String(data);
136
dataSms = currStr;
137
}
138
//+CMT: "+79819998877","","16/04/18,20:25:08+12"
139
if
(data ==
'+'
&& flag1 == 0){flag1 = 1;}
140
if
(data ==
'C'
&& flag1 == 1){flag1 = 2;}
141
if
(data ==
'M'
&& flag1 == 2){flag1 = 3;}
142
if
(data ==
'T'
&& flag1 == 3){flag1 = 4;}
143
if
(data ==
'+'
&& flag1 == 4){currStrN =
""
;flag1 = 5;}
144
if
(data !=
'"'
&& flag1 == 5){currStrN += String(data); dataSmsN = currStrN;}
145
if
(data ==
'"'
&& flag1 == 5){flag1 = 6;}
146
147
//+CUSD: 0, "Balance:117,27r ", 15
148
if
(data ==
'U'
&& flag1 == 2){flag2 = 3;}
149
if
(data ==
'S'
&& flag2 == 3){flag2 = 4;}
150
if
(data ==
'D'
&& flag2 == 4){flag2 = 5;}
151
if
(data ==
':'
&& flag2 == 5){flag2 = 6;}
152
if
(data ==
'"'
&& flag2 == 6){dataBalanceTemp = ""; flag2 = 7;
goto
c;}
153
if
(data !=
'"'
&& flag2 == 7){dataBalanceTemp += String(data); dataBalance = dataBalanceTemp;}
154
if
(data ==
'"'
&& flag2 == 7){flag2 = 8;}
155
// if (data == ':' && flag2 == 7){dataBalanceTemp = ""; flag2 = 8; goto c;}
156
// if (data != ':' && flag2 == 8){dataBalanceTemp += String(data); dataBalanceNumber = dataBalanceTemp; flag2 = 9;}
157
158
}
159
160
// Смотрим данные полученные //режим кодировки СМС - обычный (для англ.)
161
if
(val.indexOf(
"+CMGF"
) > -1){
162
if
(dataSms.indexOf(
"OK"
) > -1) {
163
StartGSM = 1;
164
}
165
}
166
// Смотрим данные полученные //устанавливает программный контроль потоком передачи данных
167
if
(val.indexOf(
"+IFC"
) > -1){
168
if
(dataSms.indexOf(
"OK"
) > -1) {
169
StartGSM = 2;
170
}
171
}
172
// Смотрим данные полученные //открывает доступ к данным телефонной книги SIM-карты
173
if
(val.indexOf(
"+CPBS"
) > -1){
174
if
(dataSms.indexOf(
"OK"
) > -1) {
175
StartGSM = 3;
176
}
177
}
178
// Смотрим данные полученные //включает оповещение о новых сообщениях, новые сообщения
179
if
(val.indexOf(
"+CNMI"
) > -1){
180
if
(dataSms.indexOf(
"OK"
) > -1) {
181
StartGSM = 4;
182
}
183
}
184
// Смотрим данные полученные //запрет всех входящих звонков.
185
if
(val.indexOf(
"+GSMBUSY"
) > -1){
186
if
(dataSms.indexOf(
"OK"
) > -1) {
187
StartGSM = 5;
188
}
189
}
190
// Смотрим данные полученные //команда удалит все сообщения
191
if
(val.indexOf(
"+CMGDA"
) > -1){
192
if
(dataSms.indexOf(
"OK"
) > -1) {
193
StartGSM = 6;
194
}
195
}
196
// Смотрим данные полученные от модуля +CSQ: 22,0
197
if
(val.indexOf(
"+CSQ"
) > -1) {
198
for
(i=0; i<=20; i++){
199
if
(val[i] == 58) {
200
intNumberLevelFirst = val[i+2]-48;
201
if
(val[i+3] == 44){ intNumberLevelSecond = 0;}
202
if
(val[i+3] != 44){ intNumberLevelSecond = val[i+3]-48;}
203
if
(val[i+3] == 44){IntSignalLevel = intNumberLevelFirst;}
204
if
(val[i+3] != 44){IntSignalLevel = (intNumberLevelFirst*10) + intNumberLevelSecond;}
205
}
206
}
207
if
(IntSignalLevel == 99 || IntSignalLevel == 0){
208
for
(i=0; i<=timerSearchGSM; i++){
209
if
(Automatic == 0){
// можно что-то включить, например светодиод}
210
delay(1000);
211
if
(Automatic == 0){
// можно что-то выключить, например светодиод}
212
delay(1000);
213
}
214
FlagSignal = 0; StartGSM = 0;
215
}
216
if
(IntSignalLevel <=32 && IntSignalLevel !=0){
217
FlagSignal = 1;
218
}
219
}
220
221
// Смотрим данные полученные от модуля пришло смс
222
if
(val.indexOf(
"+CMTI:"
) > -1) {
// +CMTI: "SM",
223
StartGSM = 0;
224
}
225
226
// Смотрим данные полученные от модуля, Получили смс с балансом, теперь отсылаем
227
if
(val.indexOf(
"+CUSD:"
) > -1) {
228
if
(dataBalance !=
""
&& tempBalans == 1) {
229
smsSendAlarm(
"Hi, "
+ dataBalance);
230
tempBalans = 0;
231
dataBalance =
""
;
232
}
233
if
(dataBalance[8]-48 >= 1 && dataBalance[9]-48 >= 0 && dataBalance[10]-48 >= 0){
234
// ничего не делаем
235
}
else
if
(tempZaprosBalansa == 1){
236
smsSendAlarm(
"Hi, balance < 100r, vash balance = "
+ dataBalance);
237
tempZaprosBalansa = 0;
238
dataBalance =
""
;
239
}
240
}
241
242
243
244
245
246
247
//----------------------- определение факта приема СМС и сравнение номера(ов) с заданным(и)
248
if
(val.indexOf(
"+CMT"
) > -1) {
249
// Здесь обрабатываем смс
250
}
//+cmt
251
252
}
253
}
// коней if gsm
254
}
255
}
256
257
258
//процедура отправки СМС
259
void
smsSendAlarm(String text) {
260
// ReadNBoss(); //Читаем номер из памяти
261
gsm.println(
"AT+CMGS=\""
+ NBoss +
"\""
);
//Отправляем на GSM комманду отправка смс-номер
262
// NBoss = ""; //Очищаем перемунную
263
delay(300);
//Делаем задержку на передачу комманды
264
gsm.print(text);
//Отправляем на GSM комманду отправка смс-текст
265
text =
""
;
//Очищаем перемунную
266
delay(500);
//Делаем задержку на передачу комманды
267
gsm.print((
char
)26);
//Отправляем на GSM комманду отправка смс!
268
delay(5000);
//Делаем задержку отправку смс
269
270
}
как то замороченно с этими -
if
(StartGSM == ....
как то замороченно с этими -
if
(StartGSM == ....
зато работает стабильно
я бы поспорил, что там стабильно... инициализация разбита на 6 кусков с чередованием всего цикла программы??
странно.. можно (и думаю нужно) - делать инициализацию отдельно вначале одним куском, можно с вычиткой ответов - не проблема. и уже потом переходим к программе...
проверять сеть каждые 40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
нет сети или нет ответа - перегружаем модуль..
а у вас как то получается все мухи и котлеты в одной тарелке, да и читается код без дополнительных пояснений (их просто мало) - ужасно для понимания концепции замысла программы.
я бы поспорил, что там стабильно... инициализация разбита на 6 кусков с чередованием всего цикла программы??
странно.. можно (и думаю нужно) - делать инициализацию отдельно вначале одним куском, можно с вычиткой ответов - не проблема. и уже потом переходим к программе...
проверять сеть каждые 40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
нет сети или нет ответа - перегружаем модуль..
у меня работает полная прога уже год без глюков, ну а, если сеть теряет, то и нужны эти 6 циклов, а так при нормальной работе, они пропускаются.
Состав системы:
- 2 датчика температуры-влажности(один устанавливается на улице, второй в доме)
- 2 датчика движения(устанавливаются в доме)
- 1 датчик на открытие входной двери
- сирена с маяком
- Бесперебойный бокс(при отсутствии питание ваша система всегда работает)
Управление производится посредством телефона.
Возможности:
- Постановка и снятие с охраны.
- Запрос баланса (Авто режим, если на счете м.100 руб, происходит оповещение)
- Запрос состояния системы(Состояние контроля дома, напряжение 220В, напряжение аккумулятора, температура и влажность, сигнал сотовой сети)
- Квитирование тревог
- При пропадании напряжения 220В, придет смс
- При возобновлении напряжения 220В, придет смс
- При разряде аккумулятора, придет смс
- При срабатывании по датчикам, придет смс, включится сирена
- При открывании бокса, придет смс, включится сирена
40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
командами AT+CPAS и AT+CSQ?
А какой командой перезагрузить модуль?
- При пропадании напряжения 220В, придет смс
- При возобновлении напряжения 220В, придет смс
- При разряде аккумулятора, придет смс
Как это у Вас реализовано в коде и на физическом уровне?
40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
командами AT+CPAS и AT+CSQ?
А какой командой перезагрузить модуль?
если модуль реально зависает, то это проблема модуля
Его можно только по питанию передернуть
40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
командами AT+CPAS и AT+CSQ?
А какой командой перезагрузить модуль?
если модуль реально зависает, то это проблема модуля
Его можно только по питанию передернуть
ха-ха-ха .. :) нет конечно, необязательно. есть масса причин когда у модуля проблемы возникают...
и и например разряды молнии..и обмен базы оператора с модулем когда у модуля ступор может возникнуть и не только. База за ваш телефон "забудет" и нужно заново "войти" в сеть, а для этого перегрузить модуль.
так что утверждение что это проблемы модуля - неверное совсем..
- При пропадании напряжения 220В, придет смс
- При возобновлении напряжения 220В, придет смс
- При разряде аккумулятора, придет смс
Как это у Вас реализовано в коде и на физическом уровне?
При пропадании напряжения 220В, придет смс
вот кусок кода из моей проги:
01
// Проверяем состояние напряжения 220
02
counterVoltage220++;
03
if
(counterVoltage220 >= timerFor220V && Automatic <= 1){
04
// если нет 220 и состояние220 = 0 и есть сигнал и все настройки gsm успешны
05
if
(analogRead(Power220) <20 && state220 == 0 && FlagSignal == 1 && StartGSM == 6){
06
state220 = 1;
07
smsSendAlarm(
"Alarm! Voltage 220 No"
);
08
}
09
//если нет 220 то гасим реле все
10
if
(analogRead(Power220) <20 && FlagSignal == 1 && StartGSM == 6){
11
digitalWrite(rele1,!LOW);
12
digitalWrite(rele2,!LOW);
13
}
14
//
15
if
(analogRead(Power220) >20 && state220 == 1 && FlagSignal == 1 && StartGSM == 6){
16
state220 = 0;
17
if
(Automatic == 1){
18
// если питание появилось и флаги тревог не активны, то выполняем заново постановку на охрану
19
digitalWrite(rele2,!HIGH);
20
if
(ACh01 == 0 && ACh02 == 0 && ACh03 == 0){
21
AutoEnable = 0;
22
}
23
// если появилось питание и флаги тревог активны, то вкл. реле
24
if
(ACh01 == 1 || ACh02 == 1 || ACh03 == 1){
25
digitalWrite(rele1,!HIGH);
26
}
27
}
28
smsSendAlarm(
"Voltage 220 Norm"
);
29
}
30
// Обнуляем счетчик
31
counterVoltage220 = 0;
32
}
При разряде аккумулятора, придет смс
01
// считывание аналогового значения напряжения 12В
02
counterVoltage12++;
03
if
(counterVoltage12 >= timerFor12V){
04
ReadAnalogPin = analogRead(TempVoltage12V);
05
vout = (ReadAnalogPin * 5.0) / 1024.0;
06
vin = vout / (R2/(R1+R2));
07
if
(vin<6.0) {
08
vin=0.0;
// обнуляем нежелательное значение
09
}
10
if
(vin <= 9 && Kvitir12V == 0 && FlagSignal == 1 && StartGSM == 6){
11
Kvitir12V = 1;
12
smsSendAlarm(
"Alarm! Voltage battery < 9V"
);
13
stateSirena = 2;
14
}
15
if
(vin >= 10 && Kvitir12V == 1 && FlagSignal == 1 && StartGSM == 6){
16
Kvitir12V = 0;
17
smsSendAlarm(
"Voltage battery > 10V"
);
18
if
(Automatic == 1){digitalWrite(rele2,!HIGH);}
19
stateSirena = 0;
20
}
21
// Обнуляем счетчик
22
counterVoltage12 = 0;
23
}
У меня Бокс Бесперебойного питания, там есть индикатор(LED) о наличии питания, к нему припаеваемся, и дальше собираем схему из резисторов, ссылка тут
40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
командами AT+CPAS и AT+CSQ?
А какой командой перезагрузить модуль?
если модуль реально зависает, то это проблема модуля
Его можно только по питанию передернуть
ха-ха-ха .. :) нет конечно, необязательно. есть масса причин когда у модуля проблемы возникают...
и и например разряды молнии..и обмен базы оператора с модулем когда у модуля ступор может возникнуть и не только. База за ваш телефон "забудет" и нужно заново "войти" в сеть, а для этого перегрузить модуль.
так что утверждение что это проблемы модуля - неверное совсем..
для всего этого реализованы 6 циклов, пока прога не пройдет все, система не будет работать, как только проходит последний цикл, все отрабатываем код
При замере напряжения! по ссылке в посте 432
Помните, что напряжение выше 55 В может вывести плату Arduino из строя!
фотки при сборке системы в бокс тут
тестил питание для gsm от 2-х разных плат питания, старые на фото имеются, но не используются
40 сек - поверьте, это очень часто, достаточно раз в 2-3 мин.
командами AT+CPAS и AT+CSQ?
А какой командой перезагрузить модуль?
если модуль реально зависает, то это проблема модуля
Его можно только по питанию передернуть
ха-ха-ха .. :) нет конечно, необязательно. есть масса причин когда у модуля проблемы возникают...
и и например разряды молнии..и обмен базы оператора с модулем когда у модуля ступор может возникнуть и не только. База за ваш телефон "забудет" и нужно заново "войти" в сеть, а для этого перегрузить модуль.
так что утверждение что это проблемы модуля - неверное совсем..
и нужно заново "войти" в сеть, а для этого перегрузить модуль.
А как перегрузить модуль, можете рассказать?
Спасибо
stambylov -спасибо, буду изучать.
А как перегрузить модуль, можете рассказать?
Спасибо
по хорошему - ставите силовой ключ на питание gsm модуля. и ардуиной управляете этим ключом снимая питание на несколько секунд.
Это самый надежный вариант применяемый во всех проф. сигнализациях. Так как модуль может и не отвечать на ат команды вообще. поэтому только по питанию.
А вот этого нету, не делают ни в одном заводском шилде.
для всего этого реализованы 6 циклов, пока прога не пройдет все, система не будет работать, как только проходит последний цикл, все отрабатываем код
это я вижу, что вы на 6 циклов разделили, то, что можно в одном исполняемом куске сделать.
Но, например гсм модуль через сутки потерял сеть и сам не находит? Что тогда?
я не заметил у вас в коде команду "AT+CPOWD=1", значит вы полагаетесь на авось пронесет?
А по закону подлости - западно случится в самый неподходящий момент, когда полезут грабить.
А как перегрузить модуль, можете рассказать?
Спасибо
по хорошему - ставите силовой ключ на питание gsm модуля. и ардуиной управляете этим ключом снимая питание на несколько секунд.
Это самый надежный вариант применяемый во всех проф. сигнализациях. Так как модуль может и не отвечать на ат команды вообще. поэтому только по питанию.
А вот этого нету, не делают ни в одном заводском шилде.
Таким образом придется его выключать (если он конечно будет отзываться на команды АТ) командой AT+CPOWD=1, а как его после этого включить?
Спасибо
Именно про это я и пытался спросить в посте 417. Если я правильно понял мануал модуля, то в случае отказа АТ команд ( и соответственно невозможность перегрузить модуль командой AT+CPOWD) рекомендуют пользоваться резетом на модуле, т.е. подавать на резет минусовой импульс, из чего напрашивается вывод, что резет эквивалентен сбросу питания. Вопрос в том, как это проверить, т.к. лично у меня модули не зависали ни разу.
Я бы сделал просто и жестко. На определенный выход ардуины подал сигнал, который на 1 сек. включит миниатурное реле, которое в свою очередь разомнет и через секунду сомкнет контакты в разрыве питания модуля. Мудрите вы чет в этой теме!
Я бы сделал просто и жестко. На определенный выход ардуины подал сигнал, который на 1 сек. включит миниатурное реле, которое в свою очередь разомнет и через секунду сомкнет контакты в разрыве питания модуля. Мудрите вы чет в этой теме!
вы правы, только нужно на 5 а лучше 10сек, чтобы в самом гсм модуле все разрялилось. после 1сек может ничего не поменяться.
Я бы сделал просто и жестко. На определенный выход ардуины подал сигнал, который на 1 сек. включит миниатурное реле, которое в свою очередь разомнет и через секунду сомкнет контакты в разрыве питания модуля. Мудрите вы чет в этой теме!
можете проверять уровень сигнала, если его нет (делаем цикл, т.е. делаем 3 попытки регистрации в состовой сети), если не регистрируется gsm, то вкл. реле на 3 сек(разомкнуть питание на GSM), а дальше проходим регистрацию в сети и все остальные АТ команды для работы
Ну вы меня поняли... А какую задежку ставить легко подобрать.. Практика рулит! Дерзаем!
Проверяем в цикле есть ли сигнал, если нет даем команду сервоприводу на шевеление антенны туда-сюда, проверяем сигнал, если опять нет, шевелим контакты и тем-же сервоприводом пинаем себя, затем выключаем-включаем реле ;)
Алгоритмов куча! И вместо того, чтобы спрашивать на форумах, нужно все сперва самому проверить на практике, потом делиться этим и задавать вопросы.
Вы всё правильно пИшите, только чтобы проверить на практике, надо чтобы модуль завис, а он сутками лежит на столе и работает...
Да нет проблем. Сделайте аварийную ситуацию искусственно. Понизьте питание, экранируйте антенну, соберите простенький подавитель сети в конце концов. Если уж испытывать такую вещь как сигнализация для дома, то тут нельзя пренебрегать ничем. Или вы думаете воры тупее вас?
по поводу аппаратного ресета, мне помагает соединение вывода RST с землей.
кстати, вот натолкнулся на подтверждение своих слов, для тех, кто еще сомневается:
http://lazysmart.ru/distantsionnoe-upravlenie/opy-t-raboty-s-gsm-modemom-sim900/
Добрый день, никто не сталкивался при запросе NTP времени (пока юзал www.ntp-servers.net) командой AT+CNTP("AT+CNTP=\"88.147.254.227\",12") - иногда(редко) время синхронизируется неверно, например +4 или +5 часов к моему. Причем синхронизируется через минуту и все нормально. С указанного сайта я использовал ip 1 яруса, перешел на ip 2 яруса - пока не замечал глюков.
P.S. - на 2 ярусе тоже была обнаружена ошибка синхронизации - 07.02.2017 20:50:11(время до синхронизации) | 08.02.2017 01:49:47 (время после синхронизации)
Ни у кого нет мыслей почему так происходит?
Потестирую на www.time.nist.gov - отпишусь позже.
Спасибо