亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

仅使用 Arduino 的 DTMF 解码器

组件和用品

Arduino UNO
× 1
LED(通用)
× 10
面包板(通用)
× 1
跳线(通用)
× 20

应用和在线服务

Arduino IDE

关于这个项目

当我浏览学期项目清单时,我看到了一辆 DTMF 控制的汽车,它使用 CM 8870 IC 作为 DTMF 解码器,并将编码的二进制数据提供给 Arduino 以执行左右和向前后退操作。 DTMF解码器功能,主要部分,使用了我发现难以集成的外部IC,正在寻找甚至可以用一些附加代码替换电路中的IC的代码或库,但找不到令人满意的解决方案.但是一个基于 Goertzel 算法 (Goertzel.h) 的库可以通过计算每单位时间的脉冲数及其在给定音调信号中的幅度贡献来判断音调中是否存在特定频率。

我使用基本的示例代码作为基础,并编写了一个代码,它可以检测音调中当前的主要 DTMF 频率,并可以对其进行解码,从而为我们提供通话期间另一侧按下的号码。

代码

  • Arduino Code DTMF 解码器
Arduino Code DTMF 解码器Arduino
在Arduino IDE中编译并上传代码,不要忘记先添加库。
图书馆的链接是:
https://github.com/jacobrosenthal/Goertzel
/* 此代码是 DTMF 解码器的基本实现,用于检测来自模拟引脚 A0 的 16 个字符 DTMF 代码,并通过检查所有 Upper 和DTMF 矩阵中的较低音调,并通过打开数字 0-9 的相应数字位并通过串行打印其余字符来为我们提供相应的数字。这项工作完全基于在 http://www.embedded.com/design/embedded/4024443/The-Goertzel-Algorithm 上找到的 Kevin Banks 代码,因此完全归功于他的通用实现和分解。 Goertzel 算法由来已久,因此请参阅 http://en.wikipedia.org/wiki/Goertzel_algorithm 以获取完整说明。它通常用于 DTMF 音调检测,作为快速傅立叶变换的替代方法,因为它速度快,偷听度低,因为它只搜索单个频率而不是显示所有频率的出现。 * 此代码由“Mian Mohammad Shoaib”制作/修改并发布到公共领域。 * 对于与代码相关的任何查询,请随时通过 [email protected] 询问 */#include int sensorPin =A0; const int N =100; //它是代码将采取的样本数 y0u 可以改变灵敏度,如果大它可以减慢 arduinoconst 浮点阈值 =2000; //要考虑的最小音调幅度我们可以改变它以获得更高的灵敏度const float sampling_freq =8900; //最大可检测频率是采样率/2,16Mhz的arduino uno可以支持高达8900Hz的采样float x_frequencies[4]; // 制作两个数组,用于保存要检测的 x 和 y 轴频率float y_frequencies[4];void setup(){ pinMode(13, OUTPUT); //初始化闪烁指示灯以显示是否检测到任何音调 pinMode(2, OUTPUT); //将 10 个引脚初始化为输出,以显示从 2 到 12 的 dtmf 输出,其余将直接打印到监视器 pinMode(3, OUTPUT); pinMode(4,输出); pinMode(5, 输出); pinMode(6, 输出); pinMode(7,输出); pinMode(8,输出); pinMode(9,输出); pinMode(10,输出); pinMode(11,输出); pinMode(12,输出); Serial.begin(9600); x_frequencies[0]=1209; //只需使用 x 和 y 轴音调频率及其行号和冒号编号来初始化数组x_frequencies[1]=1336;x_frequencies[2]=1477;x_frequencies[3]=1633;y_frequencies[0]=697;y_frequencies[ 1]=770;y_frequencies[2]=852;y_frequencies[3]=941;}booldetect_tone(float freq){Goertzel goertzel =Goertzel(freq,N,sampling_freq); //使用给定的样本采样频率和目标频率来初始化库函数 goertzel.sample(sensorPin); //将取 n 个样本 float 幅度 =goertzel.detect(); //检查它们的target_freq if(magnitude>threshold){ //如果你得到错误命中或没有命中调整阈值digitalWrite(13,HIGH); //如果检测到脉冲,则在 13 上闪烁 LED 延迟(250);数字写入(13,低);串行打印(频率); Serial.print("\n");返回真; } else return false;}void print_number(int row,int column){int number=0;if(row==0){ //找到找到的行和列对应的数字 if(column==0) number=1;否则 if(column==1) number=2;否则 if(column==2) number=3;否则 if(column==3) number=10; }else if(row==1){ if(column==0) number=4;否则 if(column==1) number=5;否则 if(column==2) number=6;否则 if(column==3) number=11; }else if(row==2){ if(column==0) number=7;否则 if(column==1) number=8;否则 if(column==2) number=9;否则 if(column==3) number=12; }else if(row==3){ if(column==0) number=14;否则 if(column==1) number=0;否则 if(column==2) number=15;否则 if(column==3) number=13; }if(number <10){digitalWrite((number+2),HIGH);Serial.print(number);}else if(number ==10)Serial.print('A');else if(number ==11)Serial.print('B');else if(number ==12)Serial.print('C');else if(number ==13)Serial.print('D');else if(number ==14)Serial.print('*');else if(number ==15)Serial.print('#');Serial.print("\n");delay(800);for(int i=2;i<=12;i++){ digitalWrite(i,LOW);}}void loop(){int column=0,row=0;int i=0;while(1){ if(detect_tone(x_frequencies[i]) ) ==真){ 列 =i;休息; } i++;if(i==4)i=0;}i=0;while(1){if(detect_tone(y_frequencies[i]) ==true){ row =i;休息; } i++;if(i==4)i=0;}print_number(row,column);}

示意图

该电路使用从数字引脚 2 到 12 连接的 10 个 LED,当分别按下 0-9 之间数字的任何音调时,这些 LED 将打开,并且脉冲检测 LED 将连接在引脚 13 上,当有脉冲时,它会短暂闪烁或检测到信号,大于 9 的数字(特殊字符)将通过 IDE 中的串行打印显示。
来自音频插孔或 AUX 电缆的输入引脚将通过串联 1uF 电容器连接到模拟引脚 A0,该电容器将滤除低频和 DC 偏移。

制造工艺

  1. 使用 Arduino 制作流光溢彩监视器
  2. 使用 ARDUINO 的超声波悬浮机器
  3. Arduino 报警系统:SERENA
  4. 使用 Arduino 和智能手机的 DIY 电压表
  5. 使用物联网的心率监测器
  6. 使用激光模块的莫尔斯电码通信(两者)
  7. WebServerBlink 使用 Arduino Uno WiFi
  8. Car Counter using Arduino + Processing + PHP
  9. 使用 arduino 的自动化恐龙游戏
  10. Python3 和 Arduino 通信
  11. 使用 Arduino 和 RDA8057M 的 FM 收音机
  12. BLUE_P:无线 Arduino 编程扩展板