Как часто вы спрашивали себя по дороге на работу: «А выключил ли я утюг?» Иногда этот вопрос просто не выходит из головы и заставляет ехать через полгорода обратно домой — проверять. Вот было бы здорово управлять розетками на расстоянии, не так ли?
Одним из способов решения этой задачи является использование сотовой связи. Вам не потребуются мощные передатчики, разрешения соответствующих органов и прочие дорогостоящие вложения. В этой статье мы расскажем как собрать умную SMS-розетку.
COM
, а второй на контакт реле NO
. В итоге должна получиться такая схема. Из которой видно, что при включении вилки в 220 вольт напряжение идёт через клеммник на преобразователь, а на розетки через клеммник и реле. То есть розетки включаться только тогда, когда на управляющем входе реле будет высокий уровень.On
включаем розетку и отчитываемся о включении обратным смс.Off
выключаем розетку и отчитываемся о выключении обратным смс.State
отправляем обратное смс о состоянии розетки.Для работы кода потребуется скачать библиотеку AmperkaGPRS, подробнее о работе с библиотеками можно прочитать в статье Установка библиотек
// библиотека для работы с GPRS устройством #include <AmperkaGPRS.h> // длина сообщения #define MESSAGE_LENGTH 160 // текст сообщения о включении розетки #define MESSAGE_ON "On" // текст сообщения о выключении розетки #define MESSAGE_OFF "Off" // текст сообщения о состоянии розетки #define MESSAGE_STATE "State" // пин, к которому подключено реле #define RELAY 5 // текст сообщения char message[MESSAGE_LENGTH]; // номер, с которого пришло сообщение char phone[16]; // дата отправки сообщения char datetime[24]; bool stateRelay = false; // создаём объект класса GPRS и передаём в него объект Serial1 GPRS gprs(Serial1); void setup() { // настраиваем пин реле в режим выхода, pinMode(RELAY, OUTPUT); // подаём на пин реле «низкий уровень» (размыкаем реле) digitalWrite(RELAY, LOW); // открываем последовательный порт для мониторинга действий в программе Serial.begin(9600); // включаем GPRS шилд gprs.powerOn(); // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе while (!Serial) { } // открываем Serial-соединение с GPRS Shield Serial1.begin(9600); // проверяем есть ли связь с GPRS устройством while (!gprs.begin()) { // если связи нет, ждём 1 секунду // и выводим сообщение об ошибке // процесс повторяется в цикле // пока не появится ответ от GPRS устройства delay(1000); Serial.print("GPRS Init error\r\n"); gprs.powerOn(); delay(2000); } // вывод об удачной инициализации GPRS Shield Serial.println("GPRS init success"); } void loop() { // если пришло новое сообщение if (gprs.incomingSMS()) { // читаем его // если есть хотя бы одно непрочитанное сообщение, // читаем его 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); // вызываем функцию изменения состояния реле // в зависимости от текста сообщения setRelay(phone, message); } } void setRelay(char f_phone[], char f_message[]) { if (strcmp(f_message, MESSAGE_ON) == 0) { // если сообщение — с текстом «On», // выводим сообщение в Serial // и подаём на замыкаем реле Serial.println("OK! Power is On"); digitalWrite(RELAY, HIGH); stateRelay = true; // на номер, с которого пришёл запрос, // отправляем смс с текстом о включении питания gprs.sendSMS(f_phone, "Power is On"); } else if (strcmp(f_message, MESSAGE_OFF) == 0) { // если пришло сообщение с текстом «Off», // выводим сообщение в Serial // и размыкаем реле Serial.println("OK! Power is Off"); digitalWrite(RELAY, LOW); stateRelay = false; // на номер, с которого пришёл запрос // отправляем смс с текстом о выключении питания gprs.sendSMS(f_phone, "Power is Off"); } else if (strcmp(f_message, MESSAGE_STATE) == 0) { // если пришло сообщение с текстом «State», // отправляем сообщение с состоянием реле if (stateRelay) { Serial.println("State: Power is On"); gprs.sendSMS(f_phone, "Power is On"); } else { Serial.println("State: Power is Off"); gprs.sendSMS(f_phone, "Power is Off"); } } else { // если сообщение содержит неизвестный текст, // отправляем сообщение с текстом об ошибке Serial.println("Error... unknown command!"); gprs.sendSMS(f_phone, "Error...unknown command!"); } }
Например, подключив к платформе Iskra Neo датчик температуры и влажности DHT21, можно также получать в ответном сообщении показания температуры и влажности в помещении, где находится розетка.
Если задействовать дополнительные 3 канала на Relay Shield, можно реализовать независимое управление несколькими устройствами.