Forum >Rainbow Ring LED
Rainbow Ring LED

Hi folks,
I'm using a Rainbow Ring board with a DS1307 RTC clock module from DFRobot.
But, I desoldered all the LED and replaced them white ones because I don't need them in other colors.
They all turn on fine using the test firmware.
But, what I'm trying to achieve is something simpler which is to use the LED like a clock's arm showing hour and minute (rounded up to next 5 minutes). But, it seems that in some of the cases, 4 LED are turned on at a time rather than 2. I think my sketch is correct but there might be something I dfrobot out here.
Here's my sketch:
[code]
#include <Wire.h>
#include "RTClib.h"
#define COLUMN_B0 8
#define COLUMN_B1 9
#define COLUMN_B2 10
#define COLUMN_B3 11
#define COLUMN_B4 12
#define COLUMN_B5 13
#define LED_R1 5
#define LED_G1 6
#define LED_B1 7
#define LED_R2 14
#define LED_G2 15
#define LED_B2 16
RTC_DS1307 rtc;
void setup ()
{
// Transistor base drive pins
pinMode(COLUMN_B0, OUTPUT);
pinMode(COLUMN_B1, OUTPUT);
pinMode(COLUMN_B2, OUTPUT);
pinMode(COLUMN_B3, OUTPUT);
pinMode(COLUMN_B4, OUTPUT);
pinMode(COLUMN_B5, OUTPUT);
// LED anode pins
pinMode(LED_R1, OUTPUT);
pinMode(LED_G1, OUTPUT);
pinMode(LED_B1, OUTPUT);
pinMode(LED_R2, OUTPUT);
pinMode(LED_G2, OUTPUT);
pinMode(LED_B2, OUTPUT);
// Turn off all LED column drive
digitalWrite(COLUMN_B0, LOW);
digitalWrite(COLUMN_B1, LOW);
digitalWrite(COLUMN_B2, LOW);
digitalWrite(COLUMN_B3, LOW);
digitalWrite(COLUMN_B4, LOW);
digitalWrite(COLUMN_B5, LOW);
// Turn off all LED anode supply
digitalWrite(LED_R1, LOW);
digitalWrite(LED_B1, LOW);
digitalWrite(LED_G1, LOW);
digitalWrite(LED_R2, LOW);
digitalWrite(LED_G2, LOW);
digitalWrite(LED_B2, LOW);
Serial.begin(57600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
}
void loop ()
{
uint8_t timeHour;
uint8_t timeMinute;
DateTime now = rtc.now();
timeHour = now.hour();
timeMinute = now.minute();
Serial.print("Current Exact Time: ");
Serial.print(timeHour, DEC);
Serial.print(':');
Serial.print(timeMinute, DEC);
Serial.println();
// Convert to 12 hour system
if (timeHour >= 12)
{
// Minus off 12 hour
timeHour -= 12;
}
// Turn off all LED column drive
digitalWrite(COLUMN_B0, LOW);
digitalWrite(COLUMN_B1, LOW);
digitalWrite(COLUMN_B2, LOW);
digitalWrite(COLUMN_B3, LOW);
digitalWrite(COLUMN_B4, LOW);
digitalWrite(COLUMN_B5, LOW);
// Turn off all LED anode supply
digitalWrite(LED_R1, LOW);
digitalWrite(LED_B1, LOW);
digitalWrite(LED_G1, LOW);
digitalWrite(LED_R2, LOW);
digitalWrite(LED_G2, LOW);
digitalWrite(LED_B2, LOW);
switch(timeHour)
{
// 12 PM or AM (LED D10)
case 0:
digitalWrite(COLUMN_B4, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 1 PM or AM (LED D9)
case 1:
digitalWrite(COLUMN_B4, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 2 PM or AM (LED D8)
case 2:
digitalWrite(COLUMN_B3, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 3 PM or AM (LED D7)
case 3:
digitalWrite(COLUMN_B3, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 4 PM or AM (LED D6)
case 4:
digitalWrite(COLUMN_B2, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 5 PM or AM (LED D5)
case 5:
digitalWrite(COLUMN_B2, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 6 PM or AM (LED D4)
case 6:
digitalWrite(COLUMN_B1, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 7 PM or AM (LED D3)
case 7:
digitalWrite(COLUMN_B1, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 8 PM or AM (LED D2)
case 8:
digitalWrite(COLUMN_B0, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 9 PM or AM (LED D1)
case 9:
digitalWrite(COLUMN_B0, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 10 PM or AM (LED D12)
case 10:
digitalWrite(COLUMN_B5, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 11 PM or AM (LED D11)
case 11:
digitalWrite(COLUMN_B5, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
}
if (timeMinute <= 5)
{
timeMinute = 5;
}
else if ((timeMinute > 5) && (timeMinute <= 10))
{
timeMinute = 10;
}
else if ((timeMinute > 10) && (timeMinute <= 15))
{
timeMinute = 15;
}
else if ((timeMinute > 15) && (timeMinute <= 20))
{
timeMinute = 20;
}
else if ((timeMinute > 20) && (timeMinute <= 25))
{
timeMinute = 25;
}
else if ((timeMinute > 25) && (timeMinute <= 30))
{
timeMinute = 30;
}
else if ((timeMinute > 30) && (timeMinute <= 35))
{
timeMinute = 35;
}
else if ((timeMinute > 35) && (timeMinute <= 40))
{
timeMinute = 40;
}
else if ((timeMinute > 40) && (timeMinute <= 45))
{
timeMinute = 45;
}
else if ((timeMinute > 45) && (timeMinute <= 50))
{
timeMinute = 50;
}
else if ((timeMinute > 50) && (timeMinute <= 55))
{
timeMinute = 55;
}
else
{
timeMinute = 0;
}
switch(timeMinute)
{
// 0 minute (LED D10)
case 0:
digitalWrite(COLUMN_B4, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 5 minute (LED D9)
case 5:
digitalWrite(COLUMN_B4, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 10 minute (LED D8)
case 10:
digitalWrite(COLUMN_B3, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 15 minute (LED D7)
case 15:
digitalWrite(COLUMN_B3, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 20 minute (LED D6)
case 20:
digitalWrite(COLUMN_B2, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 25 minute (LED D5)
case 25:
digitalWrite(COLUMN_B2, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 30 minute (LED D4)
case 30:
digitalWrite(COLUMN_B1, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 35 minute (LED D3)
case 35:
digitalWrite(COLUMN_B1, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 40 minute (LED D2)
case 40:
digitalWrite(COLUMN_B0, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 45 minute (LED D1)
case 45:
digitalWrite(COLUMN_B0, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 50 minute (LED D12)
case 50:
digitalWrite(COLUMN_B5, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 55 minute (LED D11)
case 55:
digitalWrite(COLUMN_B5, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
}
Serial.print("Rounded Up Time: ");
Serial.print(timeHour, DEC);
Serial.print(':');
Serial.print(timeMinute, DEC);
Serial.println();
delay(200);
}
[/code]
Yes, the code is not optimized but it's for testing only at the moment.
I'm using a Rainbow Ring board with a DS1307 RTC clock module from DFRobot.
But, I desoldered all the LED and replaced them white ones because I don't need them in other colors.
They all turn on fine using the test firmware.
But, what I'm trying to achieve is something simpler which is to use the LED like a clock's arm showing hour and minute (rounded up to next 5 minutes). But, it seems that in some of the cases, 4 LED are turned on at a time rather than 2. I think my sketch is correct but there might be something I dfrobot out here.
Here's my sketch:
[code]
#include <Wire.h>
#include "RTClib.h"
#define COLUMN_B0 8
#define COLUMN_B1 9
#define COLUMN_B2 10
#define COLUMN_B3 11
#define COLUMN_B4 12
#define COLUMN_B5 13
#define LED_R1 5
#define LED_G1 6
#define LED_B1 7
#define LED_R2 14
#define LED_G2 15
#define LED_B2 16
RTC_DS1307 rtc;
void setup ()
{
// Transistor base drive pins
pinMode(COLUMN_B0, OUTPUT);
pinMode(COLUMN_B1, OUTPUT);
pinMode(COLUMN_B2, OUTPUT);
pinMode(COLUMN_B3, OUTPUT);
pinMode(COLUMN_B4, OUTPUT);
pinMode(COLUMN_B5, OUTPUT);
// LED anode pins
pinMode(LED_R1, OUTPUT);
pinMode(LED_G1, OUTPUT);
pinMode(LED_B1, OUTPUT);
pinMode(LED_R2, OUTPUT);
pinMode(LED_G2, OUTPUT);
pinMode(LED_B2, OUTPUT);
// Turn off all LED column drive
digitalWrite(COLUMN_B0, LOW);
digitalWrite(COLUMN_B1, LOW);
digitalWrite(COLUMN_B2, LOW);
digitalWrite(COLUMN_B3, LOW);
digitalWrite(COLUMN_B4, LOW);
digitalWrite(COLUMN_B5, LOW);
// Turn off all LED anode supply
digitalWrite(LED_R1, LOW);
digitalWrite(LED_B1, LOW);
digitalWrite(LED_G1, LOW);
digitalWrite(LED_R2, LOW);
digitalWrite(LED_G2, LOW);
digitalWrite(LED_B2, LOW);
Serial.begin(57600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
}
void loop ()
{
uint8_t timeHour;
uint8_t timeMinute;
DateTime now = rtc.now();
timeHour = now.hour();
timeMinute = now.minute();
Serial.print("Current Exact Time: ");
Serial.print(timeHour, DEC);
Serial.print(':');
Serial.print(timeMinute, DEC);
Serial.println();
// Convert to 12 hour system
if (timeHour >= 12)
{
// Minus off 12 hour
timeHour -= 12;
}
// Turn off all LED column drive
digitalWrite(COLUMN_B0, LOW);
digitalWrite(COLUMN_B1, LOW);
digitalWrite(COLUMN_B2, LOW);
digitalWrite(COLUMN_B3, LOW);
digitalWrite(COLUMN_B4, LOW);
digitalWrite(COLUMN_B5, LOW);
// Turn off all LED anode supply
digitalWrite(LED_R1, LOW);
digitalWrite(LED_B1, LOW);
digitalWrite(LED_G1, LOW);
digitalWrite(LED_R2, LOW);
digitalWrite(LED_G2, LOW);
digitalWrite(LED_B2, LOW);
switch(timeHour)
{
// 12 PM or AM (LED D10)
case 0:
digitalWrite(COLUMN_B4, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 1 PM or AM (LED D9)
case 1:
digitalWrite(COLUMN_B4, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 2 PM or AM (LED D8)
case 2:
digitalWrite(COLUMN_B3, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 3 PM or AM (LED D7)
case 3:
digitalWrite(COLUMN_B3, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 4 PM or AM (LED D6)
case 4:
digitalWrite(COLUMN_B2, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 5 PM or AM (LED D5)
case 5:
digitalWrite(COLUMN_B2, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 6 PM or AM (LED D4)
case 6:
digitalWrite(COLUMN_B1, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 7 PM or AM (LED D3)
case 7:
digitalWrite(COLUMN_B1, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 8 PM or AM (LED D2)
case 8:
digitalWrite(COLUMN_B0, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 9 PM or AM (LED D1)
case 9:
digitalWrite(COLUMN_B0, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 10 PM or AM (LED D12)
case 10:
digitalWrite(COLUMN_B5, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 11 PM or AM (LED D11)
case 11:
digitalWrite(COLUMN_B5, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
}
if (timeMinute <= 5)
{
timeMinute = 5;
}
else if ((timeMinute > 5) && (timeMinute <= 10))
{
timeMinute = 10;
}
else if ((timeMinute > 10) && (timeMinute <= 15))
{
timeMinute = 15;
}
else if ((timeMinute > 15) && (timeMinute <= 20))
{
timeMinute = 20;
}
else if ((timeMinute > 20) && (timeMinute <= 25))
{
timeMinute = 25;
}
else if ((timeMinute > 25) && (timeMinute <= 30))
{
timeMinute = 30;
}
else if ((timeMinute > 30) && (timeMinute <= 35))
{
timeMinute = 35;
}
else if ((timeMinute > 35) && (timeMinute <= 40))
{
timeMinute = 40;
}
else if ((timeMinute > 40) && (timeMinute <= 45))
{
timeMinute = 45;
}
else if ((timeMinute > 45) && (timeMinute <= 50))
{
timeMinute = 50;
}
else if ((timeMinute > 50) && (timeMinute <= 55))
{
timeMinute = 55;
}
else
{
timeMinute = 0;
}
switch(timeMinute)
{
// 0 minute (LED D10)
case 0:
digitalWrite(COLUMN_B4, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 5 minute (LED D9)
case 5:
digitalWrite(COLUMN_B4, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 10 minute (LED D8)
case 10:
digitalWrite(COLUMN_B3, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 15 minute (LED D7)
case 15:
digitalWrite(COLUMN_B3, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 20 minute (LED D6)
case 20:
digitalWrite(COLUMN_B2, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 25 minute (LED D5)
case 25:
digitalWrite(COLUMN_B2, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 30 minute (LED D4)
case 30:
digitalWrite(COLUMN_B1, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 35 minute (LED D3)
case 35:
digitalWrite(COLUMN_B1, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 40 minute (LED D2)
case 40:
digitalWrite(COLUMN_B0, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 45 minute (LED D1)
case 45:
digitalWrite(COLUMN_B0, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
// 50 minute (LED D12)
case 50:
digitalWrite(COLUMN_B5, HIGH);
digitalWrite(LED_R2, HIGH);
digitalWrite(LED_G2, HIGH);
digitalWrite(LED_B2, HIGH);
break;
// 55 minute (LED D11)
case 55:
digitalWrite(COLUMN_B5, HIGH);
digitalWrite(LED_R1, HIGH);
digitalWrite(LED_G1, HIGH);
digitalWrite(LED_B1, HIGH);
break;
}
Serial.print("Rounded Up Time: ");
Serial.print(timeHour, DEC);
Serial.print(':');
Serial.print(timeMinute, DEC);
Serial.println();
delay(200);
}
[/code]
Yes, the code is not optimized but it's for testing only at the moment.
2013-08-01 02:20:15 Could you give me your library RTClib. I used the RTClib from this https://github.com/adafruit/RTClib. I'm not sure it‘s the same.
I uploaded your code in my Rainbow LED. There are only 2 LEDs turning on, not 4.
And I have another question. I don't understand you how to display minute and how to display hours.
Jane
I uploaded your code in my Rainbow LED. There are only 2 LEDs turning on, not 4.
And I have another question. I don't understand you how to display minute and how to display hours.
