将按钮合并到伺服回路中

Incorporating button into Servo Loop

我是新手所以请多多包涵。我试图通过内部定时器和按钮来控制伺服。本质上,伺服系统将每 24 小时左右打开一扇门 6 秒,或者如果您按下按钮 enter image description here

计时器循环有效,但按钮无效。但是,如果我只上传按钮代码,它就可以正常工作。请帮助!如果按住按钮时伺服可以达到 180 并且在释放时 return 到 0 将是理想的。

这是我的代码。请告诉我哪里搞砸了!

    #include <Servo.h>
Servo myservo;
const int BUTTON_PIN = 8;
const int SERVO_PIN  = 9;

int angle = 0;          // the current angle of servo motor
int lastButtonState;    // the previous state of button
int currentButtonState; // the current state of button

void setup(){
  myservo.attach(SERVO_PIN);
Serial.begin(9600); 
 pinMode(BUTTON_PIN, INPUT_PULLUP);
 myservo.write(angle);
  currentButtonState = digitalRead(BUTTON_PIN);
  } 
  
void loop(){

  myservo.write(0);// move servos to center position -> 90°
  delay(18000);
   myservo.write(180);// move servos to center position -> 120°
  delay (6000);

  lastButtonState    = currentButtonState;      // save the last state
  currentButtonState = digitalRead(BUTTON_PIN); // read new state

  if(lastButtonState == HIGH && currentButtonState == LOW) {
    Serial.println("The button is pressed");

    // change angle of servo motor
    if(angle == 180)
      angle = 0;
    else
    if(angle == 0)
      angle = 180;

    // control servo motor arccoding to the angle
    myservo.write(angle);
  }
}

根据你的图片,你的引脚应该是 7 和 9。基本上,你的代码的唯一问题是如果你还想监视某些东西(你的按钮),你不能使用延迟。因此,您可以使用所谓的看门狗定时器,基本上,您可以根据系统时钟让某事经常发生,但当这种情况没有发生时,您也可以继续做其他事情。

比较 arduino example sketch 文件夹中的 blink 和 blink without delay 示例可能有助于进一步解释这个概念。

#include <Servo.h>
Servo myservo;
const int BUTTON_PIN = 7;
const int SERVO_PIN  = 9;

unsigned long dayTimer_ms = 0;
unsigned long autoOpenDelay_ms = 86400000;

int angle = 0; 

void setup(){
  myservo.attach(SERVO_PIN);
  Serial.begin(9600);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  myservo.write(0);
}

void loop() {

  if(millis() - dayTimer_ms > autoOpenDelay_ms )
  {
    dayTimer_ms = millis();
    myservo.write(180); //(open?)
    delay(6000);
    myservo.write(0);
  }
  
  if(millis()<dayTimer_ms)//overflow handling (in case this runs for more than 50 days straight)
  {
    dayTimer_ms = millis();
  }
  
  if (!digitalRead(BUTTON_PIN) && angle != 180)
  {
    angle = 180;
    myservo.write(angle);
  }

  if (digitalRead(BUTTON_PIN) && angle != 0)
  {
    angle = 0;
    myservo.write(angle);
  }
}