Untitled

 avatar
unknown
plain_text
5 months ago
1.9 kB
4
Indexable
#include <Wire.h>
#include "RTClib.h"
#include <avr/sleep.h> // Biblioteka do obsługi trybu uśpienia

RTC_DS3231 rtc; // Obiekt dla modułu RTC

const int ledPin = 9;       // Pin dla diody LED
const int interruptPin = 8; // Pin dla przerwania (INT5)

volatile bool wakeUp = false; // Flaga dla wybudzenia

void setup() {
  pinMode(ledPin, OUTPUT);           // Ustawienie pinu LED jako wyjście
  pinMode(interruptPin, INPUT_PULLUP); // Ustawienie pinu przerwania jako wejście
  
  attachInterrupt(5, wakeUpISR, FALLING); // Wywołanie przerwania przy sygnale opadającym

  Wire.begin(); // Inicjalizacja I2C
  if (!rtc.begin()) {
    while (1); // Zatrzymaj program, jeśli moduł RTC nie działa
  }

  // Ustawienie alarmu w RTC (co 30 sekund)
  rtc.clearAlarm(1); 
  rtc.writeSqwPinMode(DS3231_OFF); // Wyłączenie sygnału kwadratowego
  rtc.setAlarm1(rtc.now() + TimeSpan(30), DS3231_A1_Second); // Alarm za 30 sekund
  rtc.alarmInterrupt(1, true); // Włącz przerwania alarmu
}

void loop() {
  blinkLED(10); // Zamrugaj diodą 10 razy
  enterSleepMode(); // Wejdź w tryb uśpienia
  // Po wybudzeniu program wróci tutaj
}

// Funkcja mrugania diodą
void blinkLED(int times) {
  for (int i = 0; i < times; i++) {
    digitalWrite(ledPin, HIGH);
    delay(250); // Dioda świeci przez 250 ms
    digitalWrite(ledPin, LOW);
    delay(250); // Dioda zgaszona przez 250 ms
  }
}

// Funkcja obsługująca tryb uśpienia
void enterSleepMode() {
  wakeUp = false; // Resetuj flagę wybudzenia

  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Ustaw tryb uśpienia
  sleep_enable();                      // Zezwól na uśpienie

  // Przerwij obsługę kodu i przejdź w tryb uśpienia
  sleep_cpu();

  // Program wraca tutaj po wybudzeniu
  sleep_disable(); // Wyłącz tryb uśpienia
}

// Funkcja obsługi przerwania
void wakeUpISR() {
  wakeUp = true; // Ustaw flagę wybudzenia
}
Editor is loading...
Leave a Comment