Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
UCC
BlinkenLights
Commits
649af4b6
Commit
649af4b6
authored
Jan 28, 2014
by
Mitchell Pomery
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Comments Everywhere
And a couple of helper functions
parent
a4425082
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
85 additions
and
65 deletions
+85
-65
BlinkenLights.ino
BlinkenLights.ino
+85
-65
No files found.
BlinkenLights.ino
View file @
649af4b6
...
...
@@ -14,20 +14,22 @@
///TODO: Make run when no network is present
///TODO: Recover when network reappears
///TODO: Make everything use posts. maybe
///TODO: Sanity checks. Everywhere. Until I'm Insane.
///TODO: Figure out memory usage. If we max memory we will see weird behaviour.
#include <Ethernet.h> // Needed For Reasons
#include <WebServer.h> // Lets us easily do web requests
#include <SPI.h> // Needed to control Lights
#include <Adafruit_NeoPixel.h> // Controls the Lights
#define STRIPLENGTH 42 // Number of LED's in light strip
#define PIN 6 // Pin that the LED strip is attached to
#define PREFIX "" // Document root for our pages
#define PORT 80 // Web Server Port
#define NAMELEN 8 // Max variable length in request
#define VALUELEN 256 // Max value from request
#define WIDTH // How many LEDs wide our array is
#define HEIGHT // How many LEDs high our array is
#define WIDTH 7 // How many LEDs wide our array is
#define HEIGHT 6 // How many LEDs high our array is
#define STRIPLENGTH 42 // Number of LED's in light strip
// Used to store the LED's values
struct
led
{
...
...
@@ -36,33 +38,61 @@ struct led {
char
blue
;
};
// For controlling the lights
// For controlling the lights
- Should only be changed by the functions
int
position
=
0
;
// How far through the cycle we are
struct
led
ledArray
[
STRIPLENGTH
];
// led array
int
lightOption
=
0
;
// Which predefined light sequence we are running
char
brightness
=
(
char
)
128
;
//Brightness of the LEDs
// We seem to have issues at the moment putting this up to the maximum (255)
// Most likely due to the fact the LED strip is underpowered
int
lightOption
=
0
;
// Which predefined light sequence we are running
// Network Settings
static
uint8_t
mac
[]
=
{
0xC0
,
0xCA
,
0xC0
,
0x1A
,
0x19
,
0x82
};
// C0CA C01A 1982
IPAddress
ip
(
130
,
95
,
13
,
96
);
// 130.95.13.96 (Can we forcefully take .82?
// If we remove the ip address, we will automatically use DHCP
// Set up our light strip
Adafruit_NeoPixel
strip
=
Adafruit_NeoPixel
(
STRIPLENGTH
,
PIN
,
NEO_GRB
+
NEO_KHZ800
);
// Set up our webserver
WebServer
webserver
(
PREFIX
,
80
);
// ============================ LIGHT MANIPULATION ============================
/**
* Change the lights to our updated array
* We should probably get rid of this soonish
*/
void
showArray
()
{
///TODO: Rename this to something better?
for
(
int
i
=
0
;
i
<
STRIPLENGTH
;
i
++
)
{
strip
.
setPixelColor
(
i
,
(
int
)
ledArray
[
i
].
red
,
(
int
)
ledArray
[
i
].
green
,
(
int
)
ledArray
[
i
].
blue
);
}
strip
.
show
();
}
/**
* Set the LED at pos in the strip to the defined color
* @param xpos x coordinate
* @param ypos y cordinate
* @return position in the array
*/
int
coordToPos
(
int
xpos
,
int
ypos
)
{
///TODO: Test this function
int
pos
=
0
;
if
(
ypos
%
2
==
0
)
{
// if we are on an even line, add y
pos
=
ypos
*
WIDTH
+
xpos
;
}
else
{
// on an odd line, take y
if
(
WIDTH
%
2
==
0
)
{
// even width
pos
=
ypos
*
WIDTH
+
HEIGHT
-
xpos
;
}
else
{
// odd width
pos
=
ypos
*
WIDTH
+
HEIGHT
-
xpos
-
1
;
}
}
return
pos
;
}
/**
* Set the LED at pos in the strip to the defined color
* @param pos position in the array
...
...
@@ -77,38 +107,45 @@ void setLED(int pos, int red, int green, int blue) {
}
/**
* Set the LED at pos in the strip to the defined color
* @param pos position in the array
* Set the LED at (xpos, ypos) in the strip to the defined color
* @param xpos x coordinate
* @param ypos y coordinate
* @param red red portion of color
* @param green green portion of color
* @param blue blue portion of color
*/
void
setLED
(
int
xpos
,
int
yxpos
,
int
red
,
int
green
,
int
blue
)
{
///TODO: Test this function
int
pos
=
0
;
if
(
ypos
%
2
==
0
)
{
// if we are on an even line, add y
pos
=
ypos
*
WIDTH
+
xpos
;
}
else
{
// on an odd line, take y
if
(
WIDTH
%
2
==
0
)
{
// even width
pos
=
ypos
*
WIDTH
+
HEIGHT
-
xpos
;
}
else
{
// odd width
pos
=
ypos
*
WIDTH
+
HEIGHT
-
xpos
-
1
;
}
}
void
setLED
(
int
xpos
,
int
ypos
,
int
red
,
int
green
,
int
blue
)
{
int
pos
=
coordToPos
(
xpos
,
ypos
);
setLED
(
pos
,
red
,
green
,
blue
);
}
/**
* Get the color of the LED
at
pos in the strip
* @param pos position in the
array
* Get the colo
u
r of the LED
in
pos
position
in the strip
* @param pos position in the
strip
* @return color of LED at pos
*/
struct
led
getLED
(
int
pos
)
{
return
ledArray
[
pos
];
}
/**
* Get the colour of the LED at (xpos, ypos)
* @param xpos x coordinate
* @param ypos y coordinate
* @return color of LED at (xpos, ypos)
*/
struct
led
getLED
(
int
xpos
,
int
ypos
)
{
int
pos
=
coordToPos
(
xpos
,
ypos
);
return
ledArray
[
pos
];
}
// ================================ WEB PAGES ================================
///TODO: Comment this stuff
///TODO: Reduce code reuse in the web page functions
///TODO: Start using post requests
///TODO: Make a function to set all the lights at once
// Sets the light sequence to one that is predefined
void
webSetSequence
(
WebServer
&
server
,
WebServer
::
ConnectionType
type
,
char
*
url_tail
,
bool
tail_complete
)
{
URLPARAM_RESULT
rc
;
...
...
@@ -116,7 +153,7 @@ void webSetSequence(WebServer &server, WebServer::ConnectionType type, char *url
char
value
[
VALUELEN
];
server
.
httpSuccess
();
// Kill the connection before doing anything if all they want is
the
head
// Kill the connection before doing anything if all they want is head
if
(
type
==
WebServer
::
HEAD
)
{
return
;
}
...
...
@@ -149,7 +186,7 @@ void webSetLED(WebServer &server, WebServer::ConnectionType type, char *url_tail
int
b
=
-
1
;
server
.
httpSuccess
();
// Kill the connection before doing anything if all they want is
the
head
// Kill the connection before doing anything if all they want is head
if
(
type
==
WebServer
::
HEAD
)
{
return
;
}
...
...
@@ -180,13 +217,6 @@ void webSetLED(WebServer &server, WebServer::ConnectionType type, char *url_tail
else
{
server
.
print
(
"Unknown"
);
}
//server.print(xPos);
//server.print(yPos);
//server.print(r);
//server.print(g);
//server.print(b);
if
(
xPos
!=
-
1
&&
yPos
!=
-
1
&&
r
!=
-
1
&&
g
!=
-
1
&&
b
!=
-
1
)
{
setLED
(
xPos
,
r
,
g
,
b
);
}
...
...
@@ -198,7 +228,7 @@ void webSetBrightness(WebServer &server, WebServer::ConnectionType type, char *u
char
value
[
VALUELEN
];
server
.
httpSuccess
();
// Kill the connection before doing anything if all they want is
the
head
// Kill the connection before doing anything if all they want is head
if
(
type
==
WebServer
::
HEAD
)
{
return
;
}
...
...
@@ -207,8 +237,6 @@ void webSetBrightness(WebServer &server, WebServer::ConnectionType type, char *u
while
(
strlen
(
url_tail
))
{
rc
=
server
.
nextURLparam
(
&
url_tail
,
name
,
NAMELEN
,
value
,
VALUELEN
);
if
(
rc
!=
URLPARAM_EOS
)
{
//Serial.println(name);
//Serial.println(value);
if
(
String
(
name
).
equals
(
"bright"
))
{
strip
.
setBrightness
(
atoi
(
value
));
server
.
print
(
atoi
(
value
));
...
...
@@ -223,6 +251,11 @@ void webSetBrightness(WebServer &server, WebServer::ConnectionType type, char *u
}
}
// ============================== LIGHT DISPLAYS ==============================
///TODO: Comment this stuff
///TODO: Make sure these functions don't block. Otherwise web requests are slow
// Fill the dots one after the other with a color
void
colorWipe
(
uint32_t
c
,
uint8_t
wait
)
{
for
(
uint16_t
i
=
0
;
i
<
strip
.
numPixels
();
i
++
)
{
...
...
@@ -256,37 +289,38 @@ void rainbowCycle(uint8_t wait) {
}
}
//Theatre-style crawling lights.
//
Theatre-style crawling lights.
void
theaterChase
(
uint32_t
c
,
uint8_t
wait
)
{
for
(
int
j
=
0
;
j
<
10
;
j
++
)
{
//do 10 cycles of chasing
for
(
int
j
=
0
;
j
<
10
;
j
++
)
{
//
do 10 cycles of chasing
for
(
int
q
=
0
;
q
<
3
;
q
++
)
{
for
(
int
i
=
0
;
i
<
strip
.
numPixels
();
i
=
i
+
3
)
{
strip
.
setPixelColor
(
i
+
q
,
c
);
//turn every third pixel on
strip
.
setPixelColor
(
i
+
q
,
c
);
//
turn every third pixel on
}
strip
.
show
();
delay
(
wait
);
for
(
int
i
=
0
;
i
<
strip
.
numPixels
();
i
=
i
+
3
)
{
strip
.
setPixelColor
(
i
+
q
,
0
);
//turn every third pixel off
strip
.
setPixelColor
(
i
+
q
,
0
);
//
turn every third pixel off
}
}
}
}
//Theatre-style crawling lights with rainbow effect
//
Theatre-style crawling lights with rainbow effect
void
theaterChaseRainbow
(
uint8_t
wait
)
{
for
(
int
j
=
0
;
j
<
256
;
j
++
)
{
// cycle all 256 colors in the wheel
for
(
int
q
=
0
;
q
<
3
;
q
++
)
{
for
(
int
i
=
0
;
i
<
strip
.
numPixels
();
i
=
i
+
3
)
{
strip
.
setPixelColor
(
i
+
q
,
Wheel
(
(
i
+
j
)
%
255
));
//turn every third pixel on
// turn every third pixel on
strip
.
setPixelColor
(
i
+
q
,
Wheel
(
(
i
+
j
)
%
255
));
}
strip
.
show
();
delay
(
wait
);
for
(
int
i
=
0
;
i
<
strip
.
numPixels
();
i
=
i
+
3
)
{
strip
.
setPixelColor
(
i
+
q
,
0
);
//turn every third pixel off
strip
.
setPixelColor
(
i
+
q
,
0
);
//
turn every third pixel off
}
}
}
...
...
@@ -306,31 +340,19 @@ uint32_t Wheel(byte WheelPos) {
}
}
// =============================== MAIN PROGRAM ===============================
void
setup
()
{
// Open //Serial communications and wait for port to open:
//Serial.begin(9600);
//while (!//Serial) {
//; // wait for //Serial port to connect. Needed for Leonardo only
//}
//Serial.println("//Serial Port Opened");
// start the Ethernet connection and the server:
//Serial.println("Starting Ethernet");
// Start Ethernet
Ethernet
.
begin
(
mac
,
ip
);
//Serial.println("Setting Up Server");
// Set up webpages
webserver
.
setDefaultCommand
(
&
webSetSequence
);
webserver
.
addCommand
(
"custom"
,
&
webSetSequence
);
webserver
.
addCommand
(
"individual"
,
&
webSetLED
);
webserver
.
addCommand
(
"brightness"
,
&
webSetBrightness
);
//Serial.println("Starting Server");
// Start Webserver
webserver
.
begin
();
//Serial.print("server is at ");
//Serial.println(Ethernet.localIP());
// Initialize our LED Array
// Turn our lights on
for
(
int
i
=
0
;
i
<
STRIPLENGTH
;
i
++
)
{
ledArray
[
i
].
red
=
(
char
)
128
;
ledArray
[
i
].
green
=
(
char
)
128
;
...
...
@@ -339,7 +361,6 @@ void setup() {
// Start Lights
strip
.
begin
();
//strip.show();
strip
.
setBrightness
(
128
);
showArray
();
}
...
...
@@ -351,7 +372,6 @@ void loop()
int
len
=
64
;
webserver
.
processConnection
(
buff
,
&
len
);
position
=
position
%
256
;
//rainbow(10);
// Run our light sequence after checking for we requests
switch
(
lightOption
)
{
case
0
:
// Don't change the lights at all
...
...
@@ -363,6 +383,6 @@ void loop()
lightOption
=
1
;
break
;
}
// Show our lights
showArray
();
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment