Mega + GSM
- Войдите на сайт для отправки комментариев
Пнд, 06/01/2014 - 08:21
С наступившим всех сообщники! Есть пара вопросов по теме.
Код:
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(50, 51); // RX, TX
int greenPin = 22;
int bluePin = 23;
void setup()
{
gprsSerial.begin(19200);
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 = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("Green on")) {
digitalWrite(greenPin, HIGH);
} else if (!currStr.compareTo("Green off")) {
digitalWrite(greenPin, LOW);
} else if (!currStr.compareTo("Blue on")) {
digitalWrite(bluePin, HIGH);
} else if (!currStr.compareTo("Blue off")) {
digitalWrite(bluePin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
Тут все ок, диоды загораются и выключаются. Так вот вопрос.
1. Проверка состояния смс-командой status. Что включено а что нет. Ответной смс.
Не обязательно по каджому диоду, можно просто ответ общим списком.
Или ответная смс по статусу. Например включил диод - ответная смс о том, что он включен.
2. Как сделать проверку номера отправителя (2 разных номера)?
Ссылки на доки приветствуются, тыканье носом тоже. Заранее благодарен.
PS. Для первого варианта так покатит (после 41-й):
Serial.println("AT+CMGF=1"); // выставляем текстовым режим сообщений
delay(1000);
Serial.print("AT+CMGS="); // отправляем смс
Serial.print((char)34);
Serial.print("8000000000"); // номер получателя
Serial.print((char)34); // символ кавычки "
Serial.print((char)13); // символ <cr> (ASCII character 13)
delay(1500);
Serial.print("Green on"); // текст смс
delay(500);
Serial.print((char)26); // символ <ctrl-z> (ASCII character 26)
delay(5000);
Или запихать в отдельную функцию?
if (!currStr.compareTo("Green on")) { digitalWrite(greenPin, HIGH); sendTextMessage("Green is ON"); } else if (!currStr.compareTo("Green off")) { digitalWrite(greenPin, LOW); sendTextMessage("Green is OFF");И после loop()
void sendTextMessage(String text) { // Устанавливает текстовый режим для SMS-сообщений gprsSerial.println("AT+CMGF=1\r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате gprsSerial.println("AT+CMGS=\"8000000000\""); //Телефон нужно откорректировать delay(100); // Пишем текст сообщения gprsSerial.println(text); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово gprsSerial.println((char)26); }Получилось получать смс после команды.
Осталось узнать как верифицировать номера с которых отправляются команды и получение общего статуса.
Походу шилду хана настала внезапно. Вообще не отзывается.