Не смогли подключить Gprs Shield на Ардуино UNO? #include <SoftwareSerial.h> //заводим Serial-соединение с GPRS-Shield на 7 и 8 цифровых входах SoftwareSerial gprsSerial(7, 8); void setup() { // GPRS Shield общается по умолчанию на скорости 19200 бод gprsSerial.begin(19200); } //в строке curStr будем хранить текущую строку, которую передает нам плата String currStr = ""; int updateTime = 0; void loop() { touch(); if (!gprsSerial.available()) return; // Считываем очередной символ с платы char currSymb = gprsSerial.read(); if ('\r' == currSymb) { // Получен символ перевода строки, это значит, что текущее // сообщение от платы завершено и мы можем на него отреагировать. // Если текущая строка - это RING, то значит, нам кто-то звонит if (!currStr.compareTo("RING")) { //кокетничаем 3 секунды, чтобы дать услышать звонящему гудок delay(3000); //посылаем команду на поднятие трубки gprsSerial.println("ATA"); } currStr = ""; } else if (currSymb != '\n') { // Дополняем текущую команду новым сиволом // При этом игнорируем второй символ в последовательности переноса // строки: \r\n currStr += String(currSymb); } } /* * Функция провоцирует поддержание коммуникации с платой даже если * та была перезагружена без перезагрузки Arduino */ void touch() { if (millis() >= updateTime) { gprsSerial.println("AT"); updateTime += 5000; } } не работает в чем может быть проблема ?
есть хорошее решение, что-бы проверить дошло -ли до нужного куска скетча (ВЫБОРОЧНАЯ КОМПИЛЯЦИЯ) в начале пишете Код (C++): #define название и потом вставляете в коде Код (C++): #ifdef название то что нужно выполнить #endif если закоменитировать(//) #define , то то, что между #ifdef и #endIf не будет выполняться. К чему я это написал. вы можете писать в сериал или мигать, звучать чем-то и вы поймёте, где и что не работает.
Хочу написать сккетч чтобы спомощью смс управлять серво? Gprs shield вставил в уно написал скетч но не работает
начать бы с малого, отправить вручную команду модулю, получить ответ. А так много неизвестного. Вот так например : Код (C++): #include <SoftwareSerial.h> SoftwareSerial mySerial(8, 9); void setup() { Serial.begin(19200); mySerial.begin(19200); } void loop() { if (Serial.available()) mySerial.write(Serial.read()); if (mySerial.available()) Serial.write(mySerial.read()); } прошиваем , открываем монитор порта и печатаем AT. или другие команды. (в мониторе скорость выставте и NL & CR.) На счет пинов для софтсериал, в МЕГЕ и Леонардо не все пины работают, в УНО не знаю.
а что не работает то? врядли вам кто то поможет. На "Врач у меня ЭТО" - тяжело и даже не хочется отвечать. Опишите что сделали, что пробовали, что получилось а что нет? Либо к экстрасенсам....
тогда как узнать что GPRS shield работает? Мы подключили к Arduino uno GPRS shield и как понять что он работает?
А Форум почитать не пробовали?Там уже 2001 раз об этом написано.У вас Програмный USART судя по скетчу тогда вопрос перемычки SW-HW на шилде как стоят?Нужно в положение "SW" (для Вашего случая) Нет их ни на Леонардо ни на УНО а только на GPRS шилде
Знакомый Скетч.Попробуйте так:Только на ГПРС шилде перемычки поставьте в положение HW Код (C++): void setup() { // GPRS Shield общается по умолчанию на скорости 9600 бод Serial.begin(9600); } //в строке curStr будем хранить текущую строку, которую передает нам плата String currStr = ""; int updateTime = 0; void loop() { touch(); if (!Serial.available()) return; // Считываем очередной символ с платы char currSymb = Serial.read(); if ('\r' == currSymb) { // Получен символ перевода строки, это значит, что текущее // сообщение от платы завершено и мы можем на него отреагировать. // Если текущая строка - это RING, то значит, нам кто-то звонит if (!currStr.compareTo("RING")) { //кокетничаем 3 секунды, чтобы дать услышать звонящему гудок delay(3000); //посылаем команду на поднятие трубки Serial.println("ATA"); } currStr = ""; } else if (currSymb != '\n') { // Дополняем текущую команду новым сиволом // При этом игнорируем второй символ в последовательности переноса // строки: \r\n currStr += String(currSymb); } } /* * Функция провоцирует поддержание коммуникации с платой даже если * та была перезагружена без перезагрузки Arduino */ void touch() { if (millis() >= updateTime) { Serial.println("AT"); updateTime += 5000; } }
я имел ввиду библиотеку SoftwareSerial, а именно такие ограничения: На платах Arduino Mega и Mega2560 некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. В силу этого, на данных платах в качестве вывода RX могут использоваться только следующие выводы: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69). На Arduino Leonardo некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. Поэтому, на этой плате в качестве вывода RX могут использоваться только следующие выводы: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). Как обстоит дело на Уно не знаю.
Зачем Вам программный USART когда есть аппаратный?Нужен ещё один?Под "ещё" один можно в принципе использовать любые пины (в.т.ч и аналоговые)если подправить библиотеку SoftwareSerial,Только смысл?Усложнить код увеличить его размер и уменьшить быстродействие?
для отладки, очень удобно видеть что отвечает gsm модуль, послать какую-нибудь команду и т.д., а у УНО есть только один аппаратный порт.
все верно, я когда с gps юзаю один програмный uart. На uno внешние прерывания вроде от любой ноги, но я обычно D2 или D3 , как на atmega8a привык. У них отдельные функции прерывания, от других ног прерывание вызывается сразу всеми 8 ногами (Bx, Cx, Dx), а по этим ногам есть два отдельных прерывания.
Кстати, "int updateTime =0;" не годится. В процедуре touch он наращивается по 5000, а предел у 16-битного int`a = 32,767. Угадайте, за сколько итераций он переполнится и условие в процедуре touch перестанет выполняться. Вместо int надо long.