// библиотека для работы с GPRS устройством #include // длина сообщения #define MESSAGE_LENGTH 160 // текст сообщения о включении розетки #define MESSAGE_ON "On" // текст сообщения о выключении розетки #define MESSAGE_OFF "Off" // текст сообщения о состоянии розетки #define MESSAGE_STATE "State" // пин, к которому подключено реле #define RELAY_PIN 5 // пин, к которому подключена сенсорная кнопка #define TOUCH_PIN 7 // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char number[16]; // дата отправки сообщения char datetime[24]; // текущее состояние реле bool stateRelay = false; // состояние кнопки boolean touchState = false; // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); // можно указать дополнительные параметры — пины PK и ST // по умолчанию: PK = 2, ST = 3 // GPRS gprs(Serial1, 2, 3); void setup() { // настраиваем пин реле в режим выхода, pinMode(RELAY_PIN, OUTPUT); // подаём на пин реле «низкий уровень» (размыкаем реле) digitalWrite(RELAY_PIN, LOW); // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // ждём пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } Serial.print("Serial init OK\r\n"); // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // включаем GPRS-шилд gprs.powerOn(); // проверяем, есть ли связь с GPRS-устройством while (!gprs.begin()) { // если связи нет, ждём 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.incomingSMS()) { // читаем его gprs.readSMS(message, number, datetime); // выводим номер, с которого пришло смс Serial.print("From number: "); Serial.println(number); // выводим дату, когда пришло смс Serial.print("Datetime: "); Serial.println(datetime); // выводим текст сообщения Serial.print("Recieved Message: "); Serial.println(message); // вызываем функцию изменения состояния реле // в зависимости от текста сообщения setRelay(number, message); } // считываем текущее состояние кнопки bool touchStateNow = digitalRead(TOUCH_PIN); // если кнопка была нажата только что if (!touchState && touchStateNow) { // считываем состояние кнопки touchStateNow = digitalRead(TOUCH_PIN); // считываем сигнал снова if (touchStateNow) { stateRelay = !stateRelay; digitalWrite(RELAY_PIN, stateRelay); } } // запоминаем последнее состояние кнопки для новой итерации touchState = touchStateNow; } void setRelay(char number[], char message[]) { if (strcmp(message, MESSAGE_ON) == 0) { // если сообщение — с текстом «On», // выводим сообщение в Serial // и подаём на замыкаем реле Serial.println("OK! Power is On"); digitalWrite(RELAY_PIN, HIGH); stateRelay = true; // на номер, с которого пришёл запрос, // отправляем смс с текстом о включении питания gprs.sendSMS(number, "Power is On"); } else if (strcmp(message, MESSAGE_OFF) == 0) { // если пришло сообщение с текстом «Off», // выводим сообщение в Serial // и размыкаем реле Serial.println("OK! Power is Off"); digitalWrite(RELAY_PIN, LOW); stateRelay = false; // на номер, с которого пришёл запрос // отправляем смс с текстом о выключении питания gprs.sendSMS(number, "Power is Off"); } else if (strcmp(message, MESSAGE_STATE) == 0) { // если пришло сообщение с текстом «State», // отправляем сообщение с состоянием реле if (stateRelay) { Serial.println("State: Power is On"); gprs.sendSMS(number, "Power is On"); } else { Serial.println("State: Power is Off"); gprs.sendSMS(number, "Power is Off"); } } else { // если сообщение содержит неизвестный текст, // отправляем сообщение с текстом об ошибке Serial.println("Error... unknown command!"); gprs.sendSMS(number, "Error...unknown command!"); } }