나는 12 시간마다 열거 나 닫히는 작은 문을 열고 닫으려고합니다. 12 시간 동안 delay (), delay (43 200 000 000)로 작은 루핑 스크립트를 만들 수 있는지 궁금합니다. 내 생각 엔? 그러나 그것이 가능하고 / 혹은 추천 가능한지 모르겠습니다. 일부 피드백 / 대안 (필요한 경우)이 좋을 것입니다 :)
나는 12 시간마다 열거 나 닫히는 작은 문을 열고 닫으려고합니다. 12 시간 동안 delay (), delay (43 200 000 000)로 작은 루핑 스크립트를 만들 수 있는지 궁금합니다. 내 생각 엔? 그러나 그것이 가능하고 / 혹은 추천 가능한지 모르겠습니다. 일부 피드백 / 대안 (필요한 경우)이 좋을 것입니다 :)
답변:
실시간 시계 방법이 가장 정확한 방법이지만 그렇지 않으면 millis
unsigned long startMillis = millis();
while (millis() - startMillis < LONG_DELAY_MS);
최대 약 지연됩니다. 4294967295ms (2 ^ 32-1) 또는 49 일 후 타이머가 다음 값을 따라 잡습니다.startMillis
delay()
그 용도가 있지만 오래 지연되면 좋지 않습니다. 단순히 마이크로 컨트롤러에게 x
클럭 사이클에 대해 아무 것도하지 말라고 지시합니다 . 그 시간 동안 Arduino는 다른 작업을 수행 할 수 없습니다.
최선의 방법은 RTC (Real Time Clock)라는 것을 사용하는 것입니다. 이 칩은 특별히 시간을 추적하기 위해 만들어졌으며 Arduino에 쉽게 연결할 수 있습니다. 다음은 그 방법에 대한 예입니다.
대기하고 전력을 절약하면서 워치 독 인터럽트를 사용하고 MCU를 절전 상태로 유지할 수 있습니다.
그러나 보드가 절약 할 경우에만 전력을 절약 할 수 있습니다. 즉, Uno와 같이 가장 일반적인 Arduino 보드를 장착하는 일반적인 레귤레이터 대신 낮은 대기 전압 레귤레이터를 사용해야합니다. 그렇지 않으면 보드가 그렇지 않은 경우 MCU가 에너지를 절약하는지 여부는 중요하지 않습니다.
코드는 다음과 같습니다.
#include <avr/sleep.h>
// This variable is made volatile because it is changed inside an interrupt function
volatile int sleep_count = 0; // Keep track of how many sleep cycles have been completed.
const int interval = 720; // Interval in minutes between waking and doing tasks.
const int sleep_total = (interval*60)/8; // Approximate number of sleep cycles
// needed before the interval defined above elapses. Not that this does integer math.
void setup(void) {
watchdogOn(); // Turn on the watch dog timer.
// Disable the ADC by setting the ADEN bit (bit 7) to zero.
ADCSRA = ADCSRA & B01111111;
// Disable the analog comparator by setting the ACD bit (bit 7) to one.
ACSR = B10000000;
// Disable digital input buffers on all analog input pins by setting bits 0-5 to one.
DIDR0 = DIDR0 | B00111111;
}
void loop(void) {
goToSleep(); // ATmega328 goes to sleep for about 8 seconds
// and continues to execute code when it wakes up
if (sleep_count == sleep_total) {
// CODE TO BE EXECUTED PERIODICALLY
}
}
void goToSleep() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode.
sleep_enable(); // Enable sleep mode.
sleep_mode(); // Enter sleep mode.
// After waking from watchdog interrupt the code continues
// to execute from this point.
sleep_disable(); // Disable sleep mode after waking.
}
void watchdogOn() {
// Clear the reset flag, the WDRF bit (bit 3) of MCUSR.
MCUSR = MCUSR & B11110111;
// Set the WDCE bit (bit 4) and the WDE bit (bit 3) of WDTCSR.
WDTCSR = WDTCSR | B00011000;
// Set the watchdog timeout prescaler value to 1024 K
// which will yeild a time-out interval of about 8.0 s.
WDTCSR = B00100001;
// Enable the watchdog timer interupt.
WDTCSR = WDTCSR | B01000000;
MCUSR = MCUSR & B11110111;
}
ISR(WDT_vect)
{
sleep_count ++; // keep track of how many sleep cycles have been completed.
}
내가 복사 한 코드는이 페이지에 있습니다 : 저전력 아두 이노 워치 독 타이머 사용하기 .
사용할 수있는 수면 (서명없는 초)이 있습니까?
그렇지 않으면 매우 오래 지연시킬 수 있습니다.
for (unsigned int bigloop=0; bigloop<65535; bigloop++)
{
for (unsigned int smallloop=0; smallloop<65535; smallloop++)
{
for (unsigned int tinyloop=0; tinyloop<65535; tinyloop++)
{
delay(65535);
}
}
}
나는 중간에 물건을하고 싶지 않을 때 for 루프를 사용합니다.
for (int Hours = 0; Hours < 12; Hours++) { //Creates 12 hours
for (int Minutes = 0; Minutes < 60; Minutes++) { //Creates 1 hour
for (int Seconds = 0; Seconds < 60; Seconds++) { //Creates 1 minute
delay(1000); //Creates 1 second
}
}
}