将按钮合并到伺服回路中
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);
}
}
我是新手所以请多多包涵。我试图通过内部定时器和按钮来控制伺服。本质上,伺服系统将每 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);
}
}