Статья для тех, кто хочет заставить 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); }
Проверка
- Подключаем Arduino (с подключенным к нему сотовым модулем) к компьютеру
- Заливаем скетч
- Открываем монитор порта и если все в порядке, то увидим следующую картину
- Пробуем сделать звонок с номера телефона, который прописали в скетче. На плате Ардуино включится светодиод на 3 секунды и в мониторе порта видим реакцию:
- Пробуем отправить СМС. Для этого набираем в мониторе порта текст sendsms и, если денег на счете достаточно и отправка оператором разрешена, то должно все получиться и увидим следующую картину:
При успешной отправке выводится строка +CMGS: 13 (цифра 13 – порядковый номер исходящего сообщения, значит успешно ушло)
Дальше сами экспериментируйте. Можно подключить любой датчик (температуры, движения, влажности и т.д.) и при достижении отпределенного значения отправлять СМСку или делать звонок хозяину.
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 | (3-номер сообщения, которое хотим прочитать, 0-изменить статус сообщения на прочитанный) |
if (val.indexOf("71234567890") > -1) {
на
if (val.indexOf("71234567890") > -1 || val.indexOf("79084567890") > -1 || val.indexOf("72277567890") > -1) {
знак двойной палки "||" - это "ИЛИ"
В сетапе:
mySerial.println("ATE1");
mySerial.println("AT+CNMI=2,2");//если вместо "RING" написать "+CMT" то будет проверять не звонок, а смс с указанного телефона
В функции отправки смс:
mySerial.println("AT+CMGF=1");
delay(100);
mySerial.println("AT+CSCS=\"GSM\"");
delay(100);
Serial.println("SMS send started");
----
Иначе не отправит смс)
Подкиньте кусочек кода как из считанного времени с модуля по команде AT+CCLK? присвоить объявленным переменным hour и minute часы и минуты соответственно?
Один из вариантов решить проблему:
SoftwareSerial на другие порты
В скече создаем свой Serial_2 и пользуемся им как обычно.
Код:
#include
SoftwareSerial Serial_2(11, 12); // RX, TX
void setup()
{
Serial.begin(57600); // стандартный
Serial_2.begin(4800); // новый на другой скорости
Serial_2.println("Hello, world?");
}
void loop()
{
}
if (val.indexOf("RING") > -1) { //если звонок обнаружен, то проверяем номер
if (val.indexOf("71234567890") > -1) { //если номер звонящего наш. Укажите свой номер без "+"
if (val.indexOf("71234567890") > -1 || val.indexOf("79125656565") > -1) { //
при компиляции скетча постоянно ругается на строчку:
sms(String("hello world"), String("+71234567890"));
""exit status 1
'sms' was not declared in this scope"".
Если её (строчку блокировать) то работает, но смс-ку не отправляет.
Подскажите, в чём касяк
RINGCЎCЎҐ(*
ҐєК’Љ‚’‚’ЄК‚b‰ўЄbbbbЉj
GSM tester v1.0 и на следующей строке смесь букв, на звонок не реагирует, при отправке смски выдает две фразы
SMS send started
SMS send complete
и опять смесь букв (но поменьше), что бы такое могло быть :cry:
http://mysku.ru/blog/ebay/43282.html
MODEM:STARTUP
В чем может быть проблема? Не соединятется с оператором связи? Не подходит сим карта? ....
Эти команды работают
AT+CLHP=1
OK
AT+CMGF=0
OK
AT+CSCS="GSM"
OK
Попробуй возле окна. Антенна слабая.
Ещё при соединении, он жрёт до 2 ампер. Я поставил конденсатор на 1000 мф на блок питания 750 мА, и все заработало.
GSM tester v1.0
kccj?kRKRC?kScJJXC?
помогите если кто сможете