发 帖  
原厂入驻New
[资料]

转:Arduino DIY—Arduino自制电话拨号器

2016-7-27 16:43:37  2622
分享
跟大家分享一个我在其他网站上看到的项目

怎么拨打电话?也许这个问题很简单:拿起话筒,按话机的数字键盘拨号码。

但是,有没想过,我们可以拿起电话,不需要碰话机键盘就能拨通电话?答案是肯定的。

下面就介绍如何用Arduino生成双音多频信号。

用法介绍:

使用时候,我们拿起电话话筒,将喇叭贴近话筒麦克风位置。在串口发送需要拨号的电话号码(比如10000),稍等片刻即可拨通。

扩展用法:

驱动开关模拟电话摘机事件,用此电路拨号,再由Arduino按照事件控制语音模块(WT588D等)发出不同的语音到电话线。即可完成一个整体的自动拨号机,可以制作报警器,或者电话提醒器。

材料清单:
Arduino一块,
喇叭1个,
100Ω电阻1个(可以选择100Ω~1kΩ),
1uF电容两个(可以选择0.1uF~10uF)。

硬件连接:



程序代码:

1.下载Tone库,并且解压到arduino-0022\libraries文件夹:
http://rogue-code.googlecode.com/files/Arduino-Library-Tone.zip
此Tone库相比自带的tone函数特点是,可以同时在多个输出脚输出不同频率的波形,但是自带tone函数在一段时间内只能在一个引脚输出。
0
· 2016-7-29 09:49:34
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频率定义参见:http://zh点wikipedia点org/zh/%E5%8F%8C%E9%9F%B3%E5%A4%9A%E9%A2%91

    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);

                }

            }





    }
· 2016-7-29 09:49:49
实物效果:

1.电路连接

· 2016-7-29 09:50:06
2、喇叭靠近电话拨号

· 2016-7-29 09:50:25
3、串口端发电话号码


4、等待喇叭响完拨号音之后,即可听到10000号的应答
· 2016-7-29 09:53:16
分享完成,,,,,,,,,,,,
· 2016-10-24 19:03:55
下载包下不了呀
· 2016-10-25 09:03:12
是吗?????

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发资料
快速回复 返回顶部 返回列表