" title="Написать письмо">Написать письмо

Статистика

Пользователи : 1
Статьи : 1643
Просмотры материалов : 6299656
 
Модуль отправки SMS для Arduino (14.09.2021). Печать E-mail
2021 - Сентябрь
14.09.2021 17:28
Save & Share
В рамках разработки автоматизированной системы защиты от протечек в квартире, требовалась автоматическая отправка SMS вида "тебе конец". Нужно было найти модуль Arduino, который мог бы это сделать.

Речь о серии модулей IOT-(G)A(6/7)(-B). И конкретно о модуле IOT-GA6-B от Goouuu Tech. Оперирует SMS, телефонными разговорами, командами оператора сотовой связи - имея простейшее подключение (за некоторыми особенностями).

Вначале были куплены модули SIM800L, SIM900A. Нужно избегать любых модулей SIM, т.к. их настройка и работоспособность - под очень большим вопросом. Начиная от физического брака чипа (выглядит как б/у) и заканчивая отсутствием обозначений контактов на печатной плате (подключай как хочешь). В итоге, ни один из этих модулей даже аппаратно сеть оператора поймать не смог - были выброшены в помойку после очень долгой возни.

Модуль IOT-GA6-B стоит в 2 раза дороже SIM - 368руб. Однако сразу отмечается его легкость настройки:
- достаточно подать питание - и видно, как светодиод меняет частоту моргания, - значит, сеть обнаружил. Значит, "специальные" SIM-карты и тарифы для умных устройств, которые предлагают мобильные операторы за приличную абонентскую плату, - не более, чем введение в заблуждение;
- выводы подписаны не совсем корректно. Подключение: VCC - 5В, URX - D2 (D2-D12), UTX - D3 (D2-D12), G - GND. GND у модуля, Arduino и источников их питания должны быть общими. Модуль должен работать только от внешнего источника питания (от USB ПК завести не получилось - что странно);
- используемая библиотека: iArduino GSM v.1.0.1;
- программная настройка. SoftwareSerial softSerial(D3, D2). D2 - PORTD 1, DDRD 0. D3 - PORTD 1, DDRD 1. На некоторых версиях (производителях?) модуля отмечается спутанность местами URX и UTX - соответственно, необходим инвертированный вариант настройки;
- даже при необходимости внешнего источника питания, модуль никогда не выходит на пиковое потребление 2А. При включении в сеть - 80мА, поиске сети - 23-72мА (5сек при плохом сигнале), простое - 10-13мА, отправке SMS - 21-55мА, получении SMS - 20-43мА. Функция gsm.pwr(false) не выключает модуль (не работает) - реализовывать отключение нужно через установку транзистора на питающий провод.

У этого модуля одна проблема (для меня прямо критичная): отказывается работать с D0 и D1 - как с аппаратным UART (gsm.begin(Serial)). И, как назло, на печатной плате невозможно поменять местами обвес для Adruino так, чтобы D0 и D1 служили другому устройству. И свободных пинов тоже нет. Как обычно, бочка дегтя в ложке меда.

(добавлено 17.09.2021) Не дружит с любыми сторонними устройствами. Как только к информационным проводам припаивается что-то еще - перестает обмениваться данными.

Если припаять такую же вторую антенну параллельно той, что в комплекте, - усиления сигнала не происходит. В дальнем конце комнаты устройство уже начинает работать с перебоями - внешняя антенна за 50руб просто необходима.

Библиотека iArduino GSM - несколько прожорливая, в то же время и удобная. Не надо использовать функцию F из примера функции SMSsend, если используется String: иначе функция сожрет памяти больше, чем доступно в Arduino Nano (и даже в Arduino Uno).

(добавлено 23.09.2021) Библиотека iArduino GSM - кусок неторта. Примеры работают как часы - но ровно до тех пор, пока не начнешь размещать модуль в большом проекте, где много других модулей и радиоэлементов. Мучился с этим модулем целый день сегодня, ища взаимосвязи:
- если создание объекта SoftwareSerial происходит выше PORTD и DDRD - обмен данными не происходит;
- если создается сторонний объект (SoftwareSerial или Serial) выше SoftwareSerial устройства - обмен данными не происходит;
- условная совместимость с Narcoleptic.delay (могут повреждаться визуальные данные в мониторе порта Serial);
- если статус модуля не GSM_OK - то попытка послать SMS приводит к зависанию Arduino.

Схемотехника модуля - кусок неторта:
- любой транзистор, установленный в питающую цепь модуля, - приводит к невозможности отправки SMS (как будто чуть-чуть не хватает напряжения - и модуль теряет сеть);
- при условии, что модуль без проблем работает от древнего ЗУ 5В/0.3А, при напряжении не более 5.05В, - само устройство с транзисторами несовместимо;
- соответственно, т.к. еще и функция pwr не работает, - устройство невозможно отключить, если оно не нужно. А это, к слову, почти 0.6кВт/год - для одного элемента это адски много;
- последний шанс: попытаться питать от цифрового выхода, которым транзистор управлялся. Может, силы тока и хватит.

(добавлено 24.09.2021) Решение с транзистором - добавление конденсатора ≥1500мкФ параллельно модулю. Тогда работает и с полевыми, и с биполярными транзисторами (тестировалось на BDX33C, FQPF5N60C). Нельзя также включать питание на модуль одновременно с другими модулями: Arduino перезагружается. Возможно, резкий всплеск тока - резко просаживающий напряжение.

Библиотека же продолжает отжигать:
- если перед объектом модуля написать const - модуль перестает работать;
- если сообщение >70 русских символов - модуль зависает напрочь и уносит за собой Arduino. Или может перезагрузиться сам по себе. Только все наладил - но изменение длин сообщения все испортило.

(добавлено 27.09.2021) Чем больше русских букв пишешь в стрингах локальных - тем больше библиотека считает их за глобальные переменные. Соответственно, под локальные переменные остается меньше места - и в конечном итоге память Arduino переполняется, и идут произвольные глюки.

Вернуть обратно в исходную не удалось. Только когда укоротил сообщения до нескольких слов - SMS начали приходить. Даже заголовок "Защита от протечек" добавить не могу. То есть, библиотека не может теперь послать даже сообщение меньше 70 русских символов в длину.

Связано это со введением дополнительных проверок. С этой библиотекой потери памяти идут постоянно: вызываешь функцию не в одном месте программы, а в двух - память потерял. Добавил больше проверок для состояний модуля - память потерял. И абсурдная ситуация напоследок: если объект модуля сделать глобальным - глобальной памяти выделяется на 2% меньше.

Решением было бы использовать глобальный стринг длиной 70 символов - чтобы не передавать в параметры функции текстовые строки. Это позволило бы уменьшить потери памяти. Но делать это уже не буду: выдохся. Итоговый скетч готов, итоговый вариант печатной платы сейчас улетит к китайцам. Данная система защиты от протечек - максимум, что можно впихнуть в маленькую Arduino Nano. Вода научится меня бояться!

(добавлено 23.12.2021) Внезапно выяснилось, что внешняя антенна (покупная) и внутренняя (поставляемая с модулем) - абсолютно одинаковы по параметрам приема (снял колпачок защитный). Но у внешней есть преимущество: возможность припаяться своим коаксиальным кабелем (экранирование кабеля позволит использовать большую его длину) - и вывести антенну в необходимое место под необходимый угол. Текущего же проводка длиной сантиметров 15 - для реализации такой задачи не хватает.



(добавлено 21.02.2022) К сожалению, все оказалось не так радужно. При переходе с напряжения 5.5В на 4.9-5В начались парадоксальные проблемы - хоть и после танцев с бубном были решены:
- при второй попытке отправки SMS (первая - успешно) модуль перезагружал Arduino. Выяснилось, что перезагрузка происходит только тогда, когда USB-разъем Arduino не находится в ПК;
- решил проблему путем установки PORTD для VCC=1, URX=0, UTX=0 (если установить VCC=0 - регистрация сим-карты не работает). А также последовательностью выключения digitalWrite UTX-URX-VCC 0 - то есть, для подачи питания стал задействовать и информационные каналы. Включение - в обратной последовательности;
- после этого появилась другая проблема: модуль перестал нормально выключаться, все время подмаргивая. Выяснилось, что даже если провод питания отрезать - модуль сосет силовое питание по информационному разъему UTX. Делитель напряжения 2-мя резисторами 10кОм на канал - проблему не решил. Решилось установкой прямо в разрез проводов UTX и URX резистора 10кОм (при 11кОм тоже работает). Подтягивающий резистор Arduino, судя по всему, избыточного номинала - с ним не вышло;
- из неустранимого: когда есть ошибка в работе модуля - почему-то подается питание на выход D9 (зажигается светодиод) - не имеющий к модулю никакого отношения. Светодиод горит некоторое время - затем гаснет. Перерыл весь исходный код - вообще нет предпосылок на его включение (только в функции, не имеющей к функции отправки SMS никакого отношения и использующей светодиод в виде частого моргания).

(добавлено 24.02.2022) Оказывается, на границу попал. 10кОм - неоднозначный результат, в зависимости от погрешности резистора. 11кОм надо ставить. На 12кОм тоже работает.

(добавлено 18.09.2022) И еще один баг: функция runUSSD, при обработке запросов получения баланса *100# и #100# в МТС, - не возвращает цифры рублей и копеек (возвращая при этом весь остальной мусор), если на балансе меньше 100руб. Высадил рублей 100 на SMS, пока понял это. Баг оператора или библиотеки - пока неясно: другие операторы не тестировались, а надо бы.

(добавлено 19.09.2022) Еще баг, сложный. Написал проверку баланса на SIM-карте при самоконтроле Системы. Пришлось выделить его в отдельную функцию из-за бага библиотеки GSM. Чем больше кода между объектом IOT_GA6_B и функцией smsSend - тем меньше русских символов smsSend может корректно послать эта функция. Реальный пример: без функции проверки баланса - 69 символов (максимальное приближение к стандарту 70 символов), с исходным кодом проверки - 15 символов, со строкой функции проверки - 35 символов. И каждый раз при модернизации ПО желательно убеждаться закомментированной функцией проверки количества символов, что количество символов не уменьшилось.

String sRussian_Symbols = "";
   
    for (int i=70; i>0; i--) //Нельзя превышать 160 для английских и 70 для русских: ложноположительный результат.
    {
      sRussian_Symbols = "";

      for (int j=0; j<i; j++) sRussian_Symbols += "Я";

      if (IOT_GA6_B.SMSsend(sRussian_Symbols, g_sTelephone))
      {
        String sRussian_Length = String(sRussian_Symbols.length()/2);
        IOT_GA6_B.SMSsend(sRussian_Length, g_sTelephone);
        return;
      }
      else delay(20000); //Чтобы провайдер не заблокировал как спамера.
    }

(добавлено 25.09.2022) Похоже, этот сложный баг - продолжение бага, найденного в прошлом году. Чем больше глобальных переменных - тем меньше длина русскоязычной SMS. При введении двух новых глобальных строк - длина сообщения упала с 35 символов до 10. Убирание всех глобальных строк в локальные функции - увеличило длину до 30 символов (хотя, по логике, должно быть больше 35).

И дело здесь не в русских буквах. Библиотека GSM коряво использует память контроллера и в большом количестве. С русскими буквами же ситуация осложняется тем, что компилятор не выдает никаких предупреждений.

(добавлено 01.10.2022) Модуль способен работать часами в активном состоянии (попытки отправить SMS) и при этом не перегреваться в герметичном полиэтиленовом пакетике.

(добавлено 14.10.2022) Модуль несовместим с SIM-картами Tele2, Tinkoff: в них отсутствует поддержка 2G, в модуле - отсутствует поддержка 3G.
Обновлено ( 26.10.2022 18:37 )
 
 

Последние новости


©2008-2022. All Rights Reserved. Разработчик - " title="Сергей Белов">Сергей Белов. Материалы сайта предоставляются по принципу "как есть". Автор не несет никакой ответственности и не гарантирует отсутствие неправильных сведений и ошибок. Вся ответственность за использование материалов лежит полностью на читателях. Размещение материалов данного сайта на иных сайтах запрещено без указания активной ссылки на данный сайт-первоисточник (ГК РФ: ст.1259 п.1 + ст.1274 п.1-3).

Много статей не имеет срока устаревания. Есть смысл смотреть и 2011, и даже 2008 год. Политика сайта: написать статью, а потом обновлять ее много лет.
Открыта карта ВТБ для материальной поддержки сайта: 5368 2902 0040 0838.

Рекламодателям! Перестаньте спамить мне на почту с предложениями о размещении рекламы на этом сайте. Я никогда спамером/рекламщиком не был и не буду!
Top.Mail.Ru