====== SMS-розетка ====== {{ :projects:smart-power:smart-power_overview.jpg?nolink&700 |}} * Платформы: Iskra Neo * Языки программирования: Arduino (C++) * Тэги: GPRS, SIM900, умная розетка, смс, реле, конструктор ПВХ. ===== Что это? ===== Как часто вы спрашивали себя по дороге на работу: «А выключил ли я утюг?» Иногда этот вопрос просто не выходит из головы и заставляет ехать через полгорода обратно домой — проверять. Вот было бы здорово управлять розетками на расстоянии, не так ли? Одним из способов решения этой задачи является использование сотовой связи. Вам не потребуются мощные передатчики, разрешения соответствующих органов и прочие дорогостоящие вложения. В этой статье мы расскажем как собрать умную SMS-розетку. ===== Что нам понадобится? ===== {{ :projects:smart-power:smart-power_parts.jpg?nolink&700 |}} - [[amp>product/iskra-neo?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | Iskra Neo]] - [[amp>product/arduino-gprs-shield?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | GPRS Shield]] - [[amp>product/arduino-relay-shield?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | Relay Shield]] - [[amp>product/usb-cable-micro?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | Кабель USB (A — Micro USB)]] - [[amp>product/usb-power-plug-amperka-eu?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | Импульсный блок питания (5 В, 3000 мА)]] - Сетевой фильтр (удлинитель) - Клеммники - Крепёжные элементы:[[amp>product/nylon-screw-m3x8?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | винты]] , [[amp>product/nylon-nut-m3?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | гайки]], стяжки - [[amp>product/structor-mega?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | Конструктор ПВХ]] 2 шт. - SIM-карта - Мобильный телефон для управления ===== Как собрать? ===== - Возьмите платформу Iskra Neo и нижнюю панель кубa (7x7), соедините её с помощью винтов и гаек, так чтобы гайки располагались между панелью и платформой.{{ :projects:smart-power:smart-power_build1.jpg?nolink&700 |}} - Вставьте сим-карту в GPRS Shield и установите его сверху на платформу Iskra Neo.{{ :projects:smart-power:smart-power_build2.jpg?nolink&700 |}} - Боковые панели куба (7x7) соедините с нижней панелью (7x7). Установите Relay Shield сверху на GPRS Shield.{{ :projects:smart-power:smart-power_build3.jpg?nolink&700 |}} - Заднюю панель куба (7x3) закрепите между левой и правой панелями внизу, напротив разъёмов USB и внешнего питания платформы Iskra Neo, заранее отделив бокорезами секции, мешающие ей устойчиво зафиксироваться.{{ :projects:smart-power:smart-power_build4.jpg?nolink&700 |}} - Теперь возьмите заднюю панель куба (7x2) и установите её между левой и правой панелями в верхней части. Затем возьмите панель крестиков (1x6) и установите между задними панелями (7x3) и (7x2), заранее откусив секцию напротив используемого реле.{{ :projects:smart-power:smart-power_build5.jpg?nolink&700 |}} - Настало время что-нибудь разобрать. Возьмите импульсный блок питания на 5 вольт, аккуратно с помощью отвёртки разберите его и достаньте плату преобразователя.{{ :projects:smart-power:smart-power_build6.jpg?nolink&700 |}} - Припаяйте к выходом преобразователя 5 вольт два провода папа-папа: красный к питанию, а чёрный к земле. На вход оставьте провода, которые уже были припаяны. Надёжно изолируйте преобразователь с помощью изоленты и закрепите его, используя стяжки, к верхней панели куба (7x7).{{ :projects:smart-power:smart-power_build7.jpg?nolink&700 |}} - Теперь возьмите клеммник, откусите от него 4 пары разъёмов и закрепите их к верхней панели куба (7x7) рядом с преобразователем напряжения на 5 вольт. Подключите входные проводники преобразователя в клеммник.{{ :projects:smart-power:smart-power_build8.jpg?nolink&700 |}} - Возьмите сетевой фильтр и разрежьте его провод пополам. Откусите от него с любой стороны часть провода длиной около 10 см, и используйте многожильные провода для коммуникации клемника и реле. Возьмите провод сетевого фильтра со стороны вилки и скоммутируйте его со входом преобразователя через клеммник. Провод с розетками подключите в два оставшихся разъёма на клеммнике. Так же через клеммник один из проводов от вилки удлинителя скоммутируйте с одним из проводов розетки. {{ :projects:smart-power:smart-power_build9.jpg?nolink&700 |}} - Скоммутируйте вторую пару проводов сетевого фильтра через клеммник и реле в режиме нормально разомкнутый: один провод на контакт реле ''COM'', а второй на контакт реле ''NO''. В итоге должна получиться такая схема. Из которой видно, что при включении вилки в 220 вольт напряжение идёт через клеммник на преобразователь, а на розетки через клеммник и реле. То есть розетки включаться только тогда, когда на управляющем входе реле будет высокий уровень.{{ :projects:smart-power:smart-power_cx.png?nolink&700 |}} - Установите, электроникой внутрь, верхнюю панель куба (7x7) на боковые панели. Возьмите переднюю панель куба (6x7) и соедините её с нижней, левой и правой панелями, заранее откусив бокорезами секции, мешающие выводу антенны. В заключение прикрутите антенну в SMA-разъём.{{ :projects:smart-power:smart-power_build11.jpg?nolink&700 |}} ===== Алгоритм ===== * Сразу после подачи питания проверяем есть ли связь с GPRS устройством. * Если связи нет, повторяем запрос снова и ждём подтверждения связи. * Проверяем память сим-карты на наличие новых непрочитанных сообщений. * Если их нет, повторяем запрос снова и снова. * Читаем сообщение и проверяем содержимое его текста: * Если ''On'' включаем розетку и отчитываемся о включении обратным смс. * Если ''Off'' выключаем розетку и отчитываемся о выключении обратным смс. * Если ''State'' отправляем обратное смс о состоянии розетки. * Если текст не распознан, отправляем обратное смс об ошибке распознавания команды. * Удаляем сообщение из памяти сим-карты ===== Исходный код ===== Для работы кода потребуется скачать библиотеку {{:projects:flight-recorder:amperkagprs.zip|AmperkaGPRS}}, подробнее о работе с библиотеками можно прочитать в статье [[http://wiki.amperka.ru/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5:%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8|Установка библиотек]] // библиотека для работы с GPRS устройством #include // длина сообщения #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!"); } } ===== Демонстрация работы устройства ===== {{youtube>QMSlBQD2Eog?large}} ===== Что дальше? ===== Например, подключив к платформе Iskra Neo [[amp>product/temperature-humidity-sensor-dht21?utm_source=proj&utm_campaign=smart-power&utm_medium=wiki | датчик температуры и влажности DHT21]], можно также получать в ответном сообщении показания температуры и влажности в помещении, где находится розетка. Если задействовать дополнительные 3 канала на Relay Shield, можно реализовать независимое управление несколькими устройствами.