Подключение модуля gsm/gprs a6 (расширенная версия) к Arduino UNO R3

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Homo Faber пишет:

где я опять накосячил?

практически везде.

write и read команды оперируют одним байтом, зачем в init 52 и 55 строка вообще не понятно

зачем ставить скорость 115200 а потом 9600, что  за извращение

какими командами и как инициализироват модем А6 уже писалось

светодиод загорается но не видно где он должен гаснуть

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

http://codius.ru/articles/GSM_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_SIM800L_%D1%87%D0%B0%D1%81%D1%82%D1%8C_1

 

Homo Faber
Offline
Зарегистрирован: 25.05.2019

Прочёл, проникся, исправил. Вот новый код и ответ на него.

#include <SoftwareSerial.h>

// 8 - RX Arduino (TX GSM_A6), 9 - TX Arduino (RX GSM_A6)
SoftwareSerial GSM_A6(8, 9);// 8 - RX Arduino (TX GSM_A6), 9 - TX Arduino (RX GSM_A6)

unsigned long current_millis=millis();
int ch = 0;
int LedG = 4;                                 // Пин для зелёного светодиода
int LedR = 7;                                 // Пин для красного светодиода
String val = "";
byte Flag=false;

void setup()
{
  pinMode(LedG, OUTPUT);
  digitalWrite(LedG, LOW);                    // Зелёный светодиод ВЫКЛ
  pinMode(LedR, OUTPUT);
  digitalWrite(LedR, LOW);                    // Красный светодиод ВЫКЛ
  Serial.begin(9600);                         // Скорость обмена данными с компьютером
  Serial.println("Start!");
  GSM_A6.println("AT+IPR=9600");
  GSM_A6.begin(9600);                         // Скорость обмена данными с модемом 9600
  initModem();
}

void loop() {
  if (GSM_A6.available())                     // Ожидаем прихода данных (ответа) от модема...
     {
      Serial.write(GSM_A6.read());            // ...и выводим их в Serial
     }
  if (Serial.available())                     // Ожидаем команды по Serial...
     {
      GSM_A6.write(Serial.read());          // ...и отправляем полученную команду модему
     }
}

void initModem()
{
  while ((millis() - current_millis) <= 5000UL)
        {
         GSM_A6.println("AT");                // Посылаем команду АТ
         delay(1000);
// Контроль ответа ОК
         val="";
         while (GSM_A6.available())
               {
                ch = GSM_A6.read();
                val += char(ch);              // Сохраняем входную строку в переменную val
                delay(10);
                if (val.indexOf("OK"))
                   {
                    Serial.println("LedG");
                    digitalWrite(LedG, HIGH); // Зелёный светодиод ВКЛ
                    Flag=true;
                    break;
                   }
               }
         if (Flag) break;      
        }
  GSM_A6.println("AT+IPR?");                  // Посылаем запрос о скорости соединения
// Контроль скорости 9600
  val="";
  while (GSM_A6.available())
        {
         ch = GSM_A6.read();
         val += char(ch);                     // Сохраняем входную строку в переменную val
         delay(10);
         if (val.indexOf("9600"))
            {
             Serial.println("LedR");
             digitalWrite(LedR, HIGH);        // Красный светодиод ВКЛ
             break;
            }
        }
  delay(1000);
  GSM_A6.println("ATI");                      // Посылаем запрос о версии модуля
}

А вот ответ.

Start!
LedG
LedR
 
 
OK
AT+IPR?
 
+IPR: 9600
 
OK
ATI
 
Ai Thinker Co.LTD
A6 
V03.03.20161229019H03
 
OK
 
Чего я не могу понять, так это почему мои сообщения "LedG" и "LedR" (и соответсвенно включаются светодиоды) выводятся раньше ответа модема? И почему на мой запрос "АТ" всё также приходит ответ в виде набора чисел? Ведь эту часть я срисовал с http://codius.ru/articles/GSM_модуль_SIM800L_часть_1.
До SMS надеюсь когда-нибудь таки дойду...
Homo Faber
Offline
Зарегистрирован: 25.05.2019

Честно говоря я что-то не понял. После очередного запуска модем стал отвечать эхом, то есть что я посылаю, то и получаю в ответ. Но только на команды введённые через монитор порта.

Примерно так.

Start!
LedG
LedR
 
 
OK
AT+IPR?
 
+IPR: 9600
 
OK
ATI
 
Ai Thinker Co.LTD
A6 
V03.03.20161229019H03
 
OK
AT
AT+IPR?
ATI
 
Дал команды сответственно "AT", "AT+IPR?" и "ATI" и получил из же в ответ. На Arduino явственно перемигиваются светодиоды TX и RX в момент передачи команды иполучения ответа. Что бы это значило?
Мой чайник скоро закипит, но не от удачной работы, а от непонимания...
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Про автоответ это банально - есть команда модема которая отключает автоответ - нагуглите легко.
По поводу остального - у вас логика программы страдает, вы выводите сообщения до того как вывод ответа, да и вообще все криво.
У вас как вообще с программированием?
Т е вам надо взять в толк что работает все последовательно, необходимо в loop разделять режимы работы программы и в зависимости от это этого выводить сообщения. Куча примеров на форуме....

Homo Faber
Offline
Зарегистрирован: 25.05.2019

"АТЕ0" пробовал - не помогло, просто никакого ответа. Программированием занимаюсь профессионально, около 30 лет. На логику никто не жаловался. С языком СОСИ++ связался впервые. Настолько идиотские конструкции, что поневоле принимаешь за правду то, что он был придуман как пример языка с невозможными конструкциями, в качестве первоапрельской шутки студентами МТИ. Почему-то очень понравился профессору. С этого момента и началось шествие С по умам программистов.
По поводу последовательности команд. Если я подав команду "АТ" дожидаюсь ответа модема "ОК" и ТОЛЬКО ПОСЛЕ ЭТОГО вывожу "LedG" и включаю зелёный светодиод, затем подаю команду "AT+IPR?", дожидаюсь ответа "+IPR: 9600" и ТОЛЬКО ПОСЛЕ ЭТОГО вывожу "LedR" и включаю красный светодиод. В чём отсутствие логики?
Кину ещё один камень в огород С. Хреново работать со строками. Нет элементарных функций наподобие LEFT(), RIGHT() для выделения определённого количества символов из строки. Пытался подключить "STRING.H", "CSTRING.H", меняне поняли ;). Получилответ,что библиотеки не подходят. Можете что-либо посоветовать?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Homo Faber пишет:

................................ Программированием занимаюсь профессионально, около 30 лет. На логику никто не жаловался. .......................................................
Кину ещё один камень в огород С. ..........................................

че то не вяжеться, тут частенько приходят супер программисты, а примитивного сделать не могут :(

ЗЫ. Извините, но я уйду с этой темы. Еслиб у Вас было желание разобраться - давно бы уже кучу примеров разобрали.

P.P.S. Не хвалюсь - просто констатация факта, ни капли не программист, работаю поверхностностно с: Ассемблер,C,Pascal,PHP,C++ ну ни разу не было желания поругаться на язык, это всего лишь инструмент, который надо учить.