首页 > 解决方案 > Arduino 按钮继电器控制和 LED

问题描述

我在 arduino 编码方面并不专业,我对草图有疑问。我需要用按钮控制继电器的代码。我有 3 个按钮、3 个 LED 和 2 个继电器。按下 1 个按钮时选择第一个 LED,如果按下两次则选择第二个 LED。当按下第二个按钮一次然后选择第一个继电器,如果两次按下然后选择第二个继电器,最后启动按钮启动所有这些命令,然后点亮第三个 LED。请帮忙!这是我的代码:

int button1=2;
int button2=3;
int button3=4;
int relay1=8;
int relay2=9;
int led=5;
int led2=6;
int led3=7;
int button1State=0;
int button2State=0;
int button3State=0;
void setup() {
      // put your setup code here, to run once:
Serial.begin(9600);
pinMode(button1, INPUT_PULLUP);
pinMode(button2,INPUT_PULLUP);
pinMode(button3,INPUT_PULLUP):
pinMode(relay1, OUTPUT);
digitalWrite(relay1, HIGH);
pinMode(relay2,OUTPUT);
digitalWrite(relay2, HIGH);
pinMode(led,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
button1State = digitalRead(button1);//when once click turn led
if(button1State==HIGH){
  digitalWrite(led,HIGH);
  delay(wait);

if(button1State==HIGH){ //when clicked twice then turn on led 2, but i dont know how to do it
digitalWrite(led2,HIGH);
delay(wait)
}
}
if (button2State== HIGH){
  digitalWrite(relay1,HIGH);
  delay(wait);

if(button2State==HIGH){ //when clicked twice turn on second relay but i dont know how to do this
  digitalWrite(relay2,HIGH);
  delay(wait);
}
if(button2State==HIGH){
  digitalWrite(relay1&&relay2,HIGH);
  delay(wait);
}
}
//and click start i dont kknow how to do this :((
//when select led then circuits run for 10 sec,if led 2 select then circuit runs for 20 sec
}

标签: arduinoarduino-unoarduino-ide

解决方案


画出你的代码流程图,你很快就会发现它不是你想做的。

让我们回顾一下你的几行:

在这里,您读取了按钮 1 在那一刻的状态

button1State = digitalRead(button1);//when once click turn led

如果该状态为高,则打开 LED 并等待。(顺便说一句,此处未定义等待,这将导致错误)

if(button1State==HIGH){
  digitalWrite(led,HIGH);
  delay(wait);

然后,如果按钮状态为高,则打开第二个 LED 并等待。和上面一样的问题。

if(button1State==HIGH){ //when clicked twice then turn on led 2, but i dont know how to do it
digitalWrite(led2,HIGH);
delay(wait)
}
...

所以你的第一个问题是你没有更新button1State。它仍然是您在开始时读取的值。

如果你只是自言自语,你会如何接近?如果每次按下按钮都想做三件不同的事情,你需要做什么?

  1. 你需要找出按钮被按下(你问自己我按下按钮了吗?)

  2. 您需要知道您按下按钮的频率(您数 1、2、3、1、2、3)

  3. 你需要为每次按下按钮做不同的事情(如果1然后做a,如果2然后做b,如果3然后做c ...

  4. 您还需要知道按钮是否仍被按下

所以你需要一个计算按钮按下的变量。

以下代码只是为了向您展示如何处理事情。我没有测试它是否可以编译,也没有实现你需要的一切。只是给你一个起点。

同样在某些时候你必须重置你的计数器。您可以为此使用模运算符。现在去学习吧!

int button1Count = 0;
int lastButton1State = LOW;
// your other variables

void setup()
{
  pinMode(button1, INPUT_PULLUP);
}

void loop()
{ 
  int button1State = digitalRead(button1);
  // button 1 has just been pressed
  if (button1State && !lastButton1State)
  {
    button1Count++;
  }

  lastButton1State = button1State;

  switch(button1State) {
  case 1:
    digitalWrite(led, HIGH);
    break;
  case 2:
    digitalWrite(led2, HIGH);
    break;
  }
}

当你成功实现这一点时,你应该了解如何编写非阻塞 arduino 代码。


推荐阅读