Как поставить отсрочку на 7 часов?

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

У меня есть программа, которая будет медленно загорать некоторые светодиоды в течение определенного периода времени, но мне нужно знать, что ввести (задержка включения), чтобы свет оставался включенным в течение 7 часов?

Будет ли это работать, если я просто заменю delay(1000) на delay(25200000UL)? Я не хочу одновременно запускать что-то еще и не хочу использовать или понимать millis(). Спасибо за любую помощь.

, 👍5

Обсуждение

Привет, у меня он уже медленно загорается со временем, просто нужно оставаться включенным в течение 7 часов, а затем медленно выключать., @Steve

Он загружается, но с ошибкой, но все еще компилируется, попробовал еще раз и без ошибок... кажется, работает., @Steve

Очень новичок в этом, кажется, теперь это работает. Большое спасибо за ваш ответ., @Steve

Пожалуйста, добавьте ответ на эту страницу, нажав кнопку ответа на свой вопрос в конце страницы. Затем это поможет другим, у которых такая же проблема., @sa_leinad


5 ответов


0

delay(1000) — задержка в мс. Таким образом, для 7-часовой задержки вам нужно 7 часов * 60 минут * 60 секунд * 1000 = 52 200 000

Хорошо добавить UL, чтобы показать, что он длинный и беззнаковый.

Кроме того, он помещается в unsigned long, максимальное значение которого равно 2^32-1 = 4 294 967 295.

Если вы действительно хотите проверить это, вы можете подождать 7 часов или использовать меньшее число (например, разделить на 60 * 60, таким образом, 7000, что должно быть 7 секунд, или сделать 70 000 и проверить, что это 70 секунд).

Если вы хотите явно указать, как вычисляется 52 200 000, или хотите сделать свою программу более гибкой, вы всегда можете создать некоторые определения (или константы):

static const uint32_t DELAY_1_S      = 1000UL;
static const uint32_t DELAY_1_MINUTE = DELAY_1S * 60UL;
static const uint32_t DELAY_1_HOUR   = DELAY_1MINUTE * 60UL;

чем вы можете пользоваться

delay(7UL * DELAY_1_HOUR); // Задержка 7 часов
,

6

Да, абсолютно, должно работать. Но ваш код будет легче читать, если вы используете некоторые константы, например:

const unsigned long SECOND = 1000;
const unsigned long HOUR = 3600*SECOND;

delay(7*HOUR);
,

3

Да, вы можете написать delay(25200000UL), и это задержит на 7 часов.

Как это работает
delay(x) будет задерживать на x миллисекунд.
1 секунда = 1000 миллисекунд
1 минута = 60 секунд
1 час = 60 минут
7 часов = 1000 * 60 * 60 * 7 = 25 200 000

Это довольно большое число, но вполне соответствует беззнаковому длинному: 32 бита = (2^32)-1 = 4 294 967 295. Если подсчитать, это продлится 49 дней и 17 часов.

Задержка >49 дней
Если по какой-то причине вам потребовалось больше 49 дней, вы можете сделать это, поместив задержку в цикл for.

const unsigned long ONE_DAY = 24UL*3600*1000;
const unsigned int numOfDays = 51;
int i;
int j;

for( i=0; i<numOfDays; i++ )
{
    delay(ONE_DAY);
}
,

Вы написали: _1000*3600*24UL_. Это переполнится. Вы имеете в виду 1000UL*3600*24: в C++ умножение ассоциативно слева направо. Вы также написали _i<7_, хотя, вероятно, имели в виду i<numOfDays., @Edgar Bonet


0

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

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

но если вы хотите пойти по этому пути, может сработать что-то вроде этого

#define delay_1hr()  delay(1000ul * 60 * 60)  // задержка на час

// задержка на день
void delay_hr(uint8_t hr) {
  while (hr--) delay_1hr();
}
,

1

Это старый вопрос, но я даю ответ. Я думаю, кому-то нужна помощь, как и вам.

Я пытаюсь сделать машину для приготовления рыбной муки с помощью Arduino Uno.

В первую очередь. Я считал секунды больше минуты. Это работает хорошо. Но когда я пытаюсь больше часа, это не работает.

В конце концов. Я узнал другой способ считать долго

Во втором. Я использовал SimpleTimer.h. Ссылка здесь. Простой таймер Arduino

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

Теперь я сослался на StackExchange Arduino. Вот мой код.

#include <SimpleTimer.h>
#include <Servo.h>

#define FIVE_SEC 5000UL
#define ONE_MIN 60000UL
#define FIVE_MIN 300000UL
#define TEN_MIN 3000000UL
#define ONE_HR 3600000UL
#define EIGHT_HRS 28800000UL
#define TWELVE_HRS 43200000UL

SimpleTimer timer;
Servo servo;
int servoPin  = 9;
int servoReadyAngle = 180;
int servoMoveAngle = 170;
int servoMoveCnt = 0;
int servoJobCycle = 35000;

unsigned long startTime;

void setup() {
  // поместите сюда код установки для однократного запуска:
  Serial.begin(9600);
  servo.attach(servoPin);

  startTime = millis(); 
}

void loop() {

  if(millis()- startTime > TEN_MIN) {
    startTime = millis();
    giveAFishMeal();
  } else {
    Serial.print("ping ");
    Serial.println(millis());
  }

}

void giveAFishMeal() {

  int servoAngle;
  if(servoReadyAngle > servoMoveAngle) {
    servoAngle = servoReadyAngle - servoMoveAngle;
  } else {
    servoAngle = servoReadyAngle + servoMoveAngle;
  }

    Serial.println("I give a meal to your fish");

    delay(500);
    servo.write(servoReadyAngle);
    delay(500);
    servo.write(servoAngle);
    delay(500);

}
,