Прием смс с помощью GPRS Shield

Тема в разделе "Arduino & Shields", создана пользователем alejendro, 28 апр 2014.

  1. alejendro

    alejendro Нуб

    Пытаюсь запрограммировать сигнализацию, управлять ей хочу с помощью смсок с телефона.
    В самом коде пытаюсь определить несколько состояний, соответственно когда выключена, когда включена и когда необходимо подать сигнал тревоги. Переход между состояниями включения и выключения хочу сделать посредством отправки смс.
    Проблема в следующем: насколько я понял, плата не постоянно готова принимать смс. В период, когда она мигает светодиодом или пищит пищалкой, либо просто идет ожидание (delay), приема смс не происходит. Подскажите, как решить эту проблему, чтобы плата постоянно была готова к приему смс, независимо от того, какое действие она выполняет.
     
  2. alejendro

    alejendro Нуб

    Ребят, ну если я бред спросил, поправьте хотя бы, объясните что к чему
     
  3. Mitrandir

    Mitrandir Гуру

    какая плата то?
     
  4. alejendro

    alejendro Нуб

  5. Mitrandir

    Mitrandir Гуру

    как вариант обойти это:
    1) не знаю через что вы получаете СМС, если это что-то поддерживает сигнал о приходе сообщения, ловить этот сигнал и передавать как прерывание
    2) взять ат-тини за 90 рублей, посадить его на работу с СМС, и при приеме смски она будет кидать прерывание основному МК
    3) написать скетч так чтобы он вовремя ловил СМС,
    к примеру: чтобы моргнуть светодиодом ему нужно несколько тактов, та что задержка прихода СМС на несколько долей миллисекунды, погоды не делает ( с учетом что она будет гулять по просторам ОПСОСА хз сколько).
    делей можно исключить из программы
     
  6. alejendro

    alejendro Нуб

    Uno получает смс через GPRS Shield

    К примеру, я отправляю сообщение "secure on" что означает включить сигнализацию. После этого плата должна мигать светодиодом, до тех пор пока не получит новое сообщение. Например, это будет сообщение "alarm" - принудительный запуск тревоги. Тогда плата должна прекратить мигать одним цветом и начинает мигать другим, а также пищать зуммером. До тех пор пока не получит новое.

    А проблема в том, что, к примеру, я запустил "alarm". Цикл выполняется постоянно и сообщение об отмене тревоги плата не получает.

    Вот мой примитивный код, я отталкиваюсь от скетча с вики про управление светодиодами с помощью смс. http://wiki.amperka.ru/беспроводная-связь:gprs-shield


    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);

    int sost = 1;
    //1 - на страже
    //2 - выключена
    //3 - тревога

    boolean wheel, saddle, device;
    int redPin = 12;
    int greenPin = 13;
    int bluePin = 6;

    void setup()
    {
    gprsSerial.begin(19200);
    Serial.begin(9600);

    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, 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 = "";
    boolean isStringMessage = false;
    int updateTime = 0;
    void loop()
    {
    if (!gprsSerial.available())
    return;

    char currSymb = gprsSerial.read();

    if ('\r' == currSymb)
    {
    if (isStringMessage)
    {
    if (!currStr.compareTo("Secure on"))
    {
    sost = 1;
    }
    else if (!currStr.compareTo("Secure off"))
    {
    sost = 2;
    }
    else if (!currStr.compareTo("Alarm"))
    {
    sost = 3;
    }
    isStringMessage = false;
    }
    else
    {
    if (currStr.startsWith("+CMT"))
    {
    isStringMessage = true;
    }
    }
    currStr = "";
    }
    else if ('\n' != currSymb)
    {
    currStr += String(currSymb);
    }

    Serial.println(sost);

    if (sost == 1)
    {
    secure_on();
    }

    if (sost == 2)
    {
    secure_off();
    }

    if (sost == 3)
    {
    alarm();
    }
    }

    void secure_on()
    {
    digitalWrite(bluePin, HIGH);
    delay(50);
    digitalWrite(bluePin, LOW);
    delay(2000);
    }

    void secure_off()
    {
    digitalWrite(greenPin, HIGH);
    delay(50);
    digitalWrite(greenPin, LOW);
    delay(2000);
    }

    void alarm()
    {
    sost = 3;
    digitalWrite(redPin, HIGH);
    delay(50);
    digitalWrite(redPin, LOW);
    delay(500);
    }
     
  7. Mitrandir

    Mitrandir Гуру

  8. alejendro

    alejendro Нуб

    Частично решил вопрос, кому интересно код:

    #include <SoftwareSerial.h>

    SoftwareSerial gprsSerial(7, 8);

    int sost = 1;
    //1 - на страже
    //2 - выключена
    //3 - тревога

    boolean wheel, saddle, device;
    int redPin = 12;
    int greenPin = 13;
    int bluePin = 6;

    void setup()
    {
    gprsSerial.begin(19200);
    Serial.begin(9600);

    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, 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 = "";
    boolean isStringMessage = false;
    int updateTime = 0;

    void loop()
    {
    if (sost == 1)
    secure_on();
    if (sost == 2)
    secure_off();

    if (sost == 3)
    alarm();
    /*
    if (!gprsSerial.available())
    return;

    char currSymb = gprsSerial.read();
    if ('\r' == currSymb)
    {
    if (isStringMessage)
    {
    if (!currStr.compareTo("Secure on"))
    {
    sost = 1;
    secure_on();
    }
    else if (!currStr.compareTo("Secure off"))
    {
    sost = 2;
    secure_off();
    }
    else if (!currStr.compareTo("Alarm"))
    {
    sost = 3;
    alarm();
    }
    isStringMessage = false;
    }
    else
    {
    if (currStr.startsWith("+CMT"))
    {
    isStringMessage = true;
    }
    }
    currStr = "";
    }
    else if ('\n' != currSymb)
    {
    currStr += String(currSymb);
    }

    Serial.println(sost);
    */
    }

    void secure_on()
    {
    while (sost == 1)
    {
    char currSymb = gprsSerial.read();
    if ('\r' == currSymb)
    {
    if (isStringMessage)
    {
    if (!currStr.compareTo("Secure off"))
    {
    sost = 2;
    // digitalWrite(redPin, LOW);
    return;
    }
    else if (!currStr.compareTo("Alarm"))
    {
    sost = 3;
    return;
    }
    isStringMessage = false;
    }
    else
    {
    if (currStr.startsWith("+CMT"))
    {
    isStringMessage = true;
    }
    }
    currStr = "";
    }
    else if ('\n' != currSymb)
    {
    currStr += String(currSymb);
    }
    digitalWrite(bluePin, HIGH);
    delay(50);
    digitalWrite(bluePin, LOW);
    delay(50);
    }
    }

    void secure_off()
    {
    while (sost == 2)
    {
    char currSymb = gprsSerial.read();
    if ('\r' == currSymb)
    {
    if (isStringMessage)
    {
    if (!currStr.compareTo("Secure on"))
    {
    sost = 1;
    // digitalWrite(redPin, LOW);
    return;
    }
    else if (!currStr.compareTo("Alarm"))
    {
    sost = 3;
    return;
    }
    isStringMessage = false;
    }
    else
    {
    if (currStr.startsWith("+CMT"))
    {
    isStringMessage = true;
    }
    }
    currStr = "";
    }
    else if ('\n' != currSymb)
    {
    currStr += String(currSymb);
    }
    digitalWrite(greenPin, HIGH);
    delay(50);
    digitalWrite(greenPin, LOW);
    delay(50);
    }
    }

    void alarm()
    {
    while (sost == 3)
    {
    char currSymb = gprsSerial.read();
    if ('\r' == currSymb)
    {
    if (isStringMessage)
    {
    if (!currStr.compareTo("Receive"))
    {
    sost = 2;
    // digitalWrite(redPin, LOW);
    return;
    }
    isStringMessage = false;
    }
    else
    {
    if (currStr.startsWith("+CMT"))
    {
    isStringMessage = true;
    }
    }
    currStr = "";
    }
    else if ('\n' != currSymb)
    {
    currStr += String(currSymb);
    }

    digitalWrite(redPin, HIGH);
    delay(50);
    tone(5,900,50);
    digitalWrite(redPin, LOW);
    delay(50);
    }
    }
     
  9. Максим B

    Максим B Гуру

    А какие датчики используешь для сигнализации ??
     
  10. Максим B

    Максим B Гуру

  11. alejendro

    alejendro Нуб

    У меня специфическая сигналка, поэтому датчик препятствия, датчик наклона и вибрации
     
  12. alejendro

    alejendro Нуб

    Спасибо за ссылку, может пригодиться