Спасибо а ещё можете ответить на 2 последних вопроса. 1) чтобы программно отключить шилд нужно прописать после отправки смс digitalWrite(power,LOW); или можно как-то ещё его отключить, чтобы не работал попусту долго 2) на сим карту это никак не повлияет долгая работа шилда? А то я одну уже потерял, только не до конца понял из-за чего.
Опишите задачу по подробней? Изходя из кода, смс отпровляется после нажатия кнопки? И вы хотите чтоб после отправки смс шилд выключился а при при следующем нажатии кнопки он включился и отправил смс, правильно?
Да, точно так и хочу, только в последующем кнопка будет заменена на датчик движения, но смысл не поменяется.
Ну для начала чем вам не устраивает что шилд работает постоянно? От этого он не сломается))) А так постоянно ему придётся искать сеть при включении, а так как время на затрачивается разное то соответствено нужно делать долгую паузу после включения!
На выключение есть АТ команда вечером дома талмуд посмотрю напишу.Но смысла не вижу так как при срабатывании датчика пройдёт много времени до отправки СМС да и постоянное включение загрузка поиск и регистрация в Сети не есть гут для СИМ(знаю сам работал в МТС)через пару месяцев придётся снова менять. Да и у шилда потребление тока максимальное в момент регистрации в сети.Так что совет-пусть работает постоянно.
Протестировал. Немного изменил скетч на этот: Код (Text): #include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); int power = 9 ; // подача питания пин 9 int btnPin = 5; boolean prevBtn = LOW; void setup() { pinMode(btnPin, INPUT); pinMode(power, OUTPUT); digitalWrite(power,HIGH); //подали питание delay(1000); //на 1 сек digitalWrite(power,LOW); //сняли питание delay(1000); //на 1 сек gprsSerial.begin(19200); gprsSerial.println("AT+CMGF=1\r"); // выставляем текстовым режим сообщений один раз delay(500); } void loop() { boolean currBtn = digitalRead(btnPin); if (prevBtn != currBtn && currBtn == HIGH) { //сразу после нажатия кнопки отправляем "тревожное" сообщение по заданному номеру sendTextMessage(); } prevBtn = currBtn; } /* * Функция отправки SMS-сообщения */ void sendTextMessage() { digitalWrite(power,HIGH); // Устанавливает текстовый режим для SMS-сообщений //gprsSerial.print("AT+CMGF=1\r"); delay(300); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+79******""); delay(300); // Пишем текст сообщения gprsSerial.println("privet"); delay(300); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); delay(6500); digitalWrite(power,LOW); delay(500); } Что получается: при подключении ардуино к питанию gsm шилд автоматически включается, срабатывает отправка смс 1 раз(если сработало условие ) и потом отключается, и дальше никак не хочет включаться(если сработало условие ). Если добавить вот эти строчки в команде void sendTextMessage : digitalWrite(power,HIGH); digitalWrite(power,LOW); То всё вроде нормально, кнопка сработала, смс отправилась, шилд потух, при повторном нажатии снова шилд включается и примерное через 3-5 сек. приходит смс. Но у меня не получилось сделать так, чтобы шилд работал постоянно, точнее я знаю как это сделать, просто в void setup убрать: delay(1000); //на 1 сек digitalWrite(power,LOW); //сняли питание delay(1000); //на 1 сек Правильно ли это будет или можно что-то изменить?
Вот не обижайтесь только. Но я вообще не понимаю что вы хотите?! Какоето масло масленое! Напишите по пунктам какой функционал вам нужен.
Я тож какбэ не понимаю.Накидал рабочий Скетч что не понравилось то?У Вас digitalWrite(power,LOW); delay(500); что последние две строчки делают?Зачем Software serial?Зачем булевы константы?Я например как Ассемблерщик стремлюсь писать коды как можно лаконичнее
Последние 2 строчки просто отключают питание от шилда. Пример кода я взял отсюда http://wiki.amperka.ru/беспроводная-связь:gprs-shield. (Отправка SMS при нажатии кнопки) . Но этот пример подразумевает собой ручное включение шилда после каждой отправки смс. Мне же надо либо: 1) постоянное включение шилда 2) автоматическое включение шилда перед отправкой смс http://forum.amperka.ru/threads/Управление-отоплением-в-загородном-доме-gsm.999/тут тоже используется похожая структура.
Скетч проверил, да, рабочий, но почему он так отличен от тех, что в ссылках выше? И что означают эти строчки: Serial.print((char)34); Serial.print((char)13);
Посмотрите это скетч: Код (Text): #include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); int power = 9 ; // подача питания пин 9 int btnPin = 5; boolean prevBtn = LOW; void setup() { pinMode(btnPin, INPUT); pinMode(power, OUTPUT); gprsSerial.begin(19200); } void loop() { boolean currBtn = digitalRead(btnPin); if (prevBtn != currBtn && currBtn == HIGH) { //сразу после нажатия кнопки отправляем "тревожное" сообщение по заданному номеру sendTextMessage(); } prevBtn = currBtn; } /* * Функция отправки SMS-сообщения */ void sendTextMessage() { digitalWrite(power,HIGH); delay (1000); digitalWrite(power,LOW); //gprsSerial.println("AT"); // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+79******""); delay(300); // Пишем текст сообщения gprsSerial.println("privet"); delay(300); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); delay(6500); digitalWrite(power,HIGH); delay (1000); digitalWrite(power,LOW); } Если не работает попробуйте раскоментировать строчку gprsSerial.println("AT");
Не получается, нет отправки. А почему в коде нет команды gprsSerial.println("AT+CMGF=1\r"); ? Он же так в любом случае не отправит смс.
Эта настройка модема сохроняеться в его памяти. А попробуйте после digitalWrite ( power, LOW ); добавить delay чтоб после включения шилд нашёл сеть.
Никак, при нажатии на кнопку, шилд включается, идёт поиск сети секунд 5-8 а потом потухает и всё. добавил delay (4000);
уфф.... как же странно от отправляет смс. увеличил до 15 сек. всё равно ещет сеть чуть дольше ~14 сек, но всё равно не отправляет. Код (Text): #include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); int power = 9 ; // подача питания пин 9 int btnPin = 12; boolean prevBtn = LOW; void setup() { pinMode(btnPin, INPUT); pinMode(power, OUTPUT); digitalWrite (power,HIGH); //подали питание delay(1000); //на 1 сек //digitalWrite(power,LOW); //сняли питание //delay(1000); //на 1 сек gprsSerial.begin(19200); delay(500); } void loop() { if (digitalRead(btnPin) == HIGH){ //сразу после нажатия кнопки отправляем "тревожное" сообщение по заданному номеру sendTextMessage(); } } /* * Функция отправки SMS-сообщения */ void sendTextMessage() { digitalWrite (power,HIGH); // Устанавливает текстовый режим для SMS-сообщений gprsSerial.print("AT+CMGF=1\r"); delay(400); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT + CMGS = \"+79**********\""); delay(400); // Пишем текст сообщения gprsSerial.println("ALARM!"); delay(400); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); delay(12000); // digitalWrite(power,LOW); } При таком коде он отправляет смс спокойно, работает сек 10, отключается на 1 сек, потом снова начинает работать, в чём я допустил ошибку? Можно ещё вопрос: почему для того, чтобы включить шилд мы должны сначала подать 5 в, потом их снять, почему нельзя в setup просто подать их и всё?
Отличается потому что я сам его писал.Можно и так: void loop (){ // считываем значения с входа кнопки если разомкнута if (digitalRead(buttonPin) == HIGH){ delay(300); // Устанавливаем адресата: телефонный номер в международном формате Serial.println("AT + CMGS = \"+79**********\""); delay(400); // Пишем текст сообщения Serial.println("ALARM!"); delay(300); // Отправляем Ctrl+Z, обозначая, что сообщение готово Serial.println((char)26); delay(10000); 1-Ушёл от Software Serial т-как в Меге есть "родной" USART и нефиг увеличивать код ляпая програмный USARTпоэтому Serial а не gprsSerial. В шилде используем пины 0,1 вместо 7,8. Учтите это замкнув перемычки на шилде 2-Ушёл от булевых констант чтобы было максимально понятно не плодить лишние телодвижения и опять не увеличивать код а написал просто как в Си if (digitalRead(buttonPin) == HIGH) Если на кнопке "1" то отправляем СМС (также можно разрешить отправку СМС не по высокому уровню а по низкому).
Во всех AVR "камнях" начиная с ATtinny-2313 и старше есть аппаратный USART .У Вас в УНО как минимум Мега-8 стоит(у меня одна УНА с Мегой-168 вторая с м-328 а "Самопал" с Мега-8).Поэтому конечно аппаратный USART!Хотя программный тоже работает-увеличивая размер программы снижая быстродействие и надёжность всего скетча.Его как правило используют там где нет аппаратного в процах типа Тини-45/85 Тини-13/12 итд.