Introduction: Openremote Arduino Sensors Servo RGB Led and Switch

This is How to use Openremote Software to Control a RGB led with sliders for each color , use a switch to turn a led on or off , move a servo with a slider , and read a temperature sensor. All item provide feedback to show position and color.

Items needed

1. Openremote software controller setup and working

can be found here if you have not already

http://www.openremote.org/display/docs/OpenRemote+...

2. Arduino , can be pretty much any of them I use a UNO for this

3. RGB LED , can use 3 separate

4. regular LED any color

5. a servo , most any will work

6. DS18B20 temp sensor

7. 4 X 220ohm resistor 1 X 4.7k

Step 1: Build the Arduino Circuit

assemble the arduino circuit per the picture. Load the provided Sketch remember to set your ip address to one available on your network. Once this has been done you can test the setup without the openremote software by using a web browser , Chrome or firefox work better as they don't try to download the file . just put in http://192.168.2.157 or what your ip is you used and you should get something like this

{"A1": 373,"A0": 371,"S0": 91,"RED": 0,"GREEN": 255,"BLUE": 54,"D7": 0,"TEMP": 77.90,}

its a JSON file it shows the value of 2 analog inputs , the servo position , the color rage for the 3 LED's from 0 - 255 , the status of switch 1 on pin 7 and the temp. To change one of the values in the web browser enter http://192.168.2.157/pinP3=200 this will change the site to

{"A1": 364,"A0": 363,"S0": 91,"RED": 200,"GREEN": 255,"BLUE": 54,"D7": 0,"TEMP": 77.90,}

and the red led will go to almost full brightness. To turn switch 1 on (digital pin7) use

http://192.168.2.157/pinD7=1 for on or http://192.168.2.157/pinD7=0 for off

{"A1": 369,"A0": 368,"S0": 91,"RED": 200,"GREEN": 255,"BLUE": 54,"D7": 1,"TEMP": 77.90,}

notice the "D7" changed to a 1 and the LED should have come on. if you want to change all 3 colors at once you can use this http://192.168.2.157/pinC1,255,255,255 this will set all 3 colors R,G,B in that order to 255 full Brightness.

{"A1": 365,"A0": 364,"S0": 91,"RED": 255,"GREEN": 255,"BLUE": 255,"D7": 1,"TEMP": 77.90,}

here is a copy of the arduino IDE sketch

/*


* Respond to requests in the URL to change digital and analog output ports
* show the number of ports changed and the value of the analog input pins.
* for example:
* sending http://192.168.1.157/?pinD2=1 turns digital pin 2 on
* sending http://192.168.1.157/?pinD2=0 turns digital pin 2 off
* sending http://192.168.1.157/?pinP3=150 turns red color to 150
* sending http://192.168.1.157/?pinP5=100 turns green color to 100
* sending http://192.168.1.157/?pinC1,255,255,255 turns all colors up to white on one line
* sending http://192.168.1.157/?pinP6=200 turns blue color to 200 0 to 255 max val
* sending http://192.168.1.157/?pinS1=90 moves servo to 90 deg mark
* sending http://192.168.2.157 {"A1": 369,"A0": 368,"S0": 11,"RED": 0,"GREEN": 255,"BLUE": 54,"D7": 1,"TEMP": 78.35,}


*/
#include
#include
#include
#include //only for ds18b20 temp
#include //only for ds18b20 temp
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Sensor1 = {0x28, 0xAC, 0xD2, 0x6E, 0x04, 0x00, 0x00, 0xF9 }; // diffrent for every device ! use sketch to find
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xF0 };
IPAddress ip(192,168,2, 157);
IPAddress myDns(192,168,2,254);
IPAddress gateway(192, 168, 2, 254);
EthernetServer server(80);
int brightnessR = 0; //need only for rgb
int brightnessG = 0; //need only for rgb
int brightnessB = 0; //need only for rgb
int pos = 0; //need only for servo
int timer = 0;
Servo myservo; //need only for servo
void setup()
{
sensors.setResolution(Sensor1, 10); //for temp
sensors.setWaitForConversion(false); //for temp
sensors.requestTemperatures(); // for temp
myservo.attach(9); //need only for servo which pin servo is attached
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
Serial.println("ready");
pinMode(3,OUTPUT);
pinMode(6,OUTPUT);
pinMode(5,OUTPUT);
pinMode(7,OUTPUT);
}
void loop()
{
// this timer keeps the temp sensor from running to much and slowing down sketch
timer = (timer +1 );
if (timer == 1000){
sensors.requestTemperatures(); // for temp
timer = 0;
}



EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
// counters to show the number of pin change requests
int digitalRequests = 0;
int analogRequests = 0;
if( client.find("GET /") ) { // search for 'GET'
// find tokens starting with "pin" and stop on the first blank line
// search to the end of line for 'pin'
while(client.findUntil("pin", "\n\r")){
char type = client.read(); // D or A

// the next ascii integer value in the stream is the pin
int pin = client.parseInt();
int val = client.parseInt(); // the integer after that is the value
int valg = client.parseInt();
int valb = client.parseInt();

if( type == 'D') {
Serial.print("Digital pin ");
pinMode(pin, OUTPUT);
digitalWrite(pin, val);

}
if( type == 'S') {
Serial.print("Servo input");
myservo.write(val);
pos = val;
delay(15);


}

if( type == 'C') {
Serial.print("Color");

analogWrite(3, val);
analogWrite(5, valg);
analogWrite(6, valb);

brightnessR = val ;


brightnessG = valg ;



brightnessB = valb ;


}
if( type == 'P') {
Serial.print("PWN");

pinMode(pin, OUTPUT);
analogWrite(pin, val);
if (pin == 3 ) {
brightnessR = val ;
}
if (pin == 5 ) {
brightnessG = val ;
}

if (pin == 6 ) {
brightnessB = val ;
}

}
else if( type == 'A'){
Serial.print("Analog pin ");
analogWrite(pin, val);
analogRequests++;
}

Serial.print(pin);
Serial.print("=");
Serial.print(val);
Serial.print(",");
Serial.print(valg);
Serial.print(",");
Serial.println(valb);
}
}
Serial.println();
///*
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: application/json");
client.println();

// output the value of each analog input pin as a json-p object

client.print("{");

client.print("\"A1");

client.print("\": ");
client.print(analogRead(1));

client.print(",");
//***********************************
client.print("\"A0");

client.print("\": ");
client.print(analogRead(0));

client.print(",");
//***********************************
client.print("\"S0");

client.print("\": ");
client.print(pos);

client.print(",");
//************************************
client.print("\"RED");

client.print("\": ");
client.print(brightnessR);

client.print(",");
//***********************************
client.print("\"GREEN");

client.print("\": ");
client.print(brightnessG);

client.print(",");

//***********************************
client.print("\"BLUE");

client.print("\": ");
client.print(brightnessB);

client.print(",");

client.print("\"D7");

client.print("\": ");
int sw1 = digitalRead(7);
if (sw1 == HIGH){
client.print("1");
}
if (sw1 == LOW){
client.print("0");
}
client.print(",");

//***********************************
client.print("\"TEMP");

client.print("\": ");
float tempC1 = sensors.getTempC(Sensor1);
client.print(DallasTemperature::toFahrenheit(tempC1));


client.print(",");


client.println("}");


break;
}
}
// give the web browser time to receive the data
delay(1);
client.stop();
}
}

Step 2: Connect With OpenRemote

I am assuming you already have openremote installed and are a little familure with its operation. Open remote designer login , go to device and click on new give it a name like Arduino , model UNO, vendor , whatever. Then create a new command

Name: get arduino temp

Protocol: HTTP

URL: http://192.168.2.157/

Method GET

polling interval 10s

JSONPath Expression $.TEMP

and submit

now create a new sensor

Name: get arduino temp

Command: get arduino temp

Type: custom

then Submit.

go to designer layout drag a Label onto the grid and select sensor and choose Device Arduino and select get arduino temp

this should provide you with a temp reading

.

Step 3: Add Sliders to Openremote

Now we can add some sliders to the Layout

lets do the red ,,, it will be the same for red blue and green the only change is in the JSON value

choose new command

Name: get brightness red

Protocol: HTTP

URL: http://192.168.2.157/

Method: GET

Polling: 1s

JSONPath Expression $.RED

And now Submit and continue and just change the RED to BLUE, and GREEN

Now , create the command to set the value again change the RED BLUE and GREEN ,,, Also ! in the URL pinP3 for RED pinP5 for GREEN and pinP6 for BLUE

Name: set brightness RED

Protocol: HTTP

URL: http://192.168.2.157/pinP3,${param}

Method: GET

submit and continue to do the other 2

Now create a new sensor .

Name: get RED

Command: get brightness RED

Type: range

Min: 0

Max: 255

do this for the other colors also

now create the sliders

new slider

name: RED

sensor: get RED

setValue: set brightness RED

and submit

now add them to your layout

drag a slider onto the grid select the SliderCommand RED and do the same for the other 2

Step 4: Add a Servo

now we can add a servo , this can be omitted if you don't need it , will not hurt script to not be added

create a command

Name: Servo pos

Protocol: HTTP

URL: http://192.168.2.157/

Method: GET

Polling: 2s

JSONPath: $.S0

now submit and continue

Name: servo set

Protocol: HTTP

URL: http://192.168.2.157/pinS1,${param}

and submit

now create a sensor

Name: servo pos

Command: servo pos

Type: range

Min: 10

Max: 180

and submit

now create a slider

Name:servo

sensor: servo pos

setValue: servo set

and add to the layout same as the rgb sliders

Step 5: