Introduction: Infinity Mirror Clock

Picture of Infinity Mirror Clock

Ever since my addressable RGB LED strips (WS2812B) came from Aliexpress, I've been fascinated with LED projects. Following up on my success with my Charlieplexed LED clock, I wanted to create something with more Jazz..

While browsing google images, I came across an instructable for an Arduino Infinity Mirror and the brain cells started working in overdrive. Why shouldn't I make an infinity mirror, that's also a clock !!

Features:

  1. Works like a clock - the colours of the hands are user-programmable over bluetooth
  2. Has an IR sensor to sense if someone is coming near the mirror. Switches off the LEDs, so that this can be used as a normal mirror :-)
  3. Shows a rainbow effect every 15 minutes (time is user adjustable)
  4. Has a touch button to toggle between clock and rainbow effects
  5. Switches to night mode between midnight and 7:00 AM - can be changed in the code.
  6. Can be programmed over bluetooth - so you do not need to take it off the wall if you need to update the code

World Maker Faire New York 2015

Step 1: Electronics

Picture of Electronics
  1. A Standalone Arduino: http://dushyant.ahuja.ws/2013/10/standalone-arduin... OR Arduino mini pro: http://www.aliexpress.com/item/10Pcs-Lot-Pro-Mini-...
  2. RTC Module – DS1302: http://fabtolab.com/DS1302-RTC-module?search=rtc
  3. LM2596 Step Down Adjustable Power Supply Module 1.3V-35V: http://cgi.ebay.in/ws/eBayISAPI.dll?ViewItem&item=...
  4. 1m 60LEDs/M Addressable RGB LED Strip (WS2812B): http://www.aliexpress.com/item/1M-WS2812-WS2812B-6...
  5. HC-05 Bluetooth module: http://www.aliexpress.com/item/RS232-TTL-LC-05-Wir...
  6. IR Proximity Sensor: https://www.instructables.com/id/Simple-IR-proximit...4 IR LEDs; 1 IR LED detector: http://www.evelta.com/industrial-control/sensors/5...
  7. Touch Pad: http://www.aliexpress.com/item/Touch-Pad-Brick-Sen...
  8. 9V – 2A Adapter
  9. CP2102 USB-to-TTL (the RST pin on the CP2102 is not for resetting the arduino – you have to solder a wire to the DTR pad on the PCB – which sends a reset signal to program the arduino. This has to be connected to the DTR pin on the Arduino

Step 2: The Circuit

Picture of The Circuit

The circuit is very simple:

  1. LED Strip - Connect power to the LM2596 Step Down Adjustable Power Supply Module - ensure you adjust the pot so that the output is 5V; Connect the ground to the common ground; Connect data to pin D5 of the Arduino
  2. Touch Sensor - data to pin D2 of Arduino
  3. RTC Module - SDA and SCL to the A4 and A5 of the Arduino respectively
  4. Bluetooth Module - Connect RX to Arduino's TX and TX to Arduino's RX. You will have to break-out pin 32 on the module to the DTR pin on the Arduino (This allows you to program the Arduino over bluetooth)
  5. IR Proximity Sensor - create the sensor as per this instructable: https://www.instructables.com/id/Simple-IR-proximit... - connect the photo-diode to A1 (A0 on the instructable schematic) and the IR LEDs to D13 (D2 on the instructable schematic)
  6. Connect the Power 9V 2A Power supply to the input of the 7805 and the LM2596

To setup the bluetooth programming circuit, please follow this link: http://makezine.com/projects/diy-arduino-bluetooth...

Step 3: The Code

This clock uses the following libraries (and all thanks to the authors of these libraries):

The latest version of the code can be downloaded from the project github: https://github.com/dushyantahuja/Smart-Infinity-Mi...

#include <Wire.h>
#include "RTClib.h"
#include "FastLED.h"
#include <SoftwareSerial.h>
#include <SerialCommand.h>
#include "EEPROM.h"
#include "TimerOne.h"

#define NUM_LEDS 60
#define DATA_PIN 5
#define UPDATES_PER_SECOND 100
#define SWITCHPIN 2

// Variables for IR Proximity

int IRpin = A1;               // IR photodiode on analog pin A1
int IRemitter = 13;            // IR emitter LED on digital pin 4

//

CRGBPalette16 currentPalette;
TBlendType    currentBlending;

CRGB leds[NUM_LEDS],minutes,hours,seconds,l,bg,lines;
RTC_DS1307 rtc;
SerialCommand sCmd;
boolean missed=0, ledState = 1, lastsec=1, multieffects = 0;
byte lastsecond, rain;
int light_low, light_high;
DateTime now;

void(* resetFunc) (void) = 0;

void setup() {
  digitalWrite(IRemitter,LOW);             // turning the IR LEDs off - as a precaution - they don't have current limiting resistors
  Wire.begin();
  rtc.begin();
  Serial.begin(115200);
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  currentPalette = RainbowStripeColors_p;
  currentBlending = NOBLEND;
  
  // ******** Setup the default values for parameters (if not set before)
  if (EEPROM.read(99) != 1){               // Check if colours have been set or not
    EEPROM.write(0,255);                   // Seconds Colour - R-G-B - White
    EEPROM.write(1,255);
    EEPROM.write(2,255);
    EEPROM.write(3,255);                   // Minutes Colour - R-G-B - Red
    EEPROM.write(4,0);
    EEPROM.write(5,0);
    EEPROM.write(6,0);                     // Hours Colour - R-G-B - Green
    EEPROM.write(7,255);
    EEPROM.write(8,0);
    EEPROM.write(9,0);                     // BG Colour - R-G-B - Black
    EEPROM.write(10,0);
    EEPROM.write(11,0);
    EEPROM.write(12, 0);                   // Light sensitivity - low
    EEPROM.write(13, 55);                  // Light sensitivity - high 
    EEPROM.write(14, 15);                  // Minutes for each rainbow   
    EEPROM.write(99,1);
  } 
  // Else read the parameters from the EEPROM
  else {
    seconds.r = EEPROM.read(0);
    seconds.g = EEPROM.read(1);
    seconds.b = EEPROM.read(2);  
    minutes.r = EEPROM.read(3);
    minutes.g = EEPROM.read(4);
    minutes.b = EEPROM.read(5);
    hours.r = EEPROM.read(6);
    hours.g = EEPROM.read(7);
    hours.b = EEPROM.read(8);
    bg.r = EEPROM.read(9);
    bg.g = EEPROM.read(10);
    bg.b = EEPROM.read(11);
    light_low = EEPROM.read(12);
    light_high = EEPROM.read(13); 
    rain = EEPROM.read(14); 
  }
  
  // ********** Setup the serial commands
  
  sCmd.addCommand("MULTI", set_multi);
  sCmd.addCommand("STAT", clockstatus);
  sCmd.addCommand("SETRAIN", set_rainbow);
  sCmd.addCommand("HOUR", set_hour);
  sCmd.addCommand("MIN", set_minute);
  sCmd.addCommand("SEC", set_second);
  sCmd.addCommand("BG", set_bg);
  sCmd.addCommand("LIGHT", set_light);
  sCmd.addCommand("TIME", set_time);
  sCmd.addCommand("MISSED", missedCall);
  sCmd.addCommand("MISSEDOFF", missedOff);
  sCmd.addCommand("RAINBOW", effects);
  sCmd.addCommand("MISSED", missedCall);
  sCmd.addCommand("MISSEDOFF", missedOff);
  sCmd.addDefaultHandler(effects);
  
  // ********** Set all LEDs to background colour
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = bg;
  }
  
  pinMode(IRemitter,OUTPUT);  // IR emitter LED on digital pin 2
  digitalWrite(IRemitter,LOW);// setup IR LED as off
  clockstatus();
  attachInterrupt(1, set_multi, FALLING);
  Timer1.initialize();
  Timer1.attachInterrupt(state, 500000);
}

void loop() {
  sCmd.readSerial();
  if(readIR(10) > 50){            // Switch off LEDs if someone is near the mirror - so that it can be used as a mirror. Switch off LEDs between 12:00 and 6:00 to save energy and cool down the LEDs and power supplies
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CRGB::Black;
    }
    FastLED.show();
    ledState = 1;
    //FastLED.delay(200);
  }
  else {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = bg;
  } 
  if(multieffects){                 // Check if the button for multi-effects has been pressed
    uint8_t secondHand;
    secondHand = now.second();
    if( secondHand ==  0)  { currentPalette = RainbowColors_p;         currentBlending = BLEND; }
    if( secondHand == 30)  { currentPalette = RainbowStripeColors_p;   currentBlending = BLEND;  }
    static uint8_t startIndex = 0;
    startIndex = startIndex + 1;
    FillLEDsFromPaletteColors( startIndex);
    FastLED.show();
  }
  else if(ledState){                	// Main clock code
    // Setting brightness to light_high
    int x = light_high; 		// analogRead(IRpin);
    now =  rtc.now();        
    if(( now.minute() % rain == 0 && now.second() == 0)){
       effects();
    }
    for(byte i=0; i<=now.minute();i++){
      //Serial.println(minutes);
      leds[i] = minutes;
    }
    //Serial.println(now.hour(),DEC);
    for(byte i = 0; i<60; i+=5){
      leds[i]=CRGB::White;
    }
    for(byte i=(now.hour()%12)*5; i<=((now.hour())%12)*5+(now.minute()/12);i++){
      leds[i] = hours;
    }
    if(now.hour() < 7) LEDS.setBrightness(constrain(light_low,0,100)); 		// Set brightness to light_low during night - cools down LEDs and power supplies.
    else LEDS.setBrightness(constrain(light_high,10,255));
    if(lastsec){
      l=leds[now.second()];
      leds[now.second()] = seconds;
      lastsecond = now.second();
      lastsec = 0;
      // Serial.println("ON");
    } else {
      leds[lastsecond] = l;
      if(missed) all_off();
      // Serial.println("OFF");
      lastsec = 1;
    }
    FastLED.show();
    ledState = 0;
  }
  //delay(250);
  if(multieffects) FastLED.delay(1000 / UPDATES_PER_SECOND);
  }
} 

void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
  uint8_t brightness = 255;
  
  for( int i = 0; i < NUM_LEDS; i++) {
    leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
    colorIndex += 3;
  }
}

void set_multi(){
  static unsigned long last_interrupt_time = 0;
  unsigned long interrupt_time = millis();
  if (interrupt_time - last_interrupt_time > 200) 
  {
    if(multieffects){
      for (int i = 0; i < NUM_LEDS; i++) {
        leds[i] = bg;
      }
    }
    multieffects = !multieffects;
    Serial.println(multieffects);
  }
  last_interrupt_time = interrupt_time;
}

void set_rainbow(){
  rain = atoi(sCmd.next());
  EEPROM.write(14,rain);
  Serial.println("RAINBOW TIME SET");
}

void clockstatus(){
  Serial.println("Status: ");
  Serial.print("BG: ");
  Serial.print(bg.r);
  Serial.print(" ");
  Serial.print(bg.g);
  Serial.print(" ");
  Serial.println(bg.b);
  Serial.print("SEC: ");
  Serial.print(seconds.r);
  Serial.print(" ");
  Serial.print(seconds.g);
  Serial.print(" ");
  Serial.println(seconds.b);
  Serial.print("MINUTE: ");
  Serial.print(minutes.r);
  Serial.print(" ");
  Serial.print(minutes.g);
  Serial.print(" ");
  Serial.println(minutes.b);
  Serial.print("HOUR: ");
  Serial.print(hours.r);
  Serial.print(" ");
  Serial.print(hours.g);
  Serial.print(" ");
  Serial.println(hours.b);
  Serial.print("Ambient Light: ");
  Serial.println(analogRead(IRpin));
  Serial.print("Light set - High:");
  Serial.println(light_high,DEC);
  Serial.print("Light set - Low:");
  Serial.println(light_low,DEC);
  Serial.print("Date: ");
  DateTime now =  rtc.now(); // DateTime(2014,5,2,22,30,0); 
  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.println(now.year(), DEC);
  Serial.print("Time: ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
  Serial.print("Distance: ");
  Serial.println(readIR(5),DEC);
}

void state(){
  ledState = 1;
}

const int colorWheelAngle = 255 / NUM_LEDS;

void effects(){
  Serial.println("RAINBOW");
  for (int j=0; j<3; j++){
    for (int i = 0; i < 60; i++) { 
      FillLEDsFromPaletteColors(i);
      FastLED.show();
      delay(30);
    }
  }
  lastsec = 1;
}

void missedCall()
{
    missed = 1;
}

void missedOff()
{
    missed = 0;
}

void all_off(){
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = CRGB::Black;
  }
}

void set_hour(){
  hours.r = atoi(sCmd.next());
  hours.g = atoi(sCmd.next());
  hours.b = atoi(sCmd.next());
  EEPROM.write(6,hours.r);
  EEPROM.write(7,hours.g);
  EEPROM.write(8,hours.b);
  Serial.println("HOUR COLOUR SET");  
}

void set_minute(){
  minutes.r = atoi(sCmd.next());
  minutes.g = atoi(sCmd.next());
  minutes.b = atoi(sCmd.next());
  EEPROM.write(3,minutes.r);
  EEPROM.write(4,minutes.g);
  EEPROM.write(5,minutes.b); 
  Serial.println("MINUTE COLOUR SET");  
}

void set_second(){
  seconds.r = atoi(sCmd.next());
  seconds.g = atoi(sCmd.next());
  seconds.b = atoi(sCmd.next());
  EEPROM.write(0,seconds.r);
  EEPROM.write(1,seconds.g);
  EEPROM.write(2,seconds.b);
  Serial.println("SECOND COLOUR SET"); 
}

void set_bg(){
  bg.r = atoi(sCmd.next());
  bg.g = atoi(sCmd.next());
  bg.b = atoi(sCmd.next());
  EEPROM.write(9,bg.r);
  EEPROM.write(10,bg.g);
  EEPROM.write(11,bg.b);
  Serial.println("BG COLOUR SET");
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = bg;
  }  
}

void set_light(){
  light_low = atoi(sCmd.next());
  light_high = atoi(sCmd.next());
  EEPROM.write(12,light_low);
  EEPROM.write(13,light_high);
  Serial.println("LIGHT SET"); 
}

void set_time(){
  String set_date, set_time;
  set_date = (String)sCmd.next() + ' ' + (String)sCmd.next() + ' ' + (String)sCmd.next();
  set_time = (String)sCmd.next();
  rtc.adjust(DateTime(set_date.c_str(),set_time.c_str()));
}
  
int readIR(int times){
  int ambientIR;                              // variable to store the IR coming from the ambient
  int obstacleIR;                             // variable to store the IR coming from the object
  int value[10];                              // variable to store the IR values
  int distance;                               // variable that will tell if there is an obstacle or not
  for(int x=0;x<times;x++){     
    digitalWrite(IRemitter,LOW);              // turning the IR LEDs off to read the IR coming from the ambient
    delay(1);                                             // minimum delay necessary to read values
    ambientIR = analogRead(IRpin);            // storing IR coming from the ambient
    digitalWrite(IRemitter,HIGH);             // turning the IR LEDs on to read the IR coming from the obstacle
    delay(1);                                 // minimum delay necessary to read values
    obstacleIR = analogRead(IRpin);           // storing IR coming from the obstacle
    value[x] = ambientIR-obstacleIR;          // calculating changes in IR values and storing it for future average
  }
 
  for(int x=0;x<times;x++){                   // calculating the average based on the "accuracy"
    distance+=value[x];
  }
  digitalWrite(IRemitter,LOW);                // turning the IR LEDs off
  return(distance/times);                     // return the final value
}

Step 4: Assembling the Clock

Picture of Assembling the Clock

The clock is primarily made up of the following:

  1. 2 pieces of 8mm plywood (600mm x 600mm) - needs to be cut as per the schematic above
  2. 1 piece of 18mm block-board (600mm x 600mm) - needs to be cut as per the schematic above. Please be careful with the circle - the circumference needs to be exactly 1000mm so that the 60 LEDs fit properly. I got it cut from a carpenter and he rounded up the radius from 159.23 to 160 - so I had to use double sided foam tape to get the LEDs to fit properly
  3. 1 circular 6mm mirror - 400mm dia
  4. 1 circular 6mm glass - 400mm dia. You need to put silver sun-control film on this - you can get this either from auto-accessories vendors or from window / glazing installers. 3M has a very good film that you should be able to get from 3M dealers
  5. 1 small round steel plate (100mm dia)
  6. N45 Silicon adhesive
  7. Black Paint
  8. Black Vinyl - you can get this from auto-accessories vendors or sticker manufacturers. We used a slightly sparkling matt black - similar to this: http://www.ebay.in/itm/Brilliant-Diamond-Black-Pea...

Steps:

  1. Join the pieces of plywood and block-board together, keeping the block-board in the center - you should use Fevicol (or similar) as well as nail it down
  2. Paint the interior portion Black
  3. Stick the LED strip to the interior of the circular cutout in the block-board. Ensure that the first LED is at the 12 o' clock position
  4. Wire up the Arduino as per the circuit in the previous step and hot-glue it to the square cutout
  5. Mount the touch-sensor on one of the sides using hot-glue (you will have to drill the block-board slightly so that the wires fit and don't show)
  6. Stick the mirror on the back side (facing up) using N45 silicon glue
  7. Stick the steel plate at the center of the mirror
  8. Stick the glass on the front side (film inside) using N45 silicon glue
  9. Test the circuit by plugging it in
  10. Troubleshoot :-)
  11. Fix the black vinyl on the front side - you will have to cut a circle in the center (~380 mm dia) so that the joint between the glass and the wood gets hidden.

Step 5: Approximate Costs

The costs were roughly as follows:

  1. Wood Frame - INR 1200 for the wood, INR 500 to get it cut and INR 500 to get it assembled and straightened
  2. LED Strip - INR 700 for 1m
  3. Standalone Arduino - INR 200
  4. Bluetooth Module - INR 500
  5. RTC Module - INR 155
  6. LM2596 Module - INR 150
  7. IR LEDs - INR 50
  8. Vinyl - INR 1000
  9. Shipping, Veroboard, hot glue, wires, etc - INR 400
  10. Touch Sensor - INR 250

All in all ~INR 5,500 (~ USD 95) - not counting my time :-)

Step 6: Final Result

Picture of Final Result

Features:

  1. Works like a clock - the colours of the hands are user-programmable over bluetooth
  2. Has an IR sensor to sense if someone is coming near the mirror. Switches off the LEDs, so that this can be used as a normal mirror :-)
  3. Shows a rainbow effect every 15 minutes (time is user adjustable)
  4. Has a touch button to toggle between clock and rainbow effects
  5. Switches to night mode between midnight and 7:00 AM - can be changed in the code.
  6. Can be programmed over bluetooth - so you do not need to take it off the wall if you need to update the code

The clock can be programmed over bluetooth using the following commands:

  1. MULTI - Toggles the multi-coloured rainbow effects
  2. STAT - Provides the clock status to the serial port
  3. SETRAIN Sets the interval for the rainbow effects - e.g every 5 minutes: SETRAIN 5
  4. HOUR [R] [G] [B] Sets the colour of the hour hand - e.g. HOUR 255 0 0 sets the hour hand to Red
  5. MIN

    [R] [G] [B]

    Sets the colour of the minute LEDs - e.g. MIN 0 255 0 sets the minute LEDs to Green
  6. SEC[R] [G] [B] Sets the colour of the second LED - e.g. SEC 255 255 255 sets the second LED to White
  7. BG [R] [G] [B] Sets the colour of the background LEDs - e.g. SEC 30 30 30 sets the background LEDs to Grey
  8. LIGHT [NIGHT] [DAY] Sets the brightness of the LEDs during night time and day time - e.g LIGHT 0 150 switches off LEDs at night and sets brightness to 150 during day. The code currently considers time between midnight and 7:00 AM as night. This can be changed easily in the code
  9. TIMESet the time

In addition, the clock can also be used as a physical notifier for missed calls on smartphones (http://dushyant.ahuja.ws/2013/11/physical-android-... Unfortunately, the android code in the link has stopped working. Can anyone help me in creating a tasker plugin that sends a serial text (placed in a variable) via bluetooth to the arduino.

Step 7: Problems Faced

Even though this build is relatively simple, I faced a few problems while building:

  1. The dimensions of the circles are very important. As I did not have access to a laser cutter, the circles have been cut by hand (not by me) and I faced problems while fixing the LED strip and the glass. I had given the dimensions to the carpenter in mm - but carpenter was used to inches and hence there was a slight rounding off in the dimensions. The center circle where the LED strip has to be stuck HAS to have a circumference of exactly 1000mm for the LED strip to fit correctly. The carpenter had made a larger circle and I had to pad the circumference with double sided tape. The outer circles where the mirror and glass had to be installed had the opposite problem - the glass simply did not fit. So I had to manually file the plywood to make the glass fit. My suggestion here would be to get the glass cut first and take it with you when you get the plywood cut. Would make things so much simpler. Luckily the design allows for small problems in the dimensions and you cannot see the faults in the final build
  2. I had assumed that a 7805 with a heat-sink would be sufficient to power the clock, as I had made a similar circuit before and it worked without any problem. I had not counted on the fact that these LEDs are behind a one-way mirror and consequently have to be much brighter. The first trial run had the processor hanging whenever the rainbow effects came on, the bluetooth module getting disconnected, etc. Thanks to friends on the arduino and fastled forums - I was able to sort this out. Bought an LM2596 module to power the LED strip separately. This module can pump out 3A with a heatsink. While this is still not enough for the 3.6A the strip can pull at full white, the software never turns on all the LEDs to white - so this is not a problem. Furthermore, I have added a night mode to the clock, so that the power supplies and LEDs can cool down at night - and hopefully prolong their life.
  3. The touch button is still giving some problems - but I think that is more to do with the problems in earthing in my house rather than anything else. Will try it at a friend's house to see if I still get the same problem.
  4. The proximity sensor does not work through glass. I had thought of installing the sensor behind the one-way mirror, but the glass blocks IR and hence the sensor does not work. I had to install it below the clock - its not big enough to be a distraction or look bad, but is not perfect either.
  5. Planning - I would suggest you plan all the features before you start building. My wife came up with the idea of converting this to a smart mirror (also) and I had to cut out the LCD enclosure with the limited tools I had at home (a drill and a file) - which was a problem. Had we planned for this enclosure earlier, we could have got a better finish.
  6. Costs - I had budget around 2,000 INR for this build, but we changed the design mid-way and added more features - so the final cost went over 5,000 INR. But I still love the final result :-)

Step 8: Future Plans

  1. Add a TFT LCD behind the one-way mirror to make it a smart mirror. The TFT LCD would show time, weather, a joke (?). The intent is to switch on the TFT when the LEDs are off so that it shows up through the on-way mirror. Similar to this: http://www.homecrux.com/2013/10/12/9583/smart-mirr...
  2. Add a microphone so that beat detection can be incorporated and effects setup to match the music
  3. Use it as a physical notifier to provide notifications for missed calls, texts, etc from my smartphone. The TFT LCD can be used to display the name, text, etc.

Suggestions welcome

Step 9: References and Links

Comments

dushyantahuja (author)2015-01-17

Just realised, the set_time doesn't function correctly, please replace with the following:

void set_time(){

DateTime now = rtc.now();

Serial.println("IN SETTIME");

uint8_t hr = (uint8_t)atoi(sCmd.next());

uint8_t minu = (uint8_t)atoi(sCmd.next());

uint8_t sec = (uint8_t)atoi(sCmd.next());

rtc.adjust(DateTime(now.year(),now.month(),now.day(),hr,minu,sec));

}

Format for setting time TIME h m s

e.g. TIME 10 12 00

i changed a code but it doesnt make the Leds ON.I wanna make only a clock Led without others function like bluetooth.Only with Leds and this code it doesnt work.May be you know the solution

Try the new code at the github - I have removed the functions for the button and the IR Sensor.

PrestonW2 (author)dushyantahuja2015-04-13

I tried the new code and could not get anything to work. Here is a picture of the libraries I have imported. Please help me understand what I am doing wrong

dushyantahuja (author)PrestonW22015-10-01

You need FastLED 3.1

PrestonW2 (author)dushyantahuja2015-04-13

I have uploaded the "new code" and cannot get anything to work. The only thing that happens is the first light on the LED strip turns on. Nothing else happens. Please help!!

dushyantahuja (author)PrestonW22015-04-14

Should have mentioned - the new code is updated for fastled v3.1 - please download that. Also, try to compile with arduino ide 1.0.6 Did you check the data pin in the new code ?

PrestonW2 (author)dushyantahuja2015-04-22

Hi, I did download the new library FastLed 3.1.

I checked all of my connections and believe they are all in the correct positions. I have one light that turns on, the first light. It is changing colors every few minutes. I have the LED strip connected to LM2596, Ground to common, Data to D5.

Touch Sensor to D2

RTC Module - DAT to A4 and CLK to A5.

No bluetooth or IR Sensor.

Do not know how to change a data pin in the programming.

PrestonW2 (author)PrestonW22015-04-22

I also connected LM2596 to a 9V battery pack.

dushyantahuja (author)PrestonW22015-04-23

I think this might be the problem - a 9V battery may not be able to provide enough current. This clock needs 2-3A at the minimum.

PrestonW2 (author)dushyantahuja2015-05-10

Hi! So I have tried a new ordeal. I connected a 9V battery pack with a 5V 1000 MA converter. Is this still not enough power?

PrestonW2 (author)PrestonW22015-04-23

what would you suggest to power these LEDs then?

dushyantahuja (author)PrestonW22015-04-24

9V 3A power supply. Be sure to tie together the grounds of both the power supplies.

PrestonW2 (author)PrestonW22015-04-22

I checked the data pin and changed the data pin to 8. I now have the first LED is blue, second is white, then third is green. Everything else is off. Not sure what else to do!

PrestonW2 (author)PrestonW22015-04-23

I did. still nothing.

dushyantahuja (author)PrestonW22015-04-23

Also - did you connect the ground of the Uno and the 2596 together?

dushyantahuja (author)PrestonW22015-04-23

You can change the data pin by modifying this line in the code:

#define DATA_PIN 8

dushyantahuja (author)2015-03-15

I've had the clock running for nearly nine months and it started getting stuck erratically. The clock would run for a few hours and then stop - the LEDs would get stuck. I tried everything to troubleshoot them - going so far as to replace all the components (except the LED strips one by one). But to no avail. Long story short - I have narrowed down to the following:

1. The first LED in the code remains ON at full brightness at all times

2. This caused the first LED to overheat and stop transmitting data

3. The solution is to change the white colour to (50,50,50)

It's working now - but will update if there are any issues.

nadlycam made it! (author)2014-09-26

Great clock! It inspired me to make this my first arduino project. I haven't completed it yet, I'm still trying to get the bluetooth to work, but I have it working using a USB to serial adapter. One thing that I found works really well is a convex mirror in the middle. I bought a 5 inch convex clock glass and painted the back with 'mirror effect' paint. It's amazing, the reflections go all the way to the middle. Thank you so much for posting this!

Jts37 (author)nadlycam2017-09-14

Looks good!

How were you able to change the colors without the bluetooth adapter? I can't seem to change anything.

nadlycam (author)Jts372017-09-22

I'm using a USB to serial adapter (FT232RL) . I was having no luck getting the bluetooth adapter to work so this was the next best thing. It's just a bit awkward to hook up to USB every time. I've recently put together another clock that does use bluetooth, so I'm considering updating my original to use it also. I even wrote an app.

dushyantahuja (author)nadlycam2014-10-03

Also - it seems from the photo that you have stuck the LED strip next to one of the mirrors - hence the double LED rows in the reflections. If you stick it near the middle - the reflections would be more regular.

nadlycam (author)dushyantahuja2014-10-19

I finally finished the frame, so I was able to attach the LED strip to the side. This is how it looks now. The trickiest part was getting the inside perimeter exactly right. I used epoxy wood filler to reduce the diameter by a couple of millimeters to get that. Now I just have to find a bluetooth module that works and it will be done. Thanks again for this instructable!

SeppV (author)nadlycam2014-11-10

this looks super awesome :) what did you use in the centre of the mirror, would you be so kind to take a picture of it?

nadlycam (author)SeppV2014-11-11

I found a convex 'clock glass' on eBay. It's about 5-3/4 inches in diameter and about an inch tall in the middle ('high rise'.) By using some mirror paint (I used stuff called Mirror Effect, there are others) on the back it became a convex mirror. I think that any frame-less convex mirror of about that diameter should work. I considered a 12-1/2 inch convex glass that would have replaced the flat mirror, but I'd have lost the straight tunnel effect around the outside.

adnos79 (author)nadlycam2014-12-20

for anyone looking for the convex glass, I went to the local auto store and brought the circular mirror they sell them to stick on truck mirrors etc....and you just pop them out of the plastic housing and you have your convex mirror. My local store only had 3 sizes and the largest being 5" dia.

SeppV (author)nadlycam2014-11-11

thank you for your reply and for the picture that clears things out a little bit. But I hope I understood this right, the bigger mirror in the back is flat and the small one in the middle is the 5-3/4 inch convex mirror

nadlycam (author)SeppV2014-11-11

Right. The flat mirror gives you a straight tunnel effect around the outside edge, and the convex mirror reflects the LEDs in a repeating conical shape that gives you radiating lines into the middle.

dushyantahuja (author)nadlycam2014-10-20

Wow - that looks amazing. I could see you've used metal clips to hold the mirror. If you've made a frame around it like me (I can't see from the images) - you can simply stick it using N45 silicon glue. It would look better.

Amazing, nevertheless - glad I helped.

dushyantahuja (author)nadlycam2014-09-29

That looks amazing. Great idea on the convex glass.

I'm glad you liked this enough to make one. Let me know if you have any problems and I can help out.

Jts37 (author)2017-09-14

I got the clock to work, however I cannot seem to figure out how to change the colors or the interval for rainbow mode. I opted out of the bluetooth adapter, so I need a way to do it without that. I have FastLED 3.1 and Arduino 1.8.1.

Any suggestions?

Antzy Carmasaic (author)2014-07-21

your build looks so beautiful!

The idea of adding a reflective metal in the middle was very creative. But I had to read the whole instructable to understand it. You can add a few pics of the metal plate to show us what kind of plate you have used.

Thanks for your feedback. I have annotated the images, have also added images of the plate.

Have also added a section on the problems I faced while building

SalilG2 (author)dushyantahuja2017-09-04

Hi Dushyant,

I was trying the clock part for now. Will try the infinity mirror later on. The code has worked just as it was supposed to. But I am not able to configure and programme the clock via bluetooth. In case you can elaborate a little on that, i would be really thankful for that.

dushyantahuja (author)2017-01-27

Updated the clock to work on an ESP8266 - don't think that requires a new instructable, but will see.

https://github.com/dushyantahuja/Smart-Infinity-Mirror/blob/ESP8266/README.md

Code revised to work on an ESP8266 instead of Arduino + RTC. The code has been revised to use NTP and hence does not require resetting of the clock at regular intervals (though still requires change of offset for daylight savings)

Also, allows for changing colours using MQTT and OpenHAB. This takes the default values from a color slider in OpenHAB (HSV values) and no rules are required to convert HSV to RGB.

Make sure you're using FastLED 3.1 and this branch of the pubsubclient:

https://github.com/Imroy/pubsubclient

I'm trying to get this running on my esp13 wroom2, however I don't understand what to do with MQTT and OpenHAB at all. Could you provide some hints for someone that has yet to use either services?

pgupta31 (author)2015-11-10

upgraded mine this festive season here is the result. omitted ir sensor.

https://www.youtube.com/watch?v=WAE0rmlefag

dushyantahuja (author)pgupta312017-01-27

That looks amazing. Great work

Ethan111 made it! (author)2016-11-11

Why would this happen ?

chriskinda (author)2015-12-31

Dushyantahuja: I keep getting this error "error: 'BLEND' was not declared in this scope" Making blend "NOBLEND" makes the code do very strange things. Please advise.

bmketch (author)chriskinda2016-01-23

chriskinda: Not sure if your still having problems however I was able to fix this by changing BLEND to LINEARBLEND. Hope this helps

chriskinda (author)bmketch2016-01-23

Are you using the code from Github? Was your only modification "LINEARBLEND"?

chriskinda (author)2015-12-31

error: 'BLEND' was not declared in this scope

bmketch (author)chriskinda2016-01-23

chriskinda: Not sure if your still having problems however I was able to fix this by changing BLEND to LINEARBLEND. Hope this helps

chriskinda (author)chriskinda2015-12-31

I keep getting this error and I have all the libraries installed. Please advise.

Akshatha_ve (author)2016-01-19

what should I change in the code if I use a 30led per metre led strip . please help

pgupta31 (author)2015-11-10

anybody intrested in code let me know

shmolky (author)2015-09-25

Hey - this is really cool! I'm trying to make it, but I'm running into trouble with the electronics. I've got the basic setup (no switch or prox sensor) and when I program my pro-mini, I get the rainbow effect twice, but then the LEDs go dark and stay dark. I figured maybe the time needs to be programmed, but I can't seem to send commands over serial/ usb. The serial monitor says rainbow every now and then, but no LEDs light up.

I also tried connecting over bluetooth, but my bluetooth module disconnects from my computer... still trying to figure out what's wrong there.

dushyantahuja (author)shmolky2015-10-01

Are you using the new code from the Github with the latest FastLED 3.1 library?

About This Instructable

127,167views

1,118favorites

More by dushyantahuja:Programming the Electrodragon IoT RelayWifi CalendarThe Ultimate Child Tracker
Add instructable to: