Untitled

 avatar
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