SMS розетка

Тема в разделе "Arduino & Shields", создана пользователем АртёмКубарев, 8 мар 2016.

  1. Реализовал такой проект: на основе GPRS модуля и китайской ардуины включаю и отключаю реле по средствам смс. Код программы взял отсюда http://wiki.amperka.ru/projects:smart-power. Вообщем то всё работает, за исключением того что ответная смс о включенном реле не приходит, хотя как я понимаю эта функция в коде прописана. Помогите понять почему так происходит.

    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>

    // библиотека для эмуляции Serial порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>

    // длина сообщения
    #define MESSAGE_LENGTH 160
    // текст сообщения о включении розетки
    #define MESSAGE_ON "Power is On"
    // текст сообщения о выключении розетки
    #define MESSAGE_OFF "Power is Off"
    // текст сообщения об ошибке распознавания команды
    #define MESSAGE_ERROR "Error...unknown command!"

    // пин, к которому подключено реле
    #define RELAY 5
    // номер сообщения в памяти сим-карты
    int messageIndex = 0;

    // текст сообщения
    char message[MESSAGE_LENGTH];
    // номер, с которого пришло сообщение
    char phone[16];
    // дата отправки сообщения
    char datetime[24];

    bool stateRelay = false;

    // создаём объект класса GPRS и передаём ему скорость 9600 бод;
    // с помощью него будем давать команды GPRS шилду
    GPRS gprs(9600);

    void setup()
    {
    // настраиваем пин реле в режим выхода,
    pinMode(RELAY, OUTPUT);
    // подаём на пин реле «низкий уровень» (размыкаем реле)
    digitalWrite(RELAY, LOW);
    // включаем GPRS-шилд
    gprs.powerUpDown();
    // открываем последовательный порт для мониторинга действий в программе
    Serial.begin(9600);
    while (!Serial) {
    // ждём, пока не откроется монитор последовательного порта
    // для того, чтобы отследить все события в программе
    }
    // проверяем, есть ли связь с GPRS-устройством
    while (!gprs.init()) {
    // если связи нет, ждём 1 секунду
    // и выводим сообщение об ошибке;
    // процесс повторяется в цикле,
    // пока не появится ответ от GPRS устройства
    delay(1000);
    Serial.print("Init error\r\n");
    }
    // вывод об удачной инициализации GPRS Shield
    Serial.println("GPRS init success");
    }

    void loop()
    {
    // проверяем наличие непрочитанных сообщений
    // и находим их номер в памяти сим-карты
    messageIndex = gprs.isSMSunread();
    if (messageIndex > 0) {
    // если есть хотя бы одно непрочитанное сообщение,
    // читаем его
    gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);

    // Удаляем прочитанное сообщение из памяти Сим-карты
    gprs.deleteSMS(messageIndex);

    // выводим номер, с которого пришло смс
    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, "On") == 0) {
    // если сообщение — с текстом «On»,
    // выводим сообщение в Serial
    // и подаём на замыкаем реле
    Serial.println("OK! Power On");
    digitalWrite(RELAY, HIGH);
    stateRelay = true;
    // на номер, с которого пришёл запрос,
    // отправляем смс с текстом о включении питания
    gprs.sendSMS(f_phone, MESSAGE_ON);

    } else if (strcmp(f_message, "Off") == 0) {
    // если пришло сообщение с текстом «Off»,
    // выводим сообщение в Serial
    // и размыкаем реле
    Serial.println("OK! Power Off");
    digitalWrite(RELAY, LOW);
    stateRelay = false;
    // на номер, с которого пришёл запрос
    // отправляем смс с текстом о выключении питания
    gprs.sendSMS(f_phone, MESSAGE_OFF);

    } else if (strcmp(f_message, "State") == 0) {
    // если пришло сообщение с текстом «State»,
    // отправляем сообщение с состоянием реле
    if (stateRelay) {
    Serial.println("State: Power On");
    gprs.sendSMS(f_phone, MESSAGE_ON);
    } else {
    Serial.println("State: Power Off");
    gprs.sendSMS(f_phone, MESSAGE_OFF);
    }
    } else {
    // если сообщение содержит неизвестный текст,
    // отправляем сообщение с текстом об ошибке
    Serial.println("Error... unknown command!");
    gprs.sendSMS(f_phone, MESSAGE_ERROR);
    }
    }
     
  2. ImrDuke

    ImrDuke Гик

    Код вставьте правильно - в таком виде читается плохо.
     
  3. Код (C++):
    // библиотека для работы с GPRS устройством
    #include <GPRS_Shield_Arduino.h>
    // библиотека для эмуляции Serial порта
    // она нужна для работы библиотеки GPRS_Shield_Arduino
    #include <SoftwareSerial.h>
    // длина сообщения
    #define MESSAGE_LENGTH 160
    // текст сообщения о включении розетки
    #define MESSAGE_ON  "Power is On"
    // текст сообщения о выключении розетки
    #define MESSAGE_OFF  "Power is Off"
    // текст сообщения об ошибке распознавания команды
    #define MESSAGE_ERROR  "Error...unknown command!"
    // пин, к которому подключено реле
    #define RELAY 5
    // номер сообщения в памяти сим-карты
    int messageIndex = 0;
    // текст сообщения
    char message[MESSAGE_LENGTH];
    // номер, с которого пришло сообщение
    char phone[16];
    // дата отправки сообщения
    char datetime[24];
    bool stateRelay = false;
    // создаём объект класса GPRS и передаём ему скорость 9600 бод;
    // с помощью него будем давать команды GPRS шилду
    GPRS gprs(9600);
    void setup()
    {
      // настраиваем пин реле в режим выхода,
      pinMode(RELAY, OUTPUT);
      // подаём на пин реле «низкий уровень» (размыкаем реле)
      digitalWrite(RELAY, LOW);
      // включаем GPRS-шилд
      gprs.powerUpDown();
      // открываем последовательный порт для мониторинга действий в программе
      Serial.begin(9600);
      while (!Serial) {
        // ждём, пока не откроется монитор последовательного порта
        // для того, чтобы отследить все события в программе
      }
      // проверяем, есть ли связь с GPRS-устройством
      while (!gprs.init()) {
        // если связи нет, ждём 1 секунду
        // и выводим сообщение об ошибке;
        // процесс повторяется в цикле,
        // пока не появится ответ от GPRS устройства
        delay(1000);
        Serial.print("Init error\r\n");
      }
      // вывод об удачной инициализации GPRS Shield
      Serial.println("GPRS init success");
    }
    void loop()
    {
      // проверяем наличие непрочитанных сообщений
      // и находим их номер в памяти сим-карты
      messageIndex = gprs.isSMSunread();
      if (messageIndex > 0) {
        // если есть хотя бы одно непрочитанное сообщение,
        // читаем его
        gprs.readSMS(messageIndex, message, MESSAGE_LENGTH, phone, datetime);
        // Удаляем прочитанное сообщение из памяти Сим-карты
        gprs.deleteSMS(messageIndex);
        // выводим номер, с которого пришло смс
        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, "On") == 0) {
        // если сообщение — с текстом «On»,
        // выводим сообщение в Serial
        // и подаём на замыкаем реле
        Serial.println("OK! Power On");
        digitalWrite(RELAY, HIGH);
        stateRelay = true;
        // на номер, с которого пришёл запрос,
        // отправляем смс с текстом о включении питания
        gprs.sendSMS(f_phone, MESSAGE_ON);
      } else if (strcmp(f_message, "Off") == 0) {
        // если пришло сообщение с текстом «Off»,
        // выводим сообщение в Serial
        // и размыкаем реле
        Serial.println("OK! Power Off");
        digitalWrite(RELAY, LOW);
        stateRelay = false;
        // на номер, с которого пришёл запрос
        // отправляем смс с текстом о выключении питания
        gprs.sendSMS(f_phone, MESSAGE_OFF);
      } else if (strcmp(f_message, "State") == 0) {
        // если пришло сообщение с текстом «State»,
        // отправляем сообщение с состоянием реле
        if (stateRelay) {
          Serial.println("State: Power On");
          gprs.sendSMS(f_phone, MESSAGE_ON);
        } else {
          Serial.println("State: Power Off");
          gprs.sendSMS(f_phone, MESSAGE_OFF);
        }
      } else {
        // если сообщение содержит неизвестный текст,
        // отправляем сообщение с текстом об ошибке
        Serial.println("Error... unknown command!");
        gprs.sendSMS(f_phone, MESSAGE_ERROR);
      }
    }