Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://github.com/vancegroup-mirrors/avr-libc/tree/master/avr-libc/include/avr
- #include <avr/sleep.h> // Biblioteca de sleep
- #include <avr/power.h> // Biblioteca de controle de power
- #include <avr/wdt.h> // Biblioteca de watch dog timer
- #define ledPin (13) // Port para o LED
- volatile int flagWdt = 0; // Flag de controle do sleep
- int vezes = 3; // Numero de vezes para dormir
- //------------------------------------------------------
- ISR(WDT_vect) // Rotina de interrupt do watch dog
- {
- if (flagWdt < vezes) // Se o flag esta habiltado
- {
- flagWdt++; // Desabilita o flag permite entrar em sleep
- }
- }
- //------------------------------------------------------
- void sleepMode(void) // Rotina de sleep
- {
- set_sleep_mode(SLEEP_MODE_PWR_SAVE); // Sleep economizando energia
- sleep_enable(); // Habilita sleep
- sleep_mode(); // Entra em sleep mode
- sleep_disable(); // Desabilita sleep
- power_all_enable(); // Religa perifiericos
- }
- //------------------------------------------------------
- void setup()
- {
- Serial.begin(9600); // Inicializa a serial
- Serial.println("Inicializando wtd"); // Imprime
- pinMode(ledPin, OUTPUT); // Define port como saida
- MCUSR &= ~(1 << WDRF); // MCUSR Status Register
- // // WDRF: Watchdog System Reset Flag Limpa o flag
- WDTCSR |= (1 << WDCE) | (1 << WDE); // WDTCSR – Watchdog Timer Control Register
- // // WDCE: Watchdog Change Enable
- // // WDE: Watchdog System Reset Enable
- WDTCSR = 1 << WDP0 | 1 << WDP3; // WDP[3:0]: Watchdog Timer Prescaler 3, 2, 1 and 0 8.0 seconds
- WDTCSR |= _BV(WDIE); // WDIE: Watchdog Interrupt Enable
- Serial.println("Inicializacao completa."); // Imprime
- }
- //------------------------------------------------------
- void loop()
- {
- if (flagWdt < vezes) // Se o flag está desligado e o arduino esta acordado
- {
- Serial.println("WDT acordou o arduino "); // Imprime
- digitalWrite(ledPin, !digitalRead(ledPin)); // Inverte led
- Serial.println("Arduino vai dormir novamente"); // Imprime
- delay(100); // Aguarda fim da impresao antes de dormir
- sleepMode(); // Reentra em sleep
- }
- else
- {
- Serial.println("Arduino acordado "); // Imprime
- digitalWrite(ledPin, !digitalRead(ledPin)); // Inverte led
- delay(100); // Tempo de piscsr o LED
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement