Skip to content

Instantly share code, notes, and snippets.

@stickperson
Forked from buckeyeworldcitizen/bdayclock
Last active August 29, 2015 14:28
Show Gist options
  • Save stickperson/56bea749c3c3462432d9 to your computer and use it in GitHub Desktop.
Save stickperson/56bea749c3c3462432d9 to your computer and use it in GitHub Desktop.
Birthday word clock
//Theres two parts to this code: first the birthday part and then the clock part which i had on separate arduinos.
//The first section is original and the second is modified from Joe Caldwell at http://www.highonsolder.com who modified it from Scott Bezek who modified it from Doug Jackson
//Good luck
#include <Wire.h>
#include "RTClib.h"
#include <Adafruit_NeoPixel.h>
#define pinhap 9
#define pindean 10
#define pinshel 11
#define strip
RTC_DS1307 RTC;
int led = 13;
int wait = 1;
int q = 1;
int k = 1;
Adafruit_NeoPixel strip_h = Adafruit_NeoPixel(13, pinhap, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip_d = Adafruit_NeoPixel(4, pindean, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip_s = Adafruit_NeoPixel(7, pinshel, NEO_GRB + NEO_KHZ800);
void setup () {
strip_h.begin();
strip_d.begin();
strip_s.begin();
strip_h.show();
strip_d.show();
strip_s.show();
Serial.begin(57600);
Wire.begin();
RTC.begin();
strip_h.setBrightness(100);
strip_d.setBrightness(100);
strip_s.setBrightness(100);
// if (! RTC.isrunning()) {
// Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
// RTC.adjust(DateTime(__DATE__, __TIME__));
}
void loop () {
DateTime now = RTC.now();
//this is running a test cycle that lights up both parts for a few minutes every hour.
//to change it to birthdays just add now.day and now.month conditions like below
if (now.minute() >= 11 && (now.minute() <= 13)){
rainbowCycle_A(20);
}
else if (now.minute() >= 22 && (now.minute() <= 25)){
rainbowCycle_B(20);
}
else{
for(q=0; q< 13; q++) {
strip_h.setPixelColor(q,0,0,0);
strip_d.setPixelColor(q,0,0,0);
strip_s.setPixelColor(q,0,0,0);
strip_h.show();
strip_d.show();
strip_s.show();
}
}
}
void rainbowCycle_A(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256*3; j++) {
for(i=0; i< 13; i++) {
strip_h.setPixelColor(i, Wheel(((i * 50 / 13) + j) & 255));
delayMicroseconds(550);
}
for(k=0; k< 7; k++) {
strip_s.setPixelColor(k, Wheel(((k * 50 / 7) + j) & 255));
delayMicroseconds(550);
}
strip_s.show();
strip_h.show();
// delay(wait);
}
}
void rainbowCycle_B(uint8_t wait) {
uint16_t i, j;
for(j=0; j<256*1; j++) {
for(i=0; i< 13; i++) {
strip_h.setPixelColor(i, Wheel(((i * 50 / 13) + j) & 255));
delayMicroseconds(550);
}
for(k=0; k< 4; k++) {
strip_d.setPixelColor(k, Wheel(((k * 50 / 4) + j) & 255));
delayMicroseconds(550);
}
strip_d.show();
strip_h.show();
// delay(wait);
}
}
// 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) {
if(WheelPos < 85) {
return strip_d.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
else if(WheelPos < 170) {
WheelPos -= 85;
return strip_d.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else {
WheelPos -= 170;
return strip_d.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
// second part
/**************************************************************************
* *
* W O R D C L O C K - A clock that tells the time using words. *
* *
* Hardware: Arduino Dumelove with a set of individual LEDs under a word *
* stencil. *
* *
* Original Copyright (C) 2009 Doug Jackson (doug@doughq.com) *
* Modifications Copyright (C) 2010 Scott Bezek (scott@bezekhome.com) *
* *
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
* MA 02111-1307 USA *
* *
***************************************************************************
*
* Revision History
*
* Date By What
* 20001025 DRJ Initial Creation of Arduino Version
* - based on Wordclock.c - from PIC version
* 20100124 Scott Bezek Changed LED pinout, added brightness control,
* changed buttons to hour/minute increment
* 20101231 Joe Caldwell Changed pushbuttons to external pulldown,
* revised comments, deleted unused code
*/
// Display output pin assignments
#define MTEN Display1=Display1 | (1<<0)
#define HALF Display1=Display1 | (1<<1)
#define QUARTER Display1=Display1 | (1<<2)
#define TWENTY Display1=Display1 | (1<<3)
#define MFIVE Display1=Display1 | (1<<4)
#define MINUTES Display1=Display1 | (1<<5)
#define PAST Display1=Display1 | (1<<6)
#define UNUSED1 Display1=Display1 | (1<<7)
#define TO Display2=Display2 | (1<<0)
#define ONE Display2=Display2 | (1<<1)
#define TWO Display2=Display2 | (1<<2)
#define THREE Display2=Display2 | (1<<3)
#define FOUR Display2=Display2 | (1<<4)
#define HFIVE Display2=Display2 | (1<<5)
#define SIX Display2=Display2 | (1<<6)
#define UNUSED2 Display2=Display2 | (1<<7)
#define SEVEN Display3=Display3 | (1<<0)
#define EIGHT Display3=Display3 | (1<<1)
#define NINE Display3=Display3 | (1<<2)
#define HTEN Display3=Display3 | (1<<3)
#define ELEVEN Display3=Display3 | (1<<4)
#define TWELVE Display3=Display3 | (1<<5)
#define OCLOCK Display3=Display3 | (1<<6)
#define UNUSED3 Display3=Display3 | (1<<7)
int hour=9, minute=30, second=00;
static unsigned long msTick =0; // the number of Millisecond Ticks since we last
// incremented the second counter
int count;
char Display1=0, Display2=0, Display3=0;
// hardware constants
int LEDClockPin=6;
int LEDDataPin=7;
int LEDStrobePin=8;
int MinuteButtonPin=2;
int HourButtonPin=3;
int PWMPin = 9;
void setup()
{
// initialise the hardware
// initialize the appropriate pins as outputs:
pinMode(LEDClockPin, OUTPUT);
pinMode(LEDDataPin, OUTPUT);
pinMode(LEDStrobePin, OUTPUT);
//pinMode(BrightnessPin, INPUT);
pinMode(MinuteButtonPin, INPUT);
pinMode(HourButtonPin, INPUT);
pinMode(PWMPin, OUTPUT);
Serial.begin(19200);
msTick=millis(); // Initialise the msTick counter
displaytime(); // display the current time
}
void ledsoff(void) {
Display1=0;
Display2=0;
Display3=0;
}
void WriteLEDs(void) {
// Now we write the actual values to the hardware
shiftOut(LEDDataPin, LEDClockPin, MSBFIRST, Display3);
shiftOut(LEDDataPin, LEDClockPin, MSBFIRST, Display2);
shiftOut(LEDDataPin, LEDClockPin, MSBFIRST, Display1);
digitalWrite(LEDStrobePin,HIGH);
delay(2);
digitalWrite(LEDStrobePin,LOW);
}
void displaytime(void){
// start by clearing the display to a known state
ledsoff();
Serial.print("It is ");
// now we display the appropriate minute counter
if ((minute>4) && (minute<10)) {
MFIVE;
MINUTES;
Serial.print("Five Minutes ");
}
if ((minute>9) && (minute<15)) {
MTEN;
MINUTES;
Serial.print("Ten Minutes ");
}
if ((minute>14) && (minute<20)) {
QUARTER;
Serial.print("Quarter ");
}
if ((minute>19) && (minute<25)) {
TWENTY;
MINUTES;
Serial.print("Twenty Minutes ");
}
if ((minute>24) && (minute<30)) {
TWENTY;
MFIVE;
MINUTES;
Serial.print("Twenty Five Minutes ");
}
if ((minute>29) && (minute<35)) {
HALF;
Serial.print("Half ");
}
if ((minute>34) && (minute<40)) {
TWENTY;
MFIVE;
MINUTES;
Serial.print("Twenty Five Minutes ");
}
if ((minute>39) && (minute<45)) {
TWENTY;
MINUTES;
Serial.print("Twenty Minutes ");
}
if ((minute>44) && (minute<50)) {
QUARTER;
Serial.print("Quarter ");
}
if ((minute>49) && (minute<55)) {
MTEN;
MINUTES;
Serial.print("Ten Minutes ");
}
if (minute>54) {
MFIVE;
MINUTES;
Serial.print("Five Minutes ");
}
if ((minute <5))
{
switch (hour) {
case 1:
ONE;
Serial.print("One ");
break;
case 2:
TWO;
Serial.print("Two ");
break;
case 3:
THREE;
Serial.print("Three ");
break;
case 4:
FOUR;
Serial.print("Four ");
break;
case 5:
HFIVE;
Serial.print("Five ");
break;
case 6:
SIX;
Serial.print("Six ");
break;
case 7:
SEVEN;
Serial.print("Seven ");
break;
case 8:
EIGHT;
Serial.print("Eight ");
break;
case 9:
NINE;
Serial.print("Nine ");
break;
case 10:
HTEN;
Serial.print("Ten ");
break;
case 11:
ELEVEN;
Serial.print("Eleven ");
break;
case 12:
TWELVE;
Serial.print("Twelve ");
break;
}
OCLOCK;
Serial.println("O'Clock");
}
else
if ((minute < 35) && (minute >4))
{
PAST;
Serial.print("Past ");
switch (hour) {
case 1:
ONE;
Serial.println("One ");
break;
case 2:
TWO;
Serial.println("Two ");
break;
case 3:
THREE;
Serial.println("Three ");
break;
case 4:
FOUR;
Serial.println("Four ");
break;
case 5:
HFIVE;
Serial.println("Five ");
break;
case 6:
SIX;
Serial.println("Six ");
break;
case 7:
SEVEN;
Serial.println("Seven ");
break;
case 8:
EIGHT;
Serial.println("Eight ");
break;
case 9:
NINE;
Serial.println("Nine ");
break;
case 10:
HTEN;
Serial.println("Ten ");
break;
case 11:
ELEVEN;
Serial.println("Eleven ");
break;
case 12:
TWELVE;
Serial.println("Twelve ");
break;
}
}
else
{
// if we are greater than 34 minutes past the hour then display
// the next hour, as we will be displaying a 'to' sign
TO;
Serial.print("To ");
switch (hour) {
case 1:
TWO;
Serial.println("Two ");
break;
case 2:
THREE;
Serial.println("Three ");
break;
case 3:
FOUR;
Serial.println("Four ");
break;
case 4:
HFIVE;
Serial.println("Five ");
break;
case 5:
SIX;
Serial.println("Six ");
break;
case 6:
SEVEN;
Serial.println("Seven ");
break;
case 7:
EIGHT;
Serial.println("Eight ");
break;
case 8:
NINE;
Serial.println("Nine ");
break;
case 9:
HTEN;
Serial.println("Ten ");
break;
case 10:
ELEVEN;
Serial.println("Eleven ");
break;
case 11:
TWELVE;
Serial.println("Twelve ");
break;
case 12:
ONE;
Serial.println("One ");
break;
}
}
WriteLEDs();
}
void incrementtime(void){
// increment the time counters keeping care to rollover as required
second=0;
if (++minute >= 60) {
minute=0;
if (++hour == 13) {
hour=1;
}
}
// debug outputs
Serial.println();
Serial.print(hour);
Serial.print(",");
Serial.print(minute);
Serial.print(",");
Serial.println(second);
}
void loop(void)
{
/*analogWrite(PWMPin, analogRead(0)/4); //enable dimming via potentiometer or photoresistor*/
analogWrite(PWMPin, 255); //manually set brightness level
// heart of the timer - keep looking at the millisecond timer on the Arduino
// and increment the seconds counter every 1000 ms
if ( millis() - msTick >999) {
msTick=millis();
second++;
// Flash the onboard Pin13 Led so we know something is hapening!
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,LOW);
}
//test to see if we need to increment the time counters
if (second==60)
{
incrementtime();
displaytime();
}
// test to see if the Minute Button is being held down
// for time setting
if ( (digitalRead(MinuteButtonPin) ==1 ) && second!=1)
// the Minute Button is down and it has been more
// than one second since we last looked
{
minute=(((minute/5)*5) +5);
second=0;
incrementtime();
second++; // Increment the second counter to ensure that the name
// flash doesnt happen when setting time
displaytime();
}
// test to see if the Hour Button is being held down
// for time setting
if ((digitalRead(HourButtonPin)==1 ) && second!=1)
{
minute = (minute/5)*5; //round minute down to previous 5 min interval
if (++hour == 13) {
hour=1;
}
incrementtime();
second++; // Increment the second counter to ensure that the name
// flash doesnt happen when setting time
displaytime();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment