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

  • Сообщения

    • рисуй фрагмент схемы .... в Гугле смотрел схемы типовые на них?
    • не сделаешь, у тебя уровня знаний не хватает даже сформулировать ТЗ. ЗЫ с таким ТЗ тему нужно было создавать в разделе работа с оглашением бюджета на разработку. переносить будем?
    • Следующий элемент схемы – силовой трансформатор. Планировалось использовать домотанный ОСМ-0,1 и небольшой трансик от системы охранной сигнализации для смещения. Однако домотанный трансформатор удвоении тока нагрузки (подключении второго канала) не давал необходимого анодного напряжения и увеличить  его дополнительной обмоткой нет никакой возможности. Окно заполнено полностью. Было принято решение доработать сердечник от ОСМ-0,1 и изготовить новый каркас. Перед разборкой помечаю подковы, чтобы не ошибиться в последующем при окончательной сборке.   Трансформатор при работе, даже без пропитки, совершенно беззвучен, так как реальная индукция в сердечнике 1,19 Тл. (вычислялась по току первичной обмотки при полной нагрузке). По результатам прогона можно с удовлетворением сказать что затея удалась.
    • Guest Николай:)
      Зачем все дублировать и добавлять : ? Когда можно сразу передавать состояние джойстиков одной строчкой (в данном случае из 14 символов вместо 7). Будет это выглядеть так:  SMDjoystick j(2, 3, 4, 5, 6, 7, 8,A0,A1,A2,A3,9,10,11); /// При подключении по указанной схеме, кстати, почему проигнорирован 12 пин? естественно,  библиотеку подправить, добавив порты. Кроме того, зачем задержка 90 миллисекунд?! это очень много! В исходнике 35, этого достаточно.
    • Сотрудников телерадиокомпании «Пыть-Ях-Информ» в городе Пыть-Ях в ХМАО проверят на полиграфе после публикации в социальных сетях видеозаписи, на которой глава города Александр Морозов во время записи обращения ко Дню российского флага выражается нецензурными словами. Об этом сообщила директор ТРК Жанна Матрунич. https://www.znak.com/2019-10-11/v_pyt_yahe_ichut_zhurnalistov_kotorye_vylozhil_v_internet_video_s_materchinoy_glavy_goroda
    • Ребят помгите не могу найти какой резистор был на плате увлажнителя YK-010 на позиции R2 
  • Покупай!

×
×
  • Create New...