【雕爷学编程】Arduino 手册之高级 I/O 函数 noTone()

在这里插入图片描述
在这里插入图片描述
什么是Arduino?
Arduino 是一款开源的电子原型平台,它可以让你用简单的硬件和软件来创建各种创意的项目。无论你是初学者还是专家,Arduino 都能为你提供无限的可能性。你可以用 Arduino 来控制传感器、灯光、马达、机器人、物联网设备等等,只要你能想到的,Arduino 都能帮你实现。

如果你想了解更多关于 Arduino 的信息,你可以访问 Arduino 的官方网站,那里有丰富的资源和教程供你参考。你也可以加入 Arduino 的社区,和来自世界各地的爱好者、学生、设计师和工程师交流心得和经验。此外,你还可以使用 Arduino 的在线编程工具,在云端编写代码并上传到你的开发板上。

Arduino 是一个不断发展和创新的平台,它有着广泛的应用领域和潜力。这里希望本手册能激发你对 Arduino 的兴趣和热情,让你享受 Arduino 带来的创造力和乐趣

在这里插入图片描述

维基百科的定义
Arduino 是一个开源嵌入式硬件平台,用来供用户制作可交互式的嵌入式项目。此外 Arduino 作为一个开源硬件和开源软件的公司,同时兼有项目和用户社群。该公司负责设计和制造Arduino电路板及相关附件。这些产品按照GNU宽通用公共许可证(LGPL)或GNU通用公共许可证(GPL)许可的开源硬件和软件分发的,Arduino 允许任何人制造 Arduino 板和软件分发。 Arduino 板可以以预装的形式商业销售,也可以作为 DIY 套件购买。

Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。初学者和爱好者可用Arduino制造传感器、简单机器人、恒温器和运动检测器等装置。

Arduino 这个名字来自意大利伊夫雷亚的一家酒吧,该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的 Arduin(Arduin of Ivrea)命名,他是伊夫雷亚边疆伯爵,也是 1002 年至 1014 年期间的意大利国王。

在这里插入图片描述

十五、Arduino高级 I/O 函数 noTone()
Arduino高级 I/O noTone()是一种用于停止向数字引脚输出音调信号的函数。noTone()的作用是让Arduino停止使用与输出引脚相关联的定时器,从而结束音调信号的产生,并释放定时器资源。这样可以实现一些需要控制音调信号的开始和结束的功能,例如发出单个音符、警报声、提示音等。

noTone()的使用范围:
1)当需要停止向一个数字引脚输出音调时,例如在发出一个音符后停止声音、在按下一个按钮后停止警报声、在完成一个操作后停止提示音等。
2)当需要在不同的数字引脚之间切换音调输出时,例如在两个扬声器之间交替播放音乐、在多个蜂鸣器之间产生不同的声音效果等。
3)当需要在不同的功能之间切换使用定时器时,例如在使用tone()函数和analogWrite()函数之间切换、在使用tone()函数和定时器中断之间切换等。

应用场景:
1)停止声音输出:在使用tone()函数产生声音信号时,可以使用noTone()函数来停止声音输出。这在需要在特定时间段内产生声音的应用中非常有用,如闹钟、警报系统等。
2)停止舵机运动:通过使用tone()函数产生PWM信号来驱动舵机时,使用noTone()函数可以停止舵机的运动。这在需要控制舵机的位置和停止运动的应用中非常有用,如机械臂控制、舵机驱动的车辆等。
3)停止振动马达:在使用tone()函数产生PWM信号来控制振动马达时,可以使用noTone()函数来停止振动。这在需要在特定时间段内提供振动反馈的应用中非常有用,如游戏手柄、手机震动提示等。

使用noTone()时,需要注意以下事项:
1)noTone()函数只能在先前通过tone()函数打开的引脚上使用,以停止该引脚上的PWM输出。在其他引脚上调用noTone()函数将不起作用。
2)noTone()函数的调用并不会关闭引脚的PWM功能,只是停止特定引脚上的PWM输出。如果需要完全关闭引脚的PWM功能,可以使用pinMode()函数将引脚设置为输入或输出模式。
3)如果在调用tone()函数之前没有使用noTone()函数停止先前的PWM输出,调用tone()函数时会重置PWM输出的设置。因此,在切换音频、舵机或振动马达的功能时,确保先调用noTone()函数停止之前的PWM输出。

以下是Arduino高级 I/O noTone()的三个实际运用程序案例:

案例一:使用noTone()实现蜂鸣器的发声

void setup() {
  // 将8号引脚设为输出模式,用于控制蜂鸣器
  pinMode(8, OUTPUT);
}

void loop() {
  // 向8号引脚输出1000赫兹的音调
  tone(8, 1000);
  // 等待1000毫秒
  delay(1000);
  // 停止向8号引脚输出音调
  noTone(8);
  // 等待1000毫秒
  delay(1000);
}

案例二:使用noTone()实现扬声器的播放

// 定义一个常量SPEAKER_PIN,表示扬声器连接到3号引脚
#define SPEAKER_PIN 3

// 定义一个数组notes,表示乐谱中每个音符对应的频率
int notes[] = {262, 294, 330, 349, 392, 440, 494, 523};

// 定义一个字符串melody,表示乐谱中每个音符对应的字母
String melody = "ccggaagffeeddc ";

// 定义一个常量tempo,表示乐谱中每个音符持续的时间
int tempo = 300;

void setup() {
}

void loop() {
  // 定义一个局部变量i,表示乐谱中音符的索引,并初始化为0
  int i = 0;
  
  // 循环遍历乐谱中的每个音符
  for (i = 0; i < melody.length(); i++) {
    // 定义一个局部变量note,表示当前音符对应的字母,并从乐谱中读取
    char note = melody.charAt(i);
    
    // 定义一个局部变量duration,表示当前音符持续的时间,并根据节奏计算
    int duration = tempo / 4;
    
    // 判断当前音符是否为空格,如果是,则表示休止符
    if (note == ' ') {
      // 停止向扬声器输出音调
      noTone(SPEAKER_PIN);
    }
    // 判断当前音符是否为大写字母,如果是,则表示高八度
    else if (note >= 'A' && note <= 'G') {
      // 向扬声器输出当前音符对应的频率乘以2,即高八度的音调
      tone(SPEAKER_PIN, notes[note - 'A'] * 2, duration);
    }
    // 判断当前音符是否为小写字母,如果是,则表示低八度
    else if (note >= 'a' && note <= 'g') {
      // 向扬声器输出当前音符对应的频率,即低八度的音调
      tone(SPEAKER_PIN, notes[note - 'a'], duration);
    }
    
    // 等待当前音符持续的时间再执行下一个音符
    delay(duration);
  }
}

案例三:使用noTone()实现PWM输出的切换

// 定义一个常量LED_PIN,表示LED灯连接到9号引脚
#define LED_PIN 9

void setup() {
}

void loop() {
  // 向9号引脚输出1000赫兹的音调,持续1000毫秒
  tone(9, 1000, 1000);
  // 等待1500毫秒
  delay(1500);
  // 停止向9号引脚输出音调
  noTone(9);
  // 将9号引脚设为128的占空比,即调节LED灯的亮度
  analogWrite(9, 128);
  // 等待1000毫秒
  delay(1000);
}

案例四:控制声音输出:

const int speakerPin = 9;

void setup() {
}

void loop() {
  tone(speakerPin, 261); // 发出音频频率为261 Hz的音符(中央C)
  delay(1000);
  noTone(speakerPin); // 停止音频输出
  delay(500);
}

在此案例中,我们使用tone()函数在引脚9上产生频率为261 Hz的声音信号(中央C音符)。通过调用noTone()函数,可以停止音频输出。这样,我们可以在特定时间间隔内产生声音,并在需要时停止声音输出。

案例五:停止舵机运动:

const int servoPin = 10;

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() {
  for (int angle = 0; angle <= 180; angle += 10) {
    tone(servoPin, angle); // 控制舵机角度
    delay(500);
  }
  noTone(servoPin); // 停止舵机运动
  delay(1000);
}

在此案例中,我们使用tone()函数在引脚10上产生PWM信号来驱动舵机。通过循环改变PWM信号的占空比,可以控制舵机的角度。在循环结束后,使用noTone()函数来停止舵机的运动,以防止舵机持续运动。

案例六:停止振动马达:

const int motorPin = 5;

void setup() {
  pinMode(motorPin, OUTPUT);
}

void loop() {
  tone(motorPin, 1000); // 控制振动马达的震动频率为1000 Hz
  delay(1000);
  noTone(motorPin); // 停止振动
  delay(500);
}

在此案例中,我们使用tone()函数在引脚5上产生PWM信号来控制振动马达的震动频率。通过调用noTone()函数,可以停止振动马达的震动。这样,我们可以在特定时间间隔内提供振动反馈,并在需要时停止振动。

这些案例展示了noTone()函数在不同应用中的使用方法。通过使用noTone()函数,我们可以控制和停止先前通过tone()函数产生的PWM输出,实现更精确和灵活的控制应用。

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值