Gprs shild и клавиатура

Тема в разделе "Arduino & Shields", создана пользователем Baskakov, 11 мар 2022.

  1. Baskakov

    Baskakov Нуб

    Здравствуйте.
    Возникла проблема сочетания обработки SMS GPRS шилдом
    и приема данных от матричной клавиатуры.
    Отдельно друг от друга работают нормально.
    Совместно - шилд ждет и принимает SMS но при этом нажатия
    на клавиши клавиатуры принимаются не в момент нажатия, а
    с не понятной задержкой (несколько секунд).
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

  3. Baskakov

    Baskakov Нуб

    Код (C++):
    #include <GPRS_Shield_Arduino.h>
    #include <SoftwareSerial.h>
    #include <Keypad.h>

    GPRS gprs(Serial1);

    const byte ROWS = 4; // число строк клавиатуры
    const byte COLS = 3; // число столбцов клавиатуры

    char hexaKeys[ROWS][COLS] = {
      {'1', '2', '3'},
      {'4', '5', '6'},
      {'7', '8', '9'},
      {'*', '0', '#'}
    };

    byte rowPins[ROWS] = {38, 35, 34, 37}; // к каким выводам подключаем управление строками (фиол/красн/оранж/зел)
    byte colPins[COLS] = {39, 41, 36}; // к каким выводам подключаем управление столбцами (син/сер/желт)
    Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

    // номер сообщения в памяти сим-карты
    int messageIndex = 0;
    // дата отправки сообщения
    char datetime[24];
    boolean started = false;
    //char sms_position;
    char phone_number[20]; // массив для считывания номера из SMS
    char sms_text[100];


    char customKey = 'F';
    char MessageChar[40];
    String Message = "";


    void setup()
    {
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      // открываем Serial-соединение с GPRS Shield
      Serial1.begin(9600);
      // ждём, пока не откроется монитор последовательного порта
      // для того, чтобы отследить все события в программе
      digitalWrite(8, HIGH);
      delay(1200); // программное включение GPRS Shield
      digitalWrite(8, LOW);
      delay(10000);

      while (!Serial) {
      }
      Serial.print("Serial init OK\r\n");
      // включаем GPRS шилд
      gprs.powerOn();
      // проверяем есть ли связь с GPRS устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке
        // процесс повторяется в цикле
        // пока не появится ответ от GPRS устройства
        delay(1000);
        Serial.print("Init error\r\n");
      }
      // выводим сообщение об удачной инициализации GPRS Shield
      Serial.println("GPRS init success");
      // отправляем сообщение по указанному номеру с заданным текстом
      // gprs.sendSMS("+79217840484", "system started");
    }

    void loop()
    {
      customKey = customKeypad.getKey();
      if (customKey) {
        Serial.println(customKey);
      }
      //************************************************************ прием и обработка SMS *********************************************
      if (gprs.ifSMSNow()) // если есть данные на прием
      {
        gprs.readSMS(sms_text, phone_number, datetime);
        String number(phone_number);
        String str(sms_text);
        Serial.println(number);
        Serial.println(str);
      }
    }

     
     
    Последнее редактирование модератором: 11 мар 2022
  4. Airbus

    Airbus Радиохулиган Модератор

  5. SergeiL

    SergeiL Оракул Модератор

    Я поправил на первый раз, отформатировал
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Я ни разу не программист, а схемотехник. Таких шилдов у меня нет. Могу только подать идею. Может реакцию на клавиатуру вынести в обработчик прерывания ? То есть не опрашивать ее каждый цыкл, а только по факту. Для этого надо смотреть, есть ли в библе функция работы в режиме обработчика прерываний.
     
    Последнее редактирование: 11 мар 2022
  7. Baskakov

    Baskakov Нуб

    Нашел ответ.
    https://habr.com/ru/post/401721/
    Цитата:
    "Главная засада заключается в принципе работы библиотеки модуля. Она работает в закрытом режиме, то есть блокирует работу контроллера на время ожидания прихода SMS (а это 99 % времени) и во время всех прочих операций модуля. Что это значит? Это значит, что на стандартной библиотеке от производителя вы не сможете построить ничего, кроме тестового скетча."
     
  8. b707

    b707 Гуру

    это не ответ. Пробежался по статье - написана сплошная дурь. Софт и Хард сериал на Меге - это вообще одна и та же библиотека, а у автора одно работает, а другое нет? Тоже самое про Дуе...
    В общем, я бы не стал ориентироваться на этот отзыв как на заслуживающий доверия.

    Что касается Шилда - если у амперки библиотека блокирующая - возьмите любую другую для своего типа GPRS модуля, ИХ ЖЕ МНОГО НА ГИТХАБЕ

    Основной корень проблемы что у вас, что у автора с хабра - недостаток опыта. Работа с GPRS - одна из самых сложных задач в "ардуиноведеньи", с нее не стоит начинать. Соберите пяток проектов попроще. освойтесь
     
    Последнее редактирование: 18 мар 2022