// Suvi Sairiala RA54T22S, 26.1.2023
#include <Adafruit_NeoPixel.h>
// NeoPixel Ringin muuttujat
int ledAmount = 16;
int ledPin = 6;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(ledAmount, ledPin, NEO_GRB);
// Valokuvioiden tarvitsemat muuttujat
int wait = 100;
int goal = 0;
int pos = 0;
void setup() {
// Käynnistetään NeoPixel Ring
strip.begin();
strip.show();
}
// Ensimmäinen kuvio: Kaksi valkoista pyörivää pistettä
// kiertää sateenkaaren väristä taustaa.
void rainbowCircle() {
// Laskee kierroksia, eli kuinka pitkään ennenkuin
// siirrytään seuraavaan valokuvioon.
for (int x = 0; x < 24; x++) {
// Itse valokuvio
strip.rainbow();
for (int i = 0; i < 4; i++) {
strip.setPixelColor(pos, strip.Color(255, 255, 255));
if (pos + 8 >= 16) {
pos = pos - 8;
}
else {
pos = pos + 8;
}
strip.setPixelColor(pos, strip.Color(255, 255, 255));
}
strip.show();
delay(wait);
pos = pos + 1;
}
}
// Toinen kuvio, kaksi väritettyä pikseliä kiertää
// ringin ympäri. Väri päätetään main loopissa.
void colorCircle(uint32_t color) {
for(int i=0; i<15; i++) {
strip.setPixelColor(i, color);
strip.setPixelColor((i+1), color);
strip.show();
delay(wait);
strip.clear();
}
// Tein viimeisen vaiheen manuaalisesti,
// koska en muuten saanut vaihdettua toisen
// pikselin sijaintia nollaksi.
strip.setPixelColor(15, color);
strip.setPixelColor(0, color);
strip.show();
delay(wait);
strip.clear();
}
// Kolmas valokuvio: Sateenkaaren värit
// kiertävät palloa.
void halfRainbow() {
// Käyttää samoja variableja kuin 1. kuvio,
// joten asetetaan ne lähtösijaintiin.
pos = 5;
goal = 5;
// Laskuri kierroksille, eli kuinka pitkään
// ennenkuin siirrytään seuraavaan kuvioon.
for (int x = 0; x < 28; x++) {
// Itse valokuvio: Tee sateenkaari, sitten peitä
// siitä yksitoista ruutua mustalla.
strip.rainbow();
for (int i = 0; i < 11; i++) {
strip.setPixelColor(pos, strip.Color(0, 0, 0));
pos = pos + 1;
if (pos >= 16) {
pos = 0;
}
}
strip.show();
delay(wait);
goal = goal + 1;
if (goal >= 16) {
goal = 0;
}
pos = goal;
}
}
// Itse main loop, joka kutsuu vuorotellen
// jokaista värikuviota ja välissä nollaa laitteen.
void loop() {
rainbowCircle();
strip.clear();
colorCircle(strip.Color(242, 87, 90));
colorCircle(strip.Color(242, 170, 53));
colorCircle(strip.Color(179, 242, 53));
strip.clear();
halfRainbow();
strip.clear();
}