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

Быстро и просто. Разработка бюджетного неизолированного источника питания на контроллере VIPer122

С помощью VIPer122 можно создавать как изолированные, так и неизолированные сетевые источники питания. Разберем самый простой и бюджетный вариант – разработку неизолированного понижающего источника питания с выходным током в несколько сотен ампер без трудоемких расчетов трансформаторов и компонентов обвязки.

Подробнее

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

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

Share this post


Link to post
Share on other sites

Новый ХИТ FANSO CR123A/SN

Параметры новой батарейки показывают прекрасные результаты. Она используется для приложений с повышенными импульсами тока. Широко применяется в охранно-пожарных датчиках, устройствах телеметрии, поисковых маячках, LED-фонарях и других промышленных и бытовых устройствах.

Подробнее

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

A116.ino

Share this post


Link to post
Share on other sites

LED-драйверы LCM - бюджетное решение для умного дома!

Для более простого и бюджетного решения по организации управляемого освещения в здании с имеющейся системой KNX компания Mean Well предлагает готовые к использованию LED-драйверы семейства LCM/KN, управляемые по протоколу KNX. По своим техническим возможностям эти изделия похожи на драйверы из популярного семейства LCM/(DA).

Подробнее

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
Guest Павел

if ((mySerial.find(TEL1)) || (mySerial.find(TEL2)) || (mySerial.find(TEL3)))    {

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...

  • Сообщения

    • Учитывая это:   надо хотя бы проверить тестером или коротким проводом это место от общей точки все лучи.  
    • ОК. Кра́сный терро́р — комплекс карательных мер, проводившихся большевиками в ходе Гражданской войны в России (1917—1923) против социальных групп, провозглашённых классовыми врагами. По большевистской терминологии Вы - классовый враг, подлежащей либо физическому уничтожению, либо высылке из страны. В обоих случаях с полной конфискацией имущества. Почему Вы считаете, что сейчас будет иначе? Какое нафиг Зимбабве? Затобелоруссиянаша сделают!!! ---------------------------------- -------------------------------- Кандидат в президенты Белоруссии Светлана Тихановская призвала белорусов «не противостоять милиции» и «не выходить на площади». В своем видеообращении она также поблагодарила проголосовавших на выборах и призвала их «к благоразумию и уважению закона». «Я не хочу крови и насилия. Я прошу вас не противостоять милиции, не выходить на площади, чтобы не подвергать свои жизни опасности. Берегите себя и своих близких», – сказала она. Видео опубликовал портал Tut.by. Обращение Тихановская читает по бумажке, где и когда оно было записано, неизвестно. https://www.vedomosti.ru/society/news/2020/08/11/836366-sopernitsa-lukashenko-na-viborah-tihanovskaya-podtverdila-otezd-iz-belorussii
    • Не дождался радиаторов, запустил второй канал. Пока в AB режиме. Сходу.. без возбудов Питание по схеме. Платки термо от Луча, диоды смд. Ток Уна 10,5 мА при R52/53=180 ом. Ток ВК 35мА- радиатор тестовый. диапазона регулировки ТП не хватило- впаял R63 =1,8к. При прогоне больше 70 градусов не быдо. Интегратор стартует с -0,5в и минуты три выводит на ноль. Коррекция C23 получилась 4,7пф. На первом экземпляре тоже поставил 4,7: без проблем. Картинки ни чем не примечательны, все как и в прошлый раз.  Легонько дал муз сигнал. на другом канале  V2014. Отличий не обнаружил. Жду корпус с радиаторами ... для сравнения АВ и супер-А    
    • Умеете паять - паяйте.
    • Так он и встанет раком... если будет некуда  деваться. Но встанет на территории объединённого и обновлённого государства России и Беларуси. И парламент проголосует за объединение. Хороший предлог к объединению во имя спасения братского народа... А потому, если у запада есть хоть капля мозгов, то угрозы санкций продлятся не более недели... так, для вида. И запад продолжит тихо и полюбовно отодвигать Беларусь от Москвы. Имхо.
    • ти ж наша зайка! Начни с изучения DC - DC преобразователей. Потом поговорим. Пройду мимо
    • [удалено цензурой] им надо. По идее же это просто разъем, и желтую вилку можно снять, и припаять какой надо ?
×
×
  • Create New...