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

標題: Arduino學習9-自制DTMF撥號器 [打印本頁]

作者: 51黑學者    時間: 2016-4-14 03:54
標題: Arduino學習9-自制DTMF撥號器
怎么撥打電話?也許這個問題很簡單:拿起話筒,按話機的數字鍵盤撥號碼。
但是,有沒想過,我們可以拿起電話,不需要碰話機鍵盤就能撥通電話?答案是肯定的。
下面就介紹如何用Arduino生成雙音多頻信號。

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

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

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

硬件連接:

程序代碼:

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

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

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.     用法,將喇叭貼近電話機話筒,然后發送要撥的電話號碼到串口,比如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.         //定義聲音產生引腳在Arduino的D11,D12
  23.         freq1.begin(11);
  24.         freq2.begin(12);
  25.     }

  26.     void loop()
  27.     {
  28.         //讀出串口數據,串接成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,持續長度200ms,間隔長度300ms
  36.         PlayDTMF(Phone_Number, 200, 300);
  37.            
  38.             //如果剛才接收到串口的電話號碼,因為號碼已經在喇叭輸出了,清空電話號碼并且重置mark
  39.         if(mark == 1)
  40.         {
  41.             Phone_Number = "";
  42.             Serial.println();
  43.             mark = 0;
  44.         }
  45.     }

  46.     /*
  47.     DTMF播放函數
  48.     調用格式:playDTMF(數字(0~9), 持續時間)。
  49.     */
  50.     void PlayDTMF(String Number, long duration, long pause)
  51.     {
  52.             //如果輸入數字為空,或者持續時間不為正數,或者暫停時間不為正數
  53.             //則視作錯誤,立即停止執行返回主程序。
  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的數字字符,
  59.             if(Number[i] >= '0' && Number[i] <= '9')
  60.             {
  61.                 //則將它ASCII碼減去‘0’,得到純數字,
  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.     }
復制代碼

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

實物效果:

1. 電路連接

2. 喇叭靠近電話撥號

3. 串口端發電話號碼

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


作者: 51黑學者    時間: 2016-4-14 03:58
問題:
你好,你寫得很清楚,這個程序很好理解,一部分是將串口送下去的一串數字生成雙音頻;另一個部分就是使用喇叭播放雙音頻。

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

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

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


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



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




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

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

作者: ishenglx    時間: 2018-4-25 13:44
請問能不能一個arduino讀取傳真信號,然后通過esp模塊傳遞給另一個arduino?




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久久免费视频网站 | 中文字幕永久在线 | 日本三级在线视频 | 日韩高清精品免费观看 | 国产精品一区一区三区 | 久久xxxx| 午夜在线国语中文字幕视频 | 亚洲黄色大片 | 国产成人av网站 | 欧美九九九 | 国产传媒在线播放 | 欧美久久一区二区 | 日韩精品在线一区 | 欧美精品二区三区四区免费看视频 | 国产精品美女久久久久久久久 | 亚洲综合五月天婷婷丁香 | 久久精品一区二区国产 | 国产精品欧美精品 | 中文字幕日韩在线观看 | 黄色一级大片 | 一级久久 | 久久综合久色欧美综合狠狠 | 精品日韩在线观看 | 少妇性bbb搡bbb爽爽爽欧美 | 国产一级生活片 | 免费国产视频 | 亚洲欧美网站 | 久久久久久国产精品 | 欧美在线小视频 | 欧美激情网站 | 91在线精品李宗瑞 | 日韩中文字幕在线 | 日本激情视频 | 日韩一区二区三区四区 | 成人羞羞网站 | 精品日韩在线 | 日韩精品免费观看 | 久久精品一区二区国产 | 成人深夜福利视频 | 亚洲天天看 | 久久99精品久久久久久 |