GSM модуль NEOWAY M590 связь с Ардуино






Здравствуйте. Однажды я уже описывал работу с GSM/GPRS-шилдом SIM900, сейчас речь пойдёт о дешёвом (порядка 150 рублей) модуле GSM NEOWAY M590.

Модуль продаётся «врассыпную» (в комплекте есть всё необходимое), поэтому потребуются навыки пайки, впрочем, ничего сложного там нет.








В комплекте поставляется

•Две маленькие, чёрные штучки — это резисторы, полярность не имеет значения.
•Квадратная жёлтая штука — это танталовый конденсатор, полярность здесь важна, поэтому припаиваем как на картинке.
•Чёрный цилиндр — это диод (в данной конструкции отвечает за понижение напряжения), обязательно соблюдение полярности, так что делаем как на иллюстрации.
•Маленькая прозрачная штучка — это светодиод, опять же, важна полярность, на плате минус расположен ближе к букве Boot.



Остальные детали, думаю, не вызывают вопросов.



Для тех, кто планирует разводить плату под модуль самостоятельно:
Схема обвязки




Будем считать, что Вы всё правильно спаяли и у Вас получилось вот такое устройство:





Подключение и эксплуатация


NEOWAY общается с ардуиной (или иным устройством) через UART (RX, TX) с помощью AT-команд. Для того чтоб посылать команды, надо выяснить скорость UARTа.
Для выяснения скорости, нужно подключить собраный модуль к компьютеру с помощью USB-UART моста, выглядит эта штука так:




В этом случае соединяем:

USB-UART <> NEOWAY

+5 <> +5
GND <> GND
TX <> RX
RX <> TX

Контакт BOOT используется для включения/отключения модуля кратковременным (~1сек) соединением с GND, однако удобнее просто соединить его с GND и не отсоединять. Включение модуля будет происходить при подачи питания.



Если такой штуки нет, то можно превратить ардуину в USB-UART мост залив в неё вот такой скетч…

void setup() 
 { 
   pinMode(0, INPUT); 
   pinMode(1, INPUT); 
 } 
 void loop() 
 {} 


… и соединив следующим образом:

Ардуина <> NEOWAY

+5 <> +5
GND <> GND
RX <> RX
TX <> TX

Контакт BOOT соедините с GND.



О питании


Модуль может потреблять большой ток, до 2-х ампер в пике, поэтому для надёжной работы необходимо организовать дополнительный БП. В принципе заработает то он и от ардуины, но в момент регистрации в сети или приёма звонка, модуль может перегружаться.

Так же будет не лишним поставить электролитический конденсатор (~1000 микрофарад, 16 вольт) поближе к модулю.


После подачи питания, на плате должен начать мигать светодиод (примерно раз в секунду) — это говорит о том, что он готов к работе.




Теперь подключаем Вашу конструкцию к компьютеру, в IDE Arduino открываем «Монитор последовательного порта» (в дальнейшем «терминал»), выбираем (внизу-справа) NL & CR, устанавливаем скорость 9600 и отправляем команду проверки связи — AT


Если ответ — ОК, то значит модуль работает и скорость UARTа установлена 9600. Если ответа нет, то проверьте правильность соединения UARTа и дальше действуйте методом «тыка» подставляя разные скорости, пока не увидите заветное ОК.



После старта модем скажет — MODEM:STARTUP, а о готовности к работе сообщит — +PBREADY




Если модему не будет хватать питания (большинство возникающих проблем происходят из-за этого), то он будет постоянно рестартовать.


Ещё я столкнулся с тем, что модем работает не со всеми сим-картами.


Если всё в порядке, тогда переходим к изучению АТ-команд для общения с NEOWAY и его настройки.



АТ-команды


АТ — запрос состояния, ответ — ОК.

ATE0 — отключить «эхо».

ATE1 — включить «эхо».
Эхо — это повтор введённой команды в терминал.

ATI — название и версия модуля.

AT+getvers — версия прошивки.

AT+IPR=9600 — установка скорости UARTа (9600), возможные варианты — 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200.

AT&W0 — сохранение конфигурации настроек в EEPROM.

AT&W1 — сохранение конфигурации настроек в EEPROM.
0 для нулевого профиля, 1 для первого профиля.

AT+CPAS — проверка статуса модема, ответ — +CPAS: 0.
Статусы: 0 — готов к работе, 2 — неизвестно, 3 — входящий звонок, 4 — в режиме соединения.

AT+CPWROFF — отключение модуля.

AT+CLIP=1 — включить АОН.

AT+CLIP=0 — отключить АОН.

ATD+79634759175; — позвонить.
В терминал будут выводиться сообщения: CONNECT — соединение установлено, BUSY — занят, NO ANSWER — нет ответа, NO CARRIER — вызов сброшен.

ATH — сбросить все соединения.

ATH1 — сбросить текущие соединение.

AT+CMGF=1 — настроить на текстовый формат SMS.

AT+CMGF=0 — настроить SMS на PDU формат.

AT+CSCS=«GSM» — кодировка текста sms — ASCII. Переправьте на нормальные кавычки.
Возможны другие кодировки: HEX – шестнадцатеричными значениями, IRA – международный справочный алфавит, PCCP437 – кодировка CP437(IBM PC), 8859-1 – кодовые страницы семейства ISO 8859, UCS2 – кодировка unicode.

AT+CMGR=1 — чтение sms, где цифра — порядковый номер сообщения. То есть в данном случае читается первое сообщение, так — AT+CMGR=2 второе и т.д.

AT+CMGD=1 — удаление sms, где цифра — порядковый номер сообщения.

AT+CMGD=1,1 — удалить все прочитанные sms.

AT+CMGD=1,2 — удалить все прочитанные и отправленные sms.

AT+CMGD=1,3 — удалить все прочитанные, отправленные и неотправленные sms.

AT+CMGD=1,4 — удалить все sms.

AT+CNMI=1,2,2,1,0 — вывод принятого sms в терминал.


Здесь можно найти исчерпывающую информацию по ат-командам.


Отправка SMS будет осуществляться ардуиной.




Далее будем управлять модулем с помощью ардуины


Если на вашем модуле установлена скорость UARTа отличная от 9600, тогда дайте команду:

AT+IPR=9600
При взаимодействии с ардуиной будет использоваться SoftwareSerial, а он плохо работает на скоростях выше 9600.



Отключите девайс от питания и переключите RX и TX (остальное без изменений) модуля к ардуине следующим образом:

Ардуина <> NEOWAY

+5 <> +5
GND <> GND
D2 <> TX
D3 <> RX

Контакт BOOT соедините с GND.



Вначале загружаем в ардуину простой скетч (предварительно вписав номер, с которого будете звонить на модуль).

При старте, на каждую команду должно быть подтверждение — ОК.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); 

byte led = 13;

void setup() {
  delay(2000);  
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);  
  mySerial.begin(9600);
  Serial.println("GSM NEOWAY promote site istarik.ru");
  Serial.println();
  Serial.println("Turn on AOH:");
  mySerial.println("AT+CLIP=1");  //включить АОН
  delay(100);
  // ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}

void loop() 
{
 if(mySerial.available()) //если модуль что-то послал
  {  
    char ch = ' ';
    String val = "";
    
    while(mySerial.available()) 
     {  
       ch = mySerial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(3);
     }

    Serial.print("Neo send> ");
    Serial.println(val);
    
    if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
     { 
      if(val.indexOf("79891196709") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
         Serial.println("On D13");
         digitalWrite(led, HIGH);  //включаем светодиод на 5 сек
         Serial.println("5 sec pause");
         delay(5000);
         digitalWrite(led, LOW);  //выключаем 
         Serial.println("Off D13");
       }
     } 
  }
}

При звонке со вписанного номера, будет на 5 секунд зажигаться D13, а связь обрываться. Если это будет другой номер, то ничего не произойдёт. Все действия отображаются в терминале.




Следующий скетч будет посылать SMS в ответ на наш звонок:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); 

byte led = 13;

void setup() 
{
  delay(2000);  
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);  
  mySerial.begin(9600);
  Serial.println("GSM NEOWAY promote site istarik.ru");
  Serial.println();
  Serial.println("Turn on AOH:");
  mySerial.println("AT+CLIP=1");  // включить АОН
  delay(100);
  Serial.println("Text format sms:");
  mySerial.println("AT+CMGF=1"); // текстовый формат SMS
  delay(100);
  Serial.println("Mode GSM:");
  mySerial.println("AT+CSCS=\"GSM\"");  // кодировка текста - GSM
  delay(100);
  // ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}

void loop() 
{
 if(mySerial.available()) //если модуль что-то послал
  {  
    char ch = ' ';
    String val = "";
    
    while(mySerial.available()) 
     {  
       ch = mySerial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(5);
     }

    Serial.print("Neo send> ");
    Serial.println(val);
    
    if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
     { 
      if(val.indexOf("79919790861") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
         delay(3000);
         sms(String("Hello from istarik.ru"), String("+79919790861")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль       
       }
     } 
  }
}


void sms(String text, String phone)  // отправка СМС
{
  Serial.println("Start SMS send");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send OK");
  delay(2000);
}

Вместо строки «Hello from istarik.ru» можно вписать какую-либо переменную, например температуру с датчика, а звонок заменить каким-либо событием, например, нажатием на кнопку (дописав обработчик нажатия кнопки).



С помощью этого скетча можно отправлять в модуль через терминал какие-то свои команды или АТ-команды. Ответ будет выводится в терминал.


#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); 

byte led = 13;


void setup() 
{
  delay(2000);  
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);  
  mySerial.begin(9600);
  Serial.println("GSM NEOWAY promote site istarik.ru");
  Serial.println();
}

void loop() 
{ 
 if(Serial.available()) //если в мониторе порта ввели что-то
  {  
    char ch = ' ';
    String val = "";
    
    while (Serial.available()) 
     {  
       ch = Serial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(5);
     }

    if(val.indexOf("callmy") > -1) // своя команда
     {  
       mySerial.println("ATD+79196989701;"); // ВПИШИТЕ номер, на который нужно позвонить
     }

    else mySerial.println(val);  // передача всего, что набрано в терминале в GSM модуль
  }


 while(mySerial.available()) 
  { 
    Serial.print((char)mySerial.read());
    delay(3);
  }
}

Если ввести в терминале ат-команду — AT+CLIP=1, то включится АОН, а если ввести свою команду — callmy, тогда модуль перезвонит на вписанный в скетче телефон.



Скетч для отправки SMS-команд:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); 

byte led = 13;

void setup() {
  delay(2000);  
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);  
  mySerial.begin(9600);
  Serial.println("GSM NEOWAY promote site istarik.ru");
  Serial.println();
  Serial.println("Turn on AOH:");
  mySerial.println("AT+CLIP=1");  //включить АОН
  delay(300);
  Serial.println("Text format sms:");
  mySerial.println("AT+CMGF=1"); // текстовый формат SMS
  delay(300);
  Serial.println("Mode GSM:");
  mySerial.println("AT+CSCS=\"GSM\"");  // кодировка текста - GSM
  delay(300);
  Serial.println("SMS to terminal:");
  mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль
  delay(300);
  
}

void loop() 
{
 if(mySerial.available()) //если модуль что-то послал
  {  
    char ch = ' ';
    String val = "";
    
    while(mySerial.available()) 
     {  
       ch = mySerial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(3);
     }

    Serial.print("Neo send> ");
    Serial.println(val);
    
    if(val.indexOf("+CMT") > -1) //если есть входящее sms
     { 
      if(val.indexOf("led13on") > -1) // смотрим, что за команда
       {  
         Serial.println("On D13");
         digitalWrite(led, HIGH);  //включаем светодиод
       }

      if(val.indexOf("led13off") > -1) // смотрим, что за команда
       { 
         digitalWrite(led, LOW);  //выключаем 
         Serial.println("Off D13");
       }
     } 
  }
}

Если отправить модулю смску с текстом — led13on, то светодиод зажжётся, а если отправить текст — led13off, то погаснет.



И последний скетч, который позволяет отправив в модуль смс со специальным словом, получить в ответ смс с балансом денег на симке, которая стоит в NEOWAY
Не забудьте вписать нужный номер.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); 

byte led = 13;

void setup() {
  delay(2000);  
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);  
  mySerial.begin(9600);
  Serial.println("GSM NEOWAY promote site istarik.ru");
  Serial.println();
  Serial.println("Turn on AOH:");
  mySerial.println("AT+CLIP=1");  //включить АОН
  delay(300);
  Serial.println("Text format sms:");
  mySerial.println("AT+CMGF=1"); // текстовый формат SMS
  delay(300);
  Serial.println("Mode GSM:");
  mySerial.println("AT+CSCS=\"GSM\"");  // кодировка текста - GSM
  delay(300);
  Serial.println("SMS to terminal:");
  mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль
  delay(300);
  
}

void loop() 
{
 if(mySerial.available()) //если модуль что-то послал
  {  
    char ch = ' ';
    String val = "";
    
    while(mySerial.available()) 
     {  
       ch = mySerial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(3);
     }

    Serial.print("Neo send> ");
    Serial.println(val);
    
    if(val.indexOf("+CMT") > -1) //если есть входящее sms
     { 
      if(val.indexOf("money") > -1) // смотрим, что за команда
       {  
         delay(3000);
         mySerial.println("ATD#100#;");
       }     
     } 


    if(val.indexOf("+CUSD") > -1) //если есть входящее sms
     { 
      if(val.indexOf("Balance") > -1) // смотрим, что за команда
       {  
         delay(3000);
       
         val = val.substring(val.indexOf("Balance"),val.indexOf("r")); 
         sms(String(val), String("+79967081199")); // ВПИШИТЕ ВАШ НОМЕР
       }     
     }         
  }
}


void sms(String text, String phone)  //отправка СМС с балансом модема
{
  Serial.println("Start SMS send");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send OK");
  delay(2000);
}

Отправьте модулю смску с текстом — money и через несколько секунд придёт ответная смс с количеством денег на балансе симки NEOWAY.


Все эксперименты проводились с оператором МТС.



Теперь можно из этих скетчей собирать то, что Вам нужно.




У NEOWAY нет микрофона, поэтому голосовую связь осуществить не получится, но само соединение устанавливается, и если принять звонок от модуля, то в динамике будет просто тишина.

При поступлении входящего вызова на контакте RING появляются импульсы с низким логическим уровнем длительностью 30 мс, в такт звуку гудка. При получении SMS сообщения, появляется однократный импульс длительностью 25-35 мс.



На этом пожалуй всё…


Вступайте в Telegram-группу Arduino


  • +458
  • 62457
Telegram-канал istarik

Известит Вас о новых публикациях...


Комментарии (54)

0
Спасибо за статью, отличная для начала!
Как подключали к ардуине, были ли проблемы с согласованием напряжений, о чём много пишут?
  • avatar
  • An12
комментарий был удален
0
Пожалуйста. Проблем с уровнями напряжения нет.
0
А не было скетча с возможностью отправки сообщения через GPRS на электронную почту, например, считать температуру с датчика и отправлять ее каждые 2 минуты, например? есть скетч с другим модемом SIM800L, можно ли его переделать под модем M590E?

#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 7 // к пину 7 подключен датчик DS18b20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#include <TimeLib.h>
#include <SimpleTimer.h>
SimpleTimer timer;
SoftwareSerial mySerial(2, 3); // RX — 2, TX -3

void setup() {
Serial.begin(57600); //Скорость сераил порта
Serial.println(«START SIM800l»);
mySerial.begin(57600); //Скорость порта для связи ARDUINO NANO c SIM800l
mySerial.println(«AT»);
mySerial.println(«AT+CFUN=1,1»); // перезагрузка модуля при запуске
sensors.begin();
delay (1000);
timer.setInterval(50000L, sendemail); // установка интервала отправки 50 секунд
}

void loop()
{
timer.run();
}

void sendemail() {
sensors.requestTemperatures(); // Polls the sensors
float temp = sensors.getTempCByIndex(0);
Serial.print(«Temperature: „);
Serial.println(temp);
mySerial.println(“AT+SAPBR=3,1,\»CONTYPE\",\«GPRS\»"); // задаем команду для выхода в интернет
delay(2000);
mySerial.println(«AT+SAPBR=3,1,\»APN\",\«internet.mts.ru\»"); // настройки APN для MTS
delay(2000);
mySerial.println(«AT+SAPBR=3,1,\»USER\",\«mts\»"); // имя пользователя
delay(1000);
mySerial.println(«AT+SAPBR=3,1,\»PWD\",\«mts\»"); пароль
delay(1000);
mySerial.println(«AT+SAPBR=1,1»); // запуск соединения по GPRS
delay(2500);
mySerial.println(«AT+EMAILCID=1»);
delay(1000);
mySerial.println(«AT+EMAILTO=100»);
delay(1000);
mySerial.println(«AT+SMTPSRV=\»mail.yahoo.com\",587");
delay(1000);
mySerial.println(«AT+SMTPAUTH=1,\»mail@yahoo.com\",\«password\»");
delay(1000);
mySerial.println(«AT+SMTPFROM=\»mail@yahoo.com\",\«Arduino NANO\»"); // отправитель письма
delay(1000);
mySerial.println(«AT+SMTPRCPT=0,0,\»mail@ek21.ru\",\«SIM800l\»"); // получатель письма
delay(1000);
mySerial.println(«AT+SMTPSUB=\»Temperature\""); // тема письма
delay(1000);
mySerial.println(«AT+SMTPBODY=20»); // устанавливаем кол-во символов в тексте письма
delay(1000);
mySerial.print(«Temperature: „);
mySerial.print(temp);
Serial.println(“С»);
mySerial.println(«AT+SMTPSEND»); // отправка сообщения
delay(8500);
mySerial.println(«AT+SAPBR=0,1»); // разрыв соединения GPRS
}
0
спасибо за подробную инструкцию почему то м590е я не смог запустить а вот ваши наработки у меня на sim800l работают отлично много что стало понятно но вот я ни как не могу разобраться как сделать чтобы при отправке с определённого номера дапустим сработало реле и в ответ пришло сообщение или наооборот допустим датчик движения сработал и модуль отправит сообщение с определённым текстом. заранее спасибо за ответы и вообще спасибо
0
Спасибо, все получилось, но управлять нагрузкой получается лишь с одного номера. Не подскажите куда можно вписать еще пару номеров, что бы доступ к этой нагрузке имело еще пара человек?

}

Serial.print(«Neo send> „);
Serial.println(val);
if(val.indexOf(“RING») > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf(«79891196709») > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Методом тыка ничего не выходит, заранее спасибо…
0
Здравствуйте, спасибо за статью. Вы упомянули, что модуль работает не со всеми симками, удалось ли понять от чего это зависит? Может, какой-то конкретный тип карт не идет.
Сам столкнулся с проблемой, когда отказывается работать, находясь в роуминге. Видимо, это и есть причина. В роуминге индикация моргает как обычно, но не подключается к сети, на команду at+cops? Выдает ERROR, на попытку посмотреть уровень сигнала командой at+csq пишет «99, 99». Может, кто сталкивался, поделитесь. Симки разных операторов, работают в телефоне. Вставил местную-все то же-99,99. Вот думаю, может столкнулся с двумя проблемами разом-отказ работать в роуминге и конфликт с местной симкой.
0
Спасибо, все получилось, но управлять нагрузкой получается лишь с одного номера. Не подскажите куда можно вписать еще пару номеров, что бы доступ к этой нагрузке имело еще пара человек?

}

Serial.print(«Neo send> „);
Serial.println(val);
if(val.indexOf(“RING») > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf(«79891196709») > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Методом тыка ничего не выходит, заранее спасибо…
0
Здравствуйте.

Можно так:


    if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
     { 
      if(val.indexOf("79891196709") > -1 || val.indexOf("79891111111") > -1 || val.indexOf("7989222222") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
         Serial.println("On D13");
         digitalWrite(led, HIGH);  //включаем светодиод на 5 сек
         Serial.println("5 sec pause");
         delay(5000);
         digitalWrite(led, LOW);  //выключаем 
         Serial.println("Off D13");
       }
     } 


Или так, с ответом на номер, с которого звонили.


    if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
     { 
      if(val.indexOf("79919790861") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
         delay(3000);
         sms(String("Hello from istarik.ru"), String("+79919790861")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль       
       }
       
      else if(val.indexOf("7991111111") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
         delay(3000);
         sms(String("Hello from istarik.ru"), String("+79919111111")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль       
       } 
       
      else if(val.indexOf("799222222") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
         delay(3000);
         sms(String("Hello from istarik.ru"), String("+799222222")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль       
       }       
      
      else mySerial.println("ATH");  //разрываем связь 
       
     } 
0
большое человеческое спасибо!!!
0
Всегда пожалуйста.
0
может подскажешь как отправить СМС при счёте например 10 или 100
ниже счётчик импульсов. я бился но хорошего результата не получил
на всякий:vicont73@rambler.ru
— //http://forum.arduino.ua/viewtopic.php?id=456
int count=0; // выделение памяти для переменной счетчика нажатий
int val=0;// выделение памяти для переменной состояния порта
void setup() //процедура setup
{
pinMode(12, INPUT); //объявляем пин как вход
Serial.begin(9600);
}
void loop() //процедура loop
{
while ( digitalRead(12)==LOW ); //в цикле ничего не делаем пока не изменится состояние порта с «0» на «1»
count=count +1; //когда изменилось состояние инкриминируем счетчик

Serial.println( count); //выводим в порт
while ( digitalRead(12)==HIGH ); // ожидаем появление опять «0»

delay(100); //??? регулируем от дребезга
}
0
Импульсы от счетчика лучше повесить на прерывание, вот здесь подробно.



Если я всё правильно понял, то отправка наверно как-то так:

...
if(count == 10) 
  { 
    sms(String(count), String("+79919790861")); // НОМЕР, на который отправляется смс 
    count = 0;      
  }
...

Эту функцию вставить где-нибудь в loop`е.
0
спасибо!!!
на выходных (по танцую с бубном)
это будет дополнительный счетчик на воду, он же сигнализация утекания воды.
0
Пожалуйста. Я думаю всё без «бубнов» обойдётся.
0
всё ОК!!! работает!!! кроме «led = 13;»
а может будете так любезны (плиз), сделайте поправки чтобы считал условно с 235 накопительно (не с начала, а всё больше и больше), а СМС отправлял периодически например каждые +10 импульсов и + при звонке на модуль
я пробовал сам но ничего путного не получилось.
за ранее спасибо. мой vicont73@rambler.ru

//http://forum.arduino.ua/viewtopic.php?id=456
//https://istarik.ru/blog/arduino/68.html#comment766

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

byte led = 13;
int count=0; // выделение памяти для переменной счетчика нажатий
int val=0;// выделение памяти для переменной состояния порта
void setup() //процедура setup
{

Serial.begin(9600);

delay(500);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
mySerial.begin(9600);
Serial.println(«GSM NEOWAY promote site istarik.ru»);
Serial.println();
Serial.println(«Turn on AOH:»);
mySerial.println(«AT+CLIP=1»); // включить АОН
delay(100);
Serial.println(«Text format sms:»);
mySerial.println(«AT+CMGF=1»); // текстовый формат SMS
delay(100);
Serial.println(«Mode GSM:»);
mySerial.println(«AT+CSCS=\»GSM\""); // кодировка текста — GSM
delay(100);
{ pinMode(12, INPUT); //объявляем пин как вход
// ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ — ОК
}
}

void loop()
{
while ( digitalRead(12)==LOW ); //в цикле ничего не делаем пока не изменится состояние порта с «0» на «1»
count=count +1; //когда изменилось состояние инкриминируем счетчик

Serial.println( count); //выводим в порт
while ( digitalRead(12)==HIGH ); // ожидаем появление опять «0»

delay(100); //??? регулируем от дребезга

if(count == 10)
{
sms(String(count), String("+71111111111111")); // НОМЕР, на который отправляется смс
count = 0;
}

if(mySerial.available()) //если модуль что-то послал
{
char ch = ' ';
String val = "";
while(mySerial.available())
{
ch = mySerial.read();
val += char(ch); //собираем принятые символы в строку
delay(5);
}

Serial.print(«Neo send> „);
Serial.println(val);
if(val.indexOf(“RING») > -1) //если есть входящий вызов, то проверяем номер
{
if(val.indexOf(«71111111111111111») > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
{
Serial.println(«Call my phone»);
mySerial.println(«ATH»); //разрываем связь
Serial.println(«Disconnection»);
delay(500); //3000
sms(String(«что написать сдесь»), String("+71111111111111")); // ВПИШИТЕ НОМЕР, на который позвонит модуль
}
}
}
}

void sms(String text, String phone) // отправка СМС
{
Serial.println(«Start SMS send»);
mySerial.println(«AT+CMGS=\»" + phone + "\"");
delay(100); //500
mySerial.print(text);
delay(100); //500
mySerial.print((char)26);
delay(100); //500
Serial.println(«SMS send OK»);
delay(500); //2000
}
0
Я не совсем понял Ваш вопрос, это первое, а второе — вставляйте код скетча в тег «код», это сверху кнопочка <>, а то каша получается.

код
0
шикарно при получении СМС можно знать сколько по факту на счётчике и поэтому старт счёта с определённой цифры например 235, а не с нуля очень важно, а при необходимости можно позвонить на АРДУИНО или СМСнуть на него и получить данные и за одно проверка работоспособности системы на контроле.
ещё я не пробовал но наверно могу прибавлять не «1», а 0,78888 для точного счёта (калибровка счётчика).

 //http://forum.arduino.ua/viewtopic.php?id=456
 //https://istarik.ru/blog/arduino/68.html#comment766

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX pins   //  с модуля м590 TXD проводим в (ардуино на 2) а RXD на (3 ардуино)

//pinMode(13, OUTPUT);
//byte led = 13;
int count=0; // выделение памяти для переменной счетчика нажатий 
int val=0;// выделение памяти для переменной состояния порта
void setup() //процедура setup 
{ 

Serial.begin(9600);

  delay(100);  //500
  //pinMode(led, OUTPUT);
  //digitalWrite(led, LOW);
  Serial.begin(9600);  
  mySerial.begin(9600);
  Serial.println("GSM NEOWAY promote site istarik.ru");
  Serial.println();
  Serial.println("Turn on AOH:");
  mySerial.println("AT+CLIP=1");  // включить АОН
  delay(100);
  Serial.println("Text format sms:");
  mySerial.println("AT+CMGF=1"); // текстовый формат SMS
  delay(100);
  Serial.println("Mode GSM:");
  mySerial.println("AT+CSCS=\"GSM\"");  // кодировка текста - GSM
  delay(100);
 { pinMode(12, INPUT); //объявляем пин как вход 

   
  // ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}
}

void loop() 
{
 while ( digitalRead(12)==LOW ); //в цикле ничего не делаем пока не изменится состояние порта с «0» на «1»
count=count +1; //когда изменилось состояние инкриминируем счетчик 

Serial.println( count); //выводим в порт
while ( digitalRead(12)==HIGH ); // ожидаем появление опять «0»

delay(200); //??? 100-регулируем от дребезга


     if(count == 1000) 
  { 
    sms(String(count), String("+79208558985")); // НОМЕР, на который отправляется смс 
     count = 0;    
  }
  



 if(mySerial.available()) //если модуль что-то послал
  {  
    char ch = ' ';
    String val = "";
    
    while(mySerial.available()) 
     {  
       ch = mySerial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(5);
     }

    Serial.print("Neo send> ");
    Serial.println(val);
    
    if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
     { 
      if(val.indexOf("79208558985") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
        delay(1000); //3000
        sms(String("что написать сдесь"), String("+79208558985")); // ВПИШИТЕ НОМЕР, на который позвонит модуль       
       
  }
     } 
  }
}


void sms(String text, String phone)  // отправка СМС
{
  Serial.println("Start SMS send");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(100); //500
  mySerial.print(text);
  delay(100); //500
  mySerial.print((char)26);
  delay(100); //500
  Serial.println("SMS send OK");
  delay(500); //2000
}
0
попробовал
count=count +0,333
нет счёта после запятой. беда
0
Для начала Вам необходимо изучить, что такое целочисленная переменная (int) и переменная с плавающей точкой (float).
0
да, я попробовал не прокатила — не считает
0
после пляски с бубном — результат = 0
сдается и правду пишут ардуино не такая уж замечательная вещь.
оно требует не поверхностного подхода
0
сдается и правду пишут ардуино не такая уж замечательная вещь
Это пишут не умные люди.
Arduino — это обычный микроконтроллер Atmega328.

оно требует не поверхностного подхода
Разумеется. Если просто хочется помигать светодиодом, то это не требует никакого понимания, а если что-то сложное, то надо изучать основы программирования на СИ или С++.
Тем не мение, Ардуино (как концепция) вещь замечательная, и очень сильно снижает порог вхождения в программирование МК и если бы её не было, то Вам пришлось бы изучать среду AVR Studio и осваивать специальные программаторы. Вот здесь у меня есть статья на эту тему.
0
В Вашем случае нужно чтоб переменная count была float, а не int и дробное значение отделяется не запятой, а точкой.

float count;

void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  count = count + 0.333;
  Serial.println(count, 3); // здесь после запятой пишется кол-во выводимых дробных знаков, то есть знаков после точки.
  delay(500);
}


Читать.
0
счётчик работает как часы.
сейчас в планах дописать туда модуль температуры(Цифровой Датчик Температуры и Влажности DHT11)+карту памяти (Micro SD TF Модуль Памяти)+источник время (RTC I2C DS1307 Часы Реального Времени)
0
спасибо огромное!!!
файл проверку прошёл. но увидеть красоту не удалось. к сожалению выпало устройство и порта 18СОМ нет, перескочил на 32 (предыдущая UNO уже отвёз ставить на воду). буду 18 искать.
увидеть красоту не удалось
0
странно получилось. раньше работало 18СОМ. скейч поправил (внёс count = count + 0.333.....) и вот при вливании в УНО ругается нет 18СОМ, ну я все прошёл по порядку 1_10_12_31СОМ, но связи нет и после этого полез в подключённые устройства на ПК нашёл там чтото по наитию и теперь оно заработала на 31СОМ
0
извиняюсь за назойливость!
вопрос — может есть программка составления програм для ардуино, облегчающая участь чайников.
и лучше безплатная
0
Здравствуйте.Спасибо, очень доходчиво.
Есть вопрос: В нашей котельной, установлены датчики давления и температуры,
подключенные к измерителям-регуляторам, которые в свою очередь соеденены с компьютером по RS485 по протоколу кажется ОВЕН.
Можно ли подключившись к сети с помощью
www.ebay.com/itm/MAX485-module-RS-485-TTL-to-RS485-MAX485CSA-Converter-Module-For-Arduino-GM-/262136733940?hash=item3d089120f4:g:LtcAAOSwLzdWS-gy
читать передаваемые данные и при получении СМС с определенным текстом отправлять прочитанное в ответном смс
0
про котельную сказать ни чего не могу
0
Может кто сталкивался, модуль NEOWAY M590.
симку видит, при звонке НА нее не доступен. на AT отвечает. В сети как я понимаю не регается.
0
От чего запитан модуль?
0
5в 2а
0
Симку другую пробовали?
0
Да. Трех операторов
0
Чтобы исключить БП попробуйте запитать модуль напрямую от LiIon Акк закоротив диод который стоит на плате.Впрочем скорее всего сам модуль кривой. Из 19 модулей рабочими оказались только 4.Правда что то подобное было у 2х. Остальные коротыши. внутри оказались дохлые микросхемы усилителей GSM сигнала
0
Здравствуйте. Не подскажите скетч подключения газового анализатора с отправкой по смс, или адрес не подскажите где найти можно? Кругом одни сигнализации, а пожарной и газовой нет…
0
вопрос — «скетч будет посылать SMS в ответ на наш звонок:»
реализовал его, но странно работает — при звонке на модуль идет сброс, далее приходит смс, но спустя немного времени еще идет смс и так до бесконечности как я понимаю.
код весь пересмотрел, ничего кроме номера телефона не правил
Подскажите?
0
попробовал «скетч будет посылать SMS в ответ на наш звонок:»
такая же ерундистика.
Звонок на модуль один, а led13 уже 3и раза отработал
0
извиняюсь во втором своем посте ошибся — скетч конечно же, который первый в статье, где по звонку горит led13
0
при звонке на модуль идет сброс
Это похоже на плохое питание. От чего модуль запитан?
0
запитан от БП компьютера +5В
но я boot проводом притянул к земле, а не сопротивлением — может в этом дело?
и уровни не согласовывал модуля и ардуины
0
У Вас какой модуль?

Кстати, я добавил кнопку на Телеграм-чат (в начале комментов), можно там пооющаться.
0
модуль ровно такой как в статье
телеграмм не работает же, по крайней мере так просто
а по модулю — он у меня работает от БП компа, но вот при звонке на недо и скетче из первого примера, вместо того, чтобы отработать на led13 один раз, он делает это несколько… порой 2, порой 4
0
В терминале смотрели, что происходит во время звонка?
0
да все ок в момент звонка
потом в порт ничего не валится
0
Ардуина какая? Подключена как описано в статье?
0
arduino duemilanove
подключено
Ардуина <> NEOWAY

+5 <> +5
GND <> GND
D2 <> TX
D3 <> RX

Контакт BOOT соедините с GND.
0
вернее у меня модуль запитан от БП ПК, а ардуино от USB
0
т.е.
Ардуина <> NEOWAY
D2 <> TX
D3 <> RX
NEOWAY <> БП ПК
+5 <> +5
GND <> GND
0
провожу эксперименты дальше
предположил, что возможно проблемы с библиотекой SoftwareSerial
скачал и установил свежую — github.com/PaulStoffregen/SoftwareSerial
и после этого еще интересней стало — в порту видно, что звонок пришел, led13 загорается
0
То есть работает?
0
модуль работает, но как я выше писал отчего-то после вызова с сотового делает с перерывами несколько включений led13
пока по моим наблюдениям 4 раза повторят
0
предположение одно, что-то не так с ардуино, тем более я от ардуино не отключил всякие разные питы, которые использовал для другого проекта
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.