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

Для такого проекта нужен модуль GSM. GSM-модуль является очень распространенным устройством в оборудовании связи. С помощью него можно реализовывать такие функции как отправка сообщений, голосовой вызов, чтение сообщений, попытка вызова (дозвон) и т.д.
GSM-модуль очень прост в эксплуатации благодаря тому, что общение с ним производится посредством специальных AT-команд через последовательный порт. Сегодня на рынке электронных компонентов представлено большое количество GSM-модулей, и в данном случае воспользуемся одним из самых распространенных и недорогих модулей SIM300. Но помимо модуля и управляющей платы Arduino необходимо также позаботиться об интерфейсе пользователя этого импровизированного телефона. Для этого к Arduino можно подключить LCD-дисплей 16x2 для вывода данных, а также матричную клавиатуру 3x4 для ввода данных (номера телефона). Для полноценного телефонного звонка нужны также микрофон и динамик, но поскольку данный проект является учебным, то в данном случае просто рассмотрим, как делать дозвон без возможности получения обратной связи. При желании всегда можно подключить средства приема и передачи голосовой информации. Итак, схема подключения Arduino и GSM, а также клавиатуры и дисплея представлены ниже.

Далее приведен код (скетч) для взаимодействия Arduino и GSM-модуля. Во время работы программы пользователь должен ввести с клавиатуры номер абонента и нажать на кнопку со звездочкой для осуществления вызова. Не забудьте при этом вставить сим-карту с положительным балансом.
#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
#define R1 13
#define R2 12
#define R3 11
#define R4 10
#define C3 16 //A2
#define C2 15 //A1
#define C1 14 //A0
int i,j,r=0,c=0,num,m;
char value;
int temp=0;
char number[10];
void setup()
{
Serial.begin(9600);
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
pinMode(C1, INPUT);
pinMode(C2, INPUT);
pinMode(C3, INPUT);
digitalWrite(R1, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R3, HIGH);
digitalWrite(R4, HIGH);
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print(" Make A Call ");
lcd.setCursor(0,1);
lcd.print("Using Keypad");
delay(3000);
lcd.clear();
}
void loop()
{
lcd.setCursor(0,0);
lcd.print(" Enter Number ");
delay(2000);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Dial(*) del(#)");
lcd.setCursor(0,0);
c=0;r=0;
num=0;
temp=0;
while(temp==0)
{
lcd.cursor();
digitalWrite(R1, LOW);
if(digitalRead(C1)==0)
{
lcd.print(number[num]='1');
num++;
delay(200);
while(digitalRead(C1)==0);
c++;
}
if(digitalRead(C2)==0)
{
lcd.print(number[num]='2');
num++;
delay(200);
while(digitalRead(C2)==0);
c++;
}
if(digitalRead(C3)==0)
{
lcd.print(number[num]='3');
num++;
delay(200);
while(digitalRead(C3)==0);
c++;
}
digitalWrite(R1, HIGH);
digitalWrite(R2, LOW);
/* key 4 */
if(digitalRead(C1)==0)
{
lcd.print(number[num]='4');
num++;
delay(200);
while(digitalRead(C1)==0);
c++;
}
if(digitalRead(C2)==0)
{
lcd.print(number[num]='5');
num++;
delay(200);
while(digitalRead(C2)==0);
c++;
}
if(digitalRead(C3)==0)
{
lcd.print(number[num]='6');
num++;
delay(200);
while(digitalRead(C3)==0);
c++;
}
/* key 7*/
digitalWrite(R2, HIGH);
digitalWrite(R3, LOW);
if(digitalRead(C1)==0)
{
lcd.print(number[num]='7');
num++;
delay(200);
while(digitalRead(C1)==0);
c++;
}
if(digitalRead(C2)==0)
{
lcd.print(number[num]='8');
num++;
delay(200);
while(digitalRead(C2)==0);
c++;
}
if(digitalRead(C3)==0)
{
lcd.print(number[num]='9');
num++;
delay(200);
while(digitalRead(C3)==0);
c++;
}
/* key * */
digitalWrite(R3, HIGH);
digitalWrite(R4, LOW);
if(digitalRead(C1)==0)
{
Serial.print("ATD+91");
for(int i=0;i<10;i++)
Serial.print(number[i]);
Serial.println(";");
delay(10);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("+91");
for(int i=0;i<10;i++)
lcd.print(number[i]);
for(int i=0;i<25;i++)
{
lcd.setCursor(0,1);
lcd.print("dialling. ");
delay(500);
lcd.setCursor(0,1);
lcd.print("dialling.. ");
delay(500);
lcd.setCursor(0,1);
lcd.print("dialling... ");
delay(500);
lcd.setCursor(0,1);
lcd.print("dialling.... ");
delay(500);
}
//delay(5000);
lcd.setCursor(0,1);
lcd.print("Call Ended ");
temp=1;
}
if(digitalRead(C2)==0)
{
lcd.noCursor();
value=48;
delay(10);
for(i=0;i<200;i++)
for(j=0;j<700;j++)
{
if(digitalRead(C2)==0)
{
lcd.setCursor(c,0);
lcd.print(number[num]=value);
value=value-6;
if(value==36)
value=35;
if(value < 35)
value=48;
while(digitalRead(C2)==0);
i=0,j=0;
delay(100);
}
}
num++;c++;
if(c==16)
c=0;
while(digitalRead(C2)==0);
}
if(digitalRead(C3)==0)
{
num--;
c--;
if(c<0)
c=0;
lcd.setCursor(c,r);
lcd.print(' ');
lcd.setCursor(c,r);
while(digitalRead(C3)==0);
delay(200);
}
digitalWrite(R4, HIGH);
if(c==11)
c=10;
}
}