65.9K
CodeProject 正在变化。 阅读更多。
Home

微控制器矩阵分压器按钮计算器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (18投票s)

2020 年 10 月 15 日

CPOL

10分钟阅读

viewsIcon

27429

downloadIcon

402

交互式界面有助于生成各种大小的按钮矩阵的电阻比。

观看关于此应用的短视频

引言

厌倦了 Covid-19? 担心白蚁会啃食您房屋的地基? 害怕后院的土拨鼠? 如果是这样,那么全新的分压器微控制器按钮矩阵就是为您准备的!

在全球大流行期间,您还在使用您 Arduino 的 13 个数字引脚中的 8 个来控制一个简单的 4x4 按钮矩阵吗?!? 如果是这样,那么全新的分压器微控制器按钮矩阵就是为您准备的!

是的,您仍然需要戴口罩。 而且您确实应该请害虫防治专家来处理您的白蚁问题。 但至少当后院的土拨鼠听到您发现了这个鲜为人知的行业秘密时,它们会开始欣赏您是一位多么有启发性和创造力的 Arduino 爱好者。 只需使用 1 个模拟输入微控制器引脚即可控制矩阵中多达数十个按钮,您也可以戴着口罩,带着这副新潮时尚的表情走在人群中。

传统方法的缺点

如果您曾经处理过 4x4 按钮控制器,如下图所示,那么您就知道它们会产生很多令人眼花缭乱的彩色线条,使您的判断模糊不清,并让您失去为项目添加更宏伟、更美好事物的希望。 是的,闪亮的彩虹色电线看起来不错,但有时工程师、创客或爱好者需要问自己:“这些电线让我看起来胖吗?” 在没有所有这些闪亮的颜色来隐藏您亲人会真正欣赏的下垂的下巴或圆圆的脸颊的情况下,您看起来就很棒,如果您能摆脱所有那些遮盖您内在美的凌乱电线。

当然,您可能喜欢轮询单个列并逐个测试按钮行,甚至这样做两次以增加项目执行时间。 或者您可能觉得在午餐时间提起 KeyPad.h 库的引用有助于您在金枪鱼三明治和薯片之间结交朋友。 您可以轻松地啜饮您的汤,知道您的同事也分享您多年来隐藏的焦虑。 但现在,您不必再默默忍受失败的不公,因为借助全新的分压器微控制器按钮矩阵,您可以获得更好、更宏伟、更自由的午餐休息时间,它将您从过去束缚您工作的凌乱电线中解脱出来,让您仅用一根引脚即可统治您的按钮矩阵!

为什么按钮矩阵无法检测一个以上的按钮?

拥有“一根引脚统治一切”,您无需担心失去同时检测多个按钮的能力,因为一些有远见的工程师为了节省成本而忽略了 二极管,这些二极管本应保护您的测试电压免受用户笨拙的多按钮按下方式将其接地为零。 因此,不要灰心得知分压器也存在同样的“多按钮冲突”问题,即当用户不当按键产生的任意路径扭曲了微控制器测得的电压时,这些扭曲的电压会导致程序只能失败。

害怕电阻?

您是否在工作场所对碳金属氧化物“欺凌者”感到焦虑?您是否害怕缠绕的电阻让您的生活变得困难?有了全新的分压器微控制器按钮矩阵界面,您将不再被这些细长的、双腿的电阻吓倒,它们长久以来一直在嘲笑您和您毫无根据的恐惧。全新的分压器微控制器按钮矩阵应用程序就在您这边。很快,您将能够整理好您的电阻,并让它们听从您的命令。控制这些横行霸道、颜色鲜艳的色带在您的工作站里横冲直撞很容易,只要您有这个强大的新工具的帮助,您将再也不想离开它。易于使用的直观界面允许您利用强大的引擎来帮助您找到任何分压器矩阵按钮控制器的解决方案。

设置您需要解决的矩阵大小,并告诉它在哪里报告结果。该应用程序将执行一种贪婪最佳优先搜索算法,为您找到可行的解决方案,以便轻松实现单引脚按钮控制。

贪婪最佳优先搜索算法

此项目使用的是据说是“贪婪最佳优先搜索”算法,用于查找产生可行按钮控制器的有效电阻组合。为此,它需要尝试各种电阻组合,测量每个按钮按下时在测量节点产生的电压水平,并找到一种产生唯一电压“签名”的组合。下图描绘了一个 4x4 按钮矩阵。有 9 个电阻。 4 个电阻将 Vcc 连接到行按钮,4 个电阻将列按钮连接到一个公共节点。公共节点将列电阻与连接到地的公共电阻连接起来。当按下按钮时,电流会流过该按钮的列/行电阻组合,然后到达公共电阻,产生一个可以被微控制器测量的唯一电压。“贪婪最佳优先搜索”算法尝试为每个电阻使用 3 种不同的值。测量所有可能组合的结果(对于 4x4 矩阵,有 9³ 种组合),并选择“最佳”结果作为下一次迭代的种子,在下一次迭代中,它将尝试比前一次迭代搜索结果的电阻值高 +/- 1 的 3 种可能性。该应用程序在将种子值用作下一次迭代的中等范围之前,将其乘以一个增长因子。

要确定一个电阻组合是否优于另一个组合,它会测量每次按钮按下的电压。取这些电压并将它们按升序重新排序。由于有效的解决方案要求每个按钮电压水平都是唯一的,因此最佳解决方案是产生两个相邻电压之间最大-最小电压差的解决方案。如果 Vcc 设置为等于按钮数量加 1 伏特,那么每个按钮电压之间的“最大-最小电压”差将是 1 伏特。考虑到实际上微控制器工作在特定的电压水平(通常为 5V),最大-最小差等于 5 伏特 / (按钮数量 + 1)。由于在搜索开始时,它只会产生两个或多个按钮电压相等的组合,因此对于这些早期的电阻组合,“最大-最小”差为零。根据您的矩阵大小,这有时会发生好几次迭代。为了在找到一个(每个按钮按下时都有唯一电压值的)有效解决方案之前继续搜索,它在计算中将 Vcc 设置为 (NumberOfButtons+1),并测量升序排列的每个电压与 1 到总按钮数量之间的整数值之间的差值。然后,通过选择差值之和最小的电阻组合作为衡量最佳电阻组合的标准。它选择最接近整数值 1、2、3、4...NumberOfButtons 的电阻组合,直到找到第一个产生唯一电压的电阻组合,然后继续改进该结果。

当上一次搜索迭代的最佳结果被播种到下一次迭代时,这些种子值会乘以“增长率”,然后才用于下一次迭代。将此值设置为 1 会使结果保持较小,但也可能导致无限循环,其中一次迭代的结果与下一次相同。您可以增加增长因子来摆脱这个无限循环并继续您的搜索。增长率值可以在搜索期间随时更改,并且仅在上一次迭代结束时被搜索算法引用,此时增长率将与前一次迭代的最佳解决方案电阻值一起用于播种下一次迭代。

如何使用计算器界面

如果您还没有看过,请看看我录制的关于这个应用程序的 20 分钟视频

视频解释了一切,或者大部分内容。如果我没记错的话,我没有谈到“Seed”按钮。如上一节搜索算法的解释中所述,搜索的每次迭代都以先前搜索的结果为种子。使用计算器窗体中的 Seed 按钮,您可以使用屏幕左侧数字向上/向下界面上的鼠标滚轮来播种您选择的矩阵大小和电阻值。如果您想将搜索结果保存到特定目录,请确保使用“Search-Form”中的“dir”按钮设置了预期的工作目录。使用此界面,您可以使用“Load”按钮加载之前的搜索结果,然后将这些电阻值(或您打算定制搜索的修改后的形式)播种到搜索引擎中,并继续中断的搜索。当使用“Close”窗体按钮(所有 Windows 窗体右上角的 X)终止应用程序时,它将保存其搜索设置,并在下次加载应用程序时从中断处继续。

Sweep and Prune 对象

我当时在处理另一个项目(动画编辑器)时,添加了许多新选项的控件,导致我的电脑响应时间陷入停滞。可能是那些恼人的“系统中断”,但这次事件让我思考“在屏幕上放置如此多的按钮、分组框、列表框和文本框会带来很多开销……也许我可以提高用户界面的内存成本?”于是我计划只使用一个 picture box 和一个 Sweep-And-Prune 算法来实现一个更便宜的微软四十多年来一直在构建的复制品。听起来很雄心勃勃,对吧?但我成功了,于是 SPObjects 库诞生了。正如我所说,它使用 Sweep-And-Prune 算法来重新创建一个简化的、回归基础的交互式对象集合,例如标签、按钮、文本框和数字向上/向下控件。上面的 GIF 演示了交互式按钮和电压信息,它是一个与用户通过鼠标交互的 PictureBox。我仍在开发该库,目前只有少数几个对象(那些我立即需要改进我的动画编辑器应用程序的对象),我仍在努力改进它。

SPObjects 类似于...

CKObjects.classMultiButtonPic 

...我在我之前的文章 创意写作者的文字处理器 中谈到的。Sweep-And-Prune 算法需要改进它所支持的搜索类型,例如搜索包含点的元素,或搜索其区域接触或包含在另一个搜索矩形中的元素。此外,当我尝试添加新对象但它们尚未正确调整大小时,出现了问题,负宽度/高度卡住了 Sweep-And-Prune 算法,需要将其从搜索中剔除以避免这些问题。由于像 GroupBoxPanel 这样的对象包含其他对象,因此需要实现绘图顺序,并且搜索结果在报告哪个对象直接位于鼠标下方时需要考虑绘图顺序,因为通常不止一个对象。该库稳定且运行良好,尽管我无法确切说明节省了多少开销。

下一步?

这个项目就像是当我从我的小工具抽屉里拿出 4x4 矩阵,看到它们需要 8 根线才能工作时,它就冒出来了。它分散了我对 动画编辑器 (我仍然有很多计划)的注意力,但我对结果非常满意,而且它让我能够更多地测试我的 SPObjects 库。我正在考虑最终允许用户将他们的电阻库存输入到应用程序中,让应用程序告诉他们哪些电阻可以与哪些解决方案一起使用,以创建一个“一根引脚统治一切”的按钮控制器……但我还有太多其他项目计划,所以这可能需要一段时间。

历史

  • 2020 年 10 月 15 日 - 最初发布
  • 2020 年 10 月 15 日 - 有一些最后的几处小问题需要修复 - Search & Seed
  • 2020 年 10 月 16 日 - 修复了一些更多的问题 - calculate_VoltageVariance() & GrowthRate
  • 2020 年 10 月 19 日 - GrowthRate 改进 - 文件名添加 Sum 值
  • 2020 年 12 月 5 日 - 修复了 Seed & restart 问题
© . All rights reserved.