使用 Arduino 中的拨动开关打开和关闭灯泡

Switching a bulb ON and OFF using toggle switch in Arduino

请帮助我编写 Arduino 代码,因为我是这个领域的新手。我有 Arduino 代码,可以使用拨动开关打开和关闭灯泡中的灯。成功运行并给出输出

代码如下:

int buttonPinBulb = 11;
int relay1 = 10;

void setup() {
  pinMode(buttonPinBulb, INPUT_PULLUP);
  pinMode(relay1, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  int buttonBulb = digitalRead(buttonPinBulb);
  
  if(buttonBulb == HIGH){
    digitalWrite(relay1, HIGH);
  } else {
    digitalWrite(relay1, LOW);
  }
  Serial.println(buttonBulb);
}

在遵循评论中的建议之前,输出是:

问题

当我打开和关闭开关时,灯泡会打开和关闭,输出连续显示在串口监视器上。但我只想要一个不重复的值。就像我打开开关一样,那么串行监视器上显示的值应该是 1 而不是 11111111....

请帮帮我。我该怎么做?

按照评论中的建议,代码为:

int buttonPinBulb = 11;
int relay1 = 10;
int buttonBulb;
void setup() {
  pinMode(buttonPinBulb, INPUT_PULLUP);
  pinMode(relay1, OUTPUT);
  Serial.begin(115200);
  Serial.println(buttonBulb);
}

void loop() {
  // put your main code here, to run repeatedly:
  buttonBulb = digitalRead(buttonPinBulb);
  
  if(buttonBulb == HIGH){
    digitalWrite(relay1, HIGH);
  }else{
    digitalWrite(relay1, LOW);
  }
 //Serial.println(buttonBulb);
}

输出为:

如评论中所述,只需存储引脚的当前值并仅在需要更改时才发布 digitalWrite ()

ccesfully running and giving output. The following is the code:

int buttonPinBulb = 11;
int relay1 = 10;
int curRel1;

void setup()
{
    pinMode(buttonPinBulb, INPUT_PULLUP);
    pinMode(relay1, OUTPUT);
    curRel1 = digitalRead(relay1);
    Serial.begin(115200);
}

void loop()
{
    int buttonBulb = digitalRead(buttonPinBulb);
  
    if(buttonBulb == HIGH)
    {
        digitalWrite(relay1, HIGH);
    }
    else
    {
        digitalWrite(relay1, LOW);
    }
 
    if (buttonBulb != curRel1)
    {
        Serial.println(buttonBulb);
        curRel1 = buttonBulb;
    }
}

您还可以在 loop() 中调用 digitalRead() 更新 curRel1

您可以使用全局变量来存储按钮的当前状态。

你可能还想在下面的例子中debounce your button (using millis(),除非去抖动已经在硬件中完成)——尤其是当你想在每次状态改变时更新数据库时。

int buttonPinBulb = 11;
int relay1 = 10;
int currentStatus = LOW;

// Debounce
unsigned long lastMillis = 0;
const unsigned long debounceTime = 100; // 100ms wait

void setup() {

    pinMode(buttonPinBulb, INPUT_PULLUP);
    pinMode(relay1, OUTPUT);
    Serial.begin(115200);
}

void loop() {

    unsigned long currentMillis = millis();

    if ( (currentMillis - lastMillis > debounceTime)
         || (currentMillis < lastMillis)) {  // protect against overflow
        
        int buttonBulb = digitalRead(buttonPinBulb);

        if (buttonBulb != currentStatus) {

            digitalWrite(relay1, buttonBulb);
            Serial.println(buttonBulb);
            currentStatus = buttonBulb;

            // update database here
        }

        lastMillis = currentMillis; 
    }
}