SMS-розетка

  • Платформы: Iskra Neo
  • Языки программирования: Arduino (C++)
  • Тэги: GPRS, SIM900, умная розетка, смс, реле, конструктор ПВХ.

Что это?

Как часто вы спрашивали себя по дороге на работу: «А выключил ли я утюг?» Иногда этот вопрос просто не выходит из головы и заставляет ехать через полгорода обратно домой — проверять. Вот было бы здорово управлять розетками на расстоянии, не так ли?

Одним из способов решения этой задачи является использование сотовой связи. Вам не потребуются мощные передатчики, разрешения соответствующих органов и прочие дорогостоящие вложения. В этой статье мы расскажем как собрать умную SMS-розетку.

Что нам понадобится?

  1. Сетевой фильтр (удлинитель)
  2. Клеммники
  3. Крепёжные элементы: винты , гайки, стяжки
  4. SIM-карта
  5. Мобильный телефон для управления

Как собрать?

  1. Возьмите платформу Iskra Neo и нижнюю панель кубa (7x7), соедините её с помощью винтов и гаек, так чтобы гайки располагались между панелью и платформой.
  2. Вставьте сим-карту в GPRS Shield и установите его сверху на платформу Iskra Neo.
  3. Боковые панели куба (7x7) соедините с нижней панелью (7x7). Установите Relay Shield сверху на GPRS Shield.
  4. Заднюю панель куба (7x3) закрепите между левой и правой панелями внизу, напротив разъёмов USB и внешнего питания платформы Iskra Neo, заранее отделив бокорезами секции, мешающие ей устойчиво зафиксироваться.
  5. Теперь возьмите заднюю панель куба (7x2) и установите её между левой и правой панелями в верхней части. Затем возьмите панель крестиков (1x6) и установите между задними панелями (7x3) и (7x2), заранее откусив секцию напротив используемого реле.
  6. Настало время что-нибудь разобрать. Возьмите импульсный блок питания на 5 вольт, аккуратно с помощью отвёртки разберите его и достаньте плату преобразователя.
  7. Припаяйте к выходом преобразователя 5 вольт два провода папа-папа: красный к питанию, а чёрный к земле. На вход оставьте провода, которые уже были припаяны. Надёжно изолируйте преобразователь с помощью изоленты и закрепите его, используя стяжки, к верхней панели куба (7x7).
  8. Теперь возьмите клеммник, откусите от него 4 пары разъёмов и закрепите их к верхней панели куба (7x7) рядом с преобразователем напряжения на 5 вольт. Подключите входные проводники преобразователя в клеммник.
  9. Возьмите сетевой фильтр и разрежьте его провод пополам. Откусите от него с любой стороны часть провода длиной около 10 см, и используйте многожильные провода для коммуникации клемника и реле. Возьмите провод сетевого фильтра со стороны вилки и скоммутируйте его со входом преобразователя через клеммник. Провод с розетками подключите в два оставшихся разъёма на клеммнике. Так же через клеммник один из проводов от вилки удлинителя скоммутируйте с одним из проводов розетки.
  10. Скоммутируйте вторую пару проводов сетевого фильтра через клеммник и реле в режиме нормально разомкнутый: один провод на контакт реле COM, а второй на контакт реле NO. В итоге должна получиться такая схема. Из которой видно, что при включении вилки в 220 вольт напряжение идёт через клеммник на преобразователь, а на розетки через клеммник и реле. То есть розетки включаться только тогда, когда на управляющем входе реле будет высокий уровень.
  11. Установите, электроникой внутрь, верхнюю панель куба (7x7) на боковые панели. Возьмите переднюю панель куба (6x7) и соедините её с нижней, левой и правой панелями, заранее откусив бокорезами секции, мешающие выводу антенны. В заключение прикрутите антенну в SMA-разъём.

Алгоритм

  • Сразу после подачи питания проверяем есть ли связь с GPRS устройством.
    • Если связи нет, повторяем запрос снова и ждём подтверждения связи.
  • Проверяем память сим-карты на наличие новых непрочитанных сообщений.
    • Если их нет, повторяем запрос снова и снова.
  • Читаем сообщение и проверяем содержимое его текста:
    • Если On включаем розетку и отчитываемся о включении обратным смс.
    • Если Off выключаем розетку и отчитываемся о выключении обратным смс.
    • Если State отправляем обратное смс о состоянии розетки.
    • Если текст не распознан, отправляем обратное смс об ошибке распознавания команды.
  • Удаляем сообщение из памяти сим-карты

Исходный код

smart-power.ino
// библиотека для работы с GPRS устройством
#include <GPRS_Shield_Arduino.h>
 
// библиотека для эмуляции Serial порта
// она нужна для работы библиотеки GPRS_Shield_Arduino
#include <SoftwareSerial.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.init()) {
    // если связи нет, ждём 1 секунду
    // и выводим сообщение об ошибке
    // процесс повторяется в цикле
    // пока не появится ответ от GPRS устройства
    delay(1000);
    Serial.print("GPRS Init error\r\n");
  }
  // вывод об удачной инициализации GPRS Shield
  Serial.println("GPRS init success");
}
 
void loop()
{
  // если пришло новое сообщение
  if (gprs.ifSMSNow()) {
    // читаем его
    // если есть хотя бы одно непрочитанное сообщение,
    // читаем его
    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 например датчик влажности и температуры DHT11, можно также получать в ответном сообщении показания температуры и влажности в помещении, где находится розетка.

Если задействовать дополнительные 3 канала на Relay Shield, можно реализовать независимое управление несколькими устройствами.