// RTClib::Code by JeeLabs http://news.jeelabs.org/code/
#include <Wire.h>
#include "RTClib.h"
#include <Adafruit_NeoPixel.h>
#define PIN 7
#define NUMPIXELS 56
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
RTC_DS3231 rtc;
//Customize Parameters
float NIGHT=125.0;//Threshold for Night clock
const int Night_R=13,Night_G=8,Night_B=2;//LED color for Night clock
const int ILL_Pin = A0;//Illuminance sensor
int value_ILL[10];//for averaging
int count_ILL=0;
boolean BRIGHT=true;
int digit[4];//HHMM
int ledClock[NUMPIXELS];//Mask array for clock display
int ledMask[NUMPIXELS];//Mask array for Hour digits and Minutes digits
int lastMin, lastHour;//for rewrite display
const int R_Pin = 2;//push switch for addition
const int L_Pin = 3;//push switch for subtruction
void setup () {
Serial.begin(9600);
pinMode(R_Pin, INPUT_PULLUP);
pinMode(L_Pin, INPUT_PULLUP);
pixels.begin(); // This initializes the NeoPixel library.
rtc.begin();
for(int i=0;i<10;i++){
//value_ILL[i]=100;//initial data for illuminance average
value_ILL[i]=NIGHT+10;//initial data for illuminance average
}
Serial.println("SimpleClock31 170626");
}
void loop () {
float value=Illum();
//Serial.println(value);//for modification
BRIGHT=(value > NIGHT);
if(BRIGHT){
rainbowCycle(10);
}
else{
nightClock();
}
}
// check button state for the time adjusutment during rainbowCycle or nightClock function
void wantAdjust(){
if(!digitalRead(R_Pin)||!digitalRead(L_Pin)){
int STATE=buttonState();
if(STATE==3) adjustClock();
}
}
int adjustClock(){
if(setHour()==0) return;
if(setMin()==0) return;
setSec00();
}
void setComplete(){
//do nothing now
}
int setHour(){
int adjusting=1;
dispHour();
unsigned long TimeModeIN=millis();
while(adjusting==1){
if((millis()-TimeModeIN)>5000) adjusting=0;
int STATE=buttonState();
if(STATE==1) addHour(),TimeModeIN=millis();
if(STATE==2) subHour(),TimeModeIN=millis();
if(STATE==3) adjusting=2;
}
return adjusting;
}
void addHour(){
DateTime now = rtc.now()+TimeSpan(0,1,0,0);
rtc.adjust(now);
dispHour();
}
void subHour(){
DateTime now = rtc.now()+TimeSpan(0,-1,0,0);
rtc.adjust(now);
dispHour();
}
int setMin(){
int adjusting=1;
dispMin();
unsigned long TimeModeIN=millis();
while(adjusting==1){
if((millis()-TimeModeIN)>5000) adjusting=0;
int STATE=buttonState();
if(STATE==1) addMin(),TimeModeIN=millis();
if(STATE==2) subMin(),TimeModeIN=millis();
if(STATE==3) adjusting=2;
}
return adjusting;
}
void addMin(){
DateTime now = rtc.now()+TimeSpan(0,0,1,0);
rtc.adjust(now);
dispMin();
}
void subMin(){
DateTime now = rtc.now()+TimeSpan(0,0,-1,0);
rtc.adjust(now);
dispMin();
}
int setSec00(){
int adjusting=1;
dispSec00();
unsigned long TimeModeIN=millis();
while(adjusting==1){
if((millis()-TimeModeIN)>60000) adjusting=0;
int STATE=buttonState();
if(STATE!=0) adjSec00(),adjusting=2;
}
}
void adjSec00(){
DateTime now = rtc.now();
int Sec00=now.second();
now = now-TimeSpan(0,0,0,Sec00);
rtc.adjust(now);
}
void dispMin(){
adjustDisp(0);
}
void dispHour(){
adjustDisp(1);
}
void dispSec00(){
adjustDisp(2);
}
int buttonState(){
boolean BUTTON=true;
int bState,last_bState;
int i=0;
while(BUTTON){
int rs=0,ls=0;
if(!digitalRead(R_Pin)) rs=1;
if(!digitalRead(L_Pin)) ls=2;
bState=rs+ls;
if(i==0) last_bState = bState;
if(bState != last_bState) BUTTON=false, bState=0;
if(i>5) BUTTON=false;
i++;
if (bState==3) delay(100);
else delay(20);
}
return bState;
}
float Illum(){
count_ILL=(count_ILL +1)%10;
value_ILL[count_ILL]=analogRead(ILL_Pin);
//Serial.print(value_ILL[count_ILL]);//for debug
//Serial.print("--");//for debug
float sum=0.0;
for(int i=0;i<10;i++){
sum=sum+value_ILL[i];
}
float average=sum/10.0;
//Serial.print(average);//for debug
//Serial.print("--");//for debug
return average;
}
void checkTime(boolean WIPE){
DateTime now = rtc.now();
if((now.minute()!=lastMin)||(now.hour()!=lastHour)){
if(WIPE) rgbWipe(255, 5);
clockPixels(now.hour(), now.minute());
if(WIPE) rgbWipe(255, 15);
}
lastMin=now.minute();
lastHour=now.hour();
}
void clockPixels(int ledHour, int ledMin){
digit[0]=ledMin%10;
digit[1]=ledMin/10;
digit[2]=ledHour%10;
digit[3]=ledHour/10;
for(int i=0;i<4;i++){
switch(digit[i]){
case 0:
ledClock[0+i*14]=1,ledClock[2+i*14]=1,ledClock[4+i*14]=1,ledClock[6+i*14]=0,ledClock[8+i*14]=1,ledClock[10+i*14]=1,ledClock[12+i*14]=1;
ledClock[1+i*14]=1,ledClock[3+i*14]=1,ledClock[5+i*14]=1,ledClock[7+i*14]=0,ledClock[9+i*14]=1,ledClock[11+i*14]=1,ledClock[13+i*14]=1;
break;
case 1:
ledClock[0+i*14]=1,ledClock[2+i*14]=0,ledClock[4+i*14]=0,ledClock[6+i*14]=0,ledClock[8+i*14]=1,ledClock[10+i*14]=0,ledClock[12+i*14]=0;
ledClock[1+i*14]=1,ledClock[3+i*14]=0,ledClock[5+i*14]=0,ledClock[7+i*14]=0,ledClock[9+i*14]=1,ledClock[11+i*14]=0,ledClock[13+i*14]=0;
break;
case 2:
ledClock[0+i*14]=1,ledClock[2+i*14]=1,ledClock[4+i*14]=0,ledClock[6+i*14]=1,ledClock[8+i*14]=0,ledClock[10+i*14]=1,ledClock[12+i*14]=1;
ledClock[1+i*14]=1,ledClock[3+i*14]=1,ledClock[5+i*14]=0,ledClock[7+i*14]=1,ledClock[9+i*14]=0,ledClock[11+i*14]=1,ledClock[13+i*14]=1;
break;
case 3:
ledClock[0+i*14]=1,ledClock[2+i*14]=1,ledClock[4+i*14]=0,ledClock[6+i*14]=1,ledClock[8+i*14]=1,ledClock[10+i*14]=1,ledClock[12+i*14]=0;
ledClock[1+i*14]=1,ledClock[3+i*14]=1,ledClock[5+i*14]=0,ledClock[7+i*14]=1,ledClock[9+i*14]=1,ledClock[11+i*14]=1,ledClock[13+i*14]=0;
break;
case 4:
ledClock[0+i*14]=1,ledClock[2+i*14]=0,ledClock[4+i*14]=1,ledClock[6+i*14]=1,ledClock[8+i*14]=1,ledClock[10+i*14]=0,ledClock[12+i*14]=0;
ledClock[1+i*14]=1,ledClock[3+i*14]=0,ledClock[5+i*14]=1,ledClock[7+i*14]=1,ledClock[9+i*14]=1,ledClock[11+i*14]=0,ledClock[13+i*14]=0;
break;
case 5:
ledClock[0+i*14]=0,ledClock[2+i*14]=1,ledClock[4+i*14]=1,ledClock[6+i*14]=1,ledClock[8+i*14]=1,ledClock[10+i*14]=1,ledClock[12+i*14]=0;
ledClock[1+i*14]=0,ledClock[3+i*14]=1,ledClock[5+i*14]=1,ledClock[7+i*14]=1,ledClock[9+i*14]=1,ledClock[11+i*14]=1,ledClock[13+i*14]=0;
break;
case 6:
ledClock[0+i*14]=0,ledClock[2+i*14]=1,ledClock[4+i*14]=1,ledClock[6+i*14]=1,ledClock[8+i*14]=1,ledClock[10+i*14]=1,ledClock[12+i*14]=1;
ledClock[1+i*14]=0,ledClock[3+i*14]=1,ledClock[5+i*14]=1,ledClock[7+i*14]=1,ledClock[9+i*14]=1,ledClock[11+i*14]=1,ledClock[13+i*14]=1;
break;
case 7:
ledClock[0+i*14]=1,ledClock[2+i*14]=1,ledClock[4+i*14]=0,ledClock[6+i*14]=0,ledClock[8+i*14]=1,ledClock[10+i*14]=0,ledClock[12+i*14]=0;
ledClock[1+i*14]=1,ledClock[3+i*14]=1,ledClock[5+i*14]=0,ledClock[7+i*14]=0,ledClock[9+i*14]=1,ledClock[11+i*14]=0,ledClock[13+i*14]=0;
break;
case 8:
ledClock[0+i*14]=1,ledClock[2+i*14]=1,ledClock[4+i*14]=1,ledClock[6+i*14]=1,ledClock[8+i*14]=1,ledClock[10+i*14]=1,ledClock[12+i*14]=1;
ledClock[1+i*14]=1,ledClock[3+i*14]=1,ledClock[5+i*14]=1,ledClock[7+i*14]=1,ledClock[9+i*14]=1,ledClock[11+i*14]=1,ledClock[13+i*14]=1;
break;
case 9:
ledClock[0+i*14]=1,ledClock[2+i*14]=1,ledClock[4+i*14]=1,ledClock[6+i*14]=1,ledClock[8+i*14]=1,ledClock[10+i*14]=0,ledClock[12+i*14]=0;
ledClock[1+i*14]=1,ledClock[3+i*14]=1,ledClock[5+i*14]=1,ledClock[7+i*14]=1,ledClock[9+i*14]=1,ledClock[11+i*14]=0,ledClock[13+i*14]=0;
break;
}
}
}
void rgbWipe(uint32_t c, uint8_t wait) {
colorWipe(pixels.Color(c, 0, 0), wait); // Red
colorWipe(pixels.Color(0, c, 0), wait); // Green
colorWipe(pixels.Color(0, 0, c), wait); // Blue
}
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<pixels.numPixels(); i++) {
pixels.setPixelColor(i, c*ledClock[i]);
pixels.show();
delay(wait);
}
}
// rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256; j++) {
checkTime(true);
wantAdjust();//adjustTime
for(i=0; i< pixels.numPixels(); i++) {
pixels.setPixelColor(i, (Wheel(((i * 256 / pixels.numPixels()) + j) & 255))*ledClock[i]);
}
pixels.show();
delay(wait);
}
}
void nightClock(){
checkTime(false);
wantAdjust();//adjustTime
for(int i=0; i< pixels.numPixels(); i++) {
pixels.setPixelColor(i, pixels.Color(Night_R, Night_G, Night_B)*ledClock[i]);
}
pixels.show();
delay(2000);
}
void adjustDisp(int MH){ //0:--MM,1:HH--,2:HHMM
//Serial.print("adjustDisp=");//for debug
//Serial.println(MH);//for debug
checkTime(false);
if(MH==0){
for(int i=0;i<NUMPIXELS/2;i++) ledMask[i]=1;
for(int i=NUMPIXELS/2;i<NUMPIXELS;i++) ledMask[i]=0;
}
if(MH==1){
for(int i=0;i<NUMPIXELS/2;i++) ledMask[i]=0;
for(int i=NUMPIXELS/2;i<NUMPIXELS;i++) ledMask[i]=1;
}
if(MH==2){
for(int i=0;i<NUMPIXELS;i++) ledMask[i]=1;
}
for(int i=0; i< NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 100, 0)*ledClock[i]*ledMask[i]);
//Display Color is Green
}
pixels.show();
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}