Статья для тех, кто хочет заставить Arduino отправлять СМС через данный GSM модуль . Модуль NEOWAY M590 на базе чипа SIM900 подойдет для создания самодельной сигнализации, умного дома. Существует также альтернативный GSM модуль подключаемый напрямую к Arduino через 5 Вольт: Sim800L EVB v2.0
Постановка задачи
- Используя только Arduino и GSM модуль управлять светодиодом посредством звонка с телефона.
- Отправлять СМС (пока через команду поступающую через монитор порта в Arduino IDE)
Подключение к Arduino
Соединяем GSM модуль с Arduino.
5В модуля -> 5V Arduino
GND модуля -> GND Arduino
ТХ модуля -> digital pin2 Arduino
RX модуля -> digital pin3 Arduino
Распиновку можно посмотреть на фото. Порядок контактов такой: 1 - +5В, 2 - GND, 7 - TX, 8 - RX.
Запитать модуль можно от 4В до 5В, я использовал 5 вольтовый выход.
Модуль требует отдельного питания, потому что потребляет в пике до 2А. Конденсатор скорей всего не спасет. Поэтому при запитке от Ардуино может не работать или глючить.
Землю Ардуино и модуля GSM при раздельном питании надо соединить, но сначала нужно мультиметром замерить напряжение между этими "землями". Некоторые компьютерные блоки питания имеют перепад потенциала на корпусе и земле USB до 100В. Ток там мизерный и убить не может, но уничтожить Ардуино или модуль GSM или то и другое вместе - запросто.
Скетч
#include < SoftwareSerial . h > SoftwareSerial mySerial (2 , 3 ) ; // RX, TX int ch = 0 ; int led = 13 ; String val = "" ; void setup () {delay(2000); //время на инициализацию модуля pinMode (led , OUTPUT ) ; digitalWrite (led , LOW ) ; Serial . begin (9600 ) ; //скорость порта Serial . println ("GSM tester v1.0" ) ; mySerial . begin (9600 ) ; mySerial . println ("AT+CLIP=1" ) ; //включаем АОН delay (100 ) ; mySerial . println ("AT+CMGF=1" ) ; //режим кодировки СМС - обычный (для англ.) delay (100 ) ; mySerial . println ("AT+CSCS=\"GSM\"" ) ; //режим кодировки текста delay (100 ) ; } void loop () { if (mySerial . available () ) { //если GSM модуль что-то послал нам, то while (mySerial . available () ) { //сохраняем входную строку в переменную val ch = mySerial . read () ; val += char (ch ) ; delay (10 ) ; } if (val . indexOf ("RING" ) > - 1 ) { //если звонок обнаружен, то проверяем номер if (val . indexOf ("71234567890" ) > - 1 ) { //если номер звонящего наш. Укажите свой номер без "+" Serial . println ("--- MASTER RING DETECTED ---" ) ; mySerial . println ("ATH0" ) ; //разрываем связь digitalWrite (led , HIGH ) ; //включаем светодиод на 3 сек delay (3000 ) ; digitalWrite (led , LOW ) ; //выключаем реле } } else Serial . println (val ) ; //печатаем в монитор порта пришедшую строку val = "" ; } if (Serial . available () ) { //если в мониторе порта ввели что-то while (Serial . available () ) { //сохраняем строку в переменную val ch = Serial . read () ; val += char (ch ) ; delay (10 ) ; } //mySerial.println(val); //передача всех команд, набранных в мониторе порта в GSM модуль if (val . indexOf ("sendsms" ) > - 1 ) { //если увидели команду отправки СМС sms (String ("hello world" ) , String ("+71234567890" ) ) ; //отправляем СМС на номер +71234567890 } val = "" ; //очищаем } } void sms (String text , String phone ) //процедура отправки СМС { Serial . println ("SMS send started" ) ; mySerial . println ("AT+CMGS=\"" + phone + "\"" ) ; delay (500 ) ; mySerial . print (text ) ; delay (500 ) ; mySerial . print ((char ) 26 ) ; delay (500 ) ; Serial . println ("SMS send complete" ) ; delay (2000 ) ; }
Проверка
GPRS
В рассматриваемой версии модуля 1.30 поддержка GPRS урезанная. Мне не удалось подключиться к серверу по его DNS имени (например mysite.ru), получилось только по IP-адресу. В другом модуле SIM800L таких проблем не было.
Перечень некоторых AT команд:
AT+CMGF=1 | Вкл. текстового режима (смс только латиницей) |
AT+CSCS= "GSM" | Вкл. режима |
AT+CLIP=1 | включение определения номера входящего звонка Если отправить команду с 0, то определение номера отключится и модуль вместо номера вызывающего будет слать только сообщение "RING". |
AT+CMGS="+79123456789" | Отправка СМС |
ATI | Получить информацию об устройстве |
AT+IPR=19200 | настройка скорости порта |
AT+GSN | вернет IMEI модуля |
AT+CCLK? | считываем время с модуля |
AT+CCLK=«yy/mm/dd,hh:mm:ss+zz» | где по порядку идут «год/месяц/дата,час:минуты:секунды+часовой пояс» Данные обязательно отправляются с ведущими нулями, то есть, к примеру, если месяц у нас "4", то отправить должны "04". Получить обратно текущие время и дату можно отправив ту же команду, только со знаком "?": |
AT+CMEE=0 | уровень информации об ошибке. Может быть от 0 до 2. 0 - отключено. Будет просто писать ERROR. 1 - код ошибки. Будет возвращать цифровой код ошибки. 2 - описание ошибки. Напишет что именно ему не нравится в команде. Для работы с модулем через терминал удобней режимы ATV1, ATE1 AT+CMEE=2, для общения с микроконтроллером лучше использовать ATV0, ATE0 и AT+CMEE=0 - так проще будет обрабатывать полученные ответы. Данные настройки не сохраняются после перезагрузки модуля, поэтому необходимо включать эти команды в код программы. |
AT+CSQ | информация о качестве сигнала. Модуль вернет два числа +CSQ: 17,0 17 - уровень сигнала. Может быть в диапазоне 0..31 или 99. Чем больше тем лучше, но 99 значит его отсутствие. 0 - коэффициент ошибок связи (т.н. RXQUAL). Может быть от 0 до 7, чем число меньше тем качество связи лучше. |
AT+COPS? | информация об операторе, в сети которого зарегистрирован модуль |
ATD+79121234567; | набор номера. (";" обязательно) Модуль позвонит по указанному номеру и вернет один из вариантов BUSY - номер занят NO DIALTONE - нет сигнала на линии NO CARRIER - нет сети или другая проблема (например, нет денег на счету) NA ANSWER - нет ответа CONNECT - есть контакт! |
AT+CMGR=3,0 |