Arduino:固定时间不活动/活动

时间:2019-01-11 20:50:00

标签: arduino timing

以下Arduino代码的目的是与Raspberry Pi发送的高低信号接口;完整的解释很复杂,所以我会及时为您节省时间。从Pi发送的信号(引脚10和11)使顺时针或逆时针旋转连接到A4988驱动器的步进电机。决定这一点的针脚是步进和方向针脚(9和8)。我要完成的工作是在针脚10和11闲置60秒后启用 sleepPin

同样,如果它们都读取相同的输入信号超过3秒钟,我想停止接受来自引脚10和11的输入。我已经研究了如何将时间整合到Arduino脚本中的方法,但是不知道如何在这种情况下整合时间。

byte directionPin = 9;
byte stepPin = 8;
byte sleepPin = 12;

byte buttonCWpin = 10;
byte buttonCCWpin = 11;


boolean buttonCWpressed = false;
boolean buttonCCWpressed = false;
long previousMillis = 0;
long interval = 1000;


void setup() { 
//determines length of stepper movement
pinMode(directionPin, OUTPUT);
pinMode(stepPin, OUTPUT);
//moves motors clockwise or counterclockwise
pinMode(buttonCWpin, INPUT_PULLUP);
pinMode(buttonCCWpin, INPUT_PULLUP);

}

void loop() { 

 readButtons();
 actOnButtons();

}

void readButtons() {

 buttonCCWpressed = false;
 buttonCWpressed = false;


 if (digitalRead(buttonCWpin) == LOW) {
 buttonCWpressed = true;
 }
 if (digitalRead(buttonCCWpin) == LOW) {
 buttonCCWpressed = true;
 }


}

void actOnButtons() {

  if (buttonCWpressed == true) {
 digitalWrite(directionPin, LOW);
   for(int x = 0; x < 1; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(515); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(515); 
   }
 }

 if (buttonCCWpressed == true) {
 digitalWrite(directionPin, HIGH);
   for(int x = 0; x < 1; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(515); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(515); 
   }
 }






}

任何帮助以及任何提示或疑虑都将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您愿意使用引脚2和3而不是引脚10和11(例如,假设您有Arduino Uno),那么使用external interrupts可能会很有用。

作为第一个问题的解决方案,这是一个最少的代码,应在 方向插针2和3上闲置60秒后将睡眠插针置于高电平。

volatile long int last_activity;

void setup(){
    attachInterrupt(2, tstamp, CHANGE);
    attachInterrupt(3, tstamp, CHANGE);
    pinMode(2, INPUT); // your new CW pin
    pinMode(3, INPUT); // your new CCW pin
    pinMode(12, OUTPUT);
    digitalWrite(12, LOW);
    last_activity = millis();
}

void loop(){
    if (millis() - last_activity > 60e3) {
        digitalWrite(12, HIGH);
        // do some other things...
    }
}

void tstamp(){
    last_activity = millis();
}

第二个问题,“停止接受来自引脚10和11的输入”到底是什么意思?如果您只需要检查它们的状态是否相同,则在序言中添加volatile long int last_common_state;并在digitalRead(2) == digitalRead(3);的正文中检查tstamp()以更新last_common_state应该可以帮助您正确的轨道。