你有没有想过开发一个项目并能够将机械、电子、传感器和编程结合起来?在本文中,我们将教您如何使用Arduino创建电梯项目以及如何使用屏蔽板连接和控制项目中的所有设备。您想知道如何创建上述所有结构并开发自己的电梯制造商吗?看过这篇文章,相信你可以学习到如何使用Arduino完成完整的电梯时间表。为什么要使用Arduino开发电梯?在许多地方,电梯用于允许建筑物的用户在不同楼层之间移动。电梯是通过在其结构中使用多个传感器而具有高度安全性的设备。除了用于运送人员之外,一些地方还使用电梯作为建筑工地、餐厅、接收产品交付等的货物处理平台。学习如何建造自己的电梯将帮助您了解:电梯是如何工作的电梯中使用的传感元件有哪些?电梯的工作机制。传感器工作原理;用于连接电梯设备的控制板有很多经验可以帮助您构建自己的电梯结构。此外,您将开发编程逻辑,这是任何电子和自动化专业人士的基本点。Arduino电梯结构下图显示了项目的完整结构。电梯由4层楼和一个控制接口组成。控制界面由4个按钮和一个20x4的LCD组成。用户将能够通过每个按钮控制电梯位置,并在结构的显示屏上接收系统信息。控制箱连接到电梯的后部。见下图。电线进入这个背面区域并与负责处理编程逻辑的Arduino连接。此外,电梯结构的创建是为了方便其编程,并允许用户在编程过程中不要移除Arduino。下面是电梯结构中Arduino的图像。如您所见,可以访问Arduino的USB端口和用于电源的插孔连接器。所有电子设备都通过使用此扩展板连接到Arduino。如下图所示。为什么在ArduinoUNO上使用Shield如果您在项目中不使用屏蔽,将会出现两个大问题:焊料连接错误以及缺少传感器和其他设备的电源端子。让我们了解如何解决这两个问题?例如,看看项目的传感器。我们有4个传感器来检测电梯的位置。见下图。总共有4个GND和4根电线用于+5V连接。不幸的是,我们知道Arduino只有2个GND端子和1个+5V的连接引脚。这迫使我们将这些电线焊接在一起并连接到这些端子。但是,在某些情况下,会出现焊接连接问题,并且项目中的设备无法正常工作。这需要时间并阻止您继续前进。为了防止出现此问题并扩展电源引脚以更轻松地连接所有设备,我们为ArduinoUNO创建了Shield。您可以使用ArduinoUNO将其应用于任何项目。接下来,我们将找出项目中的哪些电子设备将连接到Arduino的Shield电路板。项目电子设备与ShieldArduino的连接该项目由几个电子设备组成。其中,我们重点介绍了L293D驱动器和直流电机。L293D驱动器和直流电机Arduino将发送命令来激活L293D驱动器并转动直流电机以移动电梯箱。我们将在电机轴和电梯箱上放置一条尼龙线以进行牵引。在旋转过程中,线会缠绕在电机轴架上。见下图。这样我们就可以上下移动电梯。但是,我们有一个问题:我们怎么知道电梯是否到达了4层的每个位置?这就是为什么我们应该使用簧片开关传感器。它们将使我们能够在电梯移动时检测到它的位置。用于检测电梯位置的簧片开关传感器在下图中,我们展示了4个簧片开关传感器。它们在检测到附近存在磁场时触发,并将向Arduino的数字引脚发送高逻辑电平信号。我们将使用连接到电梯井后部的磁铁在每个传感器移动时触发它。在下图中,我们有一层电梯井的结构。可以看出,在电梯结构中实现了直线导轨。它们旨在提高电梯运动的稳定性并防止其运动过程中的振动。因此,这改进了传感器对电梯位置的检测。下面我们有另一个线性导轨结构的图像。电梯位置由项目控制界面上的按钮选择。接下来,我们将介绍控制界面的结构。Arduino电梯控制接口这种结构是为了方便电梯控制而开发的。它由一个20x4的LCD和4个按钮组成。按钮用于请求电梯到所需位置。LCD旨在允许系统和用户之间交换数据。通过它,我们将能够呈现各种信息:电梯的运动方向电梯在什么位置用户要求发言项目的电池电量所使用的LCD具有SERIAL-I2C转换器,以减少导线数量和与屏蔽板电气连接的复杂性。现在,我们将看看如何创建编程逻辑来控制我们的JLCPCBArduino电梯的运动。Arduino电梯控制逻辑现在您了解了电梯结构是如何构建的,让我们了解如何使用编程逻辑来控制它。有多种方法可以创建编程逻辑来控制电梯的运动。我们的逻辑将如下所示工作。#include#include//Inicializaodisplaynoendereco0x27LiquidCrystal_I2Clcd(0x27,20,4);//Variavelparacontrolaraentradanoloopboolcontrole=0;boolnot_pos=0;//Variaveisdecontroleparaiteracaonoslacosforinti=0,j=0;//Variaveisutilizadasparaarmazenaraatualposicaodoelevadoreaposicaodesejadapelousuariointactual_pos=0,des_pos=0;//Vetoresparaarmazenarasposicoesdoelevador(sensor)eaposicaodesejadapelousuario(pedido)intsensor[4];intpedido[4];//Iniciodafuncaovoidsetupvoidsetup(){//Initializationof20x4LCDlcd.begin(20,4);//InicializaoDisplaydeLCD//Initializingthe20x4LCDlcd.init();//LCDBacklightActivationlcd.backlight();//Activatingthecursortothe0.0positionofthe20x4LCDlcd.setCursor(0,0);//Configurandoospinosdosbotoescomoentradaepullupfor(inti=2;i{pinMode(i,INPUT_PULLUP);}//Configurandoospinosdosbotoescomoentradaepullupfor(inti=6;i{pinMode(i,INPUT);}for(inti=0;i{pedido[i]=1;}//ConfiguracaodospinosdecontroledosmotorescomosaidasdigitaispinMode(10,OUTPUT);pinMode(11,OUTPUT);//ComandosparaqueomotorfiqueparadodigitalWrite(10,LOW);digitalWrite(11,LOW);}voidloop(){//Leituradosbotoesselecionadospelousuariodoelevadorfor(intbotao=2;botao{//Armazenaoestadodecadabotaonovetorpedidopedido[botao-2]=digitalRead(botao);//Verificaqualoandardesejadoparaoelevadorsubirif(pedido[botao-2]==0){des_pos=botao-1;controle=0;}}//Verificaseumdosbotoesfoipressionadoeseavariaveldecontrolepossuivaloriguala0if((pedido[0]==0||pedido[1]==0||pedido[2]==0||pedido[3]==0)&&controle==0){//Setavalueof1tothecontrolvariabletoallowthecodestreamtoentertheconditiononlyoncecontrole=1;//Executetheloopcommandswhilethecontrolvariableisequalto1//Readingofallsensorstodeterminethecurrentpositionoftheelevatorfor(intsens=6;sens{sensor[sens-6]=digitalRead(sens);}//Comparingthecurrentelevatorpositionwiththedesiredpositionfor(i=0;i{if(sensor[i]==1){break;}}for(j=0;j{if(pedido[j]==0){break;}}if(j==i){digitalWrite(10,HIGH);digitalWrite(11,HIGH);}if(j{digitalWrite(10,LOW);digitalWrite(11,HIGH);}if(j>i)//2>0{digitalWrite(10,HIGH);digitalWrite(11,LOW);}controle=0;not_pos=0;while(not_pos!=1){//Determinandoaposicaoatualdoelevadorfor(intsens=6;sens{bools=digitalRead(sens);if(s==1){actual_pos=sens-5;}}if(actual_pos==des_pos){digitalWrite(10,HIGH);digitalWrite(11,HIGH);not_pos=1;for(inti=0;i{pedido[i]=1;sensor[i]=0;}break;}}}}接下来,我们将解释该项目的编程逻辑。最初,我们插入了库来处理LCD功能、I2C通信,并创建了LCD对象。LCD已配置为20x4,I2C通信地址为0x27。声明项目中使用的所有变量和向量。之后,我们有设置功能。执行设置功能以初始化LCD并将数字引脚配置为输入和输出以控制项目的设备。例如,在这些设备中,我们有直流电机、簧片开关传感器和控制按钮。//Startofvoidsetupfunctionvoidsetup(){//Initializationof20x4LCDlcd.begin(20,4);//InicializaoDisplaydeLCD//Initializingthe20x4LCDlcd.init();//LCDBacklightActivationlcd.backlight();//Activatingthecursortothe0.0positionofthe20x4LCDlcd.setCursor(0,0);//Configuringbuttonpinsasinputandpullupforthebuttonsfor(inti=2;i{pinMode(i,INPUT_PULLUP);}//Configuringbuttonpinsasinputforthesensorsfor(inti=6;i{pinMode(i,INPUT);}for(inti=0;i{pedido[i]=1;}//ConfigurationofmotorcontrolpinsasdigitaloutputspinMode(10,OUTPUT);pinMode(11,OUTPUT);//CommandsfortheenginetostopdigitalWrite(10,LOW);digitalWrite(11,LOW);}现在让我们讨论循环函数。我们实现了电梯控制的完整逻辑。voidloop(){//Leituradosbotoesselecionadospelousuariodoelevadorfor(intbotao=2;botao{//Armazenaoestadodecadabotaonovetorpedidopedido[botao-2]=digitalRead(botao);//Verificaqualoandardesejadoparaoelevadorsubirif(pedido[botao-2]==0){des_pos=botao-1;controle=0;}}//Verificaseumdosbotoesfoipressionadoeseavariaveldecontrolepossuivaloriguala0if((pedido[0]==0||pedido[1]==0||pedido[2]==0||pedido[3]==0)&&controle==0){//Setavalueof1tothecontrolvariabletoallowthecodestreamtoentertheconditiononlyoncecontrole=1;//Readingofallsensorstodeterminethecurrentpositionoftheelevatorfor(intsens=6;sens{sensor[sens-6]=digitalRead(sens);}//Comparingthecurrentelevatorpositionwiththedesiredpositionfor(i=0;i{if(sensor[i]==1){break;}}for(j=0;j{if(pedido[j]==0){break;}}if(j==i){digitalWrite(10,HIGH);digitalWrite(11,HIGH);}if(j{digitalWrite(10,LOW);digitalWrite(11,HIGH);}if(j>i)//2>0{digitalWrite(10,HIGH);digitalWrite(11,LOW);}controle=0;not_pos=0;while(not_pos!=1){//Determinandoaposicaoatualdoelevadorfor(intsens=6;sens{bools=digitalRead(sens);if(s==1){actual_pos=sens-5;}}if(actual_pos==des_pos){digitalWrite(10,HIGH);digitalWrite(11,HIGH);not_pos=1;for(inti=0;i{pedido[i]=1;sensor[i]=0;}break;}}}}第一个活动是读取4个按钮并将它们的状态存储在“pedido”向量中。在循环内部,我们通过按下的按钮检查需要哪个楼层。以下条件检查是否按下了其中一个按钮以及控制变量是否等于1。“controle”变量用于允许在按下其中一个按钮时执行一次条件代码。当电梯到达用户选择的位置时,码流会重新进入该状态。以下循环用于读取当前的电梯位置和用户所需的楼层。这两条信息将用于确定电机向上或向下到所需楼层的旋转方向。我们有3个条件。请参阅下面的代码块。它们将在下面解释。当j等于i时,表示电梯已经在用户请求的楼层上。在这种情况下,发动机必须保持停止状态。当j小于I时,表示电梯位于用户请求的上方位置。在这种情况下,电机必须旋转才能降低电梯。最后,我们有最后一个条件,即j大于i。在这种情况下,电梯位于用户请求的位置下方。因此,电机必须转动才能使电梯上升。下一步是监控电梯的位置,并在到达用户选择的楼层时停止电机。这个过程是通过读取传感器来完成的。请参阅下面的代码块。只要not_pos变量不等于1,代码就会执行。当电梯到达所需位置时,该变量的值将从0变为1。下面的条件用于读取电梯的当前位置。如果为真,则直流电机必须进入和退出回路。之后,它会退出while,返回到voidloop函数的开头,等待用户选择一个新的位置。这是设计用于控制Arduino电梯的整个结构。您可以测试其他逻辑编程并在您的项目中实现新功能。如果您对此项目有任何想法、意见或问题,请在下方留言。