如何通过1个Arduino引脚访问5个按钮

电子说

1.2w人已加入

描述

第1步:零件清单

1 x Arduino(或Arduino兼容板。我使用来自moderndevice.com的BBB)

1 x 100K电阻(棕黑黄)

1 x 1K电阻(棕黑红)

1 x 10K电阻(棕色黑色橙色)

1 x 22K电阻器(红色红色橙色)

1 x 33K电阻器(橙色橙色橙色)

1 x 68K电阻器(蓝色灰色橙色)

5 x按钮开关

面包板

一些连接它的电线

第二步:理论 - 快速回顾

A

《我建议您阅读上一个Instructable的第2步和第3步了解详细信息,但是如果你很懒(嗯,我很忙),我会给你一个快速的回顾。

通常的方法读取按钮是将其连接到数字输入引脚和5V。当您按下按钮时,输入引脚连接到5V,您可以读取引脚上的逻辑高电平。

对于Arduino的模拟引脚,您可以根据引脚上的电压读取介于0和1023之间的值。 。如果有0V,则读取0,如果有5V,则读取1023.中间的每个电压将根据实际电压返回一个比例值。从此可以看出,可以连接多个按钮模拟引脚,如果你可以让每个模块引脚连接不同的电压到模拟引脚。

事实证明,这很简单。您只需为每个按钮设置不同的分压器。我将告诉你如何。

如果看一下电路,当按钮打开时,R1充当下拉电阻,但当(例如)S4按钮关闭时,电流从5V流过R5,通过按钮,通过R1和地面。 IO引脚将测量S4(或R5)与R1之间的电压 - AKA由R1和R5形成分压器。通过使用欧姆定律,我们可以计算出我们将在IO引脚上读取大约2.75V或大约562.

PS:如果其中任何一个不清楚,你应该真正阅读以前的Instructable - 我会进入更多详情。另请参阅上面关于分压器维基百科页面的链接。

步骤3:面包板

您现在可以在面包板上构建上一个电路。如果你看看前面的电路和我的面包板,你会注意到我使用了不同的电阻器。只要你记住一些事情,电阻就不是很关键。

首先,分压器中两个电阻之间的差异越大,值越接近地或者输入电压。

第二点是连接到按钮的电阻值越接近,它们之间的差异越小,这可能使得难以读取唯一值。

所以,我要做的主要是电路的变化是使R1成为47K电阻。通过使下拉电阻与范围中间的值相同,您将获得最大的读数范围。

在之前的Instructable中,我提到我有一些坏按钮,而且有些读数已经全部结束了这个地方。我猜测电动车和坏按钮等。..。..事实证明,这是一个糟糕的面包板。我正在使用两块面包板,我已经使用了超过10年,似乎有些地方不再有良好的接触了。我订购了新的面包板,但我还在等。如果您的读数不一致,请尝试将按钮移动到面包板上的其他位置。

步骤4:获取必要读数

A

下一步是获取您需要检查按下哪些按钮的值。下载附加的草图,并按照上一步中的电路设置运行它。将草图上传到电路板后打开串行监视器,然后按住按钮(每次1个)约2秒钟。

对于每个按钮,当您按下并释放它时,您将看到值可能在很短的时间内有点不一致,忽略那些不稳定的值并记下剩下的最大和最小值。

这就是我的5个按钮:

1(1K) - 》 930 - 935

2(10K) - 》 510 - 520

3(22K) - 》 315 - 326

4(47K) - 》 175 - 179

5(68K) - 》 127 - 135

正如您所看到的,通过可靠的连接,每个按钮的范围非常小。我所拥有的最大范围是11点,这意味着波动幅度约为0.054V。一点都不差。.有一个小的范围没有理由你不能使用E12范围的电阻值在10到100K(10k,12k,15k,18k,22k,27k,33k)之间扩展到12个按钮,39k,47k,56k,68k,82k和100k),下拉电阻为27K - 33K。

步骤5:编码

A

这是我进行改进的主要领域。即使先前的硬件工作并且代码可以确定按下了哪个按钮,只要您按下按钮就会报告多个按钮按下。

我现在需要的是让Arduino读取一个按钮每次按下并释放按钮时按。附加的代码执行此操作。我也只是在检查按钮状态之间延迟了50ms,这似乎足以让它去抖动。

我改变的另一件事是清理代码。前面的代码为每个按钮使用了3个常量。这个版本使用数组,使代码更容易阅读。为了使它适用于你的值,替换buttonLowRange和buttonHighRange数组中每个按钮的值(你在上一步中得到的)。

完成后,您只需要在dealWithButtonPress方法中设置要将按钮链接到的操作。现在它只是在串行输出上打印一条消息,指示按下了哪个按钮。

步骤6:扩展它

正如我在步骤4中提到的那样,这可能会以最小的努力扩展到12个按钮。

模拟输入有一个10位分辨率,使我们在0V和参考电压之间提供1023个值。如果将其除以12个按钮,则可以看到每个按钮必须在85个点的唯一范围内。为了安全起见,我会称它不超过40 - 50。如果你这样做,你将不得不使用相当精确的电阻器(或测量它们并使用接近E12值的电阻器)你会相当可能需要更好的方法去除按钮。

从我的所有值都在11点的最大范围内的事实,这似乎是完全可行的。

第7步:最后的想法

这个版本比以前的版本要好很多。我不喜欢的一件事是依靠延迟进行去抖动。我会看看中断,而不是那样读取按钮,但是现在它运行得很好。

正如我在步骤4中提到的,通过与开关的牢固连接,每个按钮的范围非常小。我得到的最大范围是11分,这意味着没有理由不使用10到100K之间的E12电阻值(10k,12k,15k,18k,22k,27k,33k)来扩展到12个按钮,39k,47k,56k,68k,82k和100k),下拉电阻约为27K - 33K。

如果有任何不清楚的地方,请随时询问,我会在必要时回答并更新Instructable。

感谢您抽时间阅读!我希望你发现这个版本比第一个版本更有用。任何反馈或评级(眨眼,眨眼)将不胜感激。此外,如果您发现这有用,请花时间在微控制器竞赛中为我投票。

这是一个非常大的项目的第一部分。希望这次我能完成它(我不打算在接下来的几周里搬到另一个大陆)。请留意我创建时钟的下一个教程,这个时钟显示多个时区,一个RGB Orb,7段显示,并将这一切与一个将更新状态的在线应用程序连接起来(如果可能在单个Arduino上)。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • A

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分