GPRS+SDCard+Кнопки

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

  1. Alanter

    Alanter Нуб

    Заранее извиняюсь если все есть на форуме, в 4 утра уже тяжело пытатся что либо найти.
    Первый раз вожусь с Ардуино и уперся.

    Есть бутерброд из Ардуино уно + GPRS. К нему воткнуты 2 кнопки. По нажатию разных кнопок должны приходить разные смс.

    Пока имею следующее
    Код (Text):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);
    int btnPin = 12;
    int btnPin2 = 13;
    const char base[] = "Neutral";
    boolean prevBtn = LOW;
    boolean prevBtn2 = LOW;
    void setup()
    {
        gprsSerial.begin(19200);
        delay(500);
    }
    void loop()
    {
        boolean currBtn = digitalRead(btnPin);
        boolean currBtn2 = digitalRead(btnPin2);
        if (prevBtn != currBtn && currBtn == HIGH) {
          const char base[] = "Blue";
        }
        if (prevBtn2 != currBtn2 && currBtn2 == HIGH) {
          const char base[] = "Green";
        }
        if (prevBtn != currBtn && currBtn == HIGH || prevBtn2 != currBtn2 && currBtn2 == HIGH ) {
            sendTextMessage();
        }
        prevBtn = currBtn;
        prevBtn2 = currBtn2;
        const char base[] = "Neutral";
    }

    void sendTextMessage() {
        gprsSerial.print("AT+CMGF=1\r");
        delay(100);
        gprsSerial.println("AT + CMGS = \"+79200236722\"");
        delay(100);
        gprsSerial.print("ALARM! ");
        delay(100);
        gprsSerial.println(base);
        delay(100);
        gprsSerial.println((char)26);
    }
    Смс все время приходят одни и те же "Alarm! Neutral"
    если убираю const char base[] = "Neutral"; в начале скетча, то получаю что переменная не обьявлена. Но ведь в void.loop он с ней на ура работает. Что я делаю не так?

    PS Еще есть второй бутерброд тоже ардуино + GPRS +SDcard но с ним это уже второй вопрос. Мне бы с первым для начала разобратся.

    Заранее спасибо за помощь.
     
  2. Unixon

    Unixon Оракул Модератор

    Внутри if() вы объявляете локальную переменную base[], совпадающую с глобальной, и тут же ее уничтожаете по выходу из блока {}. Никакого присваивания нового значения старой строке при этом не происходит и не может произойти. Воспользуйтесь классом String из Wiring, либо string из STL, либо функциями типа strstr() из стандартной библиотеки.
     
  3. rav_75

    rav_75 Гик

    Доброго! Я немного далек от ардуино и С, но мне видится несколько ошибок, если не прав - поправьте.
    Во-первых, соглашусь с предыдущим постом. Во-вторых, Вы объявляете константу base[], константа - величина постоянная, и если бы Вы в if не объявляли бы локальную константу (const char base[] = "Blue"), а просто присваивали бы значение (base[] = "Blue"), то, скорее всего, посыпались бы ошибки. Попробуйте объявить переменную, а не константу (char base[] = "Neutral"; вместо const char base[] = "Neutral";), а в loop() использовать присваивание (base[] = "Blue").
    В-третьих, при событии нажатия кнопки, зачем два раза проверять условие? Имеется ввиду вот этот кусок кода (код подправил, сорри :) )
    Код (Text):
    if (prevBtn != currBtn && currBtn == HIGH) {
          base[] = "Blue";
        }
        if (prevBtn2 != currBtn2 && currBtn2 == HIGH) {
          base[] = "Green";
        }
        if (prevBtn != currBtn && currBtn == HIGH || prevBtn2 != currBtn2 && currBtn2 == HIGH ) {
            sendTextMessage();
        }
    можно сделать так
    Код (Text):
    if (prevBtn != currBtn && currBtn == HIGH) {
          base[] = "Blue";
          sendTextMessage();
        }
        if (prevBtn2 != currBtn2 && currBtn2 == HIGH) {
          base[] = "Green";
          sendTextMessage();
        }
       
    В-четвертых, для чего Вам вообще переменная base? Как понимаю, "Neutral" у Вас вообще ниочем. Я бы подправил функцию sendTextMessage() вот так
    Код (Text):
    void sendTextMessage(char base[]) {
        gprsSerial.print("AT+CMGF=1\r");
        delay(100);
        gprsSerial.println("AT + CMGS = \"+79200236722\"");
        delay(100);
        gprsSerial.print("ALARM! ");
        delay(100);
        gprsSerial.println(base);
        delay(100);
        gprsSerial.println((char)26);
    }
    и вызывал бы ее вот так: sendTextMessage("Green");
    т.е. весь код бы у меня был такой:
    Код (Text):
    #include <SoftwareSerial.h>
    SoftwareSerial gprsSerial(7, 8);
    int btnPin = 12;
    int btnPin2 = 13;
    boolean prevBtn = LOW;
    boolean prevBtn2 = LOW;
    void setup()
    {
        gprsSerial.begin(19200);
        delay(500);
    }
    void loop()
    {
        boolean currBtn = digitalRead(btnPin);
        boolean currBtn2 = digitalRead(btnPin2);
        if (prevBtn != currBtn && currBtn == HIGH) {
          sendTextMessage("Blue");
        }
        if (prevBtn2 != currBtn2 && currBtn2 == HIGH) {
          sendTextMessage("Green");
        }
        prevBtn = currBtn;
        prevBtn2 = currBtn2;
    }

    void sendTextMessage(char base[]) {
        gprsSerial.print("AT+CMGF=1\r");
        delay(100);
        gprsSerial.println("AT + CMGS = \"+79200236722\"");
        delay(100);
        gprsSerial.print("ALARM! ");
        delay(100);
        gprsSerial.println(base);
        delay(100);
        gprsSerial.println((char)26);
    }
    если где ошибаюсь - подправьте
     
  4. Unixon

    Unixon Оракул Модератор

    Ну не так же :)

    Если нужно выбирать между константами, тогда
    Код (Text):

    const char* STR_RED = "Red";
    const char* STR_BLUE = "Blue";
    const char* STR_GREEN = "Green";
    char* base = (char*)STR_RED;

    if (buttonPressed(BTN_GREEN)) base = (char*)STR_GREEN;
    else if (buttonPressed(BTN_BLUE)) base = (char*)STR_BLUE;