програма для m590e

zifoon13
zifoon13 аватар
Offline
Зарегистрирован: 07.11.2018
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); 
unsigned long box0 = 380676630339;
unsigned long box1 = 0;
byte led = 4;

String inString = "";
 
void setup() {
  delay(2000);
// while (!Serial) {
  //  ; // wait for serial port to connect. Needed for native USB port only
  //}
  pinMode(digitalRead(9), INPUT);  
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);  
  mySerial.begin(9600);
  mySerial.println("AT+CLIP=1");  //включить АОН
  delay(100);
  mySerial.println("AT+CMGF=1"); // текстовый формат SMS
  delay(300);
  mySerial.println("AT+CSCS=\"GSM\"");  // кодировка текста - GSM
  delay(300);
  mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль
  delay(300);
  // ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}

void loop() {

//if (digitalRead(9) == 1) {
while (Serial.available() > 0) {
    int inChar = Serial.read();
    if (isDigit(inChar)) {
      // convert the incoming byte to a char and add it to the string:
      inString += (char)inChar;
    }
    // if you get a newline, print the string, then the string's value:
   if (inChar == '\n') {
      Serial.println(inString.toInt());
      Serial.println(inString);
      box1 = "+380" +inString.toInt();
      inString = "";
      Serial.println("box1" + box1);
     
   }
  }
//}

  

 
 if(mySerial.available()) //если модуль что-то послал
  {  
    char ch = ' ';
    String val = "";
    
    while(mySerial.available()) 
     {  
       ch = mySerial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(3);
     }

    Serial.print("Neo send> ");
    Serial.println(val);
    
    if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
     { 
      if(val.indexOf(box0) > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
         Serial.println("On D13");
         digitalWrite(led, HIGH);  //включаем светодиод на 5 сек
         Serial.println("5 sec pause");
         delay(5000);
         digitalWrite(led, LOW);  //выключаем 
         Serial.println("Off D13");
       }
     } 
   }  
  




if (mySerial.available()) //если модуль что-то послал
  {  
    char ch = ' ';
    String val = "";
    
    while(mySerial.available()) 
     {  
       ch = mySerial.read();
       val += char(ch); //собираем принятые символы в строку
       delay(3);
     }

    Serial.print("Neo send> ");
    Serial.println(val);
    
    if(val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
     { 
      if(val.indexOf(box1) > -1) //  НОМЕР, с которого будем звонить на модуль
       {  
         Serial.println("Call my phone");
         mySerial.println("ATH");  //разрываем связь
         Serial.println("Disconnection");
         Serial.println("On D13");
         digitalWrite(led, HIGH);  //включаем светодиод на 5 сек
         Serial.println("5 sec pause");
         delay(5000);
         digitalWrite(led, LOW);  //выключаем 
         Serial.println("Off D13");
       }
     } 
   }
}

Програма не работает. Взял пример Sring_to_int. И приделал к остольной програме. я не понимаю почему не работает.

Emer
Offline
Зарегистрирован: 02.11.2016

А что именно не работает?

Модем на команду хоть отвечает?

54-84 и 90-120 это одно и то же, зачем дублировать?

14 строка для чего?

71-? номер нужен в текстовом (String) формате.

 

Каша какая то..

 

zifoon13
zifoon13 аватар
Offline
Зарегистрирован: 07.11.2018

я хочу чтобы я мог добавлять номера в переменние box1 и box2. проблема в том что у меня прога не работает.  дублировать надо для того, чтобы я мог звонить с двух номеров. не работает добавление номеров. 

Emer
Offline
Зарегистрирован: 02.11.2016

Есть сомнение, что она заработает с таким подходом.
Что значит с двух номеров?
Первый цикл из буфера все заберет, и там ничго для второго не останется. Или наоборот. Как вы будете попадать в такт?

zifoon13
zifoon13 аватар
Offline
Зарегистрирован: 07.11.2018

я хочу чтоби если я набрал с определенного номера, то открились двери. но если я хочу чтоби набрал друг, я надсилаю команду которая добавляет номер друга. 

zifoon13
zifoon13 аватар
Offline
Зарегистрирован: 07.11.2018

програма должна работать 

Emer
Offline
Зарегистрирован: 02.11.2016

? логично..

b707
Offline
Зарегистрирован: 26.05.2017

zifoon13 пишет:

програма должна работать 

это все здорово, но вы-то сами что для этого делаете? Кроме вас заставить программу работать некому.

вам указали на ошибки - а вы, вместо того чтоб исправлять - права качаете.

 

zifoon13
zifoon13 аватар
Offline
Зарегистрирован: 07.11.2018

ок. спасибо

zifoon13
zifoon13 аватар
Offline
Зарегистрирован: 07.11.2018

http://arduino.ru/forum/programmirovanie/kak-ochistit-serial-vkhodyashch...

Я примерно понимаю про что тут идется. Но как очистить буфер я не понимаю. И когда надо очищать его. Я только начинаю. Поетому мои знания ето изучение чужих програм.

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

А зачем чистить буфер uart?
Масса примеров приёма данных от модема - отправили команду модему - ждёте входящую строку нужную. Отправили следующую - опять ждёте ответ и т д. Но в глобальном смысле это тупик - ответ может превышать всю память МК - соответственно принять его не сможете. Начните с простейших примеров.

Update : в вашем понимании конечно после отправки новой ат команды модему так называемый буфер необходимо очищать.

zifoon13
zifoon13 аватар
Offline
Зарегистрирован: 07.11.2018

тоисть? я не понимаю что надо делать. Очищать буфер или делать паузи. Если делать паузи то какие и зачем?

Emer
Offline
Зарегистрирован: 02.11.2016

В теории превышать может память МК, но на деле не больше размера буфера, дальше выбрасывает. Это я так не мог понять почему смс не более 15 символов

Emer
Offline
Зарегистрирован: 02.11.2016

zifoon13 пишет:

тоисть? я не понимаю что надо делать. Очищать буфер или делать паузи. Если делать паузи то какие и зачем?


Зачем его чистить? Все что от туда прочитывается, от туда и стирается.
Паузы для ответа. В идеале их анализировать надо, ответил что модуль и что..
Но судя по вопросам, вам надо с попроще примеров начать.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Проверять буфер нужно не реже 20-40 мсек и читать нужно быстро. При скорости 9600 бод буфер в 64 байта заполнится примерно за 64 мс.

Ответ от М590 содержит еще символы \r и \n

Чтоб прочитать буфер и посмотреть содержимое вызывайте функцию readSoftSerial();   в  сетап() и в луп() с интервалом не более 20-40 мс.

String currStr = "";
//========================
void readSoftSerial(){
  while(gprsSerial.available()) {
    while(gprsSerial.available()) {
      currStr += (char) gprsSerial.read();//считываем из буфера уже пришедшее  
    }
    delay(2); //подождем, не придет ли очередной символ
  }
    c = Serial.println(currStr); //длина строки
    Serial.print("c=");Serial.println(c);   c = 0;
    Serial.println();
}
далее разбираем строку или/и очищаем после 
currStr = "\0";

 

zifoon13
zifoon13 аватар
Offline
Зарегистрирован: 07.11.2018

А как мне ето добавить к основному коду?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Мне кажется вы взялись за непосильную для себя задачу, поищите в интернете готовый вариант - проще будет.

Pyotr
Offline
Зарегистрирован: 12.03.2014

zifoon13 пишет:

А как мне ето добавить к основному коду?

Пример

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); 
#define TELEFON_1 "380676630339"
unsigned long box1 = 0;
byte led = 4;
byte flagRing = 0;
String inString = "";
 //========================
void readSoftSerial(){
  byte c = 0;
  while(mySerial.available()) {
    while(mySerial.available()) {
      inString += (char) mySerial.read();//считываем из буфера уже пришедшее  
    }
    delay(2); //подождем, не придет ли очередной символ
  }
  c = Serial.println(inString); //длина строки
  Serial.print("c=");Serial.println(c);//выводит длину строки
  Serial.println();//пустая строка
}
//=======================

void setup() {
  delay(2000);
  pinMode(digitalRead(9), INPUT);  
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);  
  mySerial.begin(9600);
  mySerial.println("AT+CLIP=1");  //включить АОН
  delay(100);
  if(mySerial.available()){
    readSoftSerial();
    inString = "\0";
  }      
  mySerial.println("AT+CMGF=1"); // текстовый формат SMS
  delay(300);
  if(mySerial.available()){
    readSoftSerial();
    inString = "\0";
  }  
  mySerial.println("AT+CSCS=\"GSM\"");  // кодировка текста - GSM
  delay(300);
  mySerial.println("AT+CNMI=2,2,0,0,0"); // вывод смс в консоль
  delay(300);
  if(mySerial.available()){
    readSoftSerial();
    inString = "\0";
  }  
  // ПРИ СТАРТЕ, НА КАЖДУЮ КОМАНДУ ДОЛЖНО БЫТЬ ПОДТВЕРЖДЕНИЕ - ОК
}

void loop() {
  if(mySerial.available()){ //если модуль что-то послал  
    readSoftSerial(); 
    if(inString.indexOf("RING") > -1){ //если есть входящий вызов, то проверяем номер
      if(inString.indexOf(TELEFON_1) > -1){  //если номер звонящего 
        if(flagRing == 0){//пропускаем первый гудок
          flagRing = 1;
          Serial.println("RING_1"); 
        }else{//второй гудок
          flagRing = 0;
          Serial.println("RING_2"); 
          mySerial.println("ATH");  //разрываем связь
          //разбираем строку и что-то делаем
        }     
      }
    }
    inString = "\0";
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

zifoon13 пишет:

А как мне ето добавить к основному коду?

ну-у-у батенька... с такими вопросами вам в детский сад надо

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

zifoon13 пишет:

програма должна работать 

Кому должна?

Если должна и не работает, попробуй через суд заставить.