Arduino: задержка, которая длится вечно

Я кодирую проект гидропоники, в котором я запускаю сервопривод, чтобы включить распылитель, затем включается и выключается насос, и все это нужно повторять.

Все работает отлично, за исключением последнего цикла задержки, который никогда не заканчивается, поэтому цикл цикла никогда не повторяется, он выполняется только один раз.

Любые идеи о том, почему это происходит?

Код:

#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);
}

так все остальное работает нормально? вы получаете Pump Off, и насос отключается?

Piglet 22.11.2022 09:11

Да, сервопривод нажимает кнопку помпы, помпа включается, помпа выключается, потом ничего.

R0b0tn1k 22.11.2022 09:16

Какой размер процессора вы используете 16 или 32-битный? Просто интересно, меньше ли unsigned long 120 000 на вашей платформе.

ChrisBD 22.11.2022 09:18

используйте delay(2L*1000*60) для расчета значения как long. так как int расчет переполняется на 16бит int

Juraj 22.11.2022 09:36

Это Arduino Uno, так что это ATmega328P 16.

R0b0tn1k 22.11.2022 12:44

@Juraj, пожалуйста, опубликуйте свое предложение в качестве ответа, чтобы получить баллы.

R0b0tn1k 29.11.2022 12:24

Я уверен, что это будет дубликат

Juraj 29.11.2022 13:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

не выполняйте арифметические операции с такой функцией, почему бы просто не написать delay(120000); вместо?. если вы хотите выполнять арифметические операции, лучше разделить операцию, например:

long int timeDelay1 = 60*2*1000;
delay(timeDelay1);

такая длительная задержка не очень хорошая практика, вместо этого используется функция millis() для измерения времени, например:

    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();
    }

Другие вопросы по теме