mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-05 16:24:12 +01:00
236 lines
5.8 KiB
C++
236 lines
5.8 KiB
C++
/*
|
|
Serial RGB controller
|
|
|
|
Reads a serial input string looking for three comma-separated
|
|
integers with a newline at the end. Values should be between
|
|
0 and 255. The sketch uses those values to set the color
|
|
of an RGB LED attached to pins 9 - 11.
|
|
|
|
The circuit:
|
|
* Common-anode RGB LED cathodes attached to pins 9 - 11
|
|
* LED anode connected to pin 13
|
|
|
|
To turn on any given channel, set the pin LOW.
|
|
To turn off, set the pin HIGH. The higher the analogWrite level,
|
|
the lower the brightness.
|
|
|
|
created 29 Nov 2010
|
|
by Tom Igoe
|
|
|
|
This example code is in the public domain.
|
|
*/
|
|
|
|
String inString = ""; // string to hold input
|
|
int currentColor = 0;
|
|
int red, green, blue = 0;
|
|
|
|
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
|
|
}
|
|
|
|
// send an intro:
|
|
Serial.println("\n\nString toInt() RGB:");
|
|
Serial.println();
|
|
// set LED cathode pins as outputs:
|
|
pinMode(9, OUTPUT);
|
|
pinMode(10, OUTPUT);
|
|
pinMode(11, OUTPUT);
|
|
// turn on pin 13 to power the LEDs:
|
|
pinMode(13, OUTPUT);
|
|
digitalWrite(13, HIGH);
|
|
}
|
|
|
|
void loop() {
|
|
int inChar;
|
|
|
|
// Read serial input:
|
|
if (Serial.available() > 0) {
|
|
inChar = Serial.read();
|
|
}
|
|
|
|
if (isDigit(inChar)) {
|
|
// convert the incoming byte to a char
|
|
// and add it to the string:
|
|
inString += (char)inChar;
|
|
}
|
|
|
|
// if you get a comma, convert to a number,
|
|
// set the appropriate color, and increment
|
|
// the color counter:
|
|
if (inChar == ',') {
|
|
// do something different for each value of currentColor:
|
|
switch (currentColor) {
|
|
case 0: // 0 = red
|
|
red = inString.toInt();
|
|
// clear the string for new input:
|
|
inString = "";
|
|
break;
|
|
case 1: // 1 = green:
|
|
green = inString.toInt();
|
|
// clear the string for new input:
|
|
inString = "";
|
|
break;
|
|
}
|
|
currentColor++;
|
|
}
|
|
// if you get a newline, you know you've got
|
|
// the last color, i.e. blue:
|
|
if (inChar == '\n') {
|
|
blue = inString.toInt();
|
|
|
|
// set the levels of the LED.
|
|
// subtract value from 255 because a higher
|
|
// analogWrite level means a dimmer LED, since
|
|
// you're raising the level on the anode:
|
|
analogWrite(11, 255 - red);
|
|
analogWrite(9, 255 - green);
|
|
analogWrite(10, 255 - blue);
|
|
|
|
// print the colors:
|
|
Serial.print("Red: ");
|
|
Serial.print(red);
|
|
Serial.print(", Green: ");
|
|
Serial.print(green);
|
|
Serial.print(", Blue: ");
|
|
Serial.println(blue);
|
|
|
|
// clear the string for new input:
|
|
inString = "";
|
|
// reset the color counter:
|
|
currentColor = 0;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
Here's a Processing sketch that will draw a color wheel and send a serial
|
|
string with the color you click on:
|
|
|
|
// Subtractive Color Wheel with Serial
|
|
// Based on a Processing example by Ira Greenberg.
|
|
// Serial output added by Tom Igoe
|
|
//
|
|
// The primaries are red, yellow, and blue. The secondaries are green,
|
|
// purple, and orange. The tertiaries are yellow-orange, red-orange,
|
|
// red-purple, blue-purple, blue-green, and yellow-green.
|
|
//
|
|
// Create a shade or tint of the subtractive color wheel using
|
|
// SHADE or TINT parameters.
|
|
|
|
// Updated 29 November 2010.
|
|
|
|
|
|
|
|
import processing.serial.*;
|
|
|
|
int segs = 12;
|
|
int steps = 6;
|
|
float rotAdjust = TWO_PI / segs / 2;
|
|
float radius;
|
|
float segWidth;
|
|
float interval = TWO_PI / segs;
|
|
|
|
Serial myPort;
|
|
|
|
void setup() {
|
|
size(200, 200);
|
|
background(127);
|
|
smooth();
|
|
ellipseMode(RADIUS);
|
|
noStroke();
|
|
// make the diameter 90% of the sketch area
|
|
radius = min(width, height) * 0.45;
|
|
segWidth = radius / steps;
|
|
|
|
// swap which line is commented out to draw the other version
|
|
// drawTintWheel();
|
|
drawShadeWheel();
|
|
// open the first serial port in your computer's list
|
|
myPort = new Serial(this, Serial.list()[0], 9600);
|
|
}
|
|
|
|
|
|
void drawShadeWheel() {
|
|
for (int j = 0; j < steps; j++) {
|
|
color[] cols = {
|
|
color(255-(255/steps)*j, 255-(255/steps)*j, 0),
|
|
color(255-(255/steps)*j, (255/1.5)-((255/1.5)/steps)*j, 0),
|
|
color(255-(255/steps)*j, (255/2)-((255/2)/steps)*j, 0),
|
|
color(255-(255/steps)*j, (255/2.5)-((255/2.5)/steps)*j, 0),
|
|
color(255-(255/steps)*j, 0, 0),
|
|
color(255-(255/steps)*j, 0, (255/2)-((255/2)/steps)*j),
|
|
color(255-(255/steps)*j, 0, 255-(255/steps)*j),
|
|
color((255/2)-((255/2)/steps)*j, 0, 255-(255/steps)*j),
|
|
color(0, 0, 255-(255/steps)*j),
|
|
color(0, 255-(255/steps)*j, (255/2.5)-((255/2.5)/steps)*j),
|
|
color(0, 255-(255/steps)*j, 0),
|
|
color((255/2)-((255/2)/steps)*j, 255-(255/steps)*j, 0)
|
|
};
|
|
for (int i = 0; i < segs; i++) {
|
|
fill(cols[i]);
|
|
arc(width/2, height/2, radius, radius,
|
|
interval*i+rotAdjust, interval*(i+1)+rotAdjust);
|
|
}
|
|
radius -= segWidth;
|
|
}
|
|
}
|
|
|
|
|
|
void drawTintWheel() {
|
|
for (int j = 0; j < steps; j++) {
|
|
color[] cols = {
|
|
color((255/steps)*j, (255/steps)*j, 0),
|
|
color((255/steps)*j, ((255/1.5)/steps)*j, 0),
|
|
color((255/steps)*j, ((255/2)/steps)*j, 0),
|
|
color((255/steps)*j, ((255/2.5)/steps)*j, 0),
|
|
color((255/steps)*j, 0, 0),
|
|
color((255/steps)*j, 0, ((255/2)/steps)*j),
|
|
color((255/steps)*j, 0, (255/steps)*j),
|
|
color(((255/2)/steps)*j, 0, (255/steps)*j),
|
|
color(0, 0, (255/steps)*j),
|
|
color(0, (255/steps)*j, ((255/2.5)/steps)*j),
|
|
color(0, (255/steps)*j, 0),
|
|
color(((255/2)/steps)*j, (255/steps)*j, 0)
|
|
};
|
|
for (int i = 0; i < segs; i++) {
|
|
fill(cols[i]);
|
|
arc(width/2, height/2, radius, radius,
|
|
interval*i+rotAdjust, interval*(i+1)+rotAdjust);
|
|
}
|
|
radius -= segWidth;
|
|
}
|
|
}
|
|
|
|
void draw() {
|
|
// nothing happens here
|
|
}
|
|
|
|
void mouseReleased() {
|
|
// get the color of the mouse position's pixel:
|
|
color targetColor = get(mouseX, mouseY);
|
|
// get the component values:
|
|
int r = int(red(targetColor));
|
|
int g = int(green(targetColor));
|
|
int b = int(blue(targetColor));
|
|
// make a comma-separated string:
|
|
String colorString = r + "," + g + "," + b + "\n";
|
|
// send it out the serial port:
|
|
myPort.write(colorString );
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|