本文是进一步了解Arduino的又一步骤。在我们之前的文章中,我详细地写过关于使用Arduino闪烁LED.我们已经演示了5个简单的基于arduino的项目,这将帮助您学习它的基本概念。

1.两个LED正在使用arduino

2.使用按钮开关控制LED

3.使用按钮开关切换LED

4.用一个按钮开关拨动2个LED

1.使用Arduino闪烁两个LED

作为初学者,如果你尝试过“你好,世界”程序,使用Arduino实现LED闪烁;你可以尝试闪烁两个LED作为下一个项目。在Arduino uno板上有14个I/O(输入/输出)引脚。这些引脚编号从0到13。它们可以在您为arduino创建的草图中配置为输入或输出。如果您已经仔细学习了“Hello World”程序,您现在就知道pin的输入/输出配置必须在设置()函数。这是使用arduino来闪烁2个led的电路图。

使用Arduino眨眼2个LED

使用Arduino来眨眼两个LED

const int LED1 = 12;const int LED2 = 13;void setup() {pinMode(LED1,OUTPUT);pinMode (LED2、输出);} void loop() {digitalWrite(LED1,HIGH);延迟(1000);digitalWrite (LED1、低);digitalWrite (LED2、高);延迟(1000);digitalWrite (LED2、低); }

在这个草图中唯一的区别是在输出模式中使用了2个引脚。我用了密码1213作为输出。我已经将它们配置为设置()函数。在循环()在美国,我已经编写了交替闪烁LED的命令。当LED1亮时,LED2关闭。1秒后,LED1将关闭,同时LED2将打开。再等1秒,你会看到LED2关闭和LED1打开。这个循环重复。

我在下面添加了一张实际设置的照片。

如何用arduino眨眼2个led

你可以在下面观看相同线路的视频。

2.控制LED与按钮

如果你仔细观察,到目前为止,我们只是在处理一些输出。我们眨了一个LED,然后我们向前走了一步,眨了两个LED。在这两种情况下,我们编写了软件命令,使arduino以1秒的间隔自动闪烁led。如果我们想要根据用户的输入来控制led的开/关时间呢?这意味着,我想手动输入,并根据我的输入LED应打开和关闭。我们可以使用按钮开关给用户输入arduino。事实上,我们可以使用任何类型的简单开关,如按上或按下或迷你按钮开关。在这个例子中,我使用了常开"迷你按钮开关。通常打开的按钮开关默认处于打开状态。当我们按下执行器时,这个开关将关闭。如果你想知道更多关于不同的按钮开关的工作,你可以阅读我们的详细文章按钮开关

Arduino按键控制LED

我增加了arduino用按钮开关控制LED的电路图。为了连接按钮到arduino,我们需要一个数字I/O引脚配置为数字输入。在这个例子中,我设置了引脚7作为数字输入。所以我们应该把按钮开关连接到引脚上7如电路所示。参考电压应连接到开关的一端,开关的另一端应接地。以避免短路在引脚7和接地之间,你应该连接一个电阻(最好是10K欧姆)。参考电压用于检测按钮的ON状态或closed状态。Arduino板有一个现成的+ 5伏关于电源引脚集群的参考。当按下按钮时,参考电压线将连接到引脚7上。这个电压会下降10 k欧姆电阻。所以当按钮被按下时,一个+5伏是可在引脚7和这将被认为是状态.另一方面,当按钮被释放(停留在它的常开状态),没有参考电压线连接在引脚7。在这种状态下,10K电阻上的电压为0伏(地电位)。同样的电位也在引脚7,并将被视为状态.这就是ardunio如何区分按钮开关的关闭(ON)和打开(OFF)状态。

让我们进入使用按钮开关控制LED的程序方面。在这个程序中,高亮显示的是读取按钮状态的指令。APL (Arduino编程语言)有一条指令名为digitalRead ()-读取在配置输入引脚处给出的数字输入。在我们的程序中,这条指令读取引脚7处的状态,并根据它所读取的返回一个值。在我们的示例中,该指令读取引脚7处的电压电平;返回如果它的+5伏和返回如果是0伏。因为它返回一个值,所以我们必须在编写程序时将这条指令赋给一个变量。我们已经使用了变量瓦尔存储由digitalRead()指令返回的值。按钮开关连接到引脚7,我们已经将该引脚7分配给一个名为西南在我们的草图。在设置()函数,我们已经将这个引脚7 (SW变量)配置为输入使用pinMode ()指示这是节目。

const int LED = 13;const int SW = 7;int val = 0;void setup() {pinMode(LED,OUTPUT);pinMode (SW、输入);} void loop() {val=digitalRead(SW);如果(val = =高){digitalWrite(领导、高);} else {digitalWrite(LED,LOW);}}

3.使用按钮切换LED

让我们进入下一个更有趣的项目。在这里,我们将使用一个按钮开关切换一个LED。Toggle表示改变状态。我们的目标是转向LED在…上使用第一个按钮按下并转动LED与下一个按钮按下。这个“开”和“关”的循环应该随着每个按钮的按压而继续。上面给出的相同的电路图足以做这个项目,因为我们不操纵任何硬件连接。我们只需要改变我们的软件(草图)来改变这个电路的行为。

这是使用按钮开关切换LED的示意图。

常数int LED=13;常数int SW=7;布尔状态=真//将变量状态声明为布尔int val=0;void setup(){pinMode(LED,输出);pinMode(SW,输入);}void loop(){val=digitalRead(SW);delay(120);//如果(val==高){state=!state;//使用!运算符digitalWrite(LED,state);}使用120ms延迟进行软件去抖动

我用了一个“常开微型按钮开关实现电路。这意味着按一个按钮总是会给我们一个”状态。换句话说,我们必须感知按钮开关的关闭状态来转动LED在…上. 打开和关闭LED都取决于单个事件——按钮开关执行器上的按压(它的闭合状态-当开关电压=高)。我们可以用很多方法来做这个项目。一个高效的程序总是有更少的代码行。在这个程序中,我使用了布尔指令和补码运算符。在程序中,一个变量名为状态声明为布尔值初始化为真的. 你可以阅读更多关于布尔指令的内容来深入了解。布尔指令也只有两个可能的值真的.程序的下一个重点是使用补码运算符()这是我们在8051和其他微控制器中看到的相同的否定运算符。例如,我们有一个名为产线8051指令集.这条指令补充了累加器中的值(0加1,1加0)。在数字电子学中,非门执行同样的任务。

这就是程序的工作原理。我们初始化了变量状态作为真的.其他代码行与我们在以前的程序中使用的相同。你已经知道里面写了什么设置().让我们来循环().我们用感应开关的输入digitalRead (SW)并将其存储在一个整型变量中瓦尔. 现在,我们通过不断检查变量val是否注册了.如果它曾经表现得很高,我们就赞美它的地位状态变量和保存到相同的变量中。如果状态函数是真的以前,它被称赞为假的。我们写的状态状态变量来领导。根据状态变量的值,LED将打开和关闭。如果状态变量为TRUE, LED将打开;如果状态变量为FALSE, LED将关闭。这个过程的阅读按钮开关和恭维的状态变量连续。

注:-在我们的程序中,第一个按钮按下实际上关闭了LED。只有第二次按下按钮,它才会打开。从那时起,它将交替在ON和OFF与每个按钮按下。如果您想让它在第一个按钮按下时打开,您只需要在布尔声明语句中做一个更改。首先将变量声明为FALSE。

注2:-你可能注意到了延迟(120);说明就在下面val = digitalRead (SW);指令。它被称为软件去抖动技术.这是电路的一个实际方面。如果你是根据理论来编写程序,你在这里不需要延迟指令。但有一个实际问题。你可以上传没有此延迟指令的代码并查看电路的行为。一些按钮按下会实际切换,而另一些不会产生预期的结果。这种行为有两个原因。1)按钮是一个机械开关。在实际操作中,一个按钮按下会产生一系列的高脉冲(两个机械部件接触时产生的振动的bcz)。2) Arduino是一个非常快速的原型平台。事实上,不是arduino,而是板上使用的微控制器,真的很快。在arduino uno中,Atmega328是用哪一个的20 MIPS执行能力。这意味着控制器每秒可以执行2000万条指令。它比我们想象的要快得多。所以arduino会感应到所有这些由一个按钮按下而产生的高脉冲。但我们不需要arduino来感知这些脉冲. 每按一次按钮,我们只需要一个高脉冲。这是一个由弹跳开关引起的问题,我们通过一个去振技术消除了这个问题。有两种减压技术。在这里,我们采用软件解密。

4.使用按钮切换2个LED

我们的下一个项目是使用一个按钮开关切换2个LED。这里我们还需要一个LED和软件上的小改动。我添加了下面的电路图和程序。我尊重你的智慧。在学习了这么多之后,你不需要对这个电路和程序进行解释。

使用按钮和Arduino切换LED我已经添加了下面的草图。仔细阅读草图。我们只需要在上面的程序中添加几行代码。就是这么简单。

const int LED1 = 13;const int LED2 = 12;const int SW = 7;Boolean state = true;//声明变量状态为Boolean int val=0;void setup() {pinMode(LED1,OUTPUT);pinMode (LED2、输出);pinMode (SW、输入);} void loop() {val=digitalRead(SW);延迟(100); // Software debouncing if(val==HIGH) {state=!state; // Complimenting the status of LED digitalWrite(LED1,state); digitalWrite(LED2,!state); } }

我添加了一段实际实现电路的视频。你可以在下面观看。

注3:-我已经写过,有不同的方法来创建一个程序。这个用于切换LED的相同程序可以在不使用布尔变量的情况下编写。如果我们不使用布尔变量,我们就不能使用恭维运算符。这意味着我们必须在代码中处理切换LED状态的任务。我添加了一个草图来切换一个LED而不使用布尔变量。如果你仔细看一下,你会发现这个程序非常大,使用的变量和指令比之前的程序(布尔变量)更多。但是这两张草图的结果是一样的。那么哪个程序效率更高呢?代码行数更少的那个!

const int LED1 = 13;const int LED2 = 12;const int SW = 7;int国旗;int val = 0;int状态= 1;void setup() {pinMode(LED1,OUTPUT);pinMode (LED2、输出);pinMode (SW、输入);} void loop() {val=digitalRead(SW); delay(100); if(val==HIGH&&state==1) { digitalWrite(LED1,HIGH); digitalWrite(LED2,LOW); flag=0; } if(val==LOW&&flag==0) { digitalWrite(LED1,HIGH); digitalWrite(LED2,LOW); state=0; } if(val==HIGH&&state==0) { digitalWrite(LED1,LOW); digitalWrite(LED2,HIGH); flag=1; } if(val==LOW&&flag==1) { digitalWrite(LED1,LOW); digitalWrite(LED2,HIGH); state=1; } }

稍后我将解释代码。如果你有任何疑问,请在评论中提问。

作者

6评论

  1. kuldeep年代(已

    我想为正弦波逆变器编写一个集成电路,你能把这个程序发给我吗,我不知道该怎么写程序语言。有没有办法把简单英语的书面程序转换成计算机语言?

  2. 卡斯曼

    使用按钮切换2号LED,如果有12号LED呢?

  3. 斯坦

    你好,我一直在阅读arduino板,我一直在尝试连接两个开关到一个LED,以类似的方式一个三向开关操作。现在我彻夜未眠寻找一些类似。我的最终目标是家庭自动化。但是因为我对arduino没有任何了解,所以我打算一步一步来。
    我看过你的教程,似乎很容易做到。我很快就会买一个arduino板,在我把它炸毁之前,我只是想确认一下我的这个双向开关的想法是否可行。
    这是基于您的教程如何切换LED使用按钮。我已经修改了代码,只是一个广告位,允许从不同的输入读取两个按钮,但给出相同的输出改变LED的状态。

    关于电路图,我刚刚在第一个按钮开关的同时增加了一个按钮开关。请务必让我知道,如果代码将工作,或如果有任何更改,我需要作出。

    双向开关代码:-

    const int领导= 13;
    const int SW1 = 7;
    const int SW2 = 8;
    Boolean state = true;//声明变量状态为布尔值
    int val = 0;

    无效设置()

    pinMode(领导、输出);
    pinMode (SW1、输入);
    pinMode (SW2、输入);

    无效循环()

    val = digitalRead (SW1);
    val=数字读取(SW2);
    延迟(120);//软件解码器使用120ms延迟

    如果(val==高)

    {= !状态;//赞美变量状态使用!操作符
    digitalWrite(领导、状态);

Baidu