久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8180|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

Arduino學(xué)習(xí)9-自制DTMF撥號器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:114115 發(fā)表于 2016-4-14 03:54 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
怎么撥打電話?也許這個問題很簡單:拿起話筒,按話機的數(shù)字鍵盤撥號碼。
但是,有沒想過,我們可以拿起電話,不需要碰話機鍵盤就能撥通電話?答案是肯定的。
下面就介紹如何用Arduino生成雙音多頻信號。

用法介紹:
使用時候,我們拿起電話話筒,將喇叭貼近話筒麥克風(fēng)位置。在串口發(fā)送需要撥號的電話號碼(比如10000),稍等片刻即可撥通。

擴展用法:
驅(qū)動開關(guān)模擬電話摘機事件,用此電路撥號,再由Arduino按照事件控制語音模塊(WT588D等)發(fā)出不同的語音到電話線。即可完成一個整體的自動撥號機,可以制作報警器,或者電話提醒器。

材料清單:
Arduino一塊,
喇叭1個,
100Ω電阻1個(可以選擇100Ω~1kΩ),
1uF電容兩個(可以選擇0.1uF~10uF)。

硬件連接:

程序代碼:

1. 下載Tone庫,并且解壓到arduino-0022libraries文件夾

此Tone庫相比自帶的tone函數(shù)特點是,可以同時在多個輸出腳輸出不同頻率的波形,但是自帶tone函數(shù)在一段時間內(nèi)只能在一個引腳輸出。

2.寫入下面代碼到Arduino:

  1.     /*
  2.     使用Arduino生成雙音多頻
  3.     Ansifa        2011/11/27

  4.     * 軟件:需要Tone庫,下載地址:
  5.     * 材料:喇叭1個,100Ω電阻1個,1uF電容兩個
  6.     * 硬件連接:在D11,D12引腳各接一個1uF電容,之后合并到100Ω電阻一端,
  7.       100Ω電阻另一端接喇叭,然后喇叭另一端接地。

  8.     用法,將喇叭貼近電話機話筒,然后發(fā)送要撥的電話號碼到串口,比如10000,即可撥通電話10000
  9.     */

  10.     #include

  11.     String Phone_Number = "";
  12.     int i = 0, mark = 0;

  13.     //定義freq1,freq2為Tone實例,并且定義雙音多頻的頻率
  14.     //DTMF頻率定義參見:
  15.     Tone freq1;
  16.     Tone freq2;
  17.     const int DTMF_freq1[] = {1336, 1209, 1336, 1477, 1209, 1336, 1477, 1209, 1336, 1477};
  18.     const int DTMF_freq2[] = {941,  697,  697,  697,  770,  770,  770,  852,  852,  852};

  19.     void setup()
  20.     {
  21.         Serial.begin(9600);
  22.         //定義聲音產(chǎn)生引腳在Arduino的D11,D12
  23.         freq1.begin(11);
  24.         freq2.begin(12);
  25.     }

  26.     void loop()
  27.     {
  28.         //讀出串口數(shù)據(jù),串接成Phone_Number字符串
  29.         while (Serial.available() > 0)
  30.         {
  31.             Phone_Number += char(Serial.read());
  32.             delay(2);
  33.             mark = 1;
  34.         }
  35.         //播放DTMF音頻,電話號碼來自Phone_Number,持續(xù)長度200ms,間隔長度300ms
  36.         PlayDTMF(Phone_Number, 200, 300);
  37.            
  38.             //如果剛才接收到串口的電話號碼,因為號碼已經(jīng)在喇叭輸出了,清空電話號碼并且重置mark
  39.         if(mark == 1)
  40.         {
  41.             Phone_Number = "";
  42.             Serial.println();
  43.             mark = 0;
  44.         }
  45.     }

  46.     /*
  47.     DTMF播放函數(shù)
  48.     調(diào)用格式:playDTMF(數(shù)字(0~9), 持續(xù)時間)。
  49.     */
  50.     void PlayDTMF(String Number, long duration, long pause)
  51.     {
  52.             //如果輸入數(shù)字為空,或者持續(xù)時間不為正數(shù),或者暫停時間不為正數(shù)
  53.             //則視作錯誤,立即停止執(zhí)行返回主程序。
  54.         if(Number.length() == 0 || duration <= 0 || pause <= 0) return;
  55.         //將Number逐個文字分離,
  56.         for(i = 0; i < Number.length(); i++)
  57.         {
  58.             //如果Number屬于0~9的數(shù)字字符,
  59.             if(Number[i] >= '0' && Number[i] <= '9')
  60.             {
  61.                 //則將它ASCII碼減去‘0’,得到純數(shù)字,
  62.                 Number[i] -= '0';
  63.                 //然后在串口輸出一份,便于查看
  64.                 Serial.print(Number[i], DEC);
  65.                 //輸出雙音多頻之一
  66.                 freq1.play(DTMF_freq1[Number[i]], duration);
  67.                 //輸出雙音多頻之二
  68.                 freq2.play(DTMF_freq2[Number[i]], duration);
  69.                 delay(pause);
  70.             }
  71.         }


  72.     }
復(fù)制代碼

打包下載: Dialer.zip (1.48 KB, 下載次數(shù): 15)

實物效果:

1. 電路連接

2. 喇叭靠近電話撥號

3. 串口端發(fā)電話號碼

4. 等待喇叭響完撥號音之后,即可聽到10000號的應(yīng)答

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:114115 發(fā)表于 2016-4-14 03:58 | 只看該作者
問題:
你好,你寫得很清楚,這個程序很好理解,一部分是將串口送下去的一串?dāng)?shù)字生成雙音頻;另一個部分就是使用喇叭播放雙音頻。

我的問題是,摘機后,聽筒里面的撥號音仍然長鳴。這時我也能聽到喇叭播放的“10000”已經(jīng)在受話器旁響起,可是撥號音同時也在聽筒里響著,因此撥號后,沒有反應(yīng)啊。何解?希望指點一二。
謝謝

答案:
問題的提出:昨晚按照原圖測試,的確出現(xiàn)喇叭播放的“10000”已經(jīng)在受話器旁響起,可是撥號音同時也在聽筒里響著的現(xiàn)象,受話器沒有識別撥號音。
增大音量的嘗試:今天在Ansifa的指導(dǎo)下,做了以下嘗試。
(1)甩開兩只電容,因為我使用的電容是0.1uf的,參數(shù)小,因此甩開。原設(shè)計是為了保護喇叭。(這兩個電容后來我又加上去,也撥號成功了。)
(2)11、12pin每個支路增加一只電阻,整個回路電阻是降低的。改后喇叭音量增大。
改后撥打10000號成功,第一個音響起后,話機里的等待撥號音就中止了,10000號撥完,就聽到了電腦話務(wù)員的聲音。

啟示
這個實驗的目的是用arduino的PWM腳(11、12)合成不同頻率的聲音,并且輸出至喇叭。
Ansifa介紹為保證成功率,應(yīng)該是直接接到電話線里面的。如果你感興趣,也可以分別甩開11、12pin,感受一下單音頻與雙音頻的不同。
注意:受環(huán)境,受話器質(zhì)量、喇叭與受話器距離的影響,撥號識別不是每次都成功,需要多撥幾次,但證明這個方案是可行的。


(附圖:按照Ansifa的指導(dǎo)改后的圖)



哈哈,支持滄海笑1122的親自試驗,反映的問題我也遇到了,的確成功率不是100%,規(guī)范的使用應(yīng)該是通過電路直接接到電話線上的。這樣就成了撥號機了




科普一下“電話線同樣只能傳送聲音。我們不能對著機器念電話號碼,機器聽不懂,所以電話機必須用一個統(tǒng)一的格式,把數(shù)字轉(zhuǎn)變?yōu)槁曇魜韨魉汀C看萎?dāng)你按下數(shù)字鍵,電話機就會發(fā)出一個聲音。這個聲音的頻率是事先約定的,不同數(shù)字各不相同(其實就是你按鍵時聽到的那種高低不同的“滴滴”聲)。機器收到這個頻率的聲音,就知道你要撥什么號碼了。
正因為如此,我們在撥號的這段時間,用嘴或者用任何音響設(shè)備發(fā)出的聲音,都有可能傳到電信局,成為一次撥號——但是這種情況太難發(fā)生了。每一個數(shù)字鍵發(fā)出的聲音,其實是兩個頻率聲音的組合(頻率的組合表見圖)。而且機器對頻率的認(rèn)定非常嚴(yán)格,差一點點都不行,這樣做就能有效地避免雜音被誤當(dāng)成了撥號。”

也就解釋了為什么要用Tone庫 而不用自帶的tone,因為每個數(shù)字鍵需要兩個頻率聲音合成!超版的每個帖子技術(shù)含量都是非常的高!感謝超版!
回復(fù)

使用道具 舉報

板凳
ID:162374 發(fā)表于 2018-4-25 13:44 | 只看該作者
請問能不能一個arduino讀取傳真信號,然后通過esp模塊傳遞給另一個arduino?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲91精品 | 一区二区在线观看免费视频 | 成人1区2区 | 久久久国产一区二区三区 | 国产中文视频 | 午夜影院在线观看免费 | 成人av免费| 一区二区在线看 | 国产91丝袜 | www亚洲一区 | 色香婷婷 | 看一级毛片视频 | 欧美一级二级视频 | 国产精品国产精品国产专区不片 | 欧美日韩高清在线一区 | 精品国产一级片 | 久久精品手机视频 | 手机在线观看 | 日本色婷婷 | 久久久久国 | 国产欧美精品区一区二区三区 | 亚洲www.| 久久专区 | 国产在线精品一区二区三区 | 女人一区| 久久精品久久久久久 | 日本午夜精品 | 国产成人久久 | 91资源在线 | k8久久久一区二区三区 | 天天综合久久网 | 五月天天丁香婷婷在线中 | 亚洲精品第一 | 欧美精品一区二区三区在线 | 国产精品一区二区三区久久久 | 美女天天干 | www.99热这里只有精品 | 日韩欧美大片 | 夜夜爽99久久国产综合精品女不卡 | 欧美日高清视频 | 男女网站在线观看 |