I have 2 led strips that each have 84 leds and are divided into 4 segments of 21 leds each, creating a square. I want to make it so that the two side segments (segments 2 & 4) light up at the same time gradually in groups of 3 at certain intervals, like this:
I'm pretty new to coding so I just found out that I need to be using millis() instead of delay, but I haven't figured out the right way to do it. This is my full code so far:
#include <DS3231.h> //Include the clock library RTC_DS3231 rtc
#include <FastLED.h>
// Changable Vars
unsigned long time;
CRGB leds[84];
CRGB leds2[84];
const int switchPin = 3;
const int switchPin2 = 5;
int fadeTime = 30; // How long the light will fade to max
int interval = ((fadeTime * 60000)/8);
int i = 0;
int setHour = 8; // wake (military time)
int setMin = 30;
int bedHour = 23; // bed
int bedMin = 0;
int workHour = 10; // work
int workMin = 0;
int restHour = 18; // rest
int restMin = 0;
int endHour = 23;
int endMin = 59;
int nightHour = 0; // nightlight
int nightMin = 0;
int timeMarker = 0; // for delays
// Set up Vars
DS3231 rtc(SDA, SCL);
Time t;
void start();
void setup()
{
FastLED.addLeds<WS2812, 10, GRB>(leds, 84);
FastLED.addLeds<SK6812, 9, GRB>(leds2, 84);
pinMode(3, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
Serial.begin(9600); // Match to serial monitor
rtc.begin();
}
void loop()
{
time = millis();
Serial.print("pin3: ");
Serial.println(digitalRead(3));
Serial.print("pin5: ");
Serial.println(digitalRead(5));
t = rtc.getTime(); // Make a time class called 't'
// Send Day-of-Week
Serial.print(rtc.getDOWStr());
Serial.print(" ");
// Send date
Serial.print(rtc.getDateStr());
Serial.print(" -- ");
// Send time
Serial.println(rtc.getTimeStr());
if (digitalRead(3) == HIGH && digitalRead(5) == LOW){
setting1();
}else if (digitalRead(5) == HIGH && digitalRead(3) == LOW){
setting2();
}else {
setting3();
}
}
void sunrise()
{
timeMarker = time;
// segment 1
for(int i = 0; i <= 20; i++)
{
leds[i] = CRGB(100, 0, 0);
leds2[i] = CRGB(200, 0, 0);
FastLED.show();
}
// segments 2 & 4
// 1
if(time - timeMarker >= interval){
for(int i = 21; i <= 23 && i >= 81 && i <= 83; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//2
if(time - timeMarker >= (interval * 2)){
for(int i = 24; i <= 26 && i >= 78 && i <= 80; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//3
if(time - timeMarker >= (interval * 3)){
for(int i = 27; i <= 29 && i >= 75 && i <= 77; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//4
if(time - timeMarker >= (interval * 4)){
for(int i = 30; i <= 32 && i >= 72 && i <= 74; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//5
if(time - timeMarker >= (interval * 5)){
for(int i = 33; i <= 35 && i >= 69 && i <= 71; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//6
if(time - timeMarker >= (interval * 6)){
for(int i = 36; i <= 38 && i >= 66 && i <= 68; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//7
if(time - timeMarker >= (interval * 7)){
for(int i = 39; i <= 41 && i >= 63 && i <= 65; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
// segment 3
if(time - timeMarker >= (interval * 8)){
for(int i = 42; i <= 62; i++)
{
leds[i] = CRGB(50, 5, 5);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
timeMarker = time;
}
if(time - timeMarker >= ((fadeTime * 60000)/2)){
for(int i = 0; i <= 83; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
}
delay (1000);
}
void sunset()
{
timeMarker = time;
// beginning
for(int i = 0; i <= 20; i++)
{
leds[i] = CRGB(100, 20, 0);
leds2[i] = CRGB(200, 0, 0);
FastLED.show();
}
for(int i = 21; i <= 41; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(255, 0, 100);
FastLED.show();
}
for(int i = 42; i <= 62; i++)
{
leds[i] = CRGB(5, 0, 100);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
for(int i = 63; i <= 83; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(255, 0, 100);
FastLED.show();
}
if(time - timeMarker >= 1800000){
// segment 1
for(int i = 42; i <= 62; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
timeMarker = time;
}
// segments 2 & 4
// 1
if(time - timeMarker >= 225000){
for(int i = 39; i <= 41 && i >= 63 && i <= 65; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
timeMarker = time;
}
//2
if(time - timeMarker >= 225000){
for(int i = 36; i <= 38 && i >= 66 && i <= 68; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
timeMarker = time;
}
//3
if(time - timeMarker >= 225000){
for(int i = 33; i <= 35 && i >= 69 && i <= 70; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
timeMarker = time;
}
//4
if(time - timeMarker >= 225000){
for(int i = 30; i <= 32 && i >= 72 && i <= 74; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
timeMarker = time;
}
//5
if(time - timeMarker >= 225000){
for(int i = 27; i <= 29 && i >= 75 && i <= 77; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
timeMarker = time;
}
//6
if(time - timeMarker >= 225000){
for(int i = 24; i <= 26 && i >= 78 && i <= 80; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
timeMarker = time;
}
//7
if(time - timeMarker >= 225000){
for(int i = 21; i <= 23 && i >= 81 && i <= 83; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
timeMarker = time;
}
// segment 3
if(time - timeMarker >= 225000){
for(int i = 0; i <= 20; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
}
delay (1000);
}
void work()
{
for(int i = 0; i <= 20; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 50, 200);
FastLED.show();
}
for(int i = 21; i <= 83; i++)
{
leds[i] = CRGB(0, 50, 200);
leds2[i] = CRGB(0, 200, 0);
FastLED.show();
}
delay (1000);
}
void rest()
{
for(int i = 0; i <= 20; i++)
{
leds[i] = CRGB(100, 20, 0);
leds2[i] = CRGB(255, 0, 100);
FastLED.show();
}
for(int i = 21; i <= 41; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(255, 0, 100);
FastLED.show();
}
for(int i = 42; i <= 62; i++)
{
leds[i] = CRGB(5, 0, 200);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
for(int i = 63; i <= 83; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(255, 0, 100);
FastLED.show();
}
delay (1000);
}
void night()
{
for(int i = 0; i <= 20; i++)
{
leds[i] = CRGB(100, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
for(int i = 21; i <= 83; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
delay (1000);
}
void setting1(){
if (t.hour >= setHour && t.hour < workHour && t.min >= setMin) // Check if it's time to wake up!
{
sunrise();
}
else if (t.hour >= bedHour && t.min >= bedMin)
{
sunset();
}
}
void setting2(){
if (t.hour >= workHour && t.hour < restHour && t.min >= workMin)
{
work();
}
else if (t.hour >= restHour && t.hour <= endHour && t.min >= restMin && t.min <= endMin)
{
rest();
}
else if (t.hour >= nightHour && t.hour < workHour && t.min >= nightMin)
{
night();
}
}
void setting3(){
for(int i = 0; i <= 83; i++)
{
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
// Wait one second before repeating
delay (1000);
}
And this is the part that I'm struggling with:
void sunrise()
{
timeMarker = time;
// segment 1
for(int i = 0; i <= 20; i++)
{
leds[i] = CRGB(100, 0, 0);
leds2[i] = CRGB(200, 0, 0);
FastLED.show();
}
// segments 2 & 4
// 1
if(time - timeMarker >= interval){
for(int i = 21; i <= 23 && i >= 81 && i <= 83; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//2
if(time - timeMarker >= (interval * 2)){
for(int i = 24; i <= 26 && i >= 78 && i <= 80; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//3
if(time - timeMarker >= (interval * 3)){
for(int i = 27; i <= 29 && i >= 75 && i <= 77; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//4
if(time - timeMarker >= (interval * 4)){
for(int i = 30; i <= 32 && i >= 72 && i <= 74; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//5
if(time - timeMarker >= (interval * 5)){
for(int i = 33; i <= 35 && i >= 69 && i <= 71; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//6
if(time - timeMarker >= (interval * 6)){
for(int i = 36; i <= 38 && i >= 66 && i <= 68; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
//7
if(time - timeMarker >= (interval * 7)){
for(int i = 39; i <= 41 && i >= 63 && i <= 65; i++){
leds[i] = CRGB(50, 5, 0);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
}
// segment 3
if(time - timeMarker >= (interval * 8)){
for(int i = 42; i <= 62; i++)
{
leds[i] = CRGB(50, 5, 5);
leds2[i] = CRGB(10, 0, 200);
FastLED.show();
}
timeMarker = time;
}
if(time - timeMarker >= ((fadeTime * 60000)/2)){
for(int i = 0; i <= 83; i++){
leds[i] = CRGB(0, 0, 0);
leds2[i] = CRGB(0, 0, 0);
FastLED.show();
}
}
delay (1000);
}
(I know that sunset() looks pretty rough too, I'll fix it once I know how to fix sunrise()).
The way it is now, the bottom segment lights up and after a few minutes the top one does, so it seems like it's basically skipping over the side segments. Any advice?