|
怎么撥打電話?也許這個問題很簡單:拿起話筒,按話機的數(shù)字鍵盤撥號碼。
但是,有沒想過,我們可以拿起電話,不需要碰話機鍵盤就能撥通電話?答案是肯定的。
下面就介紹如何用Arduino生成雙音多頻信號。
用法介紹:
使用時候,我們拿起電話話筒,將喇叭貼近話筒麥克風(fēng)位置。在串口發(fā)送需要撥號的電話號碼(比如10000),稍等片刻即可撥通。
擴展用法:
驅(qū)動開關(guān)模擬電話摘機事件,用此電路撥號,再由Arduino按照事件控制語音模塊(WT588D等)發(fā)出不同的語音到電話線。即可完成一個整體的自動撥號機,可以制作報警器,或者電話提醒器。
材料清單:
Arduino一塊,
喇叭1個,
100Ω電阻1個(可以選擇100Ω~1kΩ),
1uF電容兩個(可以選擇0.1uF~10uF)。
硬件連接:
142401nhvga3cqn1lvvlnf.gif (6.39 KB, 下載次數(shù): 182)
下載附件
2016-4-14 04:16 上傳
程序代碼:
1. 下載Tone庫,并且解壓到arduino-0022libraries文件夾
此Tone庫相比自帶的tone函數(shù)特點是,可以同時在多個輸出腳輸出不同頻率的波形,但是自帶tone函數(shù)在一段時間內(nèi)只能在一個引腳輸出。
2.寫入下面代碼到Arduino:
- /*
- 使用Arduino生成雙音多頻
- Ansifa 2011/11/27
- * 軟件:需要Tone庫,下載地址:
- * 材料:喇叭1個,100Ω電阻1個,1uF電容兩個
- * 硬件連接:在D11,D12引腳各接一個1uF電容,之后合并到100Ω電阻一端,
- 100Ω電阻另一端接喇叭,然后喇叭另一端接地。
- 用法,將喇叭貼近電話機話筒,然后發(fā)送要撥的電話號碼到串口,比如10000,即可撥通電話10000
- */
- #include
- String Phone_Number = "";
- int i = 0, mark = 0;
- //定義freq1,freq2為Tone實例,并且定義雙音多頻的頻率
- //DTMF頻率定義參見:
- 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);
- //定義聲音產(chǎn)生引腳在Arduino的D11,D12
- freq1.begin(11);
- freq2.begin(12);
- }
- void loop()
- {
- //讀出串口數(shù)據(jù),串接成Phone_Number字符串
- while (Serial.available() > 0)
- {
- Phone_Number += char(Serial.read());
- delay(2);
- mark = 1;
- }
- //播放DTMF音頻,電話號碼來自Phone_Number,持續(xù)長度200ms,間隔長度300ms
- PlayDTMF(Phone_Number, 200, 300);
-
- //如果剛才接收到串口的電話號碼,因為號碼已經(jīng)在喇叭輸出了,清空電話號碼并且重置mark
- if(mark == 1)
- {
- Phone_Number = "";
- Serial.println();
- mark = 0;
- }
- }
- /*
- DTMF播放函數(shù)
- 調(diào)用格式:playDTMF(數(shù)字(0~9), 持續(xù)時間)。
- */
- void PlayDTMF(String Number, long duration, long pause)
- {
- //如果輸入數(shù)字為空,或者持續(xù)時間不為正數(shù),或者暫停時間不為正數(shù)
- //則視作錯誤,立即停止執(zhí)行返回主程序。
- if(Number.length() == 0 || duration <= 0 || pause <= 0) return;
- //將Number逐個文字分離,
- for(i = 0; i < Number.length(); i++)
- {
- //如果Number屬于0~9的數(shù)字字符,
- if(Number[i] >= '0' && Number[i] <= '9')
- {
- //則將它ASCII碼減去‘0’,得到純數(shù)字,
- Number[i] -= '0';
- //然后在串口輸出一份,便于查看
- Serial.print(Number[i], DEC);
- //輸出雙音多頻之一
- freq1.play(DTMF_freq1[Number[i]], duration);
- //輸出雙音多頻之二
- freq2.play(DTMF_freq2[Number[i]], duration);
- delay(pause);
- }
- }
- }
復(fù)制代碼
打包下載:
Dialer.zip
(1.48 KB, 下載次數(shù): 15)
2016-4-14 03:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
實物效果:
1. 電路連接
142111jkfre4eogko9ee9z.jpg (70.6 KB, 下載次數(shù): 174)
下載附件
2016-4-14 04:16 上傳
2. 喇叭靠近電話撥號
14211311k99k972d90222d.jpg (36.7 KB, 下載次數(shù): 160)
下載附件
2016-4-14 04:16 上傳
3. 串口端發(fā)電話號碼
14211096blmt8f81hjt8dl.gif (13.77 KB, 下載次數(shù): 188)
下載附件
2016-4-14 04:16 上傳
4. 等待喇叭響完撥號音之后,即可聽到10000號的應(yīng)答
|
|