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

    Хочу представить вам очень простой способ удаленного управления электропитанием.
    Мы будем использовать готовые радиоуправляемые розетки, поэтому нам не потребуется ничего паять. Это очень здорово, потому что 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; в библиотеке есть соответствующие функции.
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое