首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >阿迪诺:永远的拖延

阿迪诺:永远的拖延
EN

Stack Overflow用户
提问于 2022-11-22 07:46:43
回答 1查看 27关注 0票数 0

我正在编写一个水培项目,我触发一个伺服系统打开一个喷雾器,然后一个泵被打开和关闭,整个事情需要重复。

除了最后一个延迟周期之外,整个过程都很好,它永远不会结束,所以循环循环永远不会重复,它只运行一次。

对为什么会发生这种事有什么想法吗?

守则:

代码语言:javascript
运行
复制
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN  250 
#define SERVOMAX  650 
#define USMIN  600 
#define USMAX  2400 
#define SERVO_FREQ 50 
uint8_t servonum = 0;

int D3 = 3;
int D4 = 4;

void setup() {
  Serial.begin(9600);
  Serial.println("Reboot!");
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);  
  pwm.begin();
  pwm.setOscillatorFrequency(27000000);
  pwm.setPWMFreq(SERVO_FREQ);  // Analog servos run at ~50 Hz updates
  delay(10);
}

void loop() {
  Serial.println('On');
  digitalWrite(D3, LOW); 
  digitalWrite(D4, LOW); 

  pwm.setPWM(servonum, 0, 170);
  delay(500);
  pwm.setPWM(servonum, 0, 300);


  // 
  delay(0.5*1000*60);
  //delay(3000);

  // Off for 10 minutes
  Serial.println('Off');
  pwm.setPWM(servonum, 0, 170);
  delay(500);
  pwm.setPWM(servonum, 0, 300);

  Serial.println('Pump on');
  digitalWrite(D3, HIGH); 
  digitalWrite(D4, HIGH); 
  delay(15*1000); // TURN ON PUMP FOR 15 seconds

  Serial.println('Pump Off');
  digitalWrite(D3, LOW); 
  digitalWrite(D4, LOW); // TURN OFF PUMP, TURN ON 

  delay(2*1000*60); // This is the delay that never ends, it's supposed to be 2 minutes long...

}


void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= SERVO_FREQ;   // Analog servos run at ~60 Hz updates

  pulselength /= 4096;  // 12 bits of resolution

  pulse *= 1000000;  // convert input seconds to us
  pulse /= pulselength;

  pwm.setPWM(n, 0, pulse);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-12-01 22:26:00

不要对这样的函数做算术运算,为什么不直接写延迟(120000)呢?如果您想做算术运算,最好是分隔操作,如下所示:

代码语言:javascript
运行
复制
long int timeDelay1 = 60*2*1000;
delay(timeDelay1);

这样长时间的延迟并不是很好的实践,而是使用函数millis()来度量时间,如下所示:

代码语言:javascript
运行
复制
    long int t0 = 0;
    long int t1 = 0;
    
    long int howManyTimeIWantToWait = 120000;
    
    void setup() {
      t0 = millis();  
    
    }
    
    void loop() {
      t1 = millis();
      if(t1 >= (t0+howManyTimeIWantToWait)){
        t0 = millis();
          //howManyTimeIWantToWait has been passed
      
      }
      //do other stuff whithout waiting on the function delay();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74529057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档