/如果你不能告诉,第五张图片(gif)表明,“倒计时”计时器LED衰落/ /
*不要害羞点击图片获得更多的描述在本教程的**。
它是做什么的?
这是一个<strong>增强的</strong>厨房定时器,可以关闭任何设备,你通常会插到墙上的插座。 但当有19秒,Arduino将欧洲的“倒计时”的歌,就像在GEICO的商业!
<b style="font-family: CompleteInHimPro;">难度:</b><b style="background-color: blue;color: blue;border: 1.0px solid black;">E</b><b style="background-color: blue;color: blue;border: 1.0px solid black;">一</b><b style="background-color: blue;color: blue;border: 1.0px solid black;">S</b> <b style="color: white;border: 1.0px solid black;">Y</b> <b style="color: white;border: 1.0px solid black;">..</b><b class="callout">我们将阅读原理图和重编程的蓝牙模块!</b>
<strong>前言</strong>:
在开始这个项目,请确认谁教我“秘密的多任务”来提高本项目。 特别感谢秃头工程师FadeWithoutDelay Code(void dothefade())看到这 链接更多信息。
特别感谢” 欧洲最后的倒计时“创作一首歌,很容易配置通过代码。
首先,检查出三以上的视频。
注:* *最后的倒计时的歌是听到附近的第一视频*结束
这是为什么 Arduino项目的独特性比任何其他继电器开关? 这是因为它不使用 delay()所有功能(这是一个非常好的事情)!
*为什么不使用延迟,它是什么? 别担心,我会解释的,在下一步的**。
警告
<u>我们将处理的</u><u>交流电(AC)所以一定要确保你得到成人的监督。</u>
故事时间:
(第二视频)有一天,我正在玩 slither.io只是在完成我的作业。 当我在玩我的游戏,我的爸爸让我打开我们的湿磨了整整45分钟。 那时候打我冰冷的水被扔在我的背上。 我问自己,“为什么不那些印度商人添加定时器将自动关闭我的机?”
*湿机基本上是一个大的冰沙搅拌机叶片,而是采用锥形花岗岩石头米粉成面团* *
不幸的是,这个模型没有一个定时器(只是一个通断开关)。
这是一个湿粉碎机可如果大米是地做出适当的:
这就是所谓的剂量。 看起来美味!
<strong>实现</strong>:
那时候我想使我的Arduino Uno关掉我的磨床。 毕竟,机器人有一个更好的反应时间比我们人类。 个人 ,我只想专注于打 slither.io进入顶尖行列,但不要错过正确的时间关掉磨床。(相信我,我玩的很好的时候,没有人看)。
在这个项目中,我以为我会让事情更有趣一点; <u>我决定做一个延迟的免费项目</u>。
并使它更加特别,我决定忽视使用物理按键和LCD(液晶显示器)的项目。 相反,我想用我的可靠的手机设置计时器!
奖金特点:
该项目还包括一个额外的功能,我希望你能利用你每次打上传按钮:无线编程。 它不包括一个 盾因为我知道从个人的经验,一些不友好的Arduino盾。 所以我将创建一个简单、高效的无线编程器电路的荣誉。 它是无线的程序员有点类似于 做网站,但我把一些不必要的组件,节省了更多的物理空间 。
为什么使用无线编程吗?
为什么不. 我的意思是,这是未来的,如果你认为我的Arduino代码可以更好你可以上传代码,Arduino在锁紧的地方没有USB。 (如果你懒得连接USB编程)
步骤1:多任务与Arduino的Delay Analogy
多任务处理
主要目标是褪色/闪烁的LED,播放音乐,并允许Arduino可以听任何用户输入通过蓝牙 在同一时间 。 这怎么可能? 答:多任务的实现!
好吧,你让我 ;它叫多任务制造幻觉。 你看,电脑(如Arduino)不多的任务,相反,他们所做的一切,一次一行代码,但是他们做的真的很快,使用一个时钟,因此看起来像他们可以多任务! 你可能会听到有人说超频CPU。 这基本上使你的CPU更无功的时钟,从而提供更高的处理能力。 时钟是CPU立足了跟踪速度应处理的数据从一个位置到另一个位置,做一个动作。
这就像你的孩子大吼大叫,“我们在家吗?” 每一秒,你说“我们不是”。 但有一个小的时间窗口,当你说“我们”;如果孩子错过时间的小窗口,甚至1次,你还是会说“我们没有”,继续开车在路上经过你家(这听起来很可笑,但坚持用类比)。
当你说“我们”,进入你的房子你刚刚做了一个动作,监控车内的一切,如车灯、喇叭、对你的孩子来说 在“同一时间”或在一个非常快的速度顺序。 这是怎样的 millis()作品.
Arduino的Delay
现在有了这个脏的功能,如我所说,名为 延迟 ()。 是什么情况呢?
使用同样的比喻一样,如果你使用延迟你会到达你的目的地, 但你不能 做任何事情,一路上。 所以,Layman,你会继续开车从一个随机的位置,你的房子在一条直线上;你将穿越在一个恒定的速度,你的一切因为你不能停止或关闭(或 甚至把一个信号灯 )因为延迟迫使你等待,盯着时钟,直到时间来做一个动作。
这就像你会盯着时钟(在工作或学校)开始兴奋的一天结束。 你专注于<strong>一件事:时钟</strong>!
结论
因此,更频繁的孩子大叫(孩子,请不要这样做),更多的机会,你可能会说“是”,在给定的时间窗口,去你家。 因此,更快的计算机的反应时间,更快的处理能力(和Arduino的延误原因较少使用更快的反应时间)。
事实上,如果我们摆脱了delay(),我们可以让电脑。 但不要高估自己,Arduino Uno的时钟速度是16mhz,而i7核心处理器,在大多数Windows电脑,是2.4GHz。 所以,这是一个巨大的差异 。 因此,Arduino可以如果你加太多的数据读到有些延迟。
太多的滞后可以衰落LED播放音乐了 在同一时间 由于输出时钟读数的要求一致 millis()。
但是,阅读从蓝牙而衰落LED<strong>或</strong>演奏音乐是好的。
主要目的:
正如你们许多初学者Arduino的知道,<strong>你喜欢用delay()</strong>。 这是一个很大的不,不,不!
这个项目的目标是影响我的同胞的人避免使用delay()和大规模的项目应该是一个例子。 当你使用延迟,你停止整个Arduino直到给定的条件是完整的。 例如:如果你想 眨眼LED的每一秒,最简单的方法就是延迟(1000)。 但这是非常低效的,如果你想在闪烁的LED播放音乐,你根本不可能,所以你不得不多任务的Arduino。
所以你知道你想要你的机器人在同一时间做一些事情。 这可能是很难在第一,这就是为什么它总是有助于你身边示意你的计划有一张纸。 无论如何,一个主要的功能我想你学的是 millis()功能和如何使用它来做一些其他很酷的和不必要的东西 同一时间 。
所以准备好“沟延迟看钟”,为我的老板曾说!
步骤2:收集工具
你将需要这些工具:
带橡皮的铅笔(你会发现他们在学校)
烙铁 链接
有些焊料 链接
电气胶带(从您当地的五金商店和沃尔玛)
剪刀(你可以在你的孩子的背包或沃尔玛找到它们)
线切割机(从您当地的五金商店或洛斯)
镊子 链接
一个小型的热胶枪( 亚马逊或者在业余爱好大堂)
电钻(在您当地的五金商店和沃尔玛)
一个平头螺丝刀(-)
十字螺丝刀(+)
线机(在Lowes)
美工刀(沃尔玛)
一个表做这一切的东西。
电脑(Mac或Windows)与蓝牙功能(或蓝牙适配器)
步骤3:收集无线编程器材料
好吧,到无线编程器的成分如下:
Arduino Uno(这将在教程中使用的)或任何其他Arduino电路板。 链接(如果这是一个中国克隆的吧)
#p#分页标题#e#打印机的USB电缆或任何USB电缆,需要计划你的Arduino板。
一个hc-05蓝牙模块,以突破板(小心骗局,和链接是安全的) 林K
女性对男性和女性对女性的跳线(不妨让男性对男性的其他项目(不是我)在未来) 李NK
一个破碎的跳线是件(⅔)的hc-05突破板长度。
(可选的现在,但要用厨房定时器后)发光二极管 链接
一个10K,一个1K的电阻,和一个大约2K的电阻。 链接或 糖果袋(相信我,你将节省更多的钱因为这样你得到的各种电气元件)
1用友一个电容(与比Arduino UNO,如纳米的波特率下Arduinos)和01(Arduino Uno)用友。 基本上,越大的波特率下的电容。 我想你可以摆脱一个1uF的电容或以上, 但我警告你 更高的电容并不意味着更好。 只要是安全的,使用不到1uf是安全的。 同时,确保对电解电容器的额定电压大于5伏。 糖果袋另外,陶瓷和铝电解电容器好这个电路。
步骤4:收集材料,厨房定时器
同样的Arduino电路板 链接
继电器模块 链接
“这些…我的意思是LEDs(我们只需要一个) 链接
一个220-550(欧姆)电阻
有源蜂鸣器和压电扬声器(只有一个) 链接
我们将完成修改hc-05模块后<strong>8步</strong>
你可以用别的容器包装的所有组成部分,但要确保它不是金属的因为我们将处理的交流电(AC)。
一架板插座
与有线PC的电源输入口
一个5-12v和1.25-1.95 AMPS与DC jack之间的权力Arduino的AC适配器(你可能会找到一些旧设备,直流插孔) 链接
四螺钉和四个螺母配合。(最低)(看图片)
四垫圈,安装螺钉(最低)(看图片)
跳线
热收缩管(电线 链接)
步骤5:在命令模式(复位电路)
我觉得它更容易看图片因为他们按照原理图(电路)和最节省物理空间。
销的位置 :
该hc-05状态引脚连接到陶瓷电容器。01用友,但如果您使用的是电解电容器确保(-)距国家销盖点。
连接一个10K电阻接地的陶瓷电容器或另一端(-)帽的电解电容器(我用的是陶瓷电容器)。
最后,将复位线从Arduino的电容和10K电阻之间的电线或接头。
什么是与电容和电阻?
Arduino的复位引脚,只有当它被拉至GND(地)。 因此,该电路作为一个复位定时器。
如果你已经注意到,每次你上传你的代码,你的电脑首先重置Arduino(Arduino的内置LED闪烁迅速在第一)然后上传代码。 这项技术是AtMega芯片的方式(在Arduino单片机)注意,有人将代码加载到它们,但复位时间是开放的一个小的时间窗口。 如果你刚刚摆脱的电容,然后复位线就会被拉得太久,你会错过那开放的时间窗口打开的上传能力的Arduino。
波特率:波特率越大电容。
下一步将告诉你如何处理逻辑问题(hc-05 RX Arduino TX)使用电压分压器。
步骤6:在命令模式电路(分压器)
*只是一点有用的提醒。 示意图只显示引脚和他们应该连接,但是Arduino引脚位置,右边是水平翻转。 但原理图的引脚位置仍然是正确的。* *
为分压器的公式是(VOUT = VIN * R1 /(R1+R2))。 我们要转换成5V至3.3333…V,这就是为什么我们使用1K和2K的电阻。 所以你可以使用2K和4K或。5K和1K。了解分压器,看看这个 链接。
只是带1K的电阻和弯曲成L形,使它的一个腿长。
现在,以2K的电阻和一个短的腿弯曲。 屈腿的1K的电阻焊接弯接头。
其次,采取一些跳线连接!
这里是引脚位置:
Arduino的GND去hc-05的GND。
Arduino的5V去hc-05的VCC(+5V)。
我搞砸了,接下来的两步骤的图片但纠正它最后的三张照片。 别担心,下面的步骤仍然是正确的。
Arduino的D10去hc-05 TX引脚。
Arduino的D11去电压分压器去hc-05的RX引脚。
1K的电阻可以被确定为数# 1或“领袖”,因为它是排在第一位的,它的微小的“领袖棒”。 <strong>腿不弯曲应连接到Arduino的TX引脚,该引脚D11。</strong>
<strong>2K的电阻</strong>是电阻右边没有坚持带路。 腿不弯曲<strong>应连接到Arduino的GND。</strong>
最后的最后一站,或“领导坚持“应该连接到hc-05的RX引脚。
它应该看起来像下面的图片
最后,将改进的复位线hc-05到Arduino的复位引脚。
为什么电压分压器?
如果你跳过这一步,然后 这是一个保证你hc-05将 油炸 在无线接收生命的某些时刻。 我的意思是,hc-05采用3.3 V的逻辑电平和Arduino使用5V的逻辑电平。 当Arduino接收数据从hc-05两模块好因为Arduino可以采取一个3.3V逻辑电平因为3.3V作为一个二进制1,0V则视为一个二进制0。 从3.3 V,一半以上的5V是二进制1。 但如果你把hc-05接收线,这是一个完全不同的故事。 Arduino会发出一个0-5V信号,因为hc-05期待3.3V逻辑损坏的hc-05 RX引脚。 不幸的是,我是一个反叛和炸我整个hc-05板,所以不要做我所做的,用分压器。 * * * * 它肯定没有电压分压器工作,但突然的震动对任何跳线可以轻易炒由于小静电荷的蓝牙模块 * * * *
是的,要3.3-5v因为hc-05具有电压调节器使用VCC电源hc-05是完全安全的。 但RX线不因为Arduino Uno是过时的。
我认为所有的新传感器出来的热潮,每个人都希望Arduino改变5V稳压器3.3V,但这只是一种直觉。 :)但是你现在,Arduino与3.3V逻辑层面Arduino板101! !! !
在下一步中,我将通过软件整合为hc-05设置。
步骤7:在命令(软件)
下载最新的 Arduino IDE
下载at_command.ino素描在底部或复制并粘贴以下代码:
在命令代码
#包括<< softwareserial。H >
softwareserial myserial(10,11);// RX,TX,不再迷茫。 记住,在hc-05 Arduino是TX RX和rx-tx.欢迎你!
无效setup() {
系列。开始(9600);
串行out.println(“输入命令:”);
myserial。开始(38400);//默认速度
hc-05串行。”程序的一个新的println(hc-05蓝牙模块如下”);
延迟(500);
串口打印(“”);延迟(1000);串口打印(“+组织的”);串口打印(“+角色= 0);串口打印(“+极= 0”);串口打印(“+ UART = 115200,0,0”);串行out.println(“+初始化”);
延迟(1000);
}
无效loop()
{
如果(myserial。available()){
系列。写(myserial。read());
}
如果(串行。available()){
myserial写(。
看看上面的视频的1080p或阅读下面的说明。
为了使hc-05无线编程器,它必须用同样的节奏为Arduino。 当我说我的意思是波特率的节奏。 现在,当你在邮件中收到你的hc-05,可能是在38400的默认波特率。 但是Arduino Uno在115200 / 57600和纳米是57600。 基本上,如果你读的ATMEGA芯片或矩形广场IC你将看到的名字。 ATmega328通常是57600波特率和ATmega168 19200(太慢了)。 你总是可以玩他们唯一可能的波特率的hc-05可以处理:4800,9600,19200,38400,57600,115200,23400,460800,921600,1382400。为了设置波特率,必须在命令模式下输入。
打开Arduino IDE。
点击文件->打开->无论你救了at_command.ino素描(通常在下载)
打开at_command.ino
你也可以打开一个新的草图,和代码复制并粘贴在确定新素描的空白setup()和loop()你改写。
单击“工具->板:选择你的板(我用的是Arduino Uno)
单击“工具->端口:选择你的板的端口号(你可以通过进入设备管理器,找到你的USB设备端口)
确保你的电路是由前一步仍然不变(hc-05 TX引脚10和hc-05的RX引脚11通过分压器)#p#分页标题#e#
点击上传,等到它说“完成上传”在屏幕的底部。
现在断开hc-05 Vcc(5V)。
记者在hc-05背在VCC同时插入按钮(5V)。 LED开始闪烁每2秒。
在右上角点击串口监控(它看起来像一个放大镜)
你会看到一个空白的屏幕,然后说“输入命令:“
确保在底部设置左串行监测角说:“两NL和CR”和9600波特率。
输入以下命令每一个命令在获得好的回应后(输入以下6个命令。 在+姓名+ Pswd是可选的)。
在
在组织的(复位hc-05默认出厂设置)
在+角色= 0(主从模式)
在北极= 1,0(内置LED设置)
在UART = 115200,0,0(这是Arduino Uno。 例如,如果你有你会说57600,0,0)纳米
在+名字=(任何你想要的名字)例如,我在+姓名=羊肉说(就不说了)
在+ Pswd = 4的PIN码(默认密码为1234)
在init(启动蓝牙)
您刚刚创建了一个无线编程器! 现在让我们来测试它。
at_commands.ino
下载
步骤8:测试无线编程器
按照最终的无线编程器原理图
只要将针从D10和D11 D0(RX)移动到D1(TX)。
把一个LED的引脚11的电流限制电阻(小腿到GND和长腿到引脚11)。
目前公司LED可以通过焊接220-500欧姆电阻的一个LED的腿。(看更详细的说明,图片)
装饰发光二极管和电阻,LED的前剪腿=微调电阻的长度+装饰LED的腿。
下一步,只是绕焊在电阻焊电阻的LED。
现在用你的无线编程器连接到你需要它。
让您的Windows或Mac电脑在去蓝牙设置。
插上电源的Arduino通过USB连接到电源,或另一台计算机,或使用9V电池通过电源插座。
等到你看到这个名字,你把你的蓝牙模块,出现在设备列表。
您的设备上点击,在这种情况下,我的是“羊肉”。 你应该等到你看到在hc-05 LED开始闪烁每2秒(不小心说1秒的视频);这意味着它是连接。
断开Arduino的电源,然后重新连接。
更多的蓝牙设置,点击COM端口点击。
找到你的COM端口,标有“名字”开发的B,例如,我的端口是14因为它说羊肉开发B。
你可以删除蓝牙设备输入信号,因为你不需要它。
推出Arduino IDE打开闪烁的例子。 文件-> -> ->眨眼基本例子
去工具并确保董事会是正确的,端口设置是一个你发现。 对我来说,我会点击端口:14,板:Arduino Uno。
打上传和它应该工作! 如果它不工作,一直点击上传(它可能是一个定时误差,但它很少是我制作的电路)。
<strong>重要**如果</strong>你想重新上传,确保串口监控关闭击球前上传<strong>* *</strong>
最常见的问题是我发现有些人不使用适当的蓝牙软件。
真实的故事的时候 :回到我的天,我一直在努力,努力让这个电路工作,我流泪了,浪费了大量的时间。 直到我读了科学制造网站这一后我才意识到它的工作在Windows和Mac的蓝牙软件。 显然,我使用的是东芝的蓝牙协议栈,我确信你们中的许多人都太。 就切换回老的Windows蓝牙协议栈。 相信我,如果你加入有更多的好处。 当然,你可能不能玩电脑游戏一样 用Wii Remote Minecraft使用 glovepie,但编程无线更好。 此外,你可以切换回来。 毕竟,这是你的电脑。
如果你有任何问题,解决问题,请不要犹豫,请通过评论。
步骤9:厨房定时器(容器)
把覆盖在绝缘盒。
以导电盒与盖连接,并用铅笔素描的四个边的中心 盖( 使用斜线找到交叉点,这是该中心 ) 。 在每个中心的全部4个边画一个洞(不包括封面的顶部和底部)(见图片)。
用电钻钻4个孔与仍在盖。
现在拆下盖。
把螺丝插进盒子从外面。 将螺母在螺杆从里面。 使用螺丝刀,螺丝钉保持螺母。(你应该紧密配合。 看图片)
把热胶枪胶在螺母和螺钉,除了螺丝的底部(朝向盒子中结束)
继续这剩下的3个漏洞。
下一步,将盖和胶垫圈四个孔在外面。
现在,把盖子盖上。
然后,在每一个孔,以确保其符合和摆脱多余的胶水螺丝钉。
擦掉铅笔痕迹。
最后,它应该看起来像最后一张照片。
步骤10:厨房定时器(AC开关)
你会需要成人监督这部分。
总结这一步,你把插座放在系列继电器和PC的电源进。 然后,把它放在盒子中包装整齐。 用热缩管来掩盖在PC的电源入口节点,因为它是交流电压(跳到下一步学习如何使用热缩管现在)! !! 别忘了用电工胶带无处不在。(看图片)
确保接地(绿色)线连接到金属(光泽)墙上的插座板。
另外,确保你有两线剩下连接墙板和系列PC的电源入口后(看图片)。
确保你不要碰VCC,GND,在(信号)的继电器模块呢。 我们将讨论在下一步。
一条线(黑色)连接到左侧(继电器的常开边)。
其他电线(松跳线)应连接到继电器的中间。
把墙上的电源插座上的底部,在盒子的中心和它周围画一个轮廓。(看图片)
现在把封闭区域(我们在上一步了)。
我用电钻因为我没有旋转的Dremel。
只是钻一孔沿轮廓你画的每个孔之间的差距小。
然后,使用压力,弹出关闭钻区。
把墙上的电源插座上,在串联电路中,你把孔内。(看图片)
钻两孔为两个螺钉来固定插座。
把塑料垫圈和胶水在两孔的表面从盒子里面的观点。
在两个螺钉拧入孔,并安装面板。
从盒子的内部来看,胶在墙上的电源插座上,它不会掉出来。
用电工胶带在中继模块和周围的每一个金属物体内盒。
这包括把电工胶带(由内而外)周围的4个螺丝,把盖。
如果你不能达到用电工胶带的一些地区,尝试使用热熔胶代替。
现在把电脑的电源入口和脸放在这个盒子的一个墙(里面的观点)。
把电脑的电源<strong>线</strong>放在你想要的地方你的入口区。
恭喜. 你完成了这一步。 你是3 / 4的这个项目做的方法!
步骤11:厨房定时器(无线编程器的最终电路)
图片前,示意应该告诉你我们现在所处的位置(如果你迷路了。)
按照新的示意图。 Piezo暗示,蜂鸣器有极性(看图片)。
从盒子中取出盖。
将Arduino在盖底顶。 确保入口面临在同一方向的PC电源入口的切口。(查看图片)
使用任何器皿和草图的USB口和DC Jack概述。
剪出轮廓的美工刀。 是否有足够大的刚棒Arduino的入口,通过相应的孔。
#p#分页标题#e#用热胶,把Arduino进你想要的区域。 同时,确保USB口和DC jack正在经历的剪影。
你会发现一个问题,把盖子盖上盒子!
为了解决这个问题,你将不得不做出另一个缺口,但 这个时候,你会在盒子上做切口(不是盖的)! <u>检查图片</u>
接下来,焊料的压电蜂鸣器长跳线就像我们与LED 步骤8。
现在,添加热缩管保护导线的金属接头(用于LED和Piezo buzzer这样做)。
FYI(供你参考):使用烙铁的热量,缩短了热收缩管!
现在,有一把尺子和找到中心墙上的插座(墙壁插座上方的一侧)。
在发现中,找到大小合适的钻头适合LED开始钻探!
坚持领导的箱子里面直到你能看到头的LED开始凸出的孔(从外面)(看图片)
涂一点热胶在LED从箱子里面。
现在有一个完全符合压电蜂鸣器孔内的钻头。
使用相同的钻头,在盒子的侧面的中间钻一个孔(对我来说,我把蜂鸣器在白色的线。 检查图片)
最后,幻灯片对LED腿接地跳线热收缩管。 然后,焊接引脚到适当的位置。 之后,使用烙铁收缩的热收缩管的导电金属接头(看图片)。
LED(-)去蜂鸣器(-)。 LED(+)去Arduino引脚D11
不要做我所做的第四张照片中的结束。 只是你的消极和积极的电线,但<strong>原理是一样的</strong>。 所以,蜂鸣器(-)到LED(-)。 和蜂鸣器(+)去Arduino引脚D6
步骤12:你的状态和上传的代码
好吧,伙计们,
只要解压ZIP文件和从底部上传代码。 别忘了包括 时间库。(看看如何添加库,看看这个 教程)
现在,点击上传,和高枕无忧你Arduino接收HEX文件传输通过蓝牙。
最后,下载下面的应用程序从谷歌PlayStore” Arduino蓝牙控制器“Giumig Apps。
重要的******如果要重新上传,确保串口监控关闭击球前上传***
到目前为止,你已经学会了如何程序的无线和填满所有的事情知道的人,给一个电击,在一个小盒子。 好吧,我说你已经相当远(看图片)。
“最后倒计时”的代码如下:
如果你想要更多的空间在Arduino上运行的代码,你可以评论/删除了介绍,位于setup()。 从“欢迎弥敦^ 2的通用AC开关…”
你需要下载代码的底部,这是一个zip文件,为了得到球。H和ac_switch_with_no_delay代码放在一起,否则你会得到一个错误代码中缺失的音调。h文件。
下面的代码只是为了显示什么样子如果你没有Arduino IDE编辑器。
“倒计时”计时器代码
#包括<<时间。”
#包括<< timelib。H >
/ *
我是一个自由软件;你可以将我和/或修改
我,但你必须有人参加拍我。
创作者:Nathan Ramanathan(但我的朋友叫我弥敦^ 2)
/ /特别感谢秃头工程师FadeWithoutDelay密码
/看到更多的信息
* /
/ -----------------------------------------------------------不要连接销D12是因为它作为一个虚拟销--------------------------------------------------------- /
int dummypin baldengineer.com/fading-led-analogwrite-millis-example.html = 12;//我原来一个错误d33了Arduino板,有少于33的I /。 所以我决定牺牲一个真正的销。
int piezopin = 6;//该引脚连接到压电蜂鸣器
#定义继电器8 / / #定义是一个简单的方法来识别,在任何人的代码,所有的引脚Arduino会乱动。
#确定LED 11
int speakerpin;
/全局变量
int HR = 1;// 1小时
int Mn = 30;// 30分钟
int秒= 0;// 0seconds /因此,1小时和30。 //Use maxLoad for the maximum amount of time for the switch to be open(For safety purposes).
double maxLoad = hr * (60 * 60 * 1E3)/*hours*/ + mn * (60 * 1E3)/*minutes*/ + sec * (1E3)/*seconds*/;
double h = 0, m = 0, s = 0, a = 0, b = 0, c = 0, BeepTime = .25E3;
bool e = false, d = false, f = false, fadeOrNot = false, viewer = false, pause = true, start = false, shortTime = false, lightOrNot = true, buzzOrNot = true; //If you music off as default, simply change buzzOrNot to false
String where = ""; String split = "";
int str = 0, count = 0, buzzerCount = 0;
double interval = 0;
double newInterval = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////
// define directions for LED fadeWithoutDelay
// constants for min and max PWM
const int minPWM = 0;
const int maxPWM = 255;
// State Variable for Fade Direction
bool q = true;
// Global Fade Value
// but be bigger than byte and signed, for rollover
int fadeValue = 0;
// How smooth to fade?
字节fadeincrement = 5;
/ millis()时序变量,只是衰落
unsigned long previousfademillis;
/多快
int fadeInterval = 45;
//////////////////////////////////////////////// The FINAL COUNTDOWN song
#include "pitches.h"
unsigned long songMillis = 0;
int thisNote = -1;
// notes in the melody:
//int melody[] = {
// NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
//};
int melody[] = {//The FINAL COUNTDOWN song
NOTE_B4, NOTE_A4, NOTE_B4, NOTE_E4, 0, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4, 0, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_E4, NOTE_FS4, 0, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_FS4, NOTE_A4, NOTE_G4, 0, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_E4, 0, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4, 0, NOTE_B4, NOTE_A4, NOTE_B4, NOTE_E4, NOTE_FS4, 0, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_FS4, NOTE_A4, NOTE_G4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
16, 16, 4, 4, 2, 16, 16, 8, 8, 4, 2, 16, 16, 4, 4, 4, 4, 16, 16, 8, 8, 8, 8, 4, 8, 16, 16, 4, 4, 2, 16, 16, 8, 8, 4, 2, 16, 16, 4, 4, 4, 6, 16, 16, 8, 8, 8, 8, 4
};
const int lengthOfSong = 23 + 26;//因为某些原因millis()不喜欢计算数组的大小。
///////////////////////////
////////////////////////////////////////功能干预
unsigned long的millis() psmillis = 0;
unsigned long shorttimemillis = 0;
unsigned long placeholder1 = 0;
unsigned long placeholder2 = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////
无效setup() {
/ /把你的设置代码,运行一次:
系列。开始(115200 /);取决于Arduino你选择,因为我们正在利用。 例如,该hc-05和Arduino都运行在115200的波特率。
speakerpin = piezopin;
pinmode(speakerpin,输出);/ Arduino的引脚输出/告诉
pinmode(LED,输出);
pinmode(继电器输出);
digitalwrite(继电器,高);/ /关闭交流开关(继电器)
///////////////////////////////////////////////////////////介绍(只运行一次)
串行out.println(“欢迎弥敦。 你想把这台机器上多久? 例如,4小时,30分钟,2秒的4h 30m 2S。 顺序并不重要。”);
/串行out.println(“T \但,如果你输入4h 2m 3S,但是你实际上意味着1m二十多岁的时候,只需输入您的意思‘噢1m 20s。 这真的很简单!”) ;
/串口。println(”式“V”的观点去看你。 1.5小时最大(安全隐患)!”) ;
/串行out.println(“你知道有一个! 要打开或关闭它,“L”型。”);
/串口。println(”式的“B”把报警状态。”);}
无效loop() {
/把你的主要代码,运行多次:
unsigned long currentmillis = millis();
如果(串行。available()){
STR =串行。read();
如果(因而isalpha(STR)! 开始)
开关(STR){
案例“H”:/ /小时
H =哪里。tofloat();/ /不修改变量H,M,或是因为我们想用户所输入的显示!
interval -= a;
a = (h * 60 * 60 * 1E3);
where = "";
d = true;
interval += a;
psMillis = millis();
viewer = true;
break;
case 'm':
//minutes
m = where.toFloat();
interval -= b;
b = (m * 60 * 1E3);
where = "";
e = true;
interval += b;
psMillis = millis();
viewer = true;
break;
case 's':
//seconds
s = where.toFloat();
interval -= c;
c = (s * 1E3);
where = "";
f = true;
interval += c;
psMillis = millis();
viewer = true;
break;
case 'v':
if ((interval <= maxLoad)) {
Serial.print("You entered a time of ");
readTime(d, e, f, h, m, s);
Serial.println(split);
Serial.print("\t");
串行out.println(“Y型”是的,我们将开始!”) ;
查看器=假;
} { //其他
。 改变就改变了maxLoad开头的所有代码(17-19行)。
串行out.println(“太! 走下“+字符串(HR)+“小时”+字符串(Mn)+“分钟”+字符串(SEC)+“秒”);}
打破;
案例“Y”:
如果((间隔≤maxLoad)&(间隔>0)){ // /启动机器
查看器=假;
fadeinterval = 4;
println(”系列。 ;
串行out.println(“暂停/恢复:'p'不复位:R T端的计时器:“E”没有剩余时间:‘W’。”);
如果(buzzornot){
期= true;
beeptime = 1E3;
buzzercount = 4;}
如果(lightornot){
digitalwrite(LED,高);
}
digitalwrite(继电器、低);
fadeornot = false;
newinterval =区间;
psmillis = millis();
开始=真;
placeholder1 = millis();
}
打破;
}
开关(STR){
案例P
如果(':
{开始){ ////////////////////////////////////////////////////////////////////////////////////最! 停顿){ //该代码允许用户暂停机定时器然后继续回到它离开的地方。
暂停= true;
fadeornot = false;
newinterval = newinterval -(placeholder2 - placeholder1);
psmillis = currentmillis;
placeholder1 = currentmillis;
串行out.println(“恢复”);
digitalwrite(继电器、低);
;)
别的{
暂停= false;//相信它或没有,但我们需要暂停虚假,为了。 :0
fadeornot = true;
placeholder2 = currentmillis;
双pausedinterval =(newinterval -(placeholder2 - placeholder1));
打印串口。 剩余时间:”);
readduring(pausedinterval);
digitalwrite(继电器,高);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
} } }
打破;
案例的“r”:/ /复位定时器
如果(开始){
串口打印(“重置定时器回到“);
readtime(D,E,F,H,M,S);
串口打印(分);
newinterval =区间;
如果(停顿){
串行out.println(“恢复”);}
其他
{
串行out.println(“,还暂停”);}
psmillis = millis();
placeholder2 = millis();
placeholder1 = millis();
数据= 定时器
如果(开始){
串行out.println(“结束计时器”);
暂停= true;
newinterval = 0;
数据= lengthofsong + 1;
}
打破;
案例“W”:/ /结束计时器
如果(启动和暂停){
系列。打印(“T T T时间:”);
双pausedinterval =(newinterval -(millis() - placeholder1));
readduring(pausedinterval);
}
打破;
案例“L”:/ /灯光设置
lightornot = true;
如果(计数= = 0){
digitalwrite(LED,低);
lightornot = false;
串行out.println(“T tnightlight:关闭”);
fadeornot =! 开始){
digitalwrite(LED,高);
串行out.println(“T tnightlight:“);
fadeornot = true;
}
else if(数= =! 开始){
fadeornot = false;
串行out.println(“T tnightlight:衰落”);} else
(启动和暂停){
如果(计数= = 1){
fadeornot = false;
串行out.println(“T tnightlight:简历衰落”);
计数+ +;
}
}
别的! pause) {
if (count == 1) {
count++;
fadeOrNot = true;
Serial.println("\t\tNightLight: Blinking");
}
}
if (count == 2) {
count = -1;
}
count++;
break;
case 'b': //Alarm settings
Serial.print("\t\tBuzzer: ");
if (buzzOrNot) {
buzzOrNot = false;
shortTime = false;
speakerPin = dummyPin;
Serial.println("Off");
}
else {
buzzOrNot = true;
Serial.println("On");
speakerPin = PiezoPin;
shortTime = true;
BeepTime = 75;
}
break;
}
}
else if (isDigit(str)) {
where += char(str); //Add numbers, not words, in a string that will be converted later with toFloat().
}
}
else { //This else statement will probably have more instances tha#p#分页标题#e# n if语句,所以它是完美的代码,需要更新每一毫秒!
如果(fadeornot = = false){
dothefade(currentmillis);//衰落LED(… 因为它看起来很酷)
}
如果! 暂停和lightornot){
如果(currentmillis - psmillis > = 500){ //显示计时器暂停
digitalwrite(LED,! //读出数字接口的值(LED));//将LED和快速的方式。
psmillis = currentmillis;
} }如果
(短期){
如果(currentmillis - shorttimemillis > = beeptime){
如果(buzzercount > 5){
期=假;
buzzercount = 0;
其他
{ },! //读出数字接口的值(speakerpin));
shorttimemillis = currentmillis;
buzzercount + +;
} } }如果
((观众)){
如果(currentmillis - psmillis > = 3E3){ //输入后,定时器,用户可能不知道。 所以一个提示会弹出像一个恼人的广告后3秒。
串行out.println(“T”型以为:“V”来查看你的计时器。”);
psmillis = currentmillis;
查看器=假;
} }如果
(启动和暂停){ //,if()声明,激活时,“Y”是输入序列。
/ /
如果(间隔> = 18.5e3){
如果(currentmillis - psmillis > =(newinterval - 18.5e3)){ //这将关闭当表机。 18.5e3秒的音乐播放时间。
melodywithoutdelay(currentmillis);/ /结束计时器倒计时的歌
} } {
其他
如果(currentmillis - psmillis > =(newinterval)){
数据= lengthofsong;
melodywithoutdelay(currentmillis);/结束定时器哔哔声
} } } }
}
/无效dothefade(unsigned long thismillis){ //特别感谢秃头工程师FadeWithoutDelay密码
/看baldengineer.com/fading-led-analogwrite-millis-example.html更多信息
/ James Lewis创造的
/是时候更新
/如果没有,什么都没有发生
如果(lightornot){
如果(thismillis - previousfademillis > = fadeinterval){
/是的,它是!
if (q) {
fadeValue += fadeIncrement;
if (fadeValue >= maxPWM) {
// At max, limit and change direction
fadeValue = maxPWM;
q = false;
}
} else {
//if we aren't going up, we're going down
fadeValue -= fadeIncrement;
if (fadeValue <= minPWM) {
// At min, limit and change direction
fadeValue = minPWM;
q = true;
}
}
// Only need to update when it changes
analogWrite(led, fadeValue);
// reset millis for the next iteration (fade timer only)
previousFadeMillis = thisMillis;
}
}
}
void readTime(bool a_a, bool b_b, bool c_c, int hh, int mm, int ss) {
split = "";
if (a_a) {
split += (hh + String(" hours"));
}
if (a_a && b_b) {
split += ((", and ") + String(mm) + String(" minutes"));
}
else if (b_b) {
split += (mm + String(" minutes"));
}
if ((b_b && c_c) || (c_c && a_a)) {
split += ((", and ") + String(ss) + String(" se 条件”));} else if(
c_c){
分裂+ =(SS +字符串(“秒”));}
! (a_a)&! (b_b)&! (c_c)){
分=(显然没有。”);} }
无效readduring(双把){
int哈=小时(弄/(1E3));
int马=分钟(得到/(1E3));
int SA =二(得到/(1E3));
布尔真=假;布尔btrue = false;布尔ctrue = false! = 0)
真实=真实;
如果! = 0)
btrue = true;
如果! = 0)
ctrue = true;
readtime(真正的,btrue,ctrue,哈,马,SA);
系列。println(分裂);
}
/
无效MelodyWithoutDelay(双cmillis){
int noteduration = 1700 / notedurations [数据];
int pausebetweennotes = noteduration * 1.2;
如果((cmillis - songmillis <= pausebetweennotes / 4)){
digitalwrite(LED,低);
}
else if((cmillis - songmillis <= pausebetweennotes)){
音(speakerpin,旋律[数据],noteduration);
如果(lightornot)
digitalwrite(LED,高);
} {
其他
fadeornot = true;
如果(数据> = lengthofsong){
数据= 2;
psmillis = cmillis;
digitalwrite(继电器,高 ;
fadeinterval = 45;
fadeornot = false;
开始=假;
期= true;
beeptime = 1E3;
}
数据+ +;
不一(speakerpin);
songmillis =
ac_switch_with_no_delay.zip
下载
步骤13:结论:提示和技巧完全手册
第一步是打开你的蓝牙设备,找到你的设备。(记住,你的密码是当我们在命令模式,我的是1234)”的默认密码是1234”
第二,打开Arduino蓝牙控制器的应用。
第三、在你的设备上点击并确认没有其他设备连接到它。 同时,确保Arduino是插在通过DC插座或USB。
注:由于蓝牙模块把你的Arduino到无线接收器的USB端口是不可用的,所以你不能计划通过USB,但你可以通过USB然后程序的无线(如果你是编程通过USB,但你不是)。
在终端模式下点击。
在开始的时候,“倒计时”定时器将问你多久,你想把你的机器。
恼人的是,当你插入你的Arduino与权力、串口吐出段引言(可在setup()删除)。
串联重复setup()每次有新设备连接
所以每次你进入程序通过蓝牙后堵在Arduino的力量,会给你介绍两款!
为了避免这种情况,进入终端模式<strong>两次</strong>(只是退出程序,再点击你的蓝牙设备)。 你只需要做一次每次你给Arduino的权力。
***************************************************************************************************************************** 完全手册
定时器指令
如果你想要一个定时器1小时29minutes和30s,你会1h29m30s型和顺序并不重要。 如果你真的想让周围的混乱,你可以说“29am 1 Wh 3q,0wes,仍然得到相同的结果;只要<strong>数</strong>小时/分钟/秒总是先于<strong>信</strong>,代表的时间单位,它是一个有效的按键。 除了字母“Y”和“V”,因为他们有潜力激活定时器<strong>还没开始</strong>呢(看下面)。
这些命令只在定时器 还没有开始 (出于安全原因)
如何查看定时器吗?
类型V / /你不必型V开始计时;它只是确保你如果你输入的是不是正确的。
如何启动定时器吗?
这些命令后,定时器工作 已经开始 (出于安全原因,如人的宝贝,点击“Y”太多的时间在您的手机,集无限定时器(或大于50天:]))
如何暂停/恢复定时器吗?
如何重置定时器吗?
“R”型
如何结束定时器吗?
型“e”
如何看时间的剩余量?
型W /吐出时间做其他任何事情
这些命令 在所有时间的工作 (因为它是安全的方式)
如何关闭蜂鸣器(音)?
“B”类
如何切换光吗? / /说你不喜欢光,因为它太亮了。 嗯,你可以把它关掉,定时器仍然会做它的工作! 不是多漂亮!
“L”型切换光从->上->衰落
暂停时,LED会闪烁一次。恢复时,LED将继续以正常的速度。
技巧
<strong>让我们说你需要一个时间上的“1m40s”但你不小心输入“1m0s”。嗯,这是很简单的解决</strong>。所有你要做的是“40”型。 然后,当你输入“V”来查看你的计时器,你会看到Arduino说1分40秒。
你可能注意到你不能超过1小时30分钟的时间。 这是因为我想对这个产品添加安全功能。
例如:有人说婴儿<strong>意外</strong>类型的100h”。 这会持续100个小时,可能不会很好的机器,你的<strong>电费</strong>!
但如果你想要一个4小时的最大运行时间,你会说:
国际人力资源= 4;
int Mn = 0;
int秒= 0;
步骤14:结语:解释代码
我强烈建议听视频。
我将解释的主要复杂的代码,因为一切都比其他的暂停/恢复代码很容易了解自己。 因此,暂停/恢复的代码将被解释在视频比什么都重要。 如果你们想要我的代码的其他部分的一些解释,请不要犹豫,请通过评论。
如果你需要额外的帮助,FadeWithoutDelay检查了秃头工程师 网站。
MelodyWithoutDelay是我发明的。 它基本上是一样的tonemelody相同,除了它不包含延迟。 看看我原来的MelodyWithoutDelay下面的代码:
这首歌是为“倒计时”相同,但它的扩展版本,持续41秒。
激活型G。 测试Arduino的多任务处理能力型“H”和Arduino会说“你好”时给你唱一曲!
你可以上传的代码下面的“倒计时”计时器箱;不会发生什么不幸。
melodywithoutdelay代码
//Invented by Nathan Ramanathan
#include "pitches.h"
#define led 11 //attach a LED at pin 11
#define buzzer 6
unsigned long songMillis = 0;
bool check = false, a = false, fadeOrNot = true;
int thisNote = -1;
// notes in the melody:
//int melody[] = {
// NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5
//};
int melody[] = {//The FINAL COUNTDOWN song
NOTE_B4, NOTE_A4, NOTE_B4, NOTE_E4, 0, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4, 0, NOTE_C5, NOTE_B4, NOTE_C5, NOTE_E4, NOTE_FS4, 0, NOTE_A4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_FS4, NOTE_A4, NOTE_G4,0,NOTE_B4,NOTE_A4,NOTE_B4,NOTE_E4,0,NOTE_C5,NOTE_B4,NOTE_C5,NOTE_B4,NOTE_A4,0,NOTE_B4,NOTE_A4,NOTE_B4,NOTE_E4,NOTE_FS4,0,NOTE_A4,NOTE_G4,NOTE_A4,NOTE_G4,NOTE_FS4,NOTE_A4, NOTE_G4,NOTE_FS4,NOTE_G4,NOTE_A4,NOTE_G4,NOTE_A4,NOTE_B4,NOTE_A4,NOTE_G4,NOTE_FS4,NOTE_E4,NOTE_B4,NOTE_C5,NOTE_G4,0,NOTE_B4,NOTE_A4,NOTE_B4,NOTE_E4,0,NOTE_C5,NOTE_B4,NOTE_C5,NOTE_B4,NOTE_A4, 0,NOTE_C5,NOTE_B4,NOTE_C5,NOTE_E4,NOTE_FS4,0,NOTE_A4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_FS4, NOTE_A4,NOTE_G4,0,NOTE_B4,NOTE_A4,NOTE_B4,NOTE_E4,0,NOTE_C5, NOTE_B4, NOTE_C5, NOTE_B4, NOTE_A4,0, NOTE_C5,NOTE_B4,NOTE_C5,NOTE_E4, NOTE_FS4,0,NOTE_A4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_FS4, NOTE_A4,NOTE_G4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
16, 16, 4, 4, 2, 16, 16, 8, 8, 4, 2, 16, 16, 4, 4, 4, 4, 16, 16, 8, 8, 8, 8, 4,8,16,16,4,4,2,16,16,8,8,4,2,16,16,4,4,4,6,16,16,8,8,8,8, 2,16,16,3,16,16,8,8,8,8,4,8,1,4,8,16,16,4,4,2,16,16,8,8,8, 2,16,16,4,4,4,8,16,16,8,8,8,8,4,6,16,16,4,4,2,16,16,8,8,4,2,16,16,4,4, 4,6,16,16,8,8,8,8,4
};
const int lengthOfSong = 23+25+25+30+9; //For some reason the millis() doesn't like calculating array size.
//////////////////////////////////////////////////////////////////////
// constants for min and max PWM
const int minPWM = 0;
const int maxPWM = 255;
// State Variable for Fade Direction
bool b = true;
// Global Fade Value
// but be bigger than byte and signed, for rollover
int fadeValue = 0;
// Ho#p#分页标题#e# W顺利消失?
字节fadeincrement = 5;
/ millis()时序变量,只是衰落
unsigned long previousfademillis;
int fadeInterval = 30;
//////////////////////////////////////////////////////////////////////
void setup() {
pinMode(led, OUTPUT);
Serial.begin(115200);
Serial.println("Type 'g' to hear a melody.");
}
void loop() {
// no need to repeat the melody.
unsigned long currentMillis = millis();
if (Serial.available()) {
int c = Serial.read();
if (c == 'g') {
check = true;
fadeOrNot = false;
}
if (c == 'h') {
Serial.println("Hello");
}
}
else {
if (fadeOrNot) {
doTheFade(currentMillis);
}
if (check) {
MelodyWithoutDelay(currentMillis);
}
}
}
void MelodyWithoutDelay(long cMillis) {
int noteDuration = 1700 / noteDurations[thisNote];
int pauseBetweenNotes = noteDuration * 1.2;
if ((cMillis - songMillis <= pauseBetweenNotes / 4)) {
digitalWrite(led, LOW);
}
else if ((cMillis - songMillis <= pauseBetweenNotes)) {
tone(buzzer, melody[thisNote], noteDuration);
if (melody[thisNote] ! = 0){
digitalwrite(LED,高);} } {
其他
如果(数据> = lengthofsong){
数据= 2;
检查=假;
fadeornot = true;
}
数据+ +;
不一(蜂鸣器);
songmillis = cmillis;蜂鸣器
} }
无效dothefade(unsigned long thismillis)
/ {
如果(thismillis - previousfademillis > = fadeinterval){
如果(B){
fadevalue + = fadeincrement;
如果(fadevalue > = maxpwm){
/最大,限制和改变方向
fadevalue = maxpwm;
B = false;} } {
其他
fadevalue = fadeincrement;
如果(fadevalue <= minpwm){
/ / min,限制和改变方向
fadevalue = minpwm;
B = true;
}
}
analogWrite(LED,fadevalue);
你需要下载代码的底部,为了得到球。H和MelodyWithoutDelay码在一起,否则你会得到一个错误代码中缺失的音调。h文件。
===================================================================================
我希望你喜欢这个教程,我希望大部分你将能够程序的无线!
你想创建一个命令吗? 看看这个 链接去参加一个自由班来帮助启动你的兴趣教学。
关键是在外面玩的开心,做一些你和其他人觉得有趣,这是最困难的部分,然后你必须解释每一步的关键细节。 我希望你能加入我们的教学社区!
记住,尽量少用延迟你的代码<u>在你的工作</u>,当然:)
melodywithoutdelayexample.zip
(责任编辑:admin)