如何将 ESP32-C3 与 CD4017 CMOS 十位计数器结合,制作一个“数字轮盘”
大家好,今天我将向大家介绍如何利用 ESP32-C3 超迷你微控制器与经典的 CD4017 CMOS 十位计数器组合,制作一个“数字轮盘”。当按钮被按下时,ESP32 向 CD4017 集成电路发送“时钟脉冲”,使 LED 灯依次闪烁。松开按钮后,系统会模拟减速效果,直到随机停在某个位置,并通过串口监视器或 Wi-Fi 报告最终结果。
所需元件
电路图
本项目的接线非常简单!* 将 ESP32 的引脚 8 连接到 IC#1 的复位引脚(引脚 15)* 将 ESP32 的引脚 10 连接到 IC#1 的时钟引脚(引脚 14)* 将 ESP32 的引脚 9 连接到带上拉电阻的按钮开关 * 将 ESP32 的引脚 0 连接到带限流电阻的 Wi-Fi 指示 LED。其余接线请参考屏幕上的电路图。
为了更方便,我已为您设计了一块定制 PCB。
核心功能
我最初使用555定时器IC和几个CD4017 CMOS十进制计数器来制作这个LED轮盘项目。555定时器作为时钟振荡器,产生一个信号驱动CD4017十进制计数器。IC555的引脚3输出信号被输入到IC4017的引脚14。每当IC4017接收到一个脉冲时,就会增加计数,并激活下一个输出引脚(Q0至Q9),从而形成LED的位移效果。
这种初始设计的主要缺点是,我必须手动处理计数操作。我希望实现一个系统,能够自动累加数字,并由系统自身决定获胜者。我的目标并不是制作一个赌博轮盘,而是打造一款简单的轮盘游戏,可以与儿子一起愉快地玩耍。为实现这一目标,ESP32-C3超级迷你板成了理想选择。它体积小巧,并内置Wi-Fi功能。
因此,我放弃了使用555定时器IC,转而采用ESP32-C3板来为其中一个CD4017 IC生成“时钟脉冲”。按下按钮时,脉冲会越来越快。灯光在圆圈中快速旋转,营造出“旋转”的感觉。当按钮被释放后,旋转并不会立即停止,而是逐渐增加脉冲之间的间隔时间,使灯光逐步减速——就像一个真实车轮慢慢滑行到停止一样。一旦速度足够慢,灯就会完全停下,并通过串口监视器或Wi-Fi报告最终的LED位置。随后,结果会被保存到MySQL数据库中,并通过PHP进行可视化显示。
代码
现在我们来看看整个系统运行背后的逻辑。如前所述,该系统依赖于多种组件,包括Arduino代码、PHP、MySQL数据库等。我的GitHub仓库包含两个版本的代码:一个带有服务器版本,另一个不带服务器版本。如果你不需要将结果保存到服务器上,只需将“Code_No_Wi-Fi”上传到你的ESP32板即可。但本教程中,我将演示整个系统的完整功能。接下来,让我们逐一查看这些代码。
在Arduino代码中,你需要输入网络的SSID和密码,并设置服务器IP和URL,使其与你的PHP文件所在目录相匹配。除非你想为现有功能添加新特性,否则无需修改代码的其他部分。当启动轮盘时,ESP32会先尝试通过Wi-Fi连接到服务器。一旦连接建立,玩家即可开始游戏。按下按钮会通过减少延迟来加快LED序列的运行速度,而松开按钮则会增加延迟以减慢速度,直到达到停止阈值为止。这会在序列完全停止前产生一种自然的自由滚动效果。一旦LED轮停止转动,ESP32-C3便会将获胜位置发送至远程服务器。只要玩家继续游戏,这一过程就会持续进行。
除了代码外,我还附带了一个名为“MySQL_DB.sql”的文件,需要导入到你的MySQL服务器中。操作方法是:打开phpMyAdmin,进入“导入”选项卡,点击“选择文件”按钮,然后选择“MySQL_DB.sql”文件,最后点击“执行”按钮完成表的导入。要验证导入是否成功,请点击表格名称,检查表格结构是否正确显示。
设置Web服务器时,我们需要对从我的GitHub仓库下载的PHP文件进行一些修改。打开“Connection.php”文件,并更新其中的主机名、用户名、密码和数据库名称。然后将这些文件拖放到Web服务器上的某个目录中。为确认一切正常运行,请在浏览器中打开“Player_Results_Display.php”文件,检查排行榜是否正确显示。
面包板演示
硬件逻辑已准备就绪且服务器设置完成之后,我们可以立即在面包板上进行快速测试,以验证系统的功能。现在按下按钮,查看串行监视器是否能记录按键操作。如图所示,串行监视器会显示HTTP 200状态码,表明与服务器通信成功。在排行榜页面,我们可以确认服务器已记录到按键事件。网页每5秒自动刷新一次,实时显示两名玩家的最新得分。页面包含“玩家1”和“玩家2”的并排比分表,显示每位玩家的实时得分、胜场、负场、平局以及总比赛场次。点击“新游戏”按钮后,页面将重置,并根据当前比分更新玩家的胜场、负场或平局次数。
3D打印
我使用Microsoft 3D Builder设计了该项目的3D模型。该设计由三部分组成:
- 上部结构,用于安装所有LED灯;
- 下部结构,包含所有电子元件;
- 一个小型模块,内含蓝色Wi-Fi指示LED、电池充电模块、SPDT开关(常开/常闭),以及天线电缆和按钮开关的安装孔。
我在Bambu Studio中对模型进行切片,并使用我的新款Bambu A1 3D打印机打印出来。对于追求超精细工业级3D打印效果的用户,我建议从PCBWay.com下载STL文件进行打印。
最后,我使用亚克力颜料为项目主体进行上色,金色表面处理显著提升了整体外观质感。待油漆干燥后,我将所有LED灯安装到上部结构中,并以“每十对一组”的方式将它们的负极连接在一起。
焊接
现在,我们开始组装所有电子元件。首先,花点时间检查一下制作好的PCB质量。我已经使用PCBWay将近六年了,非常满意他们提供的最终成品。我们先将所有电阻焊接到电路板上,然后是所有晶体管。由于我特别重视IC和微控制器的处理,因此从不直接将它们焊接到电路板上。对于IC,我总是使用IC底座,如果无法找到底座,就使用母头排针。这样可以避免直接焊接,便于更换。我逐一将所有元件焊接到了PCB上。
为了给电路板供电,我们需要集成充电模块以及一些附加组件。我首先安装了SPDT开关,然后连接蓝色的Wi-Fi指示LED灯。接着,我用强力胶将世界上最小的电池充电模块粘贴到基板上,并用这个小型白色块固定。最后,根据屏幕上的电路图,将充电指示灯按要求粘贴到位。
剩下的两个孔位用于安装天线和按钮开关。最终,当所有元件都安装完毕后,我将塑料块粘入底座底部的凹槽中。这是完成所有电线焊接、连接LED灯后的电路板外观。对于第1至第10个LED,请使用公共地GND2;对于第11至第20个LED,则使用公共地GND1。
在将LED灯焊接到电路板时,请务必按照正确的顺序进行焊接,以避免物理LED编号与代码发送给服务器的内容不匹配。请遵循屏幕上的说明确定正确顺序。如果意外错误焊接了LED,可以在Arduino代码中修改数组来适应这一变化。在我的设置中,所有设备均使用3.7V可充电电池供电。不过,如果你愿意,也可以将一个220V转5V的降压转换器或USB数据线焊接到电路板上的+5V和-VE接口上。
一切准备就绪后,剩下的就是将底部部件粘贴到顶部部件上。就这么简单。
最终演示
硬件设置完成后,就可以开始玩乐了!打开设备,等待蓝色LED灯亮起。当灯亮起时,表示已成功连接到服务器的Wi-Fi网络。按下按钮即可启动LED闪烁效果。你的得分可以在任何连接到同一网络的设备(电脑或手机)上查看。
简而言之,这个装置通过为动作增加“惯性”,将一个简单的按钮与LED系统变成了触手可及的真实感游戏体验。
本文编译自hackster.io





