Заранее извиняюсь если все есть на форуме, в 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 но с ним это уже второй вопрос. Мне бы с первым для начала разобратся. Заранее спасибо за помощь.
Внутри if() вы объявляете локальную переменную base[], совпадающую с глобальной, и тут же ее уничтожаете по выходу из блока {}. Никакого присваивания нового значения старой строке при этом не происходит и не может произойти. Воспользуйтесь классом String из Wiring, либо string из STL, либо функциями типа strstr() из стандартной библиотеки.
Доброго! Я немного далек от ардуино и С, но мне видится несколько ошибок, если не прав - поправьте. Во-первых, соглашусь с предыдущим постом. Во-вторых, Вы объявляете константу 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); } если где ошибаюсь - подправьте
Ну не так же Если нужно выбирать между константами, тогда Код (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;