Pull to refresh

Управляем розеткой по SMS

Developing for Arduino *
Хочу представить вам очень простой способ удаленного управления электропитанием.
Мы будем использовать готовые радиоуправляемые розетки, поэтому нам не потребуется ничего паять. Это очень здорово, потому что 220 В (начинающим) лучше не трогать.

Топик без картинки - деньги на ветер

P.S. вчера был похожий топик, но использовался Raspberry Pi, управляемый через чат. Наш вариант несколько попроще и универсальнее, потому что ему не нужен Интернет и смартфон, а вместо Raspberry будет обычное Arduino.

Нам понадобится


Железо

  • Arduino UNO или аналог. В принципе можно и Mega.
  • GSM/GPRS Shield. Подойдет любой. Я использовал шилд от китайского Seeedstudio, т.к. его проще всего купить из России.
  • Передатчик 443MHz — на AliExpress пара приемник-передатчик стоит чуть ли не 20 руб. Мой называется FS1000A/XY-FST, где FS1000A — это передатчик.
  • Управляемая розетка(и) 443MHz. Я брал комплект AB440S из трех розеток-переходников с пультом в немецком интернет-магазине. Сейчас, кажется, можно найти что-то подобное и у нас — видел недавно в Чип-и-Дип.

Софт

  • Библиотека для управления GSM-шилдом. Скачайте код с сайта производителя. Для моего шилда такого кода не было, поэтому я скачал универсальную библиотеку для SIM900 GSMSHIELD
  • Библиотека rc-switch для управления розетками.


Принцип работы


В диапазоне 433MHz могут работать без лицензии маломощные рации и устройства дистанционного управления. В продаже можно найти готовые диммеры, выключатели, патроны и розетки, управляемые пультом по радио в этом частотном диапазоне. Для наших целей лучше всего подходят «промежуточные» розетки-переходники: в обычную розетку вставляется радиоуправляемая, а уже в нее само устройство.

Чтобы такие розетки можно было различать между собой у них есть адрес, задаваемый DIP- или поворотными переключателями. За счет этого можно управлять несколькими розетками независимо. Или наоборот — установить им одинаковый адрес, чтобы они включались и выключались одновременно.

Наша схема элементарна: Ардуино получает SMS с командой, затем с помощью радиомодуля посылает сигнал «включить» или «выключить» на розетки. SMS-ки будут вида A1B0C0, где A, B, C… — имена розеток, 0 — выкл., 1 — вкл.


Собираем устройство


  1. Вставляем симкарту в GSM-шилд, а шилд в ардуину.
  2. Подключаем ноги передатчика: GND→GND, VCC→5V, DATA→в один из пинов, например в 12.
  3. Также я припаял проводок 15 см к ANT в углу платки передатчика. Но мне кажется, что это опционально.



Проверяем GSM-модуль


Если вы еще не работали с GSM-шилдом до этого, я рекомендую сначала залить тестовый код (взят отсюда)и проверить его работу.
Код все данные из Serial передает в SoftwareSerial и обратно, таким образом, подключив шилд к SoftwareSerial, мы можем отправлять команды модему через Serial Monitor в Arduino IDE.
//Serial Relay - Arduino will patch a 
//serial link between the computer and the GPRS Shield
//at 19200 bps 8-N-1
//Computer is connected to Hardware UART
//GPRS Shield is connected to the Software UART 
 
#include <SoftwareSerial.h>
 
SoftwareSerial GPRS(7, 8);
unsigned char buffer[64]; // buffer array for data recieve over serial port
int count=0;     // counter for buffer array 
void setup()
{
  GPRS.begin(19200);               // the GPRS baud rate   
  Serial.begin(19200);             // the Serial port of Arduino baud rate.
 
}
 
void loop()
{
  if (GPRS.available())              // if date is comming from softwareserial port ==> data is comming from gprs shield
  {
    while(GPRS.available())          // reading data into char array 
    {
      buffer[count++]=GPRS.read();     // writing data into array
      if(count == 64)break;
  }
    Serial.write(buffer,count);            // if no data transmission ends, write buffer to hardware serial port
    clearBufferArray();              // call clearBufferArray function to clear the storaged data from the array
    count = 0;                       // set counter of while loop to zero
 
 
  }
  if (Serial.available())            // if data is available on hardwareserial port ==> data is comming from PC or notebook
    GPRS.write(Serial.read());       // write it to the GPRS shield
}
void clearBufferArray()              // function to clear buffer array
{
  for (int i=0; i<count;i++)
    { buffer[i]=NULL;}                  // clear all index of array with command NULL
}

Заливаем код в Ардуино, открываем Serial monitor. Вводим команду AT — ответ должен быть OK. Если ответа нет, значит что-то не так. Возможно, нужно поменять скорость передачи?

Дальше можно проверить, что мы зарегистрировались в сети:
AT+COPS?
+COPS: 0,0,"MTS-RUS"
OK


Я рекомендую понизить скорость UART-модема. Не знаю точно насчет SMS, но GPRS точно работает надежнее на низких скоростях — у Ардуинки маленький буфер и часть информации может теряться. Установим скорость 2400 бод.
AT+IPR=2400
OK

Если вы хотите еще поиграться с модемом, то рекомендую использовать готовый java-апплет для браузера. Ну и можно почитать мануал по командам.


Смотрим/меняем адреса розеток


У розеток есть аппаратный адрес из двух частей. Первые 5 бит — одинаковые у всего комплекта и совпадают с адресом пульта. Последние 5 бит — индивидуальные. Адрес можно поменять, отвернув крышечку. На других моделях задание адреса может отличаться — см. сайт rc-switch.



Код


Если вы используете не GSMSHIELD, а какую-то другую библиотеку, то код разумеется будет отличаться, но принцип будет один и тот же. Через определенные интервалы времени мы проверяем, нет ли у нас непрочитанных SMS, парсим их, и если пришла валидная команда с авторизованного номера, то посылаем радиосигнал функциями mySwitch.switchOff или mySwitch.switchOn, передавая им адрес розетки.
Прим. в моем случае для шилда от Seeedstudio нужно было залезть в GSM.cpp и поменять заданные пины на 7 и 8.
/*
 Arduino GSM-switch example code 
 
 Switch on/off radio controlled controlled outlets 
 
 Author: Vladislav Ross, 2014
 Contact: vladislav.ross@gmail.com
 
 You need to download:
  1. rc-switch https://code.google.com/p/rc-switch/
  2. GSMSHIELD http://www.gsmlib.org/
 
 For GSMSHIELD:
  * To change pins for Software Serial, use the two lines in GSM.cpp.
  * If you are using Mega, uncomment "#define MEGA" line in HWSerial.h
  * You can enable debug messages on serial port by defining DEBUG_ON

*/

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "call.h"

#include <RCSwitch.h>

// 433MHz transmitter pin
const byte RCpin = 12;

char groupAddress[6] = "11111";

char smsLetters[] = "ABC";
char* deviceAddresses[] = {
  "10000", //A
  "01000", //B
  "00100"  //C
};

char adminNumber[] = "+74991356235"; //your phone number

CallGSM call;
SMSGSM sms;

RCSwitch mySwitch = RCSwitch();

char number[20];
byte stat=0;
char smsText[11];
byte position;
int deviceLetterIdx = -1;
byte i,j;

void setup() 
{
 gsm.begin(2400);
 delay(10000);
 for(i = 1; i <= 21; i++)
 {
   sms.DeleteSMS(i);
 }
 
 mySwitch.enableTransmit(RCpin);
};

void loop() 
{  
  //hang up all incoming calls
  /*stat=call.CallStatus();
  if(stat==CALL_INCOM_VOICE)
  {
    call.HangUp();    
  }*/
  
  position = sms.IsSMSPresent(SMS_UNREAD); //get new SMS
  if (position) 
  {
    sms.GetSMS(position, number, smsText, 10);
    sms.DeleteSMS(position);
    
    if(strcmp(number, adminNumber) == 0) //accept SMS only from defined number
    {
      for (i = 0; i < sizeof(smsText) - 1; i++)
      {
        if(deviceLetterIdx != -1)
        {
          //got letter, now expecting 0 or 1
          if(smsText[i] == '0')
          {
            mySwitch.switchOff(groupAddress, deviceAddresses[deviceLetterIdx]);
            delay(500);
          }
          if(smsText[i] == '1')
          {
            mySwitch.switchOn(groupAddress, deviceAddresses[deviceLetterIdx]);
            delay(500);
          }
          deviceLetterIdx = -1;
        }
        else
        {
          //waiting for letter A,B,C...
          for(j = 0; j < sizeof(smsLetters) - 1; j++)
          {
            if(smsLetters[j] == smsText[i])
            {
              deviceLetterIdx = j;
              break;
            }
          }
        }
      }
    }
  }  
  
  delay(10000);
};

GitHub.


Проблемы?


Если розетки ни в какую не хотят переключаться, можно попробовать принять сигнал от родного пульта на приемник. В rc-switch есть пример кода.



Что дальше?


Как дальше можно развить этот проект:
Во-первых, у нас осталось еще куча пинов на самом Ардуино и на GSM-шилде. Можно подключить к ним какие-то датчики или устройства. Например, сделать удаленный мониторинг температуры или полив цветов.
Во-вторых, мы использовали только SMS, а модуль еще умеет передавать голос и GPRS. GPRS может передать гораздо больше данных. Кроме того, можно не бросать трубку при звонке, а, например, принимать вызов и давать слушать, что происходит на месте.
Возможно также, что вы захотите принимать управляющие SMS не с одного номера, а с нескольких. В этом случае я бы рекомендовал хранить номера в адресной книге &mash; в библиотеке есть соответствующие функции.
Tags:
Hubs:
Total votes 3: ↑3 and ↓0 +3
Views 33K
Comments Leave a comment

Please pay attention