Introduction: The Fibonacci Clock

UPDATE: This project has been successfully funded on Kickstarterand is now available for sale at http://store.basbrun.comThank you to all those who supported my campaign!

I present to you the Fibonacci Clock, a clock for nerds with style. Beautiful and fun at the same time, the clock uses the famous Fibonacci sequence to display time in a brand new way.

Step 1: How Do I Tell Time?

The Fibonacci sequence is a sequence of numbers created by the Italian mathematician Fibonacci in the 13th century. This is a sequence starting with 1 and 1, where each subsequent number is the sum of the previous two. For the clock I used the first 5 terms: 1, 1, 2, 3 and 5.

The screen of the clock is made up of five squares whose side lengths match the first five Fibonacci numbers: 1, 1, 2, 3 and 5. The hours are displayed using red and the minutes using green. When a square is used to display both the hours and minutes it turns blue. White squares are ignored. To tell time on the Fibonacci clock you need to do some math. To read the hour, simply add up the corresponding values of the red and blue squares. To read the minutes, do the same with the green and blue squares. The minutes are displayed in 5 minute increments (0 to 12) so you have to multiply your result by 5 to get the actual number.

Often, there are multiple ways to display a single time. To add to the challenge, the combinations are picked randomly from all the different ways a number can be displayed. There are, for example, 16 different ways to display 6:30 and you never know which one the clock will use!

Step 2: Circuit

I built the Fibonacci clock using an Atmega328P micro-controller using Arduino. You could buy an Arduino board and a DS1307 real-time clock break-out board and build a custom shield for your circuit but I preferred to build my own circuit board. That allows me to keep size small and price low.

Step 3: Buttons

The three buttons attached to Arduino pins #3,#4 and #6 are used together to change time. Button on pin #3 can be used alone to change the color palette of the LEDs. An extra button is attached to pin #5 to change between different modes of the clock. Two modes are lamp modes and the default mode is the clock. All buttons are connected to the Arduino pins with a 10K pull-down resistor in parallel.

Step 4: Real-Time Clock

The real-time clock chip DS1307 is connected to the Arduino analog pins 4 and 5 with two 22K pull-up resistors. The clock pin 5 (SDA) is connected to the Atmega328P pin 27 (Arduino A4) and the clock pin 6 (SCL) is connected to the Atmega329P pin 29 (Arduino A5). To keep time while unplugged the DS1307 chip needs a 3V battery connected to pint 3 and 4 of the chip. Finally, the real-time clock is driven by a 32KHz crystal connected on pins 1 and 2. A 5V power is applied on pin 8.

Step 5: LED Pixels Strip

I am using LED pixels built on top of the WS2811 drivers. These microcontrollers allows me to set the color of each individual LED with a single output on the Arduino microcontroller. The Arduino pin used to control the LEDs in this project is pin #8 (Atmega328P pin #14).

Step 6: Microcontroller

You will find all the details on how to connect the Atmega328P to make an Arduino clone on my post “Build an Arduino Clone“. I added a new feature in this project, an FTDI port to program your Arduino microcontroller directly on this circuit. You connect pin one to the reset pin of the Arduino trough a 0.1uF capacitor to synchronize your uploader with the chip bootup sequence.

Pin 2 (RX) of the FTDI port connects to pin 3 of the Atmega328P(Arduino 1-TX) and pin 3 (TX) of the FTDI connector connects to pin 2 of the Atmega328P (Arduino 0 – RX). Finally FTDI pin 4 goes to 5V and 5 and 6 to ground.

Step 7: The Enclosure

The video presents all the steps for the construction of the Fibonacci clock enclosure. The idea is to create 5 square compartments in the clock, two inches deep, matching the size of the five first terms of the Fibonacci sequence, 1, 1, 2, 3 and 5. The LEDs are distributed in all squares and connected in the back of the clock to the circuit board.

The enclosure is built out of birch plywood. The frame is 1/4″ thick and the back panel is 1/8″ thick. The separators are 1/16″ thick and can be made of any opaque material. The dimensions of the clock are 8″x5″x4″. The front of the clock is a piece of 1/8″ thick semi-transparent plexiglass. The separators are marked using a Sharpie pen.

The wood finish is a water based varnish applied after a good sanding using 220 sand paper.

Step 8: Make It a Lamp

The Fibonacci clock can also be converted into an ambiant lamp! The code published already support two lamp modes. Simply push the mode button to toggle between the three modes. The code is open for you to hack, feel free to implement your own modes!

Step 9: You'r Done

You are done! The Fibonacci clock is a fantastic discussion starter...bring it to your next NERD get together or to the Christmas family reunion!

Thanks for reading/watching!

Step 10: The Code

You can find the source code on my github account:

https://github.com/pchretien/fibo

Comments

author
ClemRz (author)2017-07-03

Hi, awesome project! I'm working on making it with an ESP8266 and an HTML UI for the time / mode / palettes setup.

I'm analysing your code (from your git repo) and I was wondering why you do a division by five in the setTime function:

if (oldHours == hours && oldMinutes/5 == minutes/5) return;

Wouldn't it be the same as the following?

if (oldHours == hours && oldMinutes == minutes) return;

Thanks a lot for opening your code, blueprints and schematics!

author
ClemRz (author)ClemRz2017-07-04

> if (oldHours == hours && oldMinutes/5 == minutes/5) return;
> Wouldn't it be the same as the following?
> if (oldHours == hours && oldMinutes == minutes) return;

Answering to myself haha, this is not the same as we are comparing bytes, not floats.
The first line would be true for each multiple of 5 minutes while the second would be true for each minute.

That's smart! =)

author
ClemRz (author)ClemRz2017-07-03

Also, why don't you use internal pull-up resistors instead of adding pull-down resistors? This would save you space and money ;)

author
JanB118 made it! (author)2016-07-14

Here are some pictures. I failed in producing the original pcb so i decided to take the the design one step simpeler by using an arduino nano and a ds1307 module.

Then I needed to fabricate a custom pcb to house the parts. In Fritzing that is quite easy. Quite happy with the result. Still have to fabricate the back lid.

I will be using the fibonacci clock in the classes R&D that i teach. And showing off to colleagues off course :-).

20160714_164808.jpg20160714_164825.jpg20160714_164840.jpg20160714_164850.jpg20160714_164854.jpg
author
paapacj (author)JanB1182017-06-30

Sir you have done awesome work but sir can you tell me how to connect those wirings ? as im new and i really want your help please ...

author
josecmh (author)JanB1182016-12-07

Hi friend, sorry I would like to know which library you have used with that module because I have mounted it as you using RTClib-master and it does not show me the hours or anything. a greeting

author
JanB118 (author)josecmh2016-12-07

BTW i moved to the ds3231 module as it is much more accurate. Adapting the code for this module is very easy and available on request.

author
JanB118 (author)JanB1182017-02-21

Here is the code for a setup with ds3231:

// Fibonacci Clock

//

// This program is free software; you can redistribute it and/or

// modify it under the terms of the GNU General Public License Version 2

//

// 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

//

// You will find the latest version of this code at the following address:

// https://github.com/pchretien/fibo

//

// This project contains code and libraries provided by Adafruit Industries and can be found on their Github account at:

// https://github.com/adafruit

//

// Credits:

// See the credit.txt file for the list of all the backers of the Kickstarter campaign.

// https://www.kickstarter.com/projects/basbrun/fibonacci-clock-an-open-source-clock-for-nerds-wit/description

//

#include <Wire.h>

#include "RTClib.h"

#include <Adafruit_NeoPixel.h>

#define STRIP_PIN 8

#define HOUR_PIN 3 // RED

#define MINUTE_PIN 4 // GREEN

#define BTN_PIN 5 // BLACK

#define SET_PIN 6 // WHITE

#define DEBOUNCE_DELAY 10

#define MAX_BUTTONS_INPUT 20

#define MAX_MODES 3

#define MAX_PALETTES 10

#define TOTAL_PALETTES 10

#define CLOCK_PIXELS 5

// Parameter 1 = number of pixels in strip

// Parameter 2 = pin number (most are valid)

// Parameter 3 = pixel type flags, add together as needed:

// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)

// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)

// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)

// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

Adafruit_NeoPixel strip = Adafruit_NeoPixel(9, STRIP_PIN, NEO_RGB + NEO_KHZ800);

byte bits[CLOCK_PIXELS];

uint32_t black = strip.Color(0,0,0);

uint32_t colors[TOTAL_PALETTES][4] =

{

{

// #1 RGB

strip.Color(255,255,255), // off

strip.Color(255,10,10), // hours

strip.Color(10,255,10), // minutes

strip.Color(10,10,255) // both;

},

{

// #2 Mondrian

strip.Color(255,255,255), // off

strip.Color(255,10,10), // hours

strip.Color(248,222,0), // minutes

strip.Color(10,10,255) // both;

},

{

// #3 Basbrun

strip.Color(255,255,255), // off

strip.Color(80,40,0), // hours

strip.Color(20,200,20), // minutes

strip.Color(255,100,10) // both;

},

{

// #4 80's

strip.Color(255,255,255), // off

strip.Color(245,100,201), // hours

strip.Color(114,247,54), // minutes

strip.Color(113,235,219) // both;

}

,

{

// #5 Pastel

strip.Color(255,255,255), // off

strip.Color(255,123,123), // hours

strip.Color(143,255,112), // minutes

strip.Color(120,120,255) // both;

}

,

{

// #6 Modern

strip.Color(255,255,255), // off

strip.Color(212,49,45), // hours

strip.Color(145,210,49), // minutes

strip.Color(141,95,224) // both;

}

,

{

// #7 Cold

strip.Color(255,255,255), // off

strip.Color(209,62,200), // hours

strip.Color(69,232,224), // minutes

strip.Color(80,70,202) // both;

}

,

{

// #8 Warm

strip.Color(255,255,255), // off

strip.Color(237,20,20), // hours

strip.Color(246,243,54), // minutes

strip.Color(255,126,21) // both;

}

,

{

//#9 Earth

strip.Color(255,255,255), // off

strip.Color(70,35,0), // hours

strip.Color(70,122,10), // minutes

strip.Color(200,182,0) // both;

}

,

{

// #10 Dark

strip.Color(255,255,255), // off

strip.Color(211,34,34), // hours

strip.Color(80,151,78), // minutes

strip.Color(16,24,149) // both;

}

};

RTC_DS3231 rtc;

boolean on = true;

byte oldHours = 0;

byte oldMinutes = 0;

int lastButtonValue[MAX_BUTTONS_INPUT];

int currentButtonValue[MAX_BUTTONS_INPUT];

int mode = 0;

int palette = 0;

byte error = 0;

byte oldError = 0;

void setup()

{

Serial.begin(9600);

delay(3000); // wait for console opening

// Initialize the strip and set all pixels to 'off'

strip.begin();

strip.show();

Wire.begin();

rtc.begin();

if (! rtc.begin()) {

Serial.println("Couldn't find RTC");

while (1);

}

if (rtc.lostPower()) {

Serial.println("RTC lost power, lets set the time!");

// following line sets the RTC to the date & time this sketch was compiled

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

// This line sets the RTC with an explicit date & time, for example to set

// January 21, 2014 at 3am you would call:

// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

}

// Make the random() function return unpredictable results

randomSeed(rtc.now().unixtime());

pinMode(HOUR_PIN, INPUT); //RED

pinMode(MINUTE_PIN, INPUT); //GREEN

pinMode(BTN_PIN, INPUT); //BLACK

pinMode(SET_PIN, INPUT); //WHITE

pinMode(13, OUTPUT);

for(int i=0;i<4;i++)

{

digitalWrite(13, HIGH);

delay(250);

digitalWrite(13, LOW);

delay(250);

}

// Make sure the time is always displayed the first

// time the clock is powered on.

oldHours = 99;

DateTime now = rtc.now();

Serial.print(now.hour(), DEC);

Serial.print(':');

Serial.print(now.minute(), DEC);

Serial.print(':');

Serial.print(now.second(), DEC);

Serial.println();

}

void loop()

{

// 9:25

// setPixel(0, strip.Color(255,255,255));

// setPixel(1, strip.Color(255,10,10));

// setPixel(2, strip.Color(10,255,10));

// setPixel(3, strip.Color(10,10,255));

// setPixel(4, strip.Color(255,10,10));

// strip.show();

// return;

// Read buttons

int set_button = debounce(SET_PIN);

int hour_button = debounce(HOUR_PIN);

int minute_button = debounce(MINUTE_PIN);

int button = debounce(BTN_PIN);

if(set_button && button && hasChanged(BTN_PIN))

{

for(int i=0; i<100; i++)

{

if(!debounce(SET_PIN) || !debounce(BTN_PIN))

break;

}

if(debounce(SET_PIN) && debounce(BTN_PIN))

{

checkErrors();

}

}

else if( set_button && hour_button && hasChanged(HOUR_PIN))

{

DateTime newTime = DateTime(rtc.now().unixtime()+3600);

rtc.adjust( newTime );

displayCurrentTime();

}

else if( set_button && minute_button && hasChanged(MINUTE_PIN))

{

DateTime fixTime = rtc.now();

DateTime newTime = DateTime(

fixTime.year(),

fixTime.month(),

fixTime.day(),

fixTime.hour(),

((fixTime.minute()-fixTime.minute()%5)+5)%60,

0);

rtc.adjust( newTime );

displayCurrentTime();

}

else if( minute_button && hasChanged(MINUTE_PIN))

{

toggleOnOff();

}

else if( hour_button && hasChanged(HOUR_PIN))

{

palette = (palette+1)%MAX_PALETTES;

oldHours = 99;

oldError = 99;

}

else if( button && hasChanged(BTN_PIN))

{

mode = mode + 1;

if(mode >= MAX_MODES)

mode = 0;

}

// Store buttons new values

resetButtonValues();

switch(mode)

{

case 0:

displayCurrentTime();

break;

case 1:

oldHours = 99;

rainbowCycle(20);

break;

case 2:

oldHours = 99;

rainbow(20);

break;

case 3:

oldHours = 99;

// Display error code

displayErrorCode();

break;

}

}

int debounce(int pin)

{

int val = digitalRead(pin);

if( val == lastButtonValue[pin] )

{

currentButtonValue[pin] = val;

return val;

}

delay(DEBOUNCE_DELAY);

val = digitalRead(pin);

if( val != lastButtonValue[pin] )

{

currentButtonValue[pin] = val;

return val;

}

currentButtonValue[pin] = lastButtonValue[pin];

return lastButtonValue[pin];

}

boolean hasChanged(int pin)

{

return lastButtonValue[pin] != currentButtonValue[pin];

}

void resetButtonValues()

{

for(int i=0; i<MAX_BUTTONS_INPUT; i++)

lastButtonValue[i] = currentButtonValue[i];

}

void displayCurrentTime()

{

DateTime now = rtc.now();

setTime(now.hour()%12, now.minute());

}

void setTime(byte hours, byte minutes)

{

if(oldHours == hours && oldMinutes/5 == minutes/5)

return;

oldHours = hours;

oldMinutes = minutes;

for(int i=0; i<CLOCK_PIXELS; i++)

bits[i] = 0;

setBits(hours, 0x01);

setBits(minutes/5, 0x02);

for(int i=0; i<CLOCK_PIXELS; i++)

{

setPixel(i, colors[palette][bits[i]]);

strip.show();

}

}

void displayErrorCode()

{

if(oldError == error)

return;

oldError = error;

for(int i=0; i<CLOCK_PIXELS; i++)

bits[i] = 0;

if(error == 0)

{

setBits(12, 0x02);

}

else

{

setBits(error, 0x01);

}

for(int i=0; i<CLOCK_PIXELS; i++)

{

setPixel(i, colors[palette][bits[i]]);

}

strip.show();

}

void setBits(byte value, byte offset)

{

switch(value)

{

case 1:

switch(random(2))

{

case 0:

bits[0]|=offset;

break;

case 1:

bits[1]|=offset;

break;

}

break;

case 2:

switch(random(2))

{

case 0:

bits[2]|=offset;

break;

case 1:

bits[0]|=offset;

bits[1]|=offset;

break;

}

break;

case 3:

switch(random(3))

{

case 0:

bits[3]|=offset;

break;

case 1:

bits[0]|=offset;

bits[2]|=offset;

break;

case 2:

bits[1]|=offset;

bits[2]|=offset;

break;

}

break;

case 4:

switch(random(3))

{

case 0:

bits[0]|=offset;

bits[3]|=offset;

break;

case 1:

bits[1]|=offset;

bits[3]|=offset;

break;

case 2:

bits[0]|=offset;

bits[1]|=offset;

bits[2]|=offset;

break;

}

break;

case 5:

switch(random(3))

{

case 0:

bits[4]|=offset;

break;

case 1:

bits[2]|=offset;

bits[3]|=offset;

break;

case 2:

bits[0]|=offset;

bits[1]|=offset;

bits[3]|=offset;

break;

}

break;

case 6:

switch(random(4))

{

case 0:

bits[0]|=offset;

bits[4]|=offset;

break;

case 1:

bits[1]|=offset;

bits[4]|=offset;

break;

case 2:

bits[0]|=offset;

bits[2]|=offset;

bits[3]|=offset;

break;

case 3:

bits[1]|=offset;

bits[2]|=offset;

bits[3]|=offset;

break;

}

break;

case 7:

switch(random(3))

{

case 0:

bits[2]|=offset;

bits[4]|=offset;

break;

case 1:

bits[0]|=offset;

bits[1]|=offset;

bits[4]|=offset;

break;

case 2:

bits[0]|=offset;

bits[1]|=offset;

bits[2]|=offset;

bits[3]|=offset;

break;

}

break;

case 8:

switch(random(3))

{

case 0:

bits[3]|=offset;

bits[4]|=offset;

break;

case 1:

bits[0]|=offset;

bits[2]|=offset;

bits[4]|=offset;

break;

case 2:

bits[1]|=offset;

bits[2]|=offset;

bits[4]|=offset;

break;

}

break;

case 9:

switch(random(2))

{

case 0:

bits[0]|=offset;

bits[3]|=offset;

bits[4]|=offset;

break;

case 1:

bits[1]|=offset;

bits[3]|=offset;

bits[4]|=offset;

break;

}

break;

case 10:

switch(random(2))

{

case 0:

bits[2]|=offset;

bits[3]|=offset;

bits[4]|=offset;

break;

case 1:

bits[0]|=offset;

bits[1]|=offset;

bits[3]|=offset;

bits[4]|=offset;

break;

}

break;

case 11:

switch(random(2))

{

case 0:

bits[0]|=offset;

bits[2]|=offset;

bits[3]|=offset;

bits[4]|=offset;

break;

case 1:

bits[1]|=offset;

bits[2]|=offset;

bits[3]|=offset;

bits[4]|=offset;

break;

}

break;

case 12:

bits[0]|=offset;

bits[1]|=offset;

bits[2]|=offset;

bits[3]|=offset;

bits[4]|=offset;

break;

}

}

void setPixel(byte pixel, uint32_t color)

{

if(!on)

return;

switch(pixel)

{

case 0:

strip.setPixelColor(0, color);

break;

case 1:

strip.setPixelColor(1, color);

break;

case 2:

strip.setPixelColor(2, color);

break;

case 3:

strip.setPixelColor(3, color);

strip.setPixelColor(4, color);

break;

case 4:

strip.setPixelColor(5, color);

strip.setPixelColor(6, color);

strip.setPixelColor(7, color);

strip.setPixelColor(8, color);

strip.setPixelColor(9, color);

break;

};

}

void rainbow(uint8_t wait)

{

uint16_t i, j;

for(j=0; j<256; j++)

{

for(i=0; i< CLOCK_PIXELS; i++)

{

setPixel(i, Wheel((i+j) & 255));

}

strip.show();

delay(wait);

if(debounce(BTN_PIN) && hasChanged(BTN_PIN))

{

mode = (mode + 1)%MAX_MODES;

resetButtonValues();

return;

}

if(debounce(MINUTE_PIN) && hasChanged(MINUTE_PIN))

{

toggleOnOff();

resetButtonValues();

return;

}

resetButtonValues();

}

}

// Slightly different, this makes the rainbow equally distributed throughout

void rainbowCycle(uint8_t wait)

{

uint16_t i, j;

for(j=0; j<256*5; j++)

{

// 5 cycles of all colors on wheel

for(i=0; i< CLOCK_PIXELS; i++)

{

setPixel(i, Wheel(((i * 256 / CLOCK_PIXELS) + j) & 255));

}

strip.show();

delay(wait);

if(debounce(BTN_PIN) && hasChanged(BTN_PIN))

{

mode = (mode + 1)%MAX_MODES;

resetButtonValues();

return;

}

if(debounce(MINUTE_PIN) && hasChanged(MINUTE_PIN))

{

toggleOnOff();

resetButtonValues();

return;

}

resetButtonValues();

}

}

// 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.Color(WheelPos * 3, 255 - WheelPos * 3, 0);

}

else if(WheelPos < 170)

{

WheelPos -= 85;

return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);

}

else

{

WheelPos -= 170;

return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);

}

}

void toggleOnOff()

{

if( on )

{

for( int i=0; i<CLOCK_PIXELS; i++)

setPixel(i, black);

strip.show();

}

on = !on;

if(on)

{

oldHours = 99;

oldError = 99;

}

}

void checkErrors()

{

error = 0;

oldError = 99;

mode = 3;

palette = 0;

// Test sequence

if (! rtc.begin())

{

error |= 0x1;

}

int time1 = rtc.now().unixtime();

delay(1200);

int time2 = rtc.now().unixtime();

if(time1 == time2)

{

error |= 0x02;

}

}

void printDateTime(DateTime now)

{

Serial.print(now.year(), DEC);

Serial.print('/');

Serial.print(now.month(), DEC);

Serial.print('/');

Serial.print(now.day(), DEC);

Serial.print(' ');

Serial.print(now.hour(), DEC);

Serial.print(':');

Serial.print(now.minute(), DEC);

Serial.print(':');

Serial.print(now.second(), DEC);

Serial.println();

Serial.print(" since midnight 1/1/1970 = ");

Serial.print(now.unixtime());

Serial.print("s = ");

Serial.print(now.unixtime() / 86400L);

Serial.println("d");

// calculate a date which is 7 days and 30 seconds into the future

DateTime future (now.unixtime() + 7 * 86400L + 30);

Serial.print(" now + 7d + 30s: ");

Serial.print(future.year(), DEC);

Serial.print('/');

Serial.print(future.month(), DEC);

Serial.print('/');

Serial.print(future.day(), DEC);

Serial.print(' ');

Serial.print(future.hour(), DEC);

Serial.print(':');

Serial.print(future.minute(), DEC);

Serial.print(':');

Serial.print(future.second(), DEC);

Serial.println();

Serial.println();

delay(1000);

}

author
NilsV2 (author)JanB1182017-02-22

Wow, great. Thanks a lot

author
NilsV2 (author)JanB1182017-02-21

Hi,

Your project looks great. Would you mind sharing your code or how you changed the original code? Thanks!

author
JanB118 (author)josecmh2017-02-21

Did you rename the library folder from RTClib-master to RTClib?

author
JanB118 (author)josecmh2016-12-07

It is the same library as in the original design.

Maybe give this a try:

https://github.com/adafruit/RTClib

author
pchretien (author)JanB1182016-07-14

Hi,

Your clock looks great! I like the way you built your circuit ... What and where are you teaching?

Thanks for sharing with the community!

Phil

author
JanB118 (author)pchretien2016-07-14

Hah, its a bit quick and dirty, but it works.

I am a teacher in biology and research&development to youngster aging from 12 to 17 years old in the Netherlands.

Your clock is a demonstration of what can emerge when creativity and technology meet.... ingenuity!

For over two month's now, I have a lot of fun with your clock on a daily basis. Designing the custom pcb, the woodworking, sourcing the parts, the build and, off course the final result.

THANK YOU FOR SHARING THE FIBONACCI CLOCK IN THE OPEN SOURCE MANNER.

Maybe there is a market for ready made clocks in the Netherlands....;-)

author
ravijag made it! (author)2017-04-06

Fascinating clock to build. Made it myself using hardboard enclosure and 8 MM RGB Neopixel LEDs

IMG_20170319_202726.jpg
author
AxelF11 made it! (author)2016-12-19

Here are the pictures of my project. I realized it by using an arduino nano and an ds3231. It was a great pleasure to build it although my hair turned gray sometimes.

To house the parts I used a veroboard. I placed this board in a way that I still can reach the mini-usb from the arduino nano. This allows me to change the program and use other color schemes for example.

Foto 20.12.16, 01 27 29.jpgFoto 20.12.16, 01 33 40.jpgFoto 20.12.16, 01 33 56.jpgFoto 12.12.16, 23 57 19.jpg
author
etko (author)2016-11-25

I have just published an article here at Instructables. I hope you can appreciate it. Regards, Eric

https://www.instructables.com/id/Fibonacci-Clock-Mo...

author
tittiamo68 made it! (author)2016-11-09

Thanks to your project I built my watch, which I published today.

It is a bit easier (I did not use the Neopixel) but I added the minutes and the seconds in binary format and I also added a display

IMG_2130.JPG20160712_173311.jpg20160712_173045.jpg
author
marilia15 (author)2016-11-03

I am trying to build the fibonacci clock, I have already bought all the components excepct the case and the pcb. I want to order the pcb but I have big problems in the specifications because I can not see this information in the fritzing program. The fabric ask me for this specifications for my order:

material: normal FR4 board / aluminium board / blind vias board ?

fr4-tg: tg130-140/ 150-160 / 170-180 ?

thickness: from 0.4 to 2.4 mm ¿1.6?

min track/spacing: 4/4mil, 5/5mil, 6/6mil ?

min hole size: 0.2mm, 0.25, 0.3 ?

surface finish: HASL with lead, HASL lead free, inmersion gold, hard gold ?

via process: tenting vias, plugged vias, vias no covered ?

finished copper: 1 oz Cu, 2,3, 4 ?

Somebody can help me, please?

author
r_stolzenberger (author)2016-08-08

What a neat idea! I'm not a HW guy, more of a SW person. Really like the way blue functions as a double signifier, for hours and minutes, in order to permit two seperate tallyings from 0 to 11 on the clock. But I think it needs a third tally, some mechanism to get in all the minutes from 0 to 59 onto the display.

Thought of two approaches to this.

First thought was to add a third signal to the display which basically counts from 0 to 4, incrementing every minute. This signal would tell how many single minutes to add to the calculated time based upon the previously existing two tallies. My idea would be to arc counter-clockwise from the single 1x1 cell which is strictly in the interior of the fibo rectangle, i.e the one without any exterior edges. That (interior) 1X1 cell would indicate: 0 added minutes. The other 1X1 cell directly north of it (moving counter-clockwise) would indicate: 1 added minute. The 2X2 square would indicate:2; and the 3X3 square would indicate:3; finally the 5X5 square cell would indicate: 4 added minutes.

How to distinguish which of the five cells are "on" in order to know how many single minutes to add? I suppose color saturation. Normally, I'd envision all colors to be muted for the other two tallies (hours and 5-minute intervals). The one brighter square would give the number of added minutes. If some sore of analog(?) design could be used to give a gradual shading depth during the course of 60 seconds, then you could even build in a rough visual signal about how far along within the course of a given minute the current time is. This would make for a more living, constantly subtly changing clockface.

What do you think?

The second idea I had, which is still half-baked, revolved around playing with primary colors and secondary ones. If either a white or blue or green or red square were to move towards (or suddenly be) grey, purple, yellow, or orange -- then this could also serve as a signal about how many minutes, 0 thru 4, to add.

Anyway, just messing around with the concept. I could see how the software coding for adding a third tally would not present huge problems, but have no idea what complexity it introduces in the hardware.

~RS

author

Hi,

That's a great idea! Many people wrote me about their solution for a clock accurate to the minute! I think it's awesome that people get so involved in this weird project. This is what open source is all about!

A teacher from the UK wrote me a message about the class he gave using my clock project. He asked the kids what they would do to improve the clock ... there are some pretty cool ideas! I posted an article on my blog: http://basbrun.com/2015/05/29/the-fibonacci-clock-...

Have a nice day!

author
PurnaY (author)2016-10-11

Hi any direct link by using Arduino Uno and RTC?

author
pchretien (author)PurnaY2016-11-02

If you google your question you'll find tons of samples!

Thanks for stopping by ...

author
ravijag (author)2016-06-16

Sorry, i could not locate the wiring diagram @github. I am more specifically wanting to know the LED sequencing as there are 5 sets to be sequenced in series.

can u pls share this detail as i am unable to proceed with your project due to this step not being clear? Any other readers who have figured out the wiring can kindly help?

author
pchretien (author)ravijag2016-07-05

Hi ravijag,

The LEDs are driven by the WS2811 LED driver ... you only need three wires connected to an SPI port to drive all the LED independently.

author
JanB118 (author)pchretien2016-07-05

Some chinese ledstrips come with 5 wires; 2 white (both ground) 2 red (both 5v) and a green wire to drive the leds. You can clip off the extra red and white wires.

author
JanB118 (author)ravijag2016-07-04

Are you trying to connect the ledstrip to the pcb?

author
JanB118 (author)2016-07-04

I recently finished my first fibonacci lamp. I had some trouble producing my own pcb so i moved to a ready made arduino board and a ds 1307 breakout. Now I only have to make small pcb to accomodate the buttons.

author
pchretien (author)JanB1182016-07-05

That's awesome! Would love to see the final result! Thanks for sharing!

author
ravijag (author)2016-06-09

Hi

i want to build this for myself but am unable to understand the wiring sequence of the LED modules (DO to DI between modules). The picture or schematic is not clear on this critical connection. Can u please elaborate this step?

author
pchretien (author)ravijag2016-06-15

Hello,
All the schematics are in the git repo on github.
P.

author
vishnunairpr (author)2016-06-15

Can we convert the double sided pcb to single sided one???

author
pchretien (author)vishnunairpr2016-06-15

Sure you can... The Fritzing file is in the git repo. You can also find the pub at https://store.basbrun.com if you want to go faster! :)

author
vishnunairpr (author)2016-02-12

is there any substitute for the type of led strips used?

can we use separate red, yellow and green leds?
if so plese tell me how?

i would like to do this project

the led strips are not available in my place and it is undeliverable area in inernet shopping sites.

please help me

author
pchretien (author)vishnunairpr2016-06-08

Hi,

Thanks for your message ... You can use any WS2811 based LED strip. You should be able to find it on eBay or Alibaba.

Using distinct red,green and blue LEDs won't produce the same effect and you'll need multiple LED drivers to drive that many LEDs.

Where are you located?

author

An RGB LED is actually 3 seperate LEDs with either the anodes or cathodes tied together, take a red a green and a blue, twist either all the anodes or cathodes together and you have yourself a common anode or cathode (depending on which you tied) RGB LED, although, you will not get the same diffusion, it will work.

If you wish you can replace all the colours with any available LED colour, it would even be possible to make an IR clock that displays the led at 3 different brightnesses by tying different resistors to the anode or cathode that can only be seen through a camera with its IR filter removed for extra confusion!!!!

author

But how to programme it???

author
JanB118 (author)2016-06-06

I certainly will. Right now i am sourcing the right of plexiglass..

author
JanB118 (author)2016-06-05

OMG, I tried to drive the pixelstrip from the wrong end.

Problem solved!

author
pchretien (author)JanB1182016-06-05

Hi,

Glad you solved your problem! Would love to see the final result!

Philippe

author
JanB118 (author)2016-06-04

I love the idea of this clock. Very creative i must say.

I am trying to build one myself. Shipping costs to the Netherlands are a bit steep and i don't want to miss out on the DIY fun

Already fabricated my first pcb. So proud of myself. Now i want try the breadbord version before i go into soldering, but i run into some trouble now.

I bought a strip of 50 lights and cut them up in strands of 9. The first 9 led work just fine but the other cut up pieces don't ligt up. De complete strand of 50 lights worked fine also. Maybe i want to build some more as a gift so i would very much like the strands to work to.

Do you have any idea of what is going wrong here?

Thx in advance!

author
ccarpio2 (author)2016-05-10

That's really cool.
Do you think is possible to merge your project with a INKA CALCULATOR ( YUPANA )

http://www.quipus.it/english/Andean%20Calculators.pdf

author
pchretien (author)ccarpio22016-05-11

Hi ccarpio2,

This Inca calculator is a magnificent object! Sure it could be merge together ... if you do it let us know!

author
mcutin (author)2016-05-10

Hey, Philippe...

Congratulations for this awesome project! Answering your question from two days ago, I'm from Rio de Janeiro, Brazil, and I received the link for your project in a Instructable's tweet earlier today. Funny that I only realized that your article was posted a year ago when you mentioned it in your comment. :-)

author
pchretien (author)mcutin 2016-05-10

Oh great! I got more than 30 000 views in a weekend, one year after I published the article! :) Instructables.com is THE place to be in the DIY community!

author
BarbaraW82 (author)2016-05-10

Awwwh. It's not for sale? I have to build it? I like the pretty colors.

author
pchretien (author)BarbaraW822016-05-10

It is actually ... http://store.basbrun.com

Thanks!

author
deswiger (author)2016-05-10

I have enough trouble keeping track of all of the Mickey Mouse appendages on my wrist watch, I'm not ready to learn any new tricks. Looks like a nice little DIY though. Thanks for the look into the future.......;) Semper Fi

author
pchretien (author)deswiger2016-05-10

Thanks!

author
BillyB1 (author)2016-05-09

Cool project! Congratualtions on your Kickstarter campaign. I've posted a linl / pic of your clock on Pinterest, hope it helps!!

About This Instructable

157,487views

1,052favorites

License:

More by pchretien:The Fibonacci ClockRGB / RFID LampHalloween Tombstone Decoration
Add instructable to: