SMS-розетка
- Платформы: Iskra Neo
- Языки программирования: Arduino (C++)
- Тэги: GPRS, SIM900, умная розетка, смс, реле, конструктор ПВХ.
Что это?
Как часто вы спрашивали себя по дороге на работу: «А выключил ли я утюг?» Иногда этот вопрос просто не выходит из головы и заставляет ехать через полгорода обратно домой — проверять. Вот было бы здорово управлять розетками на расстоянии, не так ли?
Одним из способов решения этой задачи является использование сотовой связи. Вам не потребуются мощные передатчики, разрешения соответствующих органов и прочие дорогостоящие вложения. В этой статье мы расскажем как собрать умную SMS-розетку.
Что нам понадобится?
- Сетевой фильтр (удлинитель)
- Клеммники
- Конструктор ПВХ 2 шт.
- SIM-карта
- Мобильный телефон для управления
Как собрать?
- Возьмите платформу Iskra Neo и нижнюю панель кубa (7x7), соедините её с помощью винтов и гаек, так чтобы гайки располагались между панелью и платформой.
- Вставьте сим-карту в GPRS Shield и установите его сверху на платформу Iskra Neo.
- Боковые панели куба (7x7) соедините с нижней панелью (7x7). Установите Relay Shield сверху на GPRS Shield.
- Заднюю панель куба (7x3) закрепите между левой и правой панелями внизу, напротив разъёмов USB и внешнего питания платформы Iskra Neo, заранее отделив бокорезами секции, мешающие ей устойчиво зафиксироваться.
- Теперь возьмите заднюю панель куба (7x2) и установите её между левой и правой панелями в верхней части. Затем возьмите панель крестиков (1x6) и установите между задними панелями (7x3) и (7x2), заранее откусив секцию напротив используемого реле.
- Настало время что-нибудь разобрать. Возьмите импульсный блок питания на 5 вольт, аккуратно с помощью отвёртки разберите его и достаньте плату преобразователя.
- Припаяйте к выходом преобразователя 5 вольт два провода папа-папа: красный к питанию, а чёрный к земле. На вход оставьте провода, которые уже были припаяны. Надёжно изолируйте преобразователь с помощью изоленты и закрепите его, используя стяжки, к верхней панели куба (7x7).
- Теперь возьмите клеммник, откусите от него 4 пары разъёмов и закрепите их к верхней панели куба (7x7) рядом с преобразователем напряжения на 5 вольт. Подключите входные проводники преобразователя в клеммник.
- Возьмите сетевой фильтр и разрежьте его провод пополам. Откусите от него с любой стороны часть провода длиной около 10 см, и используйте многожильные провода для коммуникации клемника и реле. Возьмите провод сетевого фильтра со стороны вилки и скоммутируйте его со входом преобразователя через клеммник. Провод с розетками подключите в два оставшихся разъёма на клеммнике. Так же через клеммник один из проводов от вилки удлинителя скоммутируйте с одним из проводов розетки.
- Скоммутируйте вторую пару проводов сетевого фильтра через клеммник и реле в режиме нормально разомкнутый: один провод на контакт реле
COM
, а второй на контакт релеNO
. В итоге должна получиться такая схема. Из которой видно, что при включении вилки в 220 вольт напряжение идёт через клеммник на преобразователь, а на розетки через клеммник и реле. То есть розетки включаться только тогда, когда на управляющем входе реле будет высокий уровень. - Установите, электроникой внутрь, верхнюю панель куба (7x7) на боковые панели. Возьмите переднюю панель куба (6x7) и соедините её с нижней, левой и правой панелями, заранее откусив бокорезами секции, мешающие выводу антенны. В заключение прикрутите антенну в SMA-разъём.
Алгоритм
- Сразу после подачи питания проверяем есть ли связь с GPRS устройством.
- Если связи нет, повторяем запрос снова и ждём подтверждения связи.
- Проверяем память сим-карты на наличие новых непрочитанных сообщений.
- Если их нет, повторяем запрос снова и снова.
- Читаем сообщение и проверяем содержимое его текста:
- Если
On
включаем розетку и отчитываемся о включении обратным смс. - Если
Off
выключаем розетку и отчитываемся о выключении обратным смс. - Если
State
отправляем обратное смс о состоянии розетки. - Если текст не распознан, отправляем обратное смс об ошибке распознавания команды.
- Удаляем сообщение из памяти сим-карты
Исходный код
Для работы кода потребуется скачать библиотеку AmperkaGPRS, подробнее о работе с библиотеками можно прочитать в статье Установка библиотек
- smart-power.ino
// библиотека для работы с 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, можно реализовать независимое управление несколькими устройствами.