Как поставить отсрочку на 7 часов?
Для моего приложения мне нужно смоделировать солнечный свет, включая восход и заход солнца.
У меня есть программа, которая будет медленно загорать некоторые светодиоды в течение определенного периода времени, но мне нужно знать, что ввести (задержка включения), чтобы свет оставался включенным в течение 7 часов?
Будет ли это работать, если я просто заменю delay(1000)
на delay(25200000UL)
?
Я не хочу одновременно запускать что-то еще и не хочу использовать или понимать millis()
.
Спасибо за любую помощь.
@Steve, 👍5
Обсуждение5 ответов
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 часов
Да, абсолютно, должно работать. Но ваш код будет легче читать, если вы используете некоторые константы, например:
const unsigned long SECOND = 1000;
const unsigned long HOUR = 3600*SECOND;
delay(7*HOUR);
Да, вы можете написать 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
Для моего приложения мне нужно смоделировать солнечный свет, включая восход и заход солнца.
если вам приходится имитировать такую большую задержку, вы делаете что-то серьезно неправильное.
но если вы хотите пойти по этому пути, может сработать что-то вроде этого
#define delay_1hr() delay(1000ul * 60 * 60) // задержка на час
// задержка на день
void delay_hr(uint8_t hr) {
while (hr--) delay_1hr();
}
Это старый вопрос, но я даю ответ. Я думаю, кому-то нужна помощь, как и вам.
Я пытаюсь сделать машину для приготовления рыбной муки с помощью 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);
}
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Привет, у меня он уже медленно загорается со временем, просто нужно оставаться включенным в течение 7 часов, а затем медленно выключать., @Steve
Он загружается, но с ошибкой, но все еще компилируется, попробовал еще раз и без ошибок... кажется, работает., @Steve
Очень новичок в этом, кажется, теперь это работает. Большое спасибо за ваш ответ., @Steve
Пожалуйста, добавьте ответ на эту страницу, нажав кнопку ответа на свой вопрос в конце страницы. Затем это поможет другим, у которых такая же проблема., @sa_leinad