Arduino教程学习A9-Arduino自制电话拨号器
Arduino自制电话拨号器
怎么拨打电话?也许这个问题很简单:拿起话筒,按话机的数字键盘拨号码。
但是,有没想过,我们可以拿起电话,不需要碰话机键盘就能拨通电话?答案是肯定的。
下面就介绍如何用Arduino生成双音多频信号。
用法介绍:
使用时候,我们拿起电话话筒,将喇叭贴近话筒麦克风位置。在串口发送需要拨号的电话号码(比如10000),稍等片刻即可拨通。
扩展用法:
驱动开关模拟电话摘机事件,用此电路拨号,再由Arduino按照事件控制语音模块(WT588D等)发出不同的语音到电话线。即可完成一个整体的自动拨号机,可以制作报警器,或者电话提醒器。
材料清单:
Arduino一块,
喇叭1个,
100Ω电阻1个(可以选择100Ω~1kΩ),
1uF电容两个(可以选择0.1uF~10uF)。
硬件连接:
2011-11-27 14:24 上传
(6.39 KB)
程序代码:
- 下载Tone库,并且解压到arduino-0022\libraries文件夹:
http://rogue-code.googlecode.com/files/Arduino-Library-Tone.zip
此Tone库相比自带的tone函数特点是,可以同时在多个输出脚输出不同频率的波形,但是自带tone函数在一段时间内只能在一个引脚输出。
2.写入下面代码到Arduino:
/* 使用Arduino生成双音多频
Ansifa 2011/11/27
- 软件:需要Tone库,下载地址:http://rogue-code.googlecode.com/files/Arduino-Library-Tone.zip
- 材料:喇叭1个,100Ω电阻1个,1uF电容两个
- 硬件连接:在D11,D12引脚各接一个1uF电容,之后合并到100Ω电阻一端,
100Ω电阻另一端接喇叭,然后喇叭另一端接地。
用法,将喇叭贴近电话机话筒,然后发送要拨的电话号码到串口,比如10000,即可拨通电话10000
*/
#include <Tone.h>
String Phone_Number = "";
int i = 0, mark = 0;
//定义freq1,freq2为Tone实例,并且定义双音多频的频率
//DTMF频率定义参见:[url]http://zh.wikipedia.org/zh/%E5%8F%8C%E9%9F%B3%E5%A4%9A%E9%A2%91[/url]
Tone freq1;
Tone freq2;
const int DTMF_freq1[] = {1336, 1209, 1336, 1477, 1209, 1336, 1477, 1209, 1336, 1477};
const int DTMF_freq2[] = {941, 697, 697, 697, 770, 770, 770, 852, 852, 852};
void setup()
{
Serial.begin(9600);
//定义声音产生引脚在Arduino的D11,D12
freq1.begin(11);
freq2.begin(12);
}
void loop()
{
//读出串口数据,串接成Phone_Number字符串
while (Serial.available() > 0)
{
Phone_Number += char(Serial.read());
delay(2);
mark = 1;
}
//播放DTMF音频,电话号码来自Phone_Number,持续长度200ms,间隔长度300ms
PlayDTMF(Phone_Number, 200, 300);
//如果刚才接收到串口的电话号码,因为号码已经在喇叭输出了,清空电话号码并且重置mark
if(mark == 1)
{
Phone_Number = "";
Serial.println();
mark = 0;
}
}
/*
DTMF播放函数
调用格式:playDTMF(数字(0~9), 持续时间)。
*/
void PlayDTMF(String Number, long duration, long pause)
{
//如果输入数字为空,或者持续时间不为正数,或者暂停时间不为正数
//则视作错误,立即停止执行返回主程序。
if(Number.length() == 0 || duration <= 0 || pause <= 0) return;
//将Number逐个文字分离,
for(i = 0; i < Number.length(); i++)
{
//如果Number属于0~9的数字字符,
if(Number[i] >= '0' && Number[i] <= '9')
{
//则将它ASCII码减去‘0’,得到纯数字,
Number[i] -= '0';
//然后在串口输出一份,便于查看
Serial.print(Number[i], DEC);
//输出双音多频之一
freq1.play(DTMF_freq1[Number[i]], duration);
//输出双音多频之二
freq2.play(DTMF_freq2[Number[i]], duration);
delay(pause);
}
}
}
打包下载:Dialer.zip
网盘http://pan.baidu.com/s/1dExdYV3
实物效果:
- 电路连接
2011-11-27 14:21 上传(70.6 KB) - 喇叭靠近电话拨号
2011-11-27 14:21 上传(36.7 KB) - 串口端发电话号码
2011-11-27 14:21 上传(13.77 KB) - 等待喇叭响完拨号音之后,即可听到10000号的应答
via - 极客工坊