名侦探番外——Arduino“炸弹”引爆摩天大楼
名侦探番外——Arduino“炸弹”引爆摩天大楼
- 硬件准备
- 1.材料准备
- 2.模块介绍
- 电路设计
- 1.硬件接线
- 程序设计
- 1.设计思路
- 2.部分程序
- 3.功能优化
- 总结
好久不见,童鞋们!小编突然想到很久以前看的柯南剧场版——计时引爆摩天大楼的情景,对剧里的“炸弹”情有独钟,最近几天刚好有空,顺便用Arduino做了一个“炸弹”模型,这篇文章就跟大家分享一下“炸弹”的制作过程吧!
硬件准备
1.材料准备
今天的作品比较特殊,需要我们做一部分手工——制作”炸弹“模型,大家在制作之前可以先准备好以下材料:
Arduino UNO、TM1637数码管时钟模块、MP3语音模块、小喇叭、无源蜂鸣器、10kΩ电阻(3个)、杜邦线、牛皮纸、黑色胶带、美工刀、剪刀等。
注意:
- TM1637数码管时钟模块,小编在这里不方便贴链接,各位童鞋从某宝上自己购买吧。当然,小编在程序开头的注释里贴了一个链接,供大家参考。
- MP3语音模块,小编用的是多年以前从DFRobot买的语音模块,现在应该还有,大家从某宝上搜DFRobot官方商铺,在官方商铺里再搜语音模块就可以了,不过他们家的传感器模块比较贵,童鞋们也可以换其他替代产品,能用即可。
- 为了让作品更像”炸弹“,小编特意拆了几个牛皮纸包装袋,裁出大小相同的几张纸,然后把每张纸卷成圆筒,卷纸的时候可以在里面夹几只铅笔,这样卷出来的圆筒更结实,最后把所有圆筒用黑色胶带粘到一起就可以了。
- 最后调试完传感器和程序以后再把所有的硬件粘到圆筒上面即可。
特别声明:小编并没有为某宝和某商铺打广告,只是刚好手里有该模块而已,大家可以用自己的方式购买。
2.模块介绍
TM1637数码管时钟模块:驱动芯片为TM1637,共有四个引脚,分别为VCC、GND、DIO、CLK,其中VCC可接+5V或者+3.3V,DIO为数据输入/输出引脚,CLK为时钟信号引脚,这两个引脚可以接Arduino的任意数字引脚。
在Arduino中控制TM1637数码管模块可以直接调用TM1637库,库文件小编放在文档里了,文末有下载链接,大家也可以自己从Arduino软件中下载。小编在作品中用到了以下几个函数:
TM1637 tm1637(CLK, DIO);//初始化数码管,CLK和DIO是指定的连接到Arduino引脚。
tm1637.init();//初始化数码管,其实就是清空屏幕
tm1637.set(BRIGHT_TYPICAL);//设置数码管的亮度,BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;其中0最暗,7最亮
tm1637.point(true);//指定数码管中间的冒号是否显示,false不显示,true显示
tm1637.display(Addr, data); //指定数码管中某一位的显示内容,第一个参数指定数码管的某一位,四位数码管从左到右顺序为0,1,2,3,第二个参数是显示的内容,其实是个序号,库中自带有一个长度为16的数组,默认显示0-9,A-F,第二个参数指定的是这个数组的序号。
注:其他函数及其用法,各位童鞋可以自行查询和测试,小编就不在这里过多赘述了。
DFRobot MP3语音模块:工作电压为3.3V~5V,模块上有很多引脚,VCC和GND分别是电源正极和负极;RX、TX是串口通信引脚;BUSY是忙信号引脚,播放音乐时为高电平,其它为低电平;SP+和SP-分别连接喇叭的正极和负极;DACL和DACR分别是DAC音频输出的左声道和右声道;ONE是一线串口控制脚。我们的”炸弹“作品功能比较简单,所以仅用到了VCC、GND、RX、TX、SP+和SP-这几个引脚。
DFRobot MP3语音模块可以播放其内部存储的音效文件,自带8MB的存储空间,存储音效文件的方式和使用U盘一样,直接用micro usb线连接到电脑上,电脑就能识别出一个U盘一样的存储空间,然后我们就可以把音效文件存进去了,这与U盘的操作是一样的。
DFRobot MP3语音模块支持mp3和wav两种格式的音效文件,在存储音效文件之前一定要给文件编好序号,例如:01.MP3,02.mp3…,该模块需要使用串口和Arduino通信,而且它有自己的一套通讯指令,大家可以登录官方网站:
https://wiki.dfrobot.com.cn/_SKU_DFR0534_Voice_Module
自行查阅模块手册,小编在这里用到的功能比较少,所以直接抄了官方手册里的播放音乐和设置音量的示例程序:
void play(unsigned char Track)
{unsigned char play[6] = {0xAA,0x07,0x02,0x00,Track,Track+0xB3};//0xB3=0xAA+0x07+0x02+0x00,即最后一位为校验和Serial1.write(play,6);
}
void volume( unsigned char vol)
{unsigned char volume[5] = {0xAA,0x13,0x01,vol,vol+0xBE};//0xBE=0xAA+0x13+0x01,即最后一位为校验和Serial1.write(volume,5);
}
注:小编用的电脑是win10系统,插上U盘就能自动识别,但是win7或者MAC系统没有测试过,大家可以根据自己的电脑系统自行测试,如有问题可以直接访问DFRobot官方wiki或者客服解决。
电路设计
1.硬件接线
“炸弹”作品的硬件接线还是比较简单的,整个电路图如下:
TM1637数码管模块:数码管模块只有4个引脚,所以接线非常简单,这里小编把DIO和CLK引脚接到了Arduino UNO的A0和A1引脚:
TM1637数码管----------------------Arduino UNO
VCC -------------- +5VGND -------------- GNDDIO -------------- A0CLK -------------- A1
MP3语音模块:“炸弹”作品中仅用到了VCC、GND、RX、TX、SP+和SP-这几个引脚,接线如下:
MP3语音模块---------------------- Arduino UNO
VCC -------------- +5VGND -------------- GNDRX -------------- 11TX -------------- 10
MP3语音模块---------------------- 小喇叭
SP+ -------------- 正极SP- -------------- 负极
注:MP3语音模块要使用串口发送指令,作品中我们用的是Arduino UNO的软串口,所以这里把RX和TX接到了Arduino UNO的11和10号引脚。
拆弹线:因为作品中需要检测是否出现拆弹的情况,可以通过获取Arduino数字引脚的高低电平信号进行判断,这里为了避免断开拆弹线时Arduino引脚出现悬空,导致电平不稳定的情况,所以设计了一个下拉电阻的电路,当拆弹线未断开时,Arduino的数字引脚是高电平信号,当拆弹线断开时,Arduino的数字引脚是低电平信号。忘记下拉电阻电路的童鞋要补补课啦图片图片
拆弹线---------------------- Arduino UNO
红 -------------- 2绿 -------------- 3黄 -------------- 4
无源蜂鸣器:无源蜂鸣器只有两个引脚,正极和负极,接线非常简单:
无源蜂鸣器---------------------- Arduino UNO
正极 -------------- A2负极 -------------- GND
程序设计
1.设计思路
“炸弹”模型做完了,电路部分也搞定了,接下来就是程序设计了,小编按照自己写的程序简单分享以下几点:
-
首先是倒计时问题,小编在Arduino中使用了millis()函数计算程序运行的时间,这种计时方法并不精确,但是用起来方便,当计时时间达到阈值时,秒数要递减,若秒数小于0,则需要从分钟借位,然后继续递减,若分钟也小于0,就表示计时结束了,此时语音模块就要播放炸弹爆炸的声音了。程序中还设置了标志,用于控制程序是否需要继续执行倒计时以及控制倒计时过程中蜂鸣器滴滴响。
-
然后是三条拆弹线,这三条拆弹线要连接到Arduino的数字引脚,为了增加趣味性,小编在程序开始设置了随机分配三条线的引脚,方法是先用二维数组把三个数字引脚的6种情况全部排列出来,然后用随机数函数产生0~6之间的数字作为二维数组的行下标,以此获取随机的三个数字引脚,并赋值给check数组,然后再初始化引脚为输入模式。
-
最后在主程序中判断剪断了哪一条线,分别实现拆弹失败、拆弹成功以及倒计时加速的功能,当拆弹失败时,分钟和秒全部置0,此时语音模块就会发出爆炸的音效;当拆弹成功时,时间停止即可;当拆到倒计时加速的线时,倒计时会先暂停一会,然后时间会加速递减,直到时间为0则炸弹爆炸,如果时间还未加速递减到0时又拆到了拆弹成功的线那么时间会立刻停止,炸弹也不会爆炸了!
2.部分程序
void loop() {if (millis() - tt > nn && !bombFlag) {//判断当前时间是否超过nn的值,即达到计时时间了tt = millis();s--;//秒数递减if (s < 0) {//若秒数减到0if (m > 0) {//如果分钟仍然大于0则秒数从分钟借位s = 60;//秒数重新从60开始递减m--;//m被秒借走了1分钟,则应该减1} else {//若分钟不大于0,此时表示计时结束m = 0;s = 0;bombFlag = true;//改变标志值play(0x01);//语音模块播放爆炸声}}if (!bombFlag) {//若标志值还未改变,则蜂鸣器滴滴响tone(BUZZER, 1600);}} else {noTone(BUZZER);//蜂鸣器响一次就要关闭一次}if (digitalRead(check[0]) == LOW && !bombFlag) {//当check[0]被剪断,此时炸弹立即爆炸,拆弹失败m = 0;//分钟和秒直接置0s = 0;} else if (digitalRead(check[1]) == LOW && !bombFlag) {//当check[1]被剪断,此时炸弹停止,拆弹成功bombFlag = true;//改变标志值即可} else if (digitalRead(check[2]) == LOW && !bombFlag) {//当check[2]被剪断,此时炸弹暂停1500毫秒,随即快速倒计时(此时再拆check[1]仍然会停止,但拆check[0]则直接爆炸)if (!colorFlag){delay(1500);//暂停1500毫秒colorFlag = true;}nn -= 10;//nn每次减10,倒计时由慢变快if (nn < 100)nn = 100;//nn虽然逐渐递减,但不能小于100}displayTime(m, s);//数码管显示倒计时时间delay(20);
}
3.功能优化
由于时间比较仓促,材料准备也不是很充足,这个“炸弹”作品还有很大的优化空间,例如可以使用时钟模块提升计时精度,增加按键用于设置倒计时时间。各位童鞋如果有更好的想法也可以跟小编分享一下!
总结
模拟“炸弹”的音效文件、完整程序等文件已经上传到百度网盘了,想要资料的同学,请移步公粽号并回复“模拟炸弹”即可获得下载链接,好东西不容错过!
本期分享就到这里咯,撰文不易,欢迎各位小伙伴持续关注 初芯未来,更多内容分享等着你哦~!
相关文章:

名侦探番外——Arduino“炸弹”引爆摩天大楼
名侦探番外——Arduino“炸弹”引爆摩天大楼 硬件准备1.材料准备2.模块介绍 电路设计1.硬件接线 程序设计1.设计思路2.部分程序3.功能优化 总结 好久不见,童鞋们!小编突然想到很久以前看的柯南剧场版——计时引爆摩天大楼的情景,对剧里的“炸…...

自适应AI chatgpt智能聊天创作官网html源码
我们致力于开发先进的自适应AI智能聊天技术,旨在为用户提供前所未有的聊天体验。通过融合自然语言处理、机器学习和深度学习等领域的顶尖技术,我们的智能聊天系统能够准确理解用户的需求并给出相应的回应。 我们的自适应AI智能聊天系统具备以下核心特点…...
防抖,节流
概念 防抖(debounce):类似法师技能读条,读条没完再按技能就会重新读条,在触发后的n秒内只会执行一次,若在这n秒内重复触发则重新计算 节流(throttle):连续发生的事件在n秒内只执行一次函数 参考 【前端面试必问】—…...

【Linux】多线程1——线程概念与线程控制
文章目录 1. 线程概念什么是线程Linux中的线程线程的优点线程的缺点线程的独立资源和共享资源 2. 线程控制Linux的pthread库用户级线程 📝 个人主页 :超人不会飞)📑 本文收录专栏:《Linux》💭 如果本文对您有帮助&…...

【Maven】SpringBoot项目使用maven-assembly-plugin插件多环境打包
SpringBoot项目使用maven-assembly-plugin插件多环境打包 1.创建SpringBoot项目并在pom.xml文件中添加maven-assembly-plugin配置 <!-- 多环境配置 --><profiles><!-- 开发环境 --><profile><id>dev</id><properties><prof…...
指令集_基础
指令集-基础 一、提示过程1,文章摘要2,数学问题求解 二、角色提示三、多范例提示 一、提示过程 指导人工智能,执行任务的过程,称为提示过程。向AI 提供一组指令(提示),然后它执行任务 1,文章摘要 例如&a…...
学习Vue:数据绑定的基本概念
在 Vue.js 中,Vue 实例是您构建应用程序的核心。它允许您将数据和界面连接起来,实现动态的数据绑定,使您的应用程序能够根据数据的变化自动更新界面。让我们来深入了解 Vue 实例与数据绑定的基本概念。 Vue 实例与数据绑定 什么是 Vue 实例&…...
Python 装饰器 - 推导式(列表推导式) - 迭代器 - 生成器 - 闭包
目录 推导式 1、列表推导式(用得最多的) 给你一个列表,求所有数据的绝对值 列表推导式跟if运算 打印50以内能被3整除的数的平方(filter)(if的使用) 找到1000以内开平方的结果是整数的数&am…...

【大数据】Flink 详解(二):核心篇 Ⅲ
Flink 详解(二):核心篇 Ⅲ 29、Flink 通过什么实现可靠的容错机制? Flink 使用 轻量级分布式快照,设计检查点(checkpoint)实现可靠容错。 30、什么是 Checkpoin 检查点? Checkpoint …...

Jmeter性能测试系列-性能测试需求分析
性能测试需求分析 性能测试需求分析与传统的功能测试需求有所不同,功能测试需求分析重点在于从用户层面分析被测对象的功能性、易用性等质量特性,性能测试则需要从终端用户应用、系统架构设计、硬件配置等多个纬度分析系统可能存在性能瓶颈的业务。 性…...

Syncfusion Essential Studio JavaScrip Crack
Syncfusion Essential Studio JavaScrip Crack 数据透视表 添加了在将数据透视表导出到PDF文档时自定义列宽的支持。 签名 添加了对在特定位置绘制文本的支持。 Syncfusion Essential Studio for JavaScript在一个包中包含80多个高性能、轻量级、模块化和响应式UI组件。包括Jav…...

8.13黄金是否进入下行通道?下周开盘如何布局
近期有哪些消息面影响黄金走势?黄金多空该如何研判? 黄金消息面解析:周五(8月11日)现货黄金小幅收低,受累于美元走强和美国国债收益率上升,本周录得6月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…...

Idea的基本使用带案例---详细易懂
一.idea是什么 有专业人士说,idea是天生适合做微软,当时我还想肯定是夸大其词了,但当你用起来的时候确实很爽,😊😊 ntelliJ IDEA是一种集成开发环境(IDE),由JetBrains开发…...

MySQL中的用户管理
系列文章目录 MySQL常见的几种约束 MySQL中的函数 MySQL中的事务 MySQL中的视图 MySQL中的索引 文章目录 系列文章目录前言一、用户管理1、用户管理入门2、用户管理操作及示例 二、权限管理1.权限管理语法2.权限操作示例 三、角色管理1、角色管理入门2、角色操作示例 总结…...

【STM32】利用CubeMX对FreeRTOS用按键控制任务
对于FreeRTOS中的操作,最常用的就是创建、删除、暂停和恢复任务。 此次实验目标: 1.创建任务一:LED1每间隔1秒闪烁一次,并通过串口打印 2.创建任务二:LED2每间隔0.5秒闪烁一次,并通过串口打印 3.创建任…...
c# .net mvc的IHttpHandler奇妙之旅--图片文件请求安全过滤,图片防盗链
源码下载: c# .net mvc图片文件请求安全过滤,图片防盗链 https://download.csdn.net/download/cplvfx/88206428 在阅读该文章前,请先阅读该文章 c# .net mvc的IHttpHandler奇妙之旅。.net的生命周期和管道你听说过吗?你可以利用他处理业务如:跳转业务页面,文件请求的安全…...

STM32F407使用Helix库软解MP3并通过DAC输出,最精简的STM32+SD卡实现MP3播放器
只用STM32单片机SD卡耳机插座,实现播放MP3播放器! 看过很多STM32软解MP3的方案,即不通过类似VS1053之类的解码器芯片,直接用STM32和软件库解码MP3文件,通常使用了labmad或者Helix解码库实现,Helix相对labm…...
STM32 CAN 过滤器设置
做个笔记吧 ,免得以后忘记了 芯片是stm32F207 ,用cubeMX 6.80 版本生成 CAN 的使用总体包含4个部分 第一步:CAN初始化,配置波特率 (cubeMX 里面配置好后自动生成,不需要手动添加) MX_CAN1_Init(); 第二步&#…...

日常BUG—— maven编译报错
😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 一个maven项目在由于在代码中书写了如下代码: public static ConcurrentMap<…...

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理
Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 目录 Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 一、简单介绍 二、实现原理 三、实现步骤 四、关键代码 一、简单介绍 Unity 工具类,自己整理的一些游戏开发可…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...