Я кодирую проект гидропоники, в котором я запускаю сервопривод, чтобы включить распылитель, затем включается и выключается насос, и все это нужно повторять.
Все работает отлично, за исключением последнего цикла задержки, который никогда не заканчивается, поэтому цикл цикла никогда не повторяется, он выполняется только один раз.
Любые идеи о том, почему это происходит?
Код:
#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);
}
Да, сервопривод нажимает кнопку помпы, помпа включается, помпа выключается, потом ничего.
Какой размер процессора вы используете 16 или 32-битный? Просто интересно, меньше ли unsigned long 120 000 на вашей платформе.
используйте delay(2L*1000*60)
для расчета значения как long
. так как int
расчет переполняется на 16бит int
Это Arduino Uno, так что это ATmega328P 16.
@Juraj, пожалуйста, опубликуйте свое предложение в качестве ответа, чтобы получить баллы.
Я уверен, что это будет дубликат
не выполняйте арифметические операции с такой функцией, почему бы просто не написать 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();
}
так все остальное работает нормально? вы получаете Pump Off, и насос отключается?