Untitled
unknown
plain_text
a year ago
2.0 kB
7
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