Mega + GSM

Sorny
Offline
Зарегистрирован: 20.02.2013

С наступившим всех сообщники! Есть пара вопросов по теме.

Код:

#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);

Или запихать в отдельную функцию?

Sorny
Offline
Зарегистрирован: 20.02.2013
            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);
}

Получилось получать смс после команды.

Осталось узнать как верифицировать номера с которых отправляются команды и получение общего статуса.

Sorny
Offline
Зарегистрирован: 20.02.2013

Походу шилду хана настала внезапно. Вообще не отзывается.