Arduino SIM900 получает телефонный звонок

Я создал программу Arduino, которую можно отправлять и принимать SMS/ голосовые звонки. Но я не знаю, как получить телефонный звонок.

Все работает кроме Get_Call() функция. Я хочу, чтобы эта функция принимала телефонный звонок и прекращала этот вызов с помощью последовательной команды, такой как мой Send_Call функция.

Я не нашел, как программа может принимать телефонные звонки с AT-командами.

Это мой код:

#include <SoftwareSerial.h>

SoftwareSerial SIM900(7, 8);
char message=0;

void setup() {
  SIM900.begin(19200);
  delay(25000);
  Serial.begin(19200);
  Serial.println("OK");
  digitalWrite(9, HIGH);
  delay(1000);
}

void Send_Call() {
  SIM900.println("ATD 0608446677;");
  delay(100);
  SIM900.println();
  while(Serial.read() != '1') {
    delay(100);
  }
  SIM900.println("ATH");
  delay(1000);
}

void Send_SMS() {
  SIM900.print("AT+CMGF=1\r");
  delay(100);
  SIM900.println("AT+CMGS=\"0608446677\"");
  delay(100);
  SIM900.println("test sms");
  delay(100);
  SIM900.println((char)26);
  delay(100);
  SIM900.println();
  delay(5000);
  Serial.println("SMS sent successfully");
}

void Get_SMS() {
  SIM900.println("AT+CNMI=2,2,0,0,0"); 
  delay(1000);
}

void Get_Call() {
}

void loop() {
  if (Serial.available()>0) {
    if(Serial.read() == 'p') {
      Send_Call();
    }
    if(Serial.read() == 's') {
      Send_SMS();
    }
   Get_SMS();
   Get_Call();
  }

 if (SIM900.available()>0)
   Serial.write(SIM900.read());
}

Я пробовал это для Get_Call():

void Get_Call() {
  SIM900.print("AT+ATA\r\n"); //accept call
  SIM900.print("AT+CLIP=1\r\n"); //view phone number
  while(Serial.read() != '1') {
    delay(100);
  }
  SIM900.println("ATH"); //exit call when send in com '1'
}

2 ответа

Я нашел проблему с вашим кодом. Он находится в Get_Call. Проблема в следующих двух строках кодов:

char incoming_char=0;
incoming_char=SIM900.read();

Поймите тот факт, что SIM900.read() возвращает целочисленное значение или значение его символа не равно 'R'.

Так что вам нужно изменить incoming_char переменная int и условие if также.

код:

 int incoming_char=0;
  incoming_char=SIM900.read();
  if(incoming_char==252)
  {
      SIM900.println("ATA\r\n");

      delay(5000000);
      SIM900.println("ATH");
  }

Приведенного выше кода достаточно для этого.

NB. После 4-5 звонков он будет автоматически отвечать на звонок.

Используйте команду "ATA", чтобы ответить на звонок. В моем проекте я держал эту команду в пустом цикле. Поэтому при поступлении входящего звонка он автоматически отвечает. Вы можете оставить то же самое в своей функции. Для отключения вызова используйте "АТХ". В вашем коде добавьте: SIM900.println("ATA");

Другие вопросы по тегам