GSM Shield SIM900 - управление через SMS

Тема в разделе "Глядите, что я сделал", создана пользователем ostrov, 7 янв 2017.

  1. ostrov

    ostrov Гуру

    Запустил на сабже программу позволяющую при помощи смсок включать и выключать определенные реле с подтверждением выполнения. Кроме того можно посмотреть какие реле включены в данный момент, если вдруг запамятовали. Система так же предупреждает о включении и перезапуске в случае зависания или потери связи (на предмет чего периодически пингует модуль). Еще она информирует владельца о срабатывании различных датчиков, о чем в видео не показано. Принимает команды только от конкретного номера (или номеров), что исключает доступ извне. Можно использовать для охранной системы, удаленного управления чем угодно (с учетом инертности в несколько секунд), сборе информации и так далее.

    В целом шилд понравился, в отличии от NEOWAY запускается сразу без бубнов и работает стабильно даже от питания UNO. Если же обеспечить отдельное питание в районе 2А, то проблем не будет вообще, наверное. Немного инертен, команды выполняются от 0,5 до 10 сек, но общение посредством СМС и не рассчитано на мгновенную реакцию. Минусы: цена и размер. К использованию рекомендую.

     
    Последнее редактирование: 7 янв 2017
    Arduino-cool-2015, BSERG и Airbus нравится это.
  2. Airbus

    Airbus Радиохулиган Модератор

    Отличная работа!А что с ценой?Почему не нравиться?
     
  3. ostrov

    ostrov Гуру

    Дороже чем М590 раз в 7-10.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Когда то лет 10 назад делал такие штучки на Асме и Тини 2313. В качестве ГСМ модуля использовал старые "Семёны-35" (Siemens C/S/M 35). Ну а так да ГСМ шилд брал по 1000 руб правда до скачка Доллара. А М590 не работает?
     
  5. Доброго времени суток. А как скажите реализовали "сравнение" ..
    через
    switch ( sms_ka )
    case "текст_сообщения" ???
    Или if' ами баловались.

    Потому, что char s[] = "текст_смс"; кейс, как-то не очень работает с массивами
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Думаю можно и так и так. Но для If/else релюх многовато.Можно дёргать из массива определённый символ(ы) и далее Switch/case.Можно сравнивать строки с исходной-"нулевой" получать число и далее снова Switch/case. Как автор сделал я не знаю.
     
  7. BSERG

    BSERG Нуб

    класс! кодом не поделетесь?
     
  8. ostrov

    ostrov Гуру

    Если варантов немного, как тут, то можно switch, если десятки, то надо придумывать текстовый массив с командами и ответами, что тоже не сложно.
     
  9. Alex_KAN

    Alex_KAN Нуб

    :) Класс!
     
  10. fiftelement

    fiftelement Нуб

    Очень интересно, не поделитесь кодом?
    У меня только вот такой работает, нужна смс розетка для управления Wi-Fi станции, и защиты от грозы посредством выключения из розетки.
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(2, 3);

    int powerGSM = 6; // Пин включения GSM
    int unit1 = 8; // Пин включения реле №1

    void setup()
    {
        digitalWrite(powerGSM, HIGH); // Включаю GSM модуль
        delay(1000);
        digitalWrite(powerGSM, LOW);
        delay(5000);
        gprsSerial.begin(19200);
        delay(300);
        pinMode(unit1, OUTPUT);
       
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
    }
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
    void loop()
    {
        if (!gprsSerial.available())
            return;
        char currSymb = gprsSerial.read();  
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("On")) {
                    digitalWrite(unit1, HIGH);
                    gprsSerial.println("AT + CMGS = \"+79XXXXXXXX\"");
                    delay(100);
                    gprsSerial.println("Relay is On");
                    delay(100);
                    gprsSerial.println((char)26);
                } else if (!currStr.compareTo("Off")) {
                    digitalWrite(unit1, LOW);
                    gprsSerial.println("AT + CMGS = \"+79XXXXXXXX\"");
                    delay(100);
                    gprsSerial.println("Relay is Off");
                    delay(100);
                    gprsSerial.println((char)26);
                }
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
    }