Untitled
unknown
plain_text
5 months ago
2.0 kB
4
Indexable
#include <Wire.h> #include "RTClib.h" #include <avr/sleep.h> #include <avr/interrupt.h> RTC_DS3231 rtc; const int ledPin = 9; // Pin dla diody LED const int interruptPin = 8; // Pin dla przerwania (INT5) volatile bool wakeUp = false; // Flaga wybudzenia void setup() { pinMode(ledPin, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); Wire.begin(); if (!rtc.begin()) { while (1); // Zatrzymaj program, jeśli RTC nie działa } // Ustaw przerwanie na INT5 (pin 8) attachInterrupt(digitalPinToInterrupt(interruptPin), wakeUpISR, FALLING); // Konfiguracja alarmu RTC rtc.clearAlarm(1); rtc.clearAlarm(2); rtc.writeSqwPinMode(DS3231_OFF); configureRTCAlarm(); } void loop() { blinkLED(10); // Zamrugaj diodą 10 razy enterSleepMode(); // Przejdź w tryb uśpienia } void blinkLED(int times) { for (int i = 0; i < times; i++) { digitalWrite(ledPin, HIGH); delay(250); digitalWrite(ledPin, LOW); delay(250); } } void enterSleepMode() { wakeUp = false; // Reset flagi wybudzenia set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Ustaw tryb uśpienia sleep_enable(); // Zezwól na uśpienie cli(); // Wyłącz przerwania na czas konfiguracji attachInterrupt(digitalPinToInterrupt(interruptPin), wakeUpISR, FALLING); // Upewnij się, że przerwanie jest aktywne sei(); // Włącz przerwania globalne sleep_cpu(); // Wprowadź mikrokontroler w tryb uśpienia // Wybudzenie nastąpi tutaj sleep_disable(); // Wyłącz tryb uśpienia } void wakeUpISR() { wakeUp = true; // Flaga wybudzenia rtc.clearAlarm(1); // Wyczyść alarm configureRTCAlarm(); // Ustaw kolejny alarm } void configureRTCAlarm() { DateTime now = rtc.now(); DateTime alarmTime = now + TimeSpan(30); // Dodaj 30 sekund do aktualnego czasu rtc.setAlarm1(alarmTime, DS3231_A1_Second); // Ustaw alarm co 30 sekund }
Editor is loading...
Leave a Comment