Здравствуйте. Возникла проблема сочетания обработки SMS GPRS шилдом и приема данных от матричной клавиатуры. Отдельно друг от друга работают нормально. Совместно - шилд ждет и принимает SMS но при этом нажатия на клавиши клавиатуры принимаются не в момент нажатия, а с не понятной задержкой (несколько секунд).
Код (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); } }
Я ни разу не программист, а схемотехник. Таких шилдов у меня нет. Могу только подать идею. Может реакцию на клавиатуру вынести в обработчик прерывания ? То есть не опрашивать ее каждый цыкл, а только по факту. Для этого надо смотреть, есть ли в библе функция работы в режиме обработчика прерываний.
Нашел ответ. https://habr.com/ru/post/401721/ Цитата: "Главная засада заключается в принципе работы библиотеки модуля. Она работает в закрытом режиме, то есть блокирует работу контроллера на время ожидания прихода SMS (а это 99 % времени) и во время всех прочих операций модуля. Что это значит? Это значит, что на стандартной библиотеке от производителя вы не сможете построить ничего, кроме тестового скетча."
это не ответ. Пробежался по статье - написана сплошная дурь. Софт и Хард сериал на Меге - это вообще одна и та же библиотека, а у автора одно работает, а другое нет? Тоже самое про Дуе... В общем, я бы не стал ориентироваться на этот отзыв как на заслуживающий доверия. Что касается Шилда - если у амперки библиотека блокирующая - возьмите любую другую для своего типа GPRS модуля, ИХ ЖЕ МНОГО НА ГИТХАБЕ Основной корень проблемы что у вас, что у автора с хабра - недостаток опыта. Работа с GPRS - одна из самых сложных задач в "ардуиноведеньи", с нее не стоит начинать. Соберите пяток проектов попроще. освойтесь