Jump to content
geniv82

Как распознать два и более разрешённых номеров

Recommended Posts

 

Здравствуйте форумчане, который день бьюсь с GSM розеткой. Проблема в том, что не могу записать более одного разрешённого номера. Вот рабочий скетч.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
unsigned long timing; // Переменная для хранения точки отсчета
////////////--------------//////////////
#define  TEL1  "79038599995"    //// 1 НАШ НОМЕР УПРАВЛЕНИЯ
#define  TEL2  "79201234567"    //// 2 НАШ НОМЕР УПРАВЛЕНИЯ
#define  TEL3  "79021234567"    //// 3 НАШ НОМЕР УПРАВЛЕНИЯ
////////////--------------//////////////
void setup()
{ Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(2, OUTPUT); // ЭТО РЕЛЕ
  digitalWrite(2, LOW); //  ПОДТЯЖКА ПОРТА HIGH
  mySerial.println("ATE0");  //ОТКЛ ЭХО
  delay(300);
  mySerial.println("AT+IPR=9600;");
  delay(300);
}

void loop()
{ digitalWrite(13, HIGH);// ИНДИКАЦИЯ СВЯЗИ СИМ800 И МИКРОК.
  mySerial.println("AT"); // РЕГИСТАЦИЯ  СЕТИ
  if (millis() - timing > 500) { // Вместо 10000 подставьте нужное вам значение паузы
    if ( mySerial.find("OK")) // ОТВЕТ  ОК
    { Serial.println("SOEDINENIE OK");
      digitalWrite(13, LOW);
    }//  МИГАЕМ ВСЕ ОК
    else {
      Serial.println("SOEDINENIE NO");
      digitalWrite(13, HIGH); // ЕСЛИ НЕ НАШЛИ ГОРИМ
    }
    timing = millis();

  }

  /////////////ИЩЕМ ЗВОНОК/////////////

  if (mySerial.find("CLIP:")) // если нашли RING
  {
    Serial.println("RING!");
    delay(200);
    mySerial.println("AT+CLIP=1"); // ВКЛ ОПРЕДЕЛИТЕЛЬ НОМЕРА
    delay(300);
    while (1) // в цикле
    {
      if (mySerial.find(TEL1)) { // ищим номер телефона, если нашли 
      { digitalWrite(2, !digitalRead(2)); // инвертируем A1
          delay(500);
          Serial.println("INVERSIA RELE");
          ////////////////////////////////////////
          delay(500);
          if ( digitalRead(2) == HIGH) //ЕСЛИ РЕЛЕ ВКЛ LOW
          { mySerial.println("AT+CHUP;"); // сбрасываем вызов
            delay(400);
            Serial.println("VKL RELE");
          }
          else
          {
            Serial.println("OTKL  RELE");
            delay(6000);
            mySerial.println("AT+CHUP;"); // сбрасываем вызов
            delay(500);

          }
          if (mySerial.find("CLIP:"))
            break;
        }

      }

      else { // иначе
        mySerial.println("AT"); // спрашиваем состояние модема
        delay(200);
        if (mySerial.find("OK"))
          break;   // и если он в "готовности", выходим из цикла
      }            // если звонок в процессе, возвращает +CPAS: 3
    }              // и крутимся дальше

    mySerial.println("AT+CHUP;"); // сбрасываем вызов
    delay(200);

  }
}

А вот этот работать не хочет, из-за изменений в строке: if (mySerial.find(TEL1)||(TEL2)||(TEL3)) { // ищим номер телефона, если нашли 

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
unsigned long timing; // Переменная для хранения точки отсчета
////////////--------------//////////////
#define  TEL1  "79038599995"    //// 1 НАШ НОМЕР УПРАВЛЕНИЯ
#define  TEL2  "79201234567"    //// 2 НАШ НОМЕР УПРАВЛЕНИЯ
#define  TEL3  "79021234567"    //// 3 НАШ НОМЕР УПРАВЛЕНИЯ
////////////--------------//////////////
void setup()
{ Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(2, OUTPUT); // ЭТО РЕЛЕ
  digitalWrite(2, LOW); //  ПОДТЯЖКА ПОРТА HIGH
  mySerial.println("ATE0");  //ОТКЛ ЭХО
  delay(300);
  mySerial.println("AT+IPR=9600;");
  delay(300);
}

void loop()
{ digitalWrite(13, HIGH);// ИНДИКАЦИЯ СВЯЗИ СИМ800 И МИКРОК.
  mySerial.println("AT"); // РЕГИСТАЦИЯ  СЕТИ
  if (millis() - timing > 500) { // Вместо 10000 подставьте нужное вам значение паузы
    if ( mySerial.find("OK")) // ОТВЕТ  ОК
    { Serial.println("SOEDINENIE OK");
      digitalWrite(13, LOW);
    }//  МИГАЕМ ВСЕ ОК
    else {
      Serial.println("SOEDINENIE NO");
      digitalWrite(13, HIGH); // ЕСЛИ НЕ НАШЛИ ГОРИМ
    }
    timing = millis();

  }

  /////////////ИЩЕМ ЗВОНОК/////////////

  if (mySerial.find("CLIP:")) // если нашли RING
  {
    Serial.println("RING!");
    delay(200);
    mySerial.println("AT+CLIP=1"); // ВКЛ ОПРЕДЕЛИТЕЛЬ НОМЕРА
    delay(300);
    while (1) // в цикле
    {
     if (mySerial.find(TEL1)||(TEL2)||(TEL3)) { // ищим номер телефона, если нашли 
      { digitalWrite(2, !digitalRead(2)); // инвертируем A1
          delay(500);
          Serial.println("INVERSIA RELE");
          ////////////////////////////////////////
          delay(500);
          if ( digitalRead(2) == HIGH) //ЕСЛИ РЕЛЕ ВКЛ LOW
          { mySerial.println("AT+CHUP;"); // сбрасываем вызов
            delay(400);
            Serial.println("VKL RELE");
          }
          else
          {
            Serial.println("OTKL  RELE");
            delay(6000);
            mySerial.println("AT+CHUP;"); // сбрасываем вызов
            delay(500);

          }
          if (mySerial.find("CLIP:"))
            break;
        }

      }

      else { // иначе
        mySerial.println("AT"); // спрашиваем состояние модема
        delay(200);
        if (mySerial.find("OK"))
          break;   // и если он в "готовности", выходим из цикла
      }            // если звонок в процессе, возвращает +CPAS: 3
    }              // и крутимся дальше

    mySerial.println("AT+CHUP;"); // сбрасываем вызов
    delay(200);

  }
}

Как быть - не знаю, помогите пожалуйста.

Share this post


Link to post
Share on other sites

TEL1, TEL2, TEL3 - это массивы символов. Что Вы хотели получить, делая между ними логическое ИЛИ ? :huh:

Share this post


Link to post
Share on other sites

Хотел получить то, что при звонке определяется номер телефона, и, если он совпадает с одним из номеров TEL1 или TEL2 или TEL3:

#define TEL1 "79038599995" //// 1 НАШ НОМЕР УПРАВЛЕНИЯ

#define TEL2 "79201234567" //// 2 НАШ НОМЕР УПРАВЛЕНИЯ

#define TEL3 "79021234567" //// 3 НАШ НОМЕР УПРАВЛЕНИЯ

то далее программа включает или выключает реле (в зависимости от первоначального состояния).

В первом скетче это условие выполняется, но если там прописан только один телефон. А с двумя и более номерами - не работает.

Конечный результат следующий: на данный момент имеется розетка, которая управляется DTMF. Но не удобно включать, т.е. набрать номер, дождаться ответа, нажать соотв. цифру на клавиатуре, сбросить номер.

Хочется, чтобы по звонку с двух, трёх номеров срабатывала розетка.

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

Сначала надо принять всю строку командой типа  ReadedStr = Serial.readStringUntil( 0x0A );

А затем искать в ней все необходимые номера.

Share this post


Link to post
Share on other sites

Посмотри приложенный счетч, думаю найдеш нужные строки и разберёшся. Сам код сырой но звонки определяет исправно. Ищи ---- call_phone. Я в системе управления сигнализацией и нагрузкой дачи, отказался от разрешенных номеров, все команды имеют свою комбинацию цифр, даже пин кода не надо

A116.ino

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

16 часов назад, vic-63 сказал:

Посмотри приложенный счетч, думаю найдеш нужные строки и разберёшся. Сам код сырой но звонки определяет исправно. Ищи ---- call_phone. Я в системе управления сигнализацией и нагрузкой дачи, отказался от разрешенных номеров, все команды имеют свою комбинацию цифр, даже пин кода не надо

A116.ino

но там другой скетч

Share this post


Link to post
Share on other sites
В 22.03.2019 в 07:35, vic-63 сказал:

но там другой скетч

Вам из него нужен из него фрагмент, который буфер в строковую переменную перегоняет, вот так автор сделал:

String at = "";           // набиваем в переменную at
  int k = 0;
  while (SIM800.available()) k = SIM800.read(), at += char(k), delay(1);

Далее в переменной at ищете ваши номера.

 

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Неправильно. Самые "ходовые" температуры - от НУЛЯ до 20С - вот такие надо проверять. Некоторые и "по минусу" ходят, а вот желающие париться в полях при выше +30С - редкие маньяки. Плата находится в коробке, там тоже 50-градусам делать нечего.
    • @Серж Вамп Чего то не очень понял. Да у меня 12 вольт с нескольких аккумуляторов, а заряжать я их ношу домой по одному. Таким образом сеть всегда остаётся под напругой.
    • https://ria.ru/20190226/1551363625.html
    • хм, я просто читал что там они сами подтянуты к земле, и не надо подтягивать, спасибо, сейчас попробую. в ДШ кстати на схеме нет резисторов подтягивающих к низу, в статье же я читал что это встроенные резисторы) Но мало ли...
    • Чего тут чистить...какого дворника...Тут всё и так чисто.
    • Ти типа сейчас на полном серьёзе?   Ваще никуя. Алиса, Кино, Кинчев, сектор, Цой мои не герои, порсто нравилась музыка. Я покупал себе кассеты, балахон купил помню. И тексты для школьного возраста, в то время, были понятные. На гитаре аккорды учил, книжки с их аккордами продавались, мы все вместе ходили прккпали.  90—2000. Про войну что-то, про сцену,  хз,  тот рок необъяснить. Его надо слушать. Шнур ***** чем может мотивировать школьников сейчас? Пошла накуй,  ты дура? Я когда в хлам пьяный, а ты иди накуй?....  наверно даже не включу такое говно. 
  • Покупай!

×
×
  • Create New...