Форум программистов, компьютерный форум, киберфорум
Наши страницы
Arduino
Войти
Регистрация
Восстановить пароль
 
reser007
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 23
1

Проблемы с GSM модулем A6 Arduino

13.01.2020, 23:31. Просмотров 240. Ответов 8
Метки нет (Все метки)

Здравствуйте. Возникли проблемы с настройкой gsm модуля. Делаю систему контроля за котлом отопления. Суть проблемы в том, что при задержке после инициализации и отправкой смс, допустип тревоги по температуре, смс отказывается отправляться. Но если отправка идут сразу после инициализации, то все хорошо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 #include <iarduino_GSM.h>                                                                 // Подключаем библиотеку iarduino_GSM для работы с GSM/GPRS Shield.
    iarduino_GSM gsm;                                                                         // Создаём объект gsm для работы с функциями и методами библиотеки iarduino_GSM.
                                                                                              //
//  Следующие 2 строки нужны для работы по программной шине UATR (выводы 7 и 8):              //
    #include <SoftwareSerial.h>                                                               // Подключаем библиотеку SoftwareSerial для программной реализации шины UART.
    SoftwareSerial softSerial(7,8);                                                           // Создаём объект softSerial указывая выводы RX и TX платы Arduino.
//  Если Вы работаете c GSM/GPRS Shield по аппаратной шине UATR, удалите 2 предыдущие строки, //
//  а в функции gsm.begin(), вместо softSerial укажите Serial или Serial1, Serial2 ...        // Зависит от номера аппаратной шины UART использующей выводы 0 и 1 Вашей платы Arduino.
                                                                                              //
void setup(){                                                                                 //
String          TEXT;
int ttt=5;
 
//  Выводим текст в монитор последовательного порта:                                          //
    //Serial.begin(9600);                                                                       // Инициируем передачу данных по аппаратной шине UART для вывода результата в монитор последовательного порта.
    //Serial.print( F("Initialization, please wait ... ") );                                    // Выводим текст.
                                                                                              //
//  Инициируем GSM/GPRS Shield и проверяем его готовность к работе:                           //
    gsm.begin(softSerial);                                                                    // Инициируем работу GSM/GPRS Shield, указывая объект шины UART.
    //while(gsm.status()!=GSM_OK){Serial.print("."); delay(1000);} Serial.println(" OK!");      // Ждём завершения регистрации модема в сети оператора связи.
    //Serial.println( F("--------------------") );                                              //
                                                                                              //
//  Установка кодировки для символов Кириллицы:                                               //
    gsm.TXTsendCodingDetect("п");                                                             // Выполняем автоопределение кодировки скетча для отправки текста на Русском языке.
//  gsm.TXTsendCoding(GSM_TXT_CP866);                                                         // Если символы Кириллицы исходящих SMS сообщений некорректно отображаются на телефоне, выберите одну из кодировок: GSM_TXT_CP866 / GSM_TXT_UTF8 / GSM_TXT_WIN1251.
//  gsm.TXTreadCoding(GSM_TXT_CP866);                                                         // Если символы Кириллицы входящих  SMS сообщений некорректно отображаются в мониторе,  выберите одну из кодировок: GSM_TXT_CP866 / GSM_TXT_UTF8 / GSM_TXT_WIN1251.
                                                                                              // По умолчанию для входящих и исходящих SMS сообщений установлена кодировка GSM_TXT_UTF8.
//  Отправка короткого SMS сообщения:                                                         //
    delay(100000);
    //Serial.println(F("Sending normal SMS ..."));                                              //
    TEXT = "Значение = " + String (ttt);
    gsm.SMSsend(TEXT, "+7900000000");                               // Отправка обычного (короткого) SMS сообщения на номер +7(012)345-67-89.
                                                                                              //
                                                       // Указываем не присваивать класс отправляемым SMS сообщениям. Сообщения без класса - это обычные SMS сообщения (по умолчанию).
}                                                                                             //
                                                                                              //
void loop (){                                                                                 // В данном скетче сообщения не отправляются в цикле loop, для экономии Ваших средств на счёте.
}
Стока имитирует нормальную работу котла, ни чего не отправляется, когда время заканчивается смс все равно не отправляется.
C++
1
delay(100000);
Если мы убираем эту строку, то все отправляется.
C++
1
2
3
//  Отправка короткого SMS сообщения:                                                         
    TEXT = "Значение = " + String (ttt);
    gsm.SMSsend(TEXT, "+7900000000");
GSM должен быть всегда в сети, т.к. должна принимать смс с запросом показания датчиков.

ПОДСКАЖИТЕ В ЧЕМ МОЖЕТ БЫТЬ ПРОБЛЕМА!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2020, 23:31
Ответы с готовыми решениями:

Arduino and gsm A6
У меня проблемы с новеньким GSM...

Arduino GSM FM мониторинг
Добрый вечер. Существует необходимость контролировать вещание одной FM станции в удаленном...

ARDUINO + GSM SIM900 (лекбес)
ARDUINO + GSM SIM900 (лекбес) Короче скока не спрашивал на форумах так и не получил ответа, видать...

GSM модуль Arduino MEGA
Всем доброго времени суток. Помогите,пожалуйста, решить проблему. Взяла готовый код из интернета,...

Arduino uno + gsm sim 900
Короче пересмотрел кучу тем, и ничего путного не находится одна каша. Речь пойдет о подключении UNO...

8
iopq
8 / 8 / 1
Регистрация: 10.12.2013
Сообщений: 347
13.01.2020, 23:35 2
C++ (Qt)
1
2
3
4
5
void loop (){                                                                                 
delay(100000);
TEXT = "Значение = " + String (ttt);
gsm.SMSsend(TEXT, "+7900000000");
}
0
reser007
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 23
13.01.2020, 23:38  [ТС] 3
В таком случае он будет циклически отправляться постоянно
0
iopq
8 / 8 / 1
Регистрация: 10.12.2013
Сообщений: 347
13.01.2020, 23:39 4
reser007, один раз в 100000 мкс.
0
13.01.2020, 23:39
reser007
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 23
13.01.2020, 23:43  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
                                  // БИБЛИОТЕКИ
#include        <iarduino_GSM.h>                                                                                            // Подключаем библиотеку iarduino_GSM для работы с GSM/GPRS Shield.
#include        <SoftwareSerial.h>                                                                                          // Подключаем библиотеку SoftwareSerial для программной реализации шины UART.
#include        <OneWire.h>                                                                                                 // Подключаем библиотеку OneWire для работы с оборудованием фирмы Dallas
 
                                            // ОБЪЕКТЫ ДЛЯ РАБОТЫ С ДАТЧИКАМИ ТЕМПЕРАТУРЫ
OneWire  ds(10);
//OneWire         oneWire_in(2);                                                                                                      // Указываем вывод, к которому подключен термометр внутри помещения
//OneWire         oneWire_out(3);                                                                                                     // Указываем вывод, к которому подключен термометр снаружи помещения
//DallasTemperature sensor_inhouse(&oneWire_in);                                                                              // Создаём объект sensor_inhouse для работы с термометром внутри помещения
//DallasTemperature sensor_outhouse(&oneWire_out);                                                                            // Создаём объект sensor_outhouse для работы с термометром снаружи помещения
                                              // ОБЪЕКТЫ ДЛЯ РАБОТЫ С GSM/GPRS МОДУЛЕМ
iarduino_GSM    gsm;                                                                                                        // Создаём объект gsm для работы с функциями и методами библиотеки iarduino_GSM.
SoftwareSerial  softSerial(7, 8);                                                                                           // Создаём объект softSerial для работы по программной шине UATR, указывая выводы RX и TX платы Arduino (выводы 7 и 8)
                                                            // ПЕРЕМЕННЫЕ
String          TEXT;                                                                                                       // Переменная типа String для хранения текстовой информации и отправки её абоненту
String          strSMStxt;                                                                                                  // Переменная типа String для работы с поиском символа в строке
char            SMStxt[161];                                                                                                // Объявляем строку для хранения текста принятых SMS сообщений.
char            SMSnum[13];                                                                                                 // Объявляем строку для хранения номера отправителя SMS сообщений.
char            NUMBER[13]                            = "+700000000";                                                      // Зададим номер, с которым будет работать модуль
const char*     REPORT_COMMAND                        = "ОТЧЕТ";                                                            // Объявляем массив для хранения указателя на строку
//char            PINS[]                                = {A0, 4, 5};                                                         // Массив с номерами выводов устройств
//uint8_t         MIN_TEMP_IN                           = 15;                                                                 // Минимальная температура срабатывания для термометра внутри помещения
//uint8_t         MAX_TEMP_IN                           = 28;                                                                 // Максимальная температура срабатывания для термометра внутри помещения
float           MIN_TEMP_OUT                          = 10;                                                                 // Минимальная температура срабатывания для термометра снаружи помещения
float           MAX_TEMP_OUT                          = 30;                                                                 // Максимальная температура срабатывания для термометра снаружи помещения
uint16_t        MAX_GAS_VALUE                         = 450;                                                                // Максимальное значение концентрации газа
uint32_t        SMS_RESEND_TIME                       = 300000;                                                             // Время, по истечении которого производится повторная отправка СМС
uint32_t        WAITING_TIME_AFTER_SMS_FOR_TAKE_CALL  = 10000;                                                              // Время между отправкой СМС и совершением тревожного звонка
uint32_t        EMERGENCY_CALL_TALKING_TIME           = 30000;                                                              // Время разговора при тревожном звонке
uint32_t        TEMP_SENSOR_1_TIMER                   = 0;                                                                  // Таймер для датчика температуры внутри помещения на повторную отправку СМС
uint32_t        TEMP_SENSOR_2_TIMER                   = 0;                                                                  // Таймер для датчика температуры снаружи помещения на повторную отправку СМС
uint32_t        GAS_SENSOR_TIMER                      = 0;                                                                  // Таймер для датчика газа на повторную отправку СМС
uint32_t        MOTION_SENSOR_TIMER                   = 0;                                                                  // Таймер для датчика движения на повторную отправку СМС
uint32_t        GERKON_SENSOR_TIMER                   = 0;                                                                  // Таймер для датчика состояния на повторную отправку СМС
uint32_t        EMERGENCY_CALL_TIMER                  = 0;                                                                  // Таймер для совершения тревожного звонка
uint32_t        PHONE_TALKING_TIMER                   = 0;                                                                  // Таймер для времени дозванивания до абонента
 
void setup() {
  //Serial.begin(9600);
  //sensor_inhouse.begin();                                                                                                   // Инициируем работу с термометром внутри помещения
  //sensor_outhouse.begin();                                                                                                  // Инициируем работу с термометром снаружи помещения
  //pinMode(PINS[0], INPUT);                                                                                                  // Настройка вывода на работу в режиме ВХОД
  //pinMode(PINS[1], INPUT);                                                                                                  // Настройка вывода на работу в режиме ВХОД
  //Serial.print( F("Initialization, please wait ... ") );
  gsm.begin(softSerial);                                                                                                    // Инициируем работу GSM/GPRS Shield, указывая объект шины UART.
  while (gsm.status() != GSM_OK) {                                                                                          // Ждём завершения регистрации модема в сети оператора связи.
    //Serial.print(".");
    delay(1000);
  }
  //Serial.println(" OK!");
  // Установка кодировки для символов Кириллицы:
  gsm.TXTsendCodingDetect("п");                                                                                             // Выполняем автоопределение кодировки скетча для отправки текста на Русском языке.
  // Отправка сообщения об удачном запуске:
  gsm.SMSsend( F("Инициализация прошла успешно."), NUMBER);                                                                 // Данная строка будет отвечать отправителю указанным SMS сообщением.
  delay(3000);                                                                                                              // задержка
  //Serial.println(F("================AFTER SETUP================="));
}
 
void loop () {
    TEXT = "";
 
//========================================================================================================================//
                                               // ДАТЧИК ТЕМПЕРАТУРЫ ВНЕШНИЙ
  
 
  byte i;                                     // задаём переменную для счётчика
  byte present = 0;                           // Флаг сброса шины
  byte type_s=0;                                // Флаг модели датчика
  byte data[12];                              // массив под значения температуры, считанные с датчика
  byte addr[8];                               // массив под значение адреса датчика
  float celsius;                              // переменные под значения температуры в градусах Цельсия и Фаренгейта
  if ( !ds.search(addr)) {                    // если функция принимает значение false, значит
    delay(250);                               // задержка 250 мсек
    return;}
  
  if (OneWire::crc8(addr, 7) != addr[7]) {    // выполяем проверка контрольной суммы CRC
     return;}
  
  ds.reset();                                 // производим сброс шины перед началом работы с модулем
  ds.select(addr);                            // указываем устройство, с которым далее будет работать код
  ds.write(0x44, 0);                          // отправка команды выполнить конвертацию
  delay(1000);                                // задержка в 1 сек (для выполнения конвертации)
  present = ds.reset();                       // флаг сброса шины перед приёмом данных с модуля
  ds.select(addr);                            // указываем устройство, с которым далее будет работать код
  ds.write(0xBE);                             // считываем значение из scratchpad-памяти модуля
  for ( i = 0; i < 9; i++) {                  // запускаем цикл считывания 9 байт информации с модуля
    data[i] = ds.read();                      // побайтовое чтение значений с модуля
    }
 
  //Serial.println();                           // добавляем символ новой строки
  int16_t raw = (data[1] << 8) | data[0];     // конвертация значения температуры в 16-битный тип данных
   if (type_s=0) {                               // если подключена модель DS18S20
     byte cfg = (data[4] & 0x60);              // для задания разрешения вводится переменная (по умолчанию установлено 12-битное разрешение)
    if (cfg == 0x00) raw = raw & ~7;          // если значение переменной и указанного бита совпадают, тогда устанавливается 9-битное разрешение точности
    else if (cfg == 0x20) raw = raw & ~3;     // если значение переменной и указанного бита совпадают, тогда устанавливается 10-битное разрешение точности
    else if (cfg == 0x40) raw = raw & ~1;     // если значение переменной и указанного бита совпадают, тогда устанавливается 11-битное разрешение точности
  }
    
  celsius = (float)raw / 16.0;                // переводим значения в градусы Цельсия
  //Serial.print("  Temperature = ");         // выводим в монитор порта текста Температура
  //Serial.print(celsius);                      // выводим значения в градусах Цельсия
  //Serial.println(" Celsius, ");               // выводим в монитор порта текста "градусы Цельсия"
  
  //sensor_outhouse.requestTemperatures();                                                                                    // Запрос значения термометра снаружи помещения
  if (celsius <= MIN_TEMP_OUT || celsius >= MAX_TEMP_OUT) {                                                                   // Проверяем, не выходит ли полученное значение за установленные границы и
    //Serial.println(F("temp 2 inside VALUE"));
    if ((TEMP_SENSOR_2_TIMER + SMS_RESEND_TIME) < millis() || TEMP_SENSOR_2_TIMER == 0) {                                   // если выходит, то проверяем, чтобы сообщения отправлялись не чаще, чем 1 раз в SMS_RESEND_TIME
      //Serial.println(F("temp 2 inside TIMER"));
      //Serial.println(celsius);
      TEMP_SENSOR_2_TIMER = millis();                                                                                       // Обновляем счётчик
      TEXT = "Значение = " + String (celsius);                                                                              // Формируем текст сообщения
      gsm.SMSsend(TEXT, "+000000000");                                                                                            // Отправляем СМС с текстом
      delay(1000);                                                                                                          // задержка
    }
  }
  TEXT = TEXT + "\r\nТвнеш: " + celsius;                                                                                    // добавляем в строку текст, значение термометра и
  delay(5);                                                                                                                 // ждём 5мс
  //Serial.println(F("=================AFTER TEMP 2 SENSOR===================="));
  //========================================================================================================================//
                                                    
}
При выходе температуры за пределы должно отправлять сообщение о тревоге
C++
1
2
3
4
5
6
7
8
if (celsius <= MIN_TEMP_OUT || celsius >= MAX_TEMP_OUT) {                                                                   // Проверяем, не выходит ли полученное значение за установленные границы и
    //Serial.println(F("temp 2 inside VALUE"));
    if ((TEMP_SENSOR_2_TIMER + SMS_RESEND_TIME) < millis() || TEMP_SENSOR_2_TIMER == 0) {                                   // если выходит, то проверяем, чтобы сообщения отправлялись не чаще, чем 1 раз в SMS_RESEND_TIME
      //Serial.println(F("temp 2 inside TIMER"));
      //Serial.println(celsius);
      TEMP_SENSOR_2_TIMER = millis();                                                                                       // Обновляем счётчик
      TEXT = "Значение = " + String (celsius);                                                                              // Формируем текст сообщения
      gsm.SMSsend(TEXT, "+7900000000");
Если я запускаю прогу уже с температурой за пределами, тревога приходит, но если запустить с температурой в пределах и если температура через какое время выйдет за пределы, то смс не приходит.
0
Avazart
Эксперт С++
8009 / 5828 / 575
Регистрация: 10.12.2010
Сообщений: 26,855
Записей в блоге: 19
14.01.2020, 14:55 6
Цитата Сообщение от reser007 Посмотреть сообщение
iarduino_GSM.h
Сомневаюсь что A6 с ней работает.

Кроме того там у этого модуля скорость передачи 115200 непонятно как оно у Вас работает через SoftwareSerial.
0
reser007
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 23
14.01.2020, 20:25  [ТС] 7
Брал у них (https://iarduino.ru/shop/Expansion-payments/gsm-gprs-shield.html), они к ней библиотеку предлагали, вот её и взял.
Хорошо. Какую библиотеку лучше использовать?
0
Avazart
Эксперт С++
8009 / 5828 / 575
Регистрация: 10.12.2010
Сообщений: 26,855
Записей в блоге: 19
14.01.2020, 20:51 8
Никакую."Руками"писать кода который отсылает AT команды.
0
reser007
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 23
14.01.2020, 21:02  [ТС] 9
Ладно, Спасибо. Буду пробывать
0
14.01.2020, 21:02
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2020, 21:02

Передача текста с использованием gsm модуля и arduino
Добрый день! Необходимо написать программу на шарпе, которая передает текст, написанный на...

Как узнать сколько денег на счете сим карты в gsm модеме, Arduino?
Скажите, пожалуйста, как в arduino вы можете узнать, сколько денег на SIM-карте в gsm модеме. Я...

Соединение с удаленным GSM модулем
Приветствую, надеюсь с разделом не ошибся. Прошу совета: есть удаленный охранный блок с gsm...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.