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 мс.



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


  • 0
  • 23944

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

0
Спасибо за статью, отличная для начала!
Как подключали к ардуине, были ли проблемы с согласованием напряжений, о чём много пишут?
  • avatar
  • An12
комментарий был удален
0
Пожалуйста. Проблем с уровнями напряжения нет.
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
спасибо огромное!!!
файл проверку прошёл. но увидеть красоту не удалось. к сожалению выпало устройство и порта 18СОМ нет, перескочил на 32 (предыдущая UNO уже отвёз ставить на воду). буду 18 искать.
увидеть красоту не удалось
0
странно получилось. раньше работало 18СОМ. скейч поправил (внёс count = count + 0.333.....) и вот при вливании в УНО ругается нет 18СОМ, ну я все прошёл по порядку 1_10_12_31СОМ, но связи нет и после этого полез в подключённые устройства на ПК нашёл там чтото по наитию и теперь оно заработала на 31СОМ
0
извиняюсь за назойливость!
вопрос — может есть программка составления програм для ардуино, облегчающая участь чайников.
и лучше безплатная
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.