Реализовал такой проект: на основе GPRS модуля и китайской ардуины включаю и отключаю реле по средствам смс. Код программы взял отсюда http://wiki.amperka.ru/projects:smart-power. Вообщем то всё работает, за исключением того что ответная смс о включенном реле не приходит, хотя как я понимаю эта функция в коде прописана. Помогите понять почему так происходит. // библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // библиотека для эмуляции Serial порта // она нужна для работы библиотеки GPRS_Shield_Arduino #include <SoftwareSerial.h> // длина сообщения #define MESSAGE_LENGTH 160 // текст сообщения о включении розетки #define MESSAGE_ON "Power is On" // текст сообщения о выключении розетки #define MESSAGE_OFF "Power is Off" // текст сообщения об ошибке распознавания команды #define MESSAGE_ERROR "Error...unknown command!" // пин, к которому подключено реле #define RELAY 5 // номер сообщения в памяти сим-карты int messageIndex = 0; // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; bool stateRelay = false; // создаём объект класса GPRS и передаём ему скорость 9600 бод; // с помощью него будем давать команды GPRS шилду GPRS gprs(9600); void setup() { // настраиваем пин реле в режим выхода, pinMode(RELAY, OUTPUT); // подаём на пин реле «низкий уровень» (размыкаем реле) digitalWrite(RELAY, LOW); // включаем GPRS-шилд gprs.powerUpDown(); // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); while (!Serial) { // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе } // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS устройства delay(1000); Serial.print("Init error\r\n"); } // вывод об удачной инициализации GPRS Shield Serial.println("GPRS init success"); } void loop() { // проверяем наличие непрочитанных сообщений // и находим их номер в памяти сим-карты messageIndex = gprs.isSMSunread(); if (messageIndex > 0) { // если есть хотя бы одно непрочитанное сообщение, // читаем его gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime); // Удаляем прочитанное сообщение из памяти Сим-карты gprs.deleteSMS(messageIndex); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); // вызываем функцию изменения состояния реле // в зависимости от текста сообщения setRelay(phone, message); } } void setRelay(char f_phone[], char f_message[]) { if (strcmp(f_message, "On") == 0) { // если сообщение — с текстом «On», // выводим сообщение в Serial // и подаём на замыкаем реле Serial.println("OK! Power On"); digitalWrite(RELAY, HIGH); stateRelay = true; // на номер, с которого пришёл запрос, // отправляем смс с текстом о включении питания gprs.sendSMS(f_phone, MESSAGE_ON); } else if (strcmp(f_message, "Off") == 0) { // если пришло сообщение с текстом «Off», // выводим сообщение в Serial // и размыкаем реле Serial.println("OK! Power Off"); digitalWrite(RELAY, LOW); stateRelay = false; // на номер, с которого пришёл запрос // отправляем смс с текстом о выключении питания gprs.sendSMS(f_phone, MESSAGE_OFF); } else if (strcmp(f_message, "State") == 0) { // если пришло сообщение с текстом «State», // отправляем сообщение с состоянием реле if (stateRelay) { Serial.println("State: Power On"); gprs.sendSMS(f_phone, MESSAGE_ON); } else { Serial.println("State: Power Off"); gprs.sendSMS(f_phone, MESSAGE_OFF); } } else { // если сообщение содержит неизвестный текст, // отправляем сообщение с текстом об ошибке Serial.println("Error... unknown command!"); gprs.sendSMS(f_phone, MESSAGE_ERROR); } }
Код (C++): // библиотека для работы с GPRS устройством #include <GPRS_Shield_Arduino.h> // библиотека для эмуляции Serial порта // она нужна для работы библиотеки GPRS_Shield_Arduino #include <SoftwareSerial.h> // длина сообщения #define MESSAGE_LENGTH 160 // текст сообщения о включении розетки #define MESSAGE_ON "Power is On" // текст сообщения о выключении розетки #define MESSAGE_OFF "Power is Off" // текст сообщения об ошибке распознавания команды #define MESSAGE_ERROR "Error...unknown command!" // пин, к которому подключено реле #define RELAY 5 // номер сообщения в памяти сим-карты int messageIndex = 0; // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; bool stateRelay = false; // создаём объект класса GPRS и передаём ему скорость 9600 бод; // с помощью него будем давать команды GPRS шилду GPRS gprs(9600); void setup() { // настраиваем пин реле в режим выхода, pinMode(RELAY, OUTPUT); // подаём на пин реле «низкий уровень» (размыкаем реле) digitalWrite(RELAY, LOW); // включаем GPRS-шилд gprs.powerUpDown(); // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); while (!Serial) { // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе } // проверяем, есть ли связь с GPRS-устройством while (!gprs.init()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке; // процесс повторяется в цикле, // пока не появится ответ от GPRS устройства delay(1000); Serial.print("Init error\r\n"); } // вывод об удачной инициализации GPRS Shield Serial.println("GPRS init success"); } void loop() { // проверяем наличие непрочитанных сообщений // и находим их номер в памяти сим-карты messageIndex = gprs.isSMSunread(); if (messageIndex > 0) { // если есть хотя бы одно непрочитанное сообщение, // читаем его gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime); // Удаляем прочитанное сообщение из памяти Сим-карты gprs.deleteSMS(messageIndex); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(phone); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); // вызываем функцию изменения состояния реле // в зависимости от текста сообщения setRelay(phone, message); } } void setRelay(char f_phone[], char f_message[]) { if (strcmp(f_message, "On") == 0) { // если сообщение — с текстом «On», // выводим сообщение в Serial // и подаём на замыкаем реле Serial.println("OK! Power On"); digitalWrite(RELAY, HIGH); stateRelay = true; // на номер, с которого пришёл запрос, // отправляем смс с текстом о включении питания gprs.sendSMS(f_phone, MESSAGE_ON); } else if (strcmp(f_message, "Off") == 0) { // если пришло сообщение с текстом «Off», // выводим сообщение в Serial // и размыкаем реле Serial.println("OK! Power Off"); digitalWrite(RELAY, LOW); stateRelay = false; // на номер, с которого пришёл запрос // отправляем смс с текстом о выключении питания gprs.sendSMS(f_phone, MESSAGE_OFF); } else if (strcmp(f_message, "State") == 0) { // если пришло сообщение с текстом «State», // отправляем сообщение с состоянием реле if (stateRelay) { Serial.println("State: Power On"); gprs.sendSMS(f_phone, MESSAGE_ON); } else { Serial.println("State: Power Off"); gprs.sendSMS(f_phone, MESSAGE_OFF); } } else { // если сообщение содержит неизвестный текст, // отправляем сообщение с текстом об ошибке Serial.println("Error... unknown command!"); gprs.sendSMS(f_phone, MESSAGE_ERROR); } }