View difference between Paste ID: eEB61uWV and 8n5e0Dde
SHOW: | | - or go back to the newest paste.
1
/*  HAPPY HOLIDAYS TO ALL ARDUINOS !!! */
2
3
//modified from http://pastebin.com/wUSVNubd
4
5
/*
6
RadioShack RGB Color LED strip light show for TM1803 LED controlled LEDs.
7
This began with the default code from RS - now with some annotations to help explain
8
what is happening PLUS several NEW Patterns for July 4th 2014 and a change in the
9
pulse timing to make it easier to adjust for MCU cycle speed (e.g. 8MHz vs 16 MHz);
10
*/
11
12
#include <avr/pgmspace.h>
13
//  This is a "standard" include for the Arduino IDE that provides functions needed (like PROGMEM, etc.)
14
15
/*
16
#define DATA_1 (PORTD |= (1<<5)) // Set logic high Pin5 of Port D
17
#define DATA_0 (PORTD &= ~(1<<5)) // Set Pin5 logic low Pin5 of Port D
18
#define STRIP_PINOUT DDRD |= (1<<5) // Set Pin5 of PortD as digital output
19
#define LED_RGB_STRIP
20
*/
21
22
#define DATA_1 (PORTC |=  0X01)    // DEFINE a value for DATA as 1  // for UNO
23
#define DATA_0 (PORTC &=  0XFE)    // DEFINE a value for DATA 0   // for UNO
24
#define STRIP_PINOUT (DDRC=0x3F)  // DEFINE PORTC as OUTPUT // for UNO (change pins 0-5; leave PORTC 6 & 7 alone)
25
26
#define NOP "nop\n\t"
27
/*
28
Each 'nop' statement executes in one machine cycle (at 16 MHz) yielding a 62.5 ns (nanosecond) delay.
29
  __asm__("nop\n\t"); 
30
  __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");// Synatax for multiple Delays
31
*/
32
33
/*
34
Create an array of values [xx] by [nn] to control each LED NODE in the standard RadioShack strip.  
35
[xx] is the number of FRAMES in your sequence and [nn] is the number of NODES for YOUR LED strip, usually 10.
36
37
PROGMEM stores the data in the AVR chip's PROGRAM memory.  This has much more space than the 2K of variable RAM memory.
38
The two dimensional array has one value for each one of the 10 TM1803 RGB LEDs - controlling the color.
39
Each "row" can change the colors assigned.  This is like a FRAME in an animation.  Changing the FRAME's
40
values and patterns can create the animation effect of motion.
41
42
We will then read out these values one FRAME (row) at a time to create the 24bit serial pulse train that is OUTPUT to the LED Strip.
43
44
Each ROW is sent as OUTPUT and it will SET the COLOR for each of the TEN (10) nodes.
45
Each ROW is a NEW FRAME, changing the colors again and again, creating a pattern.
46
47
The order of the HEX doublets (bytes) controlling the COLORS is: Green - Blue - Red.
48
ff is full brightness - so 0xff0000 is full GREEN, 0xx00ff00 is full BLUE, 0x0000ff is full RED
49
*/
50
51
// In the Radio Shack RGB Strip, the TM1803 controls RED with the last HEX byte
52
PROGMEM const unsigned long chasing_red[][10]={
53
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
54
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
55
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
56
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
57
  {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
58
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
59
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
60
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
61
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
62
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
63
};
64
65
PROGMEM const unsigned long first_red[][10]={
66
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
67
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
68
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
69
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
70
  {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
71
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
72
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
73
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
74
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
75
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
76
};
77
78
PROGMEM const unsigned long second_red[][10]={
79
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
80
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
81
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
82
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
83
  {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x0000f0},
84
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x0000f0},
85
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x0000f0},
86
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x0000f0},
87
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
88
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
89
};
90
91
PROGMEM const unsigned long first_white[][10]={
92
  {0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
93
  {0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
94
  {0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
95
  {0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
96
  {0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x0000f0,0x0000f0},
97
  {0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x0000f0,0x0000f0},
98
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x0000f0,0x0000f0},
99
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
100
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
101
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
102
};
103
104
PROGMEM const unsigned long second_white[][10]={
105
  {0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
106
  {0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
107
  {0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
108
  {0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
109
  {0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
110
  {0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0x000000,0xd0d0d0,0x0000f0,0x0000f0},
111
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
112
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
113
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
114
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
115
};
116
117
PROGMEM const unsigned long first_blue[][10]={
118
  {0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
119
  {0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
120
  {0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
121
  {0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
122
  {0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
123
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
124
  {0x00f000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
125
  {0x000000,0x00f000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
126
  {0x000000,0x000000,0x00f000,0x000000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
127
  {0x000000,0x000000,0x000000,0x00f000,0x000000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
128
};
129
130
PROGMEM const unsigned long second_blue[][10]={
131
  {0x000000,0x000000,0x000000,0x000000,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
132
  {0x0000f0,0x000000,0x000000,0x000000,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
133
  {0x000000,0x0000f0,0x000000,0x000000,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
134
  {0x000000,0x000000,0x0000f0,0x000000,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
135
  {0x000000,0x000000,0x000000,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
136
  {0x0000f0,0x000000,0x000000,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
137
  {0x000000,0x0000f0,0x000000,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
138
  {0x000000,0x000000,0x0000f0,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
139
  {0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0,0x00f000,0x00f000,0xd0d0d0,0xd0d0d0,0x0000f0,0x0000f0},
140
};
141
142
// In the Radio Shack RGB Strip, the TM1803 controls GREEN with the 1st, BLUE with the 2nd, and RED with the last HEX byte, 
143
PROGMEM const unsigned long red_white_blue[][10]={
144
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
145
  {0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
146
  {0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
147
  {0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
148
  {0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
149
  {0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000,0x000000},
150
  {0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000,0x000000},
151
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000,0x000000},
152
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0,0x000000},
153
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0xd0d0d0,0x0000f0},
154
};
155
156
157
// WHITE is ALL HEX bytes (can vary the "color" of white by changing these
158
PROGMEM const unsigned long chasing_white[][10]={
159
  {0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
160
  {0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
161
  {0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
162
  {0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
163
  {0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000},
164
  {0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000,0x000000},
165
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000,0x000000},
166
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000,0x000000},
167
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x000000},
168
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd},
169
};
170
171
// BLUE is the second HEX byte
172
PROGMEM const unsigned long chasing_blue[][10]={
173
  {0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
174
  {0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
175
  {0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
176
  {0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
177
  {0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000,0x000000},
178
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000,0x000000},
179
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000,0x000000},
180
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000,0x000000},
181
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000,0x000000},
182
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x00f000},
183
};
184
185
// GREEN is the first HEX byte
186
PROGMEM const unsigned long chasing_green[][10]={
187
  {0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
188
  {0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
189
  {0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
190
  {0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
191
  {0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000,0x000000},
192
  {0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000,0x000000},
193
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000,0x000000},
194
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000,0x000000},
195
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000,0x000000},
196
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xf00000},
197
};
198
199
// Each ROW changes which LED is bright, creating a moving pattern
200
PROGMEM const unsigned long pattern_test_comet1[][10]={
201
  {0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
202
  {0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
203
  {0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
204
  {0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
205
  {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000},
206
  {0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000},
207
  {0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000},
208
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000},
209
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000},
210
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd},
211
};
212
213
PROGMEM const unsigned long pattern_test_comet2[][10]={
214
  {0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000},
215
  {0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000},
216
  {0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000},
217
  {0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000},
218
  {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd},
219
  {0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000},
220
  {0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000},
221
  {0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000},
222
  {0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000},
223
  {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x111111,0x444444,0xfdfdfd},
224
};
225
226
PROGMEM const unsigned long pattern_test_comet3[][10]={
227
  {0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd},
228
  {0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x444444},
229
  {0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0x000000,0x000000,0xfdfdfd,0x444444,0x111111},
230
  {0x000000,0x111111,0x444444,0xfdfdfd,0x000000,0x000000,0xfdfdfd,0x444444,0x111111,0x000000},
231
  {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0xfdfdfd,0x444444,0x111111,0x000000,0x000000},
232
  {0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0xfdfdfd,0x444444,0x111111,0x000000,0x000000},
233
  {0x000000,0x000000,0x000000,0xfdfdfd,0x444444,0x444444,0xfdfdfd,0x000000,0x000000,0x000000},
234
  {0x000000,0x000000,0xfdfdfd,0x444444,0x111111,0x111111,0x444444,0xfdfdfd,0x000000,0x000000},
235
  {0x000000,0xfdfdfd,0x444444,0x111111,0x000000,0x000000,0x111111,0x444444,0xfdfdfd,0x000000},
236
  {0xfdfdfd,0x444444,0x111111,0x000000,0x000000,0x000000,0x000000,0x111111,0x444444,0xfdfdfd},
237
};
238
239
//  Each row changes the color and intensity of the LEDs
240
PROGMEM const unsigned long rainbow1[][10]={
241
  {0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000},
242
  {0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000},
243
  {0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000},
244
  {0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd},
245
  {0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd},
246
  {0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00,0x0000fd},
247
  {0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00,0x00fd00},
248
  {0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00,0xfdfd00},
249
  {0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x000000,0x000000,0x000000,0xfd0000,0xfd7f00},
250
  {0xfd7f00,0xfdfd00,0x00fd00,0x0000fd,0x6f00fd,0x8f00fd,0x0000fd,0x00fd00,0xfdfd00,0xfdfd00},
251
};
252
253
PROGMEM const unsigned long cylon_test_red[][10]={
254
  {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
255
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
256
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
257
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
258
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
259
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
260
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
261
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
262
  {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x0000f0,0x000000,0x000000},
263
  {0x000000,0x000000,0x000000,0x000000,0xf0f0f0,0x000000,0x000000,0x000000,0x000000,0x000000},
264
};
265
266
PROGMEM const unsigned long red_cylon_R[][10]={
267
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
268
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
269
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
270
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
271
  {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
272
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
273
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
274
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
275
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
276
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
277
};
278
279
PROGMEM const unsigned long red_cylon_L[][10]={
280
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
281
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
282
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
283
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
284
  {0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000},
285
  {0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000},
286
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
287
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
288
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
289
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000},
290
};
291
292
PROGMEM const unsigned long star_trek_bridge[][10]={
293
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
294
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
295
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
296
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
297
  {0x000000,0x000000,0x000000,0x000000,0x0000f0,0xf000f0,0x000000,0x000000,0x000000,0x000000},
298
  {0x000000,0x000000,0x000000,0x000000,0xd000d0,0xd000d0,0x000000,0x000000,0x000000,0x000000},
299
  {0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000},
300
  {0x000000,0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000,0x000000},
301
  {0x000000,0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0,0x000000},
302
  {0x0000f0,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x0000f0},
303
};
304
305
// ***********************************************************************************************************
306
// *                            INITIALIZE the system on Power Up or after a RESET
307
// *
308
// ***********************************************************************************************************
309
void setup() {              
310
311
  STRIP_PINOUT;	// sets the output pin to control the LED Strip
312
  reset_strip(); // resets each of the LED nodes to OFF	
313
314
}
315
316
317
// ***********************************************************************************************************
318
// *                            Main Program Loop
319
// *
320
// ***********************************************************************************************************
321
void loop()
322
{
323
324
/*
325
This is a TEST PATTERN to show that all of the
326
segments ("nodes") are working properly.
327
This Runs Only ONCE ... because the next loop
328
never finishes.  
329
330
You could remove the WHILE loop and then these patterns 
331
would run continuously, as long as there is power to the board.
332
*/
333
334
/* CHASING PRIMARY COLORS */
335
  int q = 1;
336
  send_1M_pattern(chasing_green, 10, 50);
337
  delay(500);
338
  send_1M_pattern(chasing_blue, 10, 500);
339
  delay(500);
340
  send_1M_pattern(chasing_red, 10, 500);
341
  delay(500);
342
343
/* CHASING WHITE */
344
  send_1M_pattern(chasing_white, 10, 500);
345
  delay(500);
346
  
347
  send_1M_pattern(pattern_test_comet1, 10, 70);
348
  delay(500);
349
  send_1M_pattern(pattern_test_comet2, 10, 70);
350
  delay(500);
351
  send_1M_pattern(pattern_test_comet3, 10, 70);
352
  delay(500);
353
  
354
/* RAINBOW TEST PATTERN */  
355
  send_1M_pattern(rainbow1, 10, 100);
356
  delay(1000); // Wait for one second to make you think about the infinite loop
357
358
359
/* TEN CYCLES OF TREK BRIDGE */
360
  q = 10; 
361
  while (q>0){
362
     send_1M_pattern(star_trek_bridge, 10, 50);
363
    q -= 1;
364
  }	
365
  delay(500);
366
367
/*
368
Use this to control which pattern is sent to the
369
LED Strip.
370
371
This loop runs will run continuously inside the "master" loop;
372
because the value of WHILE (1) never changes.  You may elminate this,
373
or add your own control program.
374
*/
375
  while (1)
376
  {
377
  send_1M_pattern(chasing_white, 10, 100);
378
  delay(500);
379
  send_1M_pattern(rainbow1, 10, 100);
380
  delay(500);
381
  send_1M_pattern(chasing_green, 10, 50);
382
  delay(1000); // Wait for one second to make you think about the infinite loop
383
384
/* RAINBOW TEST PATTERN */  
385
  send_1M_pattern(rainbow1, 10, 100);
386
  delay(1000); // Wait for one second to make you think about the infinite loop
387
388
/* TEN CYCLES OF CYLON */
389
  q = 10; 
390
  while (q>0){
391
    send_1M_pattern(cylon_test_red, 10, 100);
392
    delay(500);
393
    send_1M_pattern(red_cylon_R, 10, 70);
394
    send_1M_pattern(red_cylon_L, 10, 70);
395
    q -= 1;
396
  }	
397
  delay(500);
398
399
400
/* 5 CYCLES OF SIMPLE RED-WHITE-BLUE */
401
  q = 5; 
402
  while (q>0){
403
  send_1M_pattern(chasing_red, 10, 100);
404
  delay(500);
405
  send_1M_pattern(chasing_white, 10, 100);
406
  delay(500);
407
  send_1M_pattern(chasing_blue, 10, 100);
408
  delay(500);
409
  q -= 1;
410
  }	
411
  delay(500);
412
413
/* FIVE CYCLES OF TREK BRIDGE */
414
  q = 5; 
415
  while (q>0){
416
     send_1M_pattern(star_trek_bridge, 10, 60);
417
    q -= 1;
418
  }	
419
  delay(500);
420
421
/* 10 CYCLES CHASING RED-WHITE-BLUE */
422
    q = 10; 
423
    while (q>0){
424
     send_1M_pattern(red_white_blue, 10, 100);
425
    delay(300);
426
    q -= 1;
427
    }	
428
delay(500);
429
  
430
/* 10 CYCLES OF RED-WHITE-BLUE BUILD UP */
431
  q = 10; 
432
  while (q>0){
433
  send_1M_pattern(first_red, 10, 100);
434
  delay(500);
435
  send_1M_pattern(second_red, 10, 100);
436
  delay(500);
437
  send_1M_pattern(first_white, 10, 100);
438
  delay(500);
439
  send_1M_pattern(second_white, 10, 100);
440
  delay(500);
441
  send_1M_pattern(first_blue, 10, 100);
442
  delay(250);
443
  send_1M_pattern(second_blue, 10, 100);
444
  delay(500);
445
  q -= 1;
446
  }	
447
  delay(500);
448
  
449
/* 10 CYCLES CHASING RED-WHITE-BLUE */
450
    q = 10; 
451
    while (q>0){
452
       send_1M_pattern(red_white_blue, 10, 100);
453
    delay(300);
454
    q -= 1;
455
    }	
456
delay(500);
457
458
  } // END OF WHILE (1);
459
460
461
} // END OF VOID LOOP() - In standard C++ otherwise known as MAIN();
462
463
/*******************************************************************************
464
* Function Name:	send_1M_pattern
465
* Description:		Transmit pattern to whole 1 meter strip              
466
* Input	: 		Pointer to RAM pattern; pattern length; frame rate               
467
* Output:		Sends out a serial pulse train using the send_strip function
468
* Return:		None
469
*******************************************************************************/
470
void send_1M_pattern(const unsigned long data[][10], int pattern_no, int frame_rate)
471
{
472
  int i=0;
473
  int j=0;
474
  uint32_t temp_data;
475
476
// data[][10] is the name of the ARRAY with the RGB LED pattern values
477
// Each pattern sends out [x] packets - one for each NODE (RGB LED cluster) in the strip
478
// pattern_no is the [y] dimension of the array - the number of ROWS in each pattern array series
479
// frame_rate is the DELAY before transmitting the next ROW in the pattern array
480
  for (i=0;i<pattern_no;i++)
481
  {
482
    noInterrupts(); // Turn OFF Interupts for more precise Pulse Timing using MCU processing cycles
483
    for (j=0;j<10;j++)
484
    {
485
      temp_data=pgm_read_dword_near(&data[i][j]);
486
      send_strip(temp_data);
487
    }
488
    interrupts(); // Turn ON Interrupts after data is sent
489
490
    delay(frame_rate); // Delay between each pulse train - sets the duration of each FRAME, before the next series is sent;
491
    /* CONTROLS THE VISUAL SPEED OF THE DISPLAY CHANGES */
492
493
  }
494
495
}
496
497
498
/*******************************************************************************
499
* Function Name:	send_strip
500
* Description:		Creates and Transmits a serial train of 24 pulses for the LED strip              
501
* Input:		24-bit data sets intensity of each color, which will persist until
502
*			the next cycle makes a change                
503
* Output:		Sends a train of 24 pulses (bits) representing values of 0 or 1 to the output pin ()
504
*                       TIMING the OUTPUT pulses using the duration of the MCU NOP @ 16MHz
505
* Return:		Nothing returned from function
506
*******************************************************************************/
507
void send_strip(uint32_t data)
508
{
509
  int i;
510
  unsigned long j=0x800000;
511
512
  int d;
513
  for (i=0;i<24;i++)
514
  {
515
    if (data & j)
516
    {
517
      DATA_1;
518
      // TM1803 BIT 1 - Set OUTPUT PIN HIGH & HOLD FOR 1.55us or ~ 26 MCU CYCLES = 1.625us;
519
      // The comparison (d<NN) uses ONE cycle, so the total delay is 2 X d X NOP (62.5 Nanoseconds);
520
      for (d=1;d<13;d++)
521
      {
522
        __asm__(NOP);
523
      }
524
      DATA_0; // Set OUTPUT PIN LOW ;
525
    }
526
    else
527
    {
528
      DATA_1; 
529
     // TM1803 BIT 0 - Set OUTPUT PIN HIGH & HOLD FOR 0.78us or ~ 12 MCU CYCLES = .750us;
530
     // The comparison (d<NN) uses ONE cycle, so the total delay is 2 X d X NOP (62.5 Nanoseconds);
531
      for (d=1;d<5;d++)
532
      {
533
        __asm__(NOP);
534
      }
535
      DATA_0; // Set OUTPUT PIN LOW ;
536
/*----------------------------*/    
537
      __asm__(NOP);
538
      __asm__(NOP);
539
      __asm__(NOP);    
540
/*----------------------------*/       
541
    }
542
    j>>=1;
543
  }
544
545
} 
546
// END of send_strip();
547
548
/*******************************************************************************
549
* Function Name:	reset_strip
550
* Description:		Send a 0 pulse to reset all colors on all NODES of the strip               
551
* Input:		None            
552
* Output: 		Sends out a looong duration 0 on the OUTPUT PIN to RESET the TM1803 chips
553
* Return:		None
554
*******************************************************************************/
555
void reset_strip()
556
{
557
  DATA_0;
558
  delayMicroseconds(20); // TM1803 specifies >= 24uS; // Arduino delay is actually slightly longer than assembler execution
559
}