此例程演示了使用tone功能来产生一个随输入值变化的音高。
/* Pitch follower 播放基于模拟输入变化的音符 */ void setup() { // 初始化通信速率(调试用): Serial.begin(9600); } void loop() { // 读取传感器值: int sensorReading = analogRead(A0); // 显示到串口 Serial.println(sensorReading); // 模拟输入变化范围 (这里,从光敏电阻得到的大约400 - 1000 ) // 输出范围(120 - 1500Hz) // 基于传感器值变化范围改变输入最大最小输入值 int thisPitch = map(sensorReading, 400, 1000, 120, 1500); // 播放音符: tone(9, thisPitch, 10); delay(1); // 延时 }
8欧姆阻抗扬声器 |
1个光敏电阻 |
4.7K欧姆电阻 |
100欧姆电阻 |
面包板 |
连接线 |
在扬声器的一端接100欧姆电阻到数字口9,另一端接地。给光敏电阻提供5v电源,并且用接地的4.7欧姆电阻连接到A0口。
代码很简单,读取模拟输入并且标定模拟值到一定范围的音高。人类可以听到20-20000hz频率的声音,但是这里我们用120-1500hz更合适。
你需要得到真实的模拟输入变化范围。电路图中可以知道模拟输入值大约在400-1000变化。改变map值来对比你的传感器的变化范围。
/* Pitch follower 播放基于模拟输入变化的音符 */ void setup() { // 初始化通信速率(调试用): Serial.begin(9600); } void loop() { // 读取传感器值: int sensorReading = analogRead(A0); // 显示到串口 Serial.println(sensorReading); // 模拟输入变化范围 (这里,从光敏电阻得到的大约400 - 1000 ) // 输出范围(120 - 1500Hz) // 基于传感器值变化范围改变输入最大最小输入值 int thisPitch = map(sensorReading, 400, 1000, 120, 1500); // 播放音符: tone(9, thisPitch, 10); delay(1); // 延时 }