Подключение sim 900 и arduino uno
- Войдите на сайт для отправки комментариев
Пнд, 08/05/2017 - 17:30
Имеется:
- Arduino Uno (ATmega328P-PU)
- GPRS Shield SIM900 (s2-1040s-z1k0c)
- Однокональное реле
Задумка сдедующая. Автоматические ворота, при звонке определенных номеров, ворота должны открываться, при повторном звонке должны закрываться. Т.е. звонок на шилд, сброс вызова, фильтрация номеров, передача сигнала на реле, далее на драйвер.
Не смог найти информации по подключение конкретных устройств, каким образом подключается сие чудо?
Shield надевается сверху на Uno, а реле подключается к любому свободному контакту.
физически не получится шилд свеху посадить на адруинку, компоненты не позволяют и ножки обрезаны.
читал что для программироания подключается как-то иначе
Это как?
Вы хотите сказать, что существуют препятствия для штатного способа соединения?
Может, Вы что не так делаете? (у Вас на фото щит и Уно сориентированы с поворотом на 180 градусов).
Ноги припоять надо на шилд
проще подключить проводами - надо-то всего - RX, TX, питание и GND
Задумка сдедующая. Автоматические ворота, при звонке определенных номеров, ворота должны открываться, при повторном звонке должны закрываться.
Пользовался такой системой - очень неудобно. Пока не начали делать, советую поменять средство управления с GSM-шилда на пару приемник 433 или 315 МГц и передатчик в виде брелка
Здравствуйте уважаемые.
Вот-вот придёт данный модуль, решила подготовить "почву" заранее, т.е. изучить работу.
Буду читать и отправлять СМС.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // длина сообщения #define MESSAGE_LENGTH 160 // номер сообщения в памяти сим-карты int messageIndex = 0; // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS-шилд gprs.powerOn(); // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS-устройства delay(1000); Serial.print("GPRS Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); Serial.println("Please send SMS message to me!"); } void loop() { // если пришло новое сообщение if (gprs.ifSMSNow()) { // читаем его gprs.readSMS(message, phone, datetime); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); } }Как я понимаю, смс остается в памяти на сим карте? Как удалять сообщение после прочтения?
А если можно, подскажите где почитать описание библиотеки, желательно на русском
Как я понимаю, смс остается в памяти на сим карте? Как удалять сообщение после прочтения?
Для этого есть соответствующая AT-команда. Где найти описание на русском - не знаю, может оказаться. что его вообще не существует. Но английский там несложный, не Шекспиром писано, а скорее всего китайцами :)
АТ команды видела, только смысл тогда от библиотеки?
АТ команды видела, только смысл тогда от библиотеки?
Вы откройте файл GPRS_Shield_Arduino.h - там должно быть краткое перечисление всех функций библиотеки с параметрами вызова. Возможно там и функция для стирания СМС есть. Но может и не быть, библиотеки ведь каждый под свои нужды пишет. Если автору не было нужно стирать СМс с карты - он это в библиотеку не вставил...
модуль не реагирует на ат команы. что я не так сделала?
Код
#include <SoftwareSerial.h> SoftwareSerial mySerial(7,8); void setup() { Serial.begin(9600); //Serial.println(“Begin”); mySerial.begin(9600); } void loop() { if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.write(Serial.read()); }Заработал
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS шилд gprs.powerOn(); // проверяем есть ли связь с GPRS устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле // пока не появится ответ от GPRS устройства Serial.print("GPRS Init error\r\n"); delay(3000); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); } void loop() { // считываем данные с компьютера и записываем их в GPRS Shield serialPCread(); // считываем данные с GPRS Shield и выводим их в Serial-порт serialGPRSread(); } void serialPCread() { if (Serial.available() > 0) { // если приходят данные по USB while (Serial.available() > 0) { // записываем их в GPRS Shield Serial1.write(Serial.read()); } } } void serialGPRSread() { if (Serial1.available() > 0) { // если приходят данные с GPRS Shield while (Serial1.available() > 0) { // передаём их в USB Serial.write(Serial1.read()); } } }Что не так в этой строке?
sketch_jan17a:57: error: 'Serial1' was not declared in this scope if (Serial1.available() > 0) { ^ exit status 1 'Serial1' was not declared in this scopeНаверное на Uno нет Serial1?
Ардуино nano
Как быть?
Наверное на Nano нет Serial1?
Hint: МК на них одинаковый. И на Mini Pro тоже, можете не пробовать.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // длина сообщения #define MESSAGE_LENGTH 160 // номер сообщения в памяти сим-карты int messageIndex = 0; // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS-шилд gprs.powerOn(); // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS-устройства delay(1000); Serial.print("GPRS Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); Serial.println("Please send SMS message to me!"); } void loop() { // если пришло новое сообщение if (gprs.ifSMSNow()) { // читаем его gprs.readSMS(message, phone, datetime); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); } }Вроде код написа для уно
Как это исправить?
Никак не исправить. Serial1 (а так же Serial2) - это глобальный объект и создается он для определенных платформ, на которых более одного хардварного (тут вам подсказка) UART. Это, например, Mega2560.
Разобралась. Спасибо.
// библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> #include <SoftwareSerial.h> // длина сообщения #define MESSAGE_LENGTH 160 // номер сообщения в памяти сим-карты int messageIndex = 0; // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; // создаём объект класса GPRS и передаём в него объект Serial1 // создаём объект mySerial и передаём номера управляющих пинов RX и TX SoftwareSerial mySerial(7, 8); GPRS gprs(mySerial); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield mySerial.begin(9600); // включаем GPRS-шилд gprs.powerOn(); // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS-устройства delay(1000); Serial.print("GPRS Init error\r\n"); } // выводим сообщение об удачной инициализации GPRS Shield Serial.println("GPRS init success"); Serial.println("Please send SMS message to me!"); } void loop() { // если пришло новое сообщение if (gprs.ifSMSNow()) { // читаем его gprs.readSMS(message, phone, datetime); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); } }Для чего это нужно?
И еще вопрос, как включать модуль програмно, а не нажатием на кнопку питания?
Нашла вот что
void powerUpOrDown() { pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(1000); digitalWrite(9,HIGH); delay(2000); digitalWrite(9,LOW); delay(3000); }НЕ ПОЙМУ КАКОЙ ЭТО КОНТАКТ ШИЛДА НА МОЕЙ КАРТИНКЕ
gprs.powerOn();
Соединила 9 пин ардуино с 9 пином шилда, не включается
читайте до просветления :)
http://arduino.ru/forum/obshchii/ne-vklyuchaetsya-shild-sim900
Спасибо. Продолжу по ссылке
Подскажите как исправить ситуацию.
#include <GPRSk_Shield_Arduino.h> #include <SoftwareSerial.h> #define MESSAGE_LENGTH 160 SoftwareSerial mySerial(7, 8); int messageIndex = 0; char message[MESSAGE_LENGTH]; char phone[16]; char datetime[24]; GPRSk gprs(mySerial); void(* resetFunc) (void) = 0; void setup() { Serial.begin(9600); mySerial.begin(9600); while (!Serial) { } Serial.print("Serial init OK\r\n"); gprs.powerOn(); while (!gprs.init()) { delay(1000); Serial.print("GPRS Init error\r\n"); resetFunc(); } Serial.println("GPRS init success"); Serial.println("Please send SMS message to me!"); } void loop() { if (gprs.ifSMSNow()) { gprs.readSMS(message, phone, datetime); //Проверка на номер if (strstr(phone, "+79603333333")){ Serial.println("Верный номер"); if (strstr(message, "zapusk5"));{ Serial.println("Запуск 5 минут");} if (strstr(message, "zapusk10"));{ Serial.println("Запуск 10 минут");} }else{ Serial.println("НЕверный номер"); Serial.println(phone); } } }В мониторе порта я получаю
Верный номер
Запуск 5 минут
Запуск 10 минут
Хотя в сообщении я посылала zapusk5
Т.е. слово zapusk сравнивается два раза.
Как сделать чтобы strstr сравнивала точные символы?
Irinka, функция strstr - это не сравнение двух строк, это поиск одной строки в другой. Прочитайте внимательно синтаксис вызова и что эта функция возвращает. Вы неправильно ее используете. В том числе и "верный номер" будет выдавать такой ответ при любом входящем СМС с любого номера.
какой функцией пользоваться?
Просто условием сравнить нельзя,потому что могут быть левые символы
можно так
if (smsstr.compareTo("status") == 0) { // бла бла бла }if (smsstr.substring(passwstrlen, (passwstrlen + 7)) == "kick on") { }это вам не искуственый разум, и не тем более разум человека, который автоматом отбрасывает лишнее
какой функцией пользоваться?
да этой же strstr. только правильно!
RTFM
if (message.compareTo("stop")==0) { digitalWrite(zazhiganie, LOW); digitalWrite(star, LOW); }можно так
if (smsstr.compareTo("status") == 0) { // бла бла бла }да ну, зачем String когда strstr идеально подходит для этого случая? Я просто хочу. чтобы человек, БЛИН, хоть чуть чуть сам научился. неужели трудно открыть гугль и посмотреть, как правильно пользоваться функцией?
ок, пусть читает:)
if (strstr(*message, "stop"));{ //,kf,kf } if (strstr(*message, "stop1"));{ блабла }Так?)
if (strstr(*message, "stop"));{ //,kf,kf } if (strstr(*message, "stop1"));{ блабла }Так?)
Блин, надоели, честное слово. Неужели трудно посмотреть пример в инете? Не так, а вот так:
if (strstr(message, "stop") != NULL) { //,kf,kf }Во-вторых, если у вас одна строка будет "stop", а другая "stop1" - первая будет совпадать с обоими. Чтобы строки работали корректно, они должны быть УНИКАЛЬНЫ.
Суть вопроса и была в том, что у меня сравнивались zapusk5 и zapusk10, в обоих есть слово zapusk
http://arduino.ru/Reference/StringObject
Суть вопроса и была в том, что у меня сравнивались zapusk5 и zapusk10, в обоих есть слово zapusk
и что ? zapusk5 и zapusk10 - разные строки и будут сравниваться отдельно, не мешая друг другу, если сравнивать правильно.
Это вы думали, что суть в этом, а она совсем в другом,...
Доброго времени суток. По вашему коду пишет в диалоговом окне GPRS Init error