Neopixel wake-up light alarmclock

Hi,
i'm trying to make a bedsidelight/alarmclock/wakeuplight.

for now this is my code:

#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include "RTClib.h"
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

#define NUM_LEDS 16

#define BRIGHTNESS 50

RTC_DS1307 RTC;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);

int gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
   10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
   17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
   25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
   37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
   51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
   69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
   90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };

Adafruit_7segment disp = Adafruit_7segment();

void setup()
{
 Wire.begin();
 RTC.begin();
 if (! RTC.isrunning())
  {
  RTC.adjust(DateTime(__DATE__, __TIME__));
   //RTC.adjust(DateTime(__TIME__));
  }
  disp.begin(0x70);
  disp.setBrightness(0);

Serial.begin(115200);
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  //#if defined (__AVR_ATtiny85__)
  //  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  //#endif
  // End of trinket special code
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}


void loop()
{
 fullRed();
 
 disp.print(getDecimalTime());
 disp.drawColon(true);
 disp.writeDisplay();
 //delay(500);
 //disp.drawColon(false);
 //disp.writeDisplay();
 //delay(500);
}

int getDecimalTime()
{
 DateTime now = RTC.now();
 int decimalTime = now.hour() * 100 + now.minute();
 if (now.hour()<1){
  disp.print(0);
 }
 return decimalTime;
}

void fullRed() {

   DateTime now = RTC.now();
   tmElements_t tm;
  

    for(uint16_t i=0; i<strip.numPixels(); i++) {
    if (now.hour() >= 21 && (now.hour() <= 22)){    
      strip.setPixelColor(i, strip.Color(255,0,0,0) );
      strip.setBrightness(50);
      strip.show();}
    else if (now.hour() >= 22 && (now.hour() < 24)){
      strip.setPixelColor(i, strip.Color(255,255,0,0) );
      strip.setBrightness(1);
      strip.show();}        
    else if (now.hour() >= 24 && (now.hour() < 6)){
      strip.setPixelColor(i, strip.Color(255,255,255,0) );
      strip.setBrightness(1);
      strip.show();}  
    else if (now.hour() >= 6 && (now.hour() < 21)){
      strip.setPixelColor(i, strip.Color(204,0,204,0) );
      strip.setBrightness(50);
      strip.show();}  
}
}

for now i have a physical button that cut the power on the neopixels, but for the wakeuplight, i need a software solution. How can i make the lights go on on a set time, and at the same time use the button to switch on the light at night (for example).

so in short: switch lights on/off with a button, and the same light go on automaticaly on a set time in the morning, regardless what state the on/off switch is.

Thx in advance.

At the set time turn in the lights, and set a Boolean variable called say lights to true.
Then look at the button only when it becomes pressed and the lights variable is true you then set the lights variable to false and turn all the lights of by setting the colours to black.

void loop(){

   DateTime now = RTC.now();
   tmElements_t tm;
  
if (now.hour() == 17 && (now.minute() >= 50 && now.minute() < 51)){
  digitalWrite(ledPin1, HIGH);}
else {
  val = digitalRead(inPin1);  // read input value
  if (val == HIGH) {         // check if the input is HIGH (button released)
    digitalWrite(ledPin1, LOW);  // turn LED GREEN OFF
  } else {
    digitalWrite(ledPin1, HIGH);  // turn LED GREEN ON
  }}

this works. on time 17:50 led goes HIGH (on), 17:51 led LOW (off)
if light is off, button still works. When light is on, button does not work.

thx Grumpy_Mike!!

void loop()
{
 fullRed();
 
 disp.print(getDecimalTime());
 disp.drawColon(true);
 disp.writeDisplay();
 //delay(500);
 //disp.drawColon(false);
 //disp.writeDisplay();
 //delay(500);
}

int getDecimalTime()
{
 DateTime now = RTC.now();
 int decimalTime = now.hour() * 100 + now.minute();
 if (now.hour()<1){
  disp.print(0);
 }
 return decimalTime;

any idea how to set leading zeroes to the clock's time?

Can you expand? Not sure what that means.

#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include "RTClib.h"

RTC_DS1307 RTC;
Adafruit_7segment disp = Adafruit_7segment();

int ledPin1 = 13; // choose the pin for the LED
int ledPin2 = 12; // choose the pin for the LED
int inPin1 = 7;   // choose the input pin (for a pushbutton)
int inPin2 = 6;   // choose the input pin (for a pushbutton)
int val = 0;     // variable for reading the pin status

void setup() {
{
/*Wire.begin();*/
 RTC.begin();
/*f (! RTC.isrunning())
  {
  RTC.adjust(DateTime(__DATE__, __TIME__));
  }*/
  disp.begin(0x70);
  disp.setBrightness(50);}


  pinMode(ledPin1, OUTPUT);  // declare LED as output
  pinMode(inPin1, INPUT);    // declare pushbutton as input
  pinMode(ledPin2, OUTPUT);  // declare LED as output
  pinMode(inPin2, INPUT);    // declare pushbutton as input
}

void loop(){

   DateTime now = RTC.now();
   tmElements_t tm;
  
if (now.hour() == 6 && (now.minute() >= 25 && now.minute() < 30)){
  digitalWrite(ledPin1, HIGH);}
else {
  val = digitalRead(inPin1);  // read input value
  if (val == HIGH) {         // check if the input is HIGH (button released)
    digitalWrite(ledPin1, LOW);  // turn LED GREEN OFF
  } else {
    digitalWrite(ledPin1, HIGH);  // turn LED GREEN ON
  }}
  
if (now.hour() == 6 && (now.minute() >= 30 && now.minute() < 45)){
  digitalWrite(ledPin2, HIGH);}
else {
  val = digitalRead(inPin2);  // read input value
  if (val == HIGH) {         // check if the input is HIGH (button released)
    digitalWrite(ledPin2, LOW);  // turn LED BLUE OFF
  } else {
    digitalWrite(ledPin2, HIGH);  // turn LED BLUE ON
  }}
 disp.print(getDecimalTime());
 disp.drawColon(true);
 disp.writeDisplay();
 delay(500);
 disp.drawColon(false);
 disp.writeDisplay();
 delay(500);
}

int getDecimalTime(){
 DateTime now = RTC.now();
 int decimalTime = now.hour() * 100 + now.minute();
 return decimalTime;}

time is correct on a 7segment 4 digit i2c led display. but there are no leading zeroes in the time. So i want 00:06 and not . . : .6 (dots are empty spaces)

normaly just ad - if (now.hour() < 10); {disp.write('0');} - or something like that, but it does not work.

normaly just ad - if (now.hour() < 10); {disp.write('0');} - or something like that, but it does not work.

Well something like this will work. You have to split the hours from the minuets and print them separately, doing the leading zero thing for each part.