Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
UCC
BlinkenLights
Commits
649af4b6
Commit
649af4b6
authored
Jan 28, 2014
by
Mitchell Pomery
Browse files
Comments Everywhere
And a couple of helper functions
parent
a4425082
Changes
1
Hide whitespace changes
Inline
Side-by-side
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
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
Supports
Markdown
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