c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备,广泛应用于电子报警器、玩具、计时器等领域。在本项目中,我们结合树莓派Pico开发板,通过C++代码控制有源蜂鸣器发出“滴滴”声,并解析其中涉及的关键技术点和硬件知识。


一、项目概述

1. 项目目标
  • 学习有源蜂鸣器的原理和特性。
  • 利用树莓派Pico开发板控制蜂鸣器发出“滴滴”声。
  • 掌握晶体管的驱动电路设计。
2. 必需硬件

  • 树莓派Pico开发板 × 1
  • 树莓派Pico扩展板 × 1
  • 有源蜂鸣器 × 1
  • NPN型晶体管(S8050) × 1
  • 1kΩ电阻 × 1
  • 面包板与跳线若干

晶体管有两种类型,如下图所示,PNP和NPN:

基于晶体管的特性,它常被用作数字电路中的开关。由于单片机输出电流的能力很弱,我们将使用晶体管来放大电流和驱动大电流的元件。在使用NPN晶体管驱动蜂鸣器时,通常采用以下方法:如果GPIO输出高电平,电流将流过R1,晶体管将传导,蜂鸣器将发出声音。如果GPIO输出低电平,没有电流流过R1,晶体管就不会传导,蜂鸣器也不会响。在使用PNP晶体管驱动蜂鸣器时,通常采用以下方法:如果GPIO输出低电平,电流将流过R1,晶体管将传导,蜂鸣器将发出声音。如果GPIO输出高电平,没有电流流过R1,晶体管就不会传导,蜂鸣器也不会响。


二、硬件知识与工作原理

1. 有源蜂鸣器与无源蜂鸣器的区别
  • 有源蜂鸣器:内置振荡电路,只需提供直流电即可发声。
  • 无源蜂鸣器:需要外部电路提供2K-5K Hz的方波信号驱动。
2. 晶体管在电路中的作用
  • NPN晶体管(S8050):作为电流放大器,解决蜂鸣器对电流需求高的问题。
  • 工作原理
    • 当GPIO输出高电平时,基极通过电流,集电极-发射极导通,蜂鸣器工作。
    • 当GPIO输出低电平时,晶体管关闭,蜂鸣器停止发声。
3. 注意事项
  • 蜂鸣器工作电压为5V。在3.3V下可运行,但音量降低。
  • 避免VUSB与GND短路,连接错误可能导致硬件烧毁。

三、项目电路设计

电路图
  1. 蜂鸣器正极:连接树莓派Pico的GP16。
  2. 蜂鸣器负极:通过NPN晶体管的集电极接地。
  3. 晶体管基极:通过1kΩ电阻连接Pico的GPIO引脚。
  4. 电源:蜂鸣器供电为5V,通过扩展板或外部供电。

项目电路图

连线图

注意

1.  该电路中蜂鸣器的电源为5V。在3.3V的电源下,蜂鸣器可以工作,但会降低响度。

2.  VUSB应连接到USB线的正极如果它连接到GND,它可能烧坏电脑树莓派Pico板。同样,树莓派Pico板的36-40引脚接线时也要小心,避免短路。

3.  有源蜂鸣器正极(“+”/长引脚)接引脚16,负极短引脚接GND


四、项目代码实现

const int buzzerPin = 16;  // 定义蜂鸣器连接的引脚

void setup() {
  pinMode(buzzerPin, OUTPUT);  // 将蜂鸣器引脚设置为输出
}

void loop() {
  digitalWrite(buzzerPin, HIGH);  // 打开蜂鸣器
  delay(500);                     // 延时500毫秒
  digitalWrite(buzzerPin, LOW);   // 关闭蜂鸣器
  delay(500);                     // 再次延时500毫秒
}
 

代码解析
  • pinMode():设置GPIO引脚为输出模式。
  • digitalWrite():向引脚写入高或低电平,控制蜂鸣器的开关。
  • delay():延时函数控制蜂鸣器工作节奏,实现“滴滴”声。

五、项目现象与应用场景

1. 项目现象

上传代码并运行后,蜂鸣器将以0.5秒的间隔发出“滴滴”声。

2. 应用场景
  • 报警器:如火灾报警、越界提醒等。
  • 电子玩具:发出特定节奏的声音。
  • 计时器:倒计时结束时提示用户。

六、扩展与优化

1. 改变音调与频率

通过调整 delay() 参数或引入PWM信号控制蜂鸣器音调,实现更丰富的声音效果。

2. 组合多种声音模式

引入按键模块,切换不同的声音模式,例如长响、短响或音乐节奏。

3. 改善功耗与稳定性

设计低功耗电路,确保蜂鸣器在便携设备中更高效运行。


七、C++知识点剖析

1. 数字信号控制
  • GPIO高低电平:通过 digitalWrite() 控制外设开关状态。
  • 延时实现节奏控制:简单但有效,适合基础音频输出。
2. 引脚模式设置
  • OUTPUT 模式确保引脚能提供足够电流驱动外设。
  • 建议在项目初始阶段统一设置所有引脚的模式,避免引脚冲突。
3. 模块化设计

通过封装功能函数如 beep() 实现更灵活的代码:

void beep(int duration) {digitalWrite(buzzerPin, HIGH);delay(duration);digitalWrite(buzzerPin, LOW);
}

八、总结与学习意义

通过本项目,您将:

  • 理解有源蜂鸣器的工作原理及其与晶体管的关系。
  • 掌握如何利用树莓派Pico的GPIO控制简单外设。
  • 学习C++代码在嵌入式开发中的基础应用。

无论是入门学习还是技术扩展,本项目都为硬件驱动的基本原理提供了宝贵经验。


结语

希望本文对您在硬件控制与C++编程的结合应用中有所帮助。如果您觉得这篇文章对您的学习和实践有价值,请点赞、收藏并分享,您的支持是我们继续创作的最大动力!

 动手实践学习套件

欢迎加V交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu+ROS推视频流至网络

目录 概述 工具 ros_rtsp 接受流 web_video_server 源码安装 二进制安装 ros接收rtsp视频流 总结 概述 ros_rtsp功能包可以将ros视频流以rtsp形式推送 web_video_server功能包可以将ros视频话题推HTTP流 rocon_rtsp_camera_relay可以接受同一网段下的rtsp视频流输出为…

探索光耦:光耦安全标准解读——确保设备隔离与安全的重要规范

在现代科技日新月异的今天,光耦(光电耦合器)作为电子设备中不可或缺的隔离元件,其重要性不言而喻。它不仅在电源调控、工业自动化及医疗设备等关键领域大显身手,更是确保系统电气隔离与运行稳定的守护神。特别是在保障…

什么是 C++ 中的函数对象?它有什么特点?

在 C 中,函数对象(Function Object)是一种可调用对象,它允许像函数一样被调用,但实际上它可能并不是真正的函数。函数对象可以是以下几种类型之一: 普通函数: 一个普通的、定义在命名空间或类…

uni-app自定义底部tab并且根据字段显示和隐藏

首先将所有tab使用到的页面创建好并且在pages里面配置好,要在pages.json中的"tabBar里面配置"custom": true将自带的tab底部导航关闭 "pages": [{"path": "pages/mine/mine","style": {"navigationBa…

C/C++基础知识复习(31)

1) 什么是 C 中的多继承?它有哪些优缺点? 多继承(Multiple Inheritance)是指在 C 中,一个类可以继承自多个基类,从而拥有多个基类的特性和行为。具体来说,子类可以通过继承多个父类&#xff0c…

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

JAVA题目笔记(二十)异常综合小练

一、键盘录入数据 import java.text.ParseException; import java.util.InputMismatchException; import java.util.Scanner;public class Co {public static void main(String[] args) throws ParseException {//键盘录入信息int age0;String namenull;Scanner sc new Scanne…

STM32F10x 定时器

使用定时器实现:B5 E5的开关 添加相关的.h路径文件 添加相关的.c配置文件 led.h文件 用于声明LED函数 #ifndef __LED_H //没有定义__LED_H #define __LED_H //就定义__LED_H #define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5) #defi…

shell脚本基础学习_总结篇(完结)

细致观看可以,访问shell脚本学习专栏,对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义: 2. 主要特点: 3. shell脚本的基本结构 4. S…

Linux创建免密登陆(错误:Permission denied (publickey,gssapi-keyex,gssapi-with-mic))

报错截图 解决方法 1. mkdir -p ~/.ssh 2. chmod 700 ~/.ssh 3. ssh-keygen,一直回车 4. chmod 600 /root/.ssh/id_rsa 5. 将公钥内容追加到服务器上,cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 6. chmod 600 ~/.ssh/authorized_keys…

低代码平台在医疗/医院行业应用案例与优势介绍

随着医疗行业的不断发展,数字化管理的需求日益迫切。传统的医疗信息化管理系统开发往往面临着成本高、周期长、定制性差等问题。在这个数字化转型的浪潮下,低代码平台应运而生,为医院快速搭建高效、灵活的医疗信息化管理系统提供了全新的解决…

【Leetcode 每日一题 - 扩展】3101. 交替子数组计数

问题背景 给你一个 二进制数组 n u m s nums nums。 如果一个 子数组 中 不存在 两个 相邻 元素的值 相同 的情况,我们称这样的子数组为 交替子数组 。 返回数组 n u m s nums nums 中交替子数组的数量。 数据约束 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le n…

Python 网络爬虫进阶:动态网页爬取与反爬机制应对

在上一篇文章中,我们学习了如何使用 Python 构建一个基本的网络爬虫。然而,在实际应用中,许多网站使用动态内容加载或实现反爬机制来阻止未经授权的抓取。因此,本篇文章将深入探讨以下进阶主题: 如何处理动态加载的网…

在 Spring Boot 中构造 API 响应的最佳实践

在平时的开发和项目中,我们一定会涉及到接口对接的功能,由于不同开发人员的编码习惯不同,API报文在项目中通常是"百花齐放"的。 不但增加工作难度,往往也是扯皮的大头,如果能统一报文格式,不但能…

多目标优化算法——多目标粒子群优化算法(MOPSO)

Handling Multiple Objectives With Particle Swarm Optimization(多目标粒子群优化算法) 一、摘要: 本文提出了一种将帕累托优势引入粒子群优化算法的方法,使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:分享|16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括: 1. 人…

Android导出Excel

poi org.apache.poi:poi-ooxml:4.x: 不支持Android使用, 不支持原因:Android底层库不支持xml所需的bean类,使用即报错only supported starting with Android O (–min-api 26) org.apache.poi:poi-ooxml:5.2.0: 支持A…

简历面-面经03

面经04 项目细则 项目名称:基于鸿蒙的爱心云捐赠系统 鸿蒙开发 ArkTS语言 ArkTS在继承TypeScript语法的基础上进行了优化,以提供更高的性能和开发效率。 目前流行的编程语言TypeScript是在JavaScript基础上通过添加类型定义扩展而来的,而A…

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后,后台无法启动jenkins服务,服务状态如下: 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…

【计算机视觉+MATLAB】自动检测并可视化圆形目标:通过 imfindcircles 和 viscircles 函数

引言 自动检测图像中的圆形或圆形对象,并可视化检测到的圆形。 函数详解 imfindcircles imfindcircles是MATLAB中的一个函数,用于在图像中检测并找出圆形区域。 基本语法: [centers, radii] imfindcircles(A, radiusRange) [centers, r…