#include <Adafruit_NeoPixel.h>
#define PIN_NEOPIXEL 11
#define NUMPIXELS 8 // Numero di Neopixel
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);
// Definizione dei PIN per gli altri LED
const int ledStellePin = 5;
const int ledLunaPin = 6;
const int ledCase2Pin = 7;
const int ledCase1Pin = 8;
const int ledFuocoPin = 9;
const int ledGiornoPin = 10;
// Durata delle fasi (in millisecondi)
const unsigned long albaDurata = 5000;
const unsigned long giornoDurata = 25000;
const unsigned long tramontoDurata = 5000;
const unsigned long notteDurata = 56000;
void setup() {
strip.begin();
strip.show(); // Spegne tutti i LED all'inizio
pinMode(ledStellePin, OUTPUT);
pinMode(ledLunaPin, OUTPUT);
pinMode(ledCase2Pin, OUTPUT);
pinMode(ledCase1Pin, OUTPUT);
pinMode(ledFuocoPin, OUTPUT);
pinMode(ledGiornoPin, OUTPUT);
}
void loop() {
unsigned long currentTime = millis() % (albaDurata + giornoDurata + tramontoDurata + notteDurata); // Ciclo totale
// Reset della striscia NeoPixel e degli altri LED
digitalWrite(ledStellePin, LOW);
digitalWrite(ledCase2Pin, LOW);
digitalWrite(ledCase1Pin, LOW);
digitalWrite(ledFuocoPin, LOW);
digitalWrite(ledGiornoPin, LOW);
// Fase Alba
if (currentTime >= 0 && currentTime < albaDurata) {
fadeToColor(255, 165, 0, currentTime, 0, albaDurata); // Colore alba (arancione)
// Accendi il LED alba/tramonto 2 secondi prima della fine dell'alba
if (currentTime >= albaDurata - 2000) {
digitalWrite(ledGiornoPin, HIGH);
}
}
// Fase Giorno
else if (currentTime >= albaDurata && currentTime < (albaDurata + giornoDurata)) {
fadeToColor(255, 255, 255, currentTime, albaDurata, albaDurata + giornoDurata); // Colore giorno (bianco)
digitalWrite(ledGiornoPin, HIGH); // Mantieni acceso il LED durante il giorno
}
// Fase Tramonto
else if (currentTime >= (albaDurata + giornoDurata) && currentTime < (albaDurata + giornoDurata + tramontoDurata)) {
fadeToColor(255, 69, 0, currentTime, albaDurata + giornoDurata, albaDurata + giornoDurata + tramontoDurata); // Colore tramonto (rosso-arancione)
// Spegni il LED alba/tramonto 2 secondi dopo l'inizio del tramonto
if (currentTime < (albaDurata + giornoDurata + 2000)) {
digitalWrite(ledGiornoPin, HIGH);
} else {
digitalWrite(ledGiornoPin, LOW);
}
}
// Fase Notte
else {
fadeToColor(0, 0, 255, currentTime, albaDurata + giornoDurata + tramontoDurata, albaDurata + giornoDurata + tramontoDurata + notteDurata); // Colore notte (blu)
// Attiva il LED Case 1 (D8) nella prima metà della notte e spegne a metà notte
if (currentTime >= (albaDurata + giornoDurata + tramontoDurata) && currentTime < (albaDurata + giornoDurata + tramontoDurata + notteDurata / 2)) {
digitalWrite(ledCase1Pin, HIGH);
}
// Attiva il LED Case 2 (D7) 5s dopo l'inizio della fase notte
if (currentTime >= (albaDurata + giornoDurata + tramontoDurata + 5000)) {
digitalWrite(ledCase2Pin, HIGH);
}
// Attiva i LED Stelle durante la fase notte con effetto flickering
if (currentTime >= (albaDurata + giornoDurata + tramontoDurata + notteDurata / 8)) {
flickerEffect(ledStellePin); // Effetto flickering per il LED stelle
}
// Attiva i LED Luna dopo 5s dall'inizio della fase notte e spegne 5s prima della fine della fase notte
if (currentTime >= (albaDurata + giornoDurata + tramontoDurata + notteDurata / 8 + 5000) && currentTime < (albaDurata + giornoDurata + tramontoDurata + notteDurata - 5000)) {
// Rimuoviamo l'aggiornamento costante di questo pin per evitare flickering
digitalWrite(ledLunaPin, HIGH);
} else {
digitalWrite(ledLunaPin, LOW);
}
// Effetto flickering per il LED fuoco nella prima metà della notte
if (currentTime >= (albaDurata + giornoDurata + tramontoDurata) && currentTime < (albaDurata + giornoDurata + tramontoDurata + notteDurata / 2)) {
flickerEffect(ledFuocoPin);
}
}
strip.show(); // Aggiorna i NeoPixel
delay(100); // Controlla ogni 0.1 secondi
}
// Funzione per impostare il colore della striscia NeoPixel con dissolvenza
void fadeToColor(uint8_t r, uint8_t g, uint8_t b, unsigned long currentTime, unsigned long startTime, unsigned long endTime) {
uint8_t currentR, currentG, currentB;
for (int i = 0; i < NUMPIXELS; i++) {
uint32_t currentColor = strip.getPixelColor(i);
currentR = (currentColor >> 16) & 0xFF;
currentG = (currentColor >> 8) & 0xFF;
currentB = currentColor & 0xFF;
break;
}
float progress = (float)(currentTime - startTime) / (float)(endTime - startTime);
uint8_t newR = currentR + (r - currentR) * progress;
uint8_t newG = currentG + (g - currentG) * progress;
uint8_t newB = currentB + (b - currentB) * progress;
setStripColor(newR, newG, newB);
}
// Funzione per impostare il colore della striscia NeoPixel
void setStripColor(uint8_t r, uint8_t g, uint8_t b) {
for (int i = 0; i < NUMPIXELS; i++) {
strip.setPixelColor(i, strip.Color(r, g, b));
}
}
// Funzione per l'effetto flickering
void flickerEffect(int pin) {
int flicker = random(0, 255);
analogWrite(pin, flicker);
delay(random(50, 200));
}