#include <Adafruit_NeoPixel.h>

#define PIN 1
#define NUMPIXELS 1

Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

unsigned long startTime;
const unsigned long duration = 60000; // 60 seconds in milliseconds

void setup() {
  strip.begin();
  strip.setBrightness(100);
  strip.show();
  startTime = millis(); // Record start time
}

void loop() {
  unsigned long elapsed = millis() - startTime;
  
  // Reset timer after 60 seconds
  if (elapsed >= duration) {
    startTime = millis();
    elapsed = 0;
  }
  
  // Calculate progress (0.0 to 1.0 over 60 seconds)
  float progress = (float)elapsed / duration;
  
  // Calculate delay: starts at 1000ms, ends at 200ms
  int delayTime = 1000 - (progress * 800); // 1000 → 200
  
  heartbeat();
  delay(delayTime);
}

void heartbeat() {
  for (int i = 0; i < 2; i++) {
    pulse(100, 150, 50, 600, 200);
    delay(150);
  }
}

void pulse(int r, int g, int b, int riseTime, int fallTime) {
  int steps = 30;
  for (int i = 0; i <= steps; i++) {
    float bLevel = (float)i / steps;
    strip.setPixelColor(0, strip.Color(r * bLevel, g * bLevel, b * bLevel));
    strip.show();
    delay(riseTime / steps);
  }
  for (int i = steps; i >= 0; i--) {
    float bLevel = (float)i / steps;
    strip.setPixelColor(0, strip.Color(r * bLevel, g * bLevel, b * bLevel));
    strip.show();
    delay(fallTime / steps);
  }
}