#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <RTClib.h>
#define PIN 6
#define NUMPIXELS 100
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
RTC_DS1307 rtc;
// Definer fargene for de forskjellige fagene
const uint32_t Matte = pixels.Color(255, 0, 0);
const uint32_t Friminutt = pixels.Color(0, 255, 0);
const uint32_t Norsk = pixels.Color(0, 0, 255);
// Legg til flere farger her
// Enum for ukedagene
enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY };
// Struktur for å representere en tidsluke
struct TimeSlot {
Weekday day; // Ukedag
int startHour; // Starttime
int startMinute; // Startminutt
int endHour; // Sluttime
int endMinute; // Sluttminutt
uint32_t color; // Farge for Neopixelringen
};
// Array som inneholder timeplanen for hele uken
TimeSlot schedule[] = {
{MONDAY, 8, 0, 8, 45, Matte}, // Mandag: Fag 1: 08:00 - 08:45 (Rød)
{MONDAY, 8, 45, 9, 0, Friminutt}, // Mandag: Friminutt: 08:45 - 09:00 (Grønn)
{MONDAY, 9, 0, 9, 45, Norsk}, // Mandag: Fag 2: 09:00 - 09:45 (Blå)
// Legg til flere tidsluker for mandag
{TUESDAY, 8, 0, 8, 45, Norsk}, // Tirsdag: Fag 1: 08:00 - 08:45 (Blå)
{TUESDAY, 8, 45, 9, 0, Friminutt}, // Tirsdag: Friminutt: 08:45 - 09:00 (Grønn)
{TUESDAY, 9, 0, 9, 45, Matte}, // Tirsdag: Fag 2: 09:00 - 09:45 (Rød)
// Legg til flere tidsluker for tirsdag
// Legg til tidsluker for resten av ukedagene
};
void setup() {
Serial.begin(9600); // Start Serial kommunikasjon
pixels.begin();
pixels.show(); // Slå av alle lysene
if (!rtc.begin()) {
Serial.println("RTC ikke funnet!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC kjører ikke, setter tid...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
rtc.adjust(DateTime(2024, 10, 7, 7, 59, 50));
}
void loop() {
DateTime now = rtc.now(); // Hent nåværende tid fra RTC
bool isActive = false; // Variabel for å sjekke om vi er i en aktiv tidsluke
// Skriv nåværende tid til Serial Monitor
Serial.print("Nåværende tid: ");
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
// Sjekk om nåværende tid er innenfor noen av tidslukene
for (TimeSlot slot : schedule) {
if (now.dayOfTheWeek() == slot.day &&
now.hour() >= slot.startHour && now.minute() >= slot.startMinute &&
now.hour() <= slot.endHour && now.minute() <= slot.endMinute) {
// Beregn totalt antall sekunder i tidsluken
int totalSeconds = ((slot.endHour - slot.startHour) * 60 + (slot.endMinute - slot.startMinute)) * 60;
// Beregn antall sekunder som har gått siden starten av tidsluken
int secondsPassed = ((now.hour() - slot.startHour) * 60 + (now.minute() - slot.startMinute)) * 60 + now.second();
// Beregn antall sekunder som er igjen
int secondsRemaining = totalSeconds - secondsPassed;
// Beregn antall lys som skal være tent
int pixelsToLight = (secondsRemaining * NUMPIXELS) / totalSeconds;
// Sett fargen på de nødvendige lysene
pixels.clear();
for (int i = 0; i < pixelsToLight; i++) {
pixels.setPixelColor(i, slot.color);
}
pixels.show(); // Oppdater Neopixelringen
isActive = true; // Sett isActive til true hvis vi er i en aktiv tidsluke
Serial.print("Status: Aktiv tidsluke, sekunder igjen: ");
Serial.println(secondsRemaining);
break; // Avslutt løkken hvis vi har funnet en matchende tidsluke
}
}
// Hvis ingen tidsluke er aktiv, slå av lysene og skriv status til Serial Monitor
if (!isActive) {
pixels.clear();
pixels.show();
Serial.println("Status: Ingen aktiv tidsluke");
}
delay(1000); // Vent ett sekund før neste oppdatering
}