Project showcase
Remote LED Mood Setter

Remote LED Mood Setter

Set LED RGB light Scenes remotely

  • 1,955 views
  • 1 comment
  • 0 respects

Components and supplies

About this project

Using MKR1000 to control an RGB LED device.

In our shortened example we will use a single RGB LED. In real world we would attach the RGB channels to a RGB Amplified or other like device. We are hoping to demonstrate how you can start using Arduino MKR1000 board as a remote helping hand to do tasks for you. For example in my home I want to move this into a soffit with existing RGB LED light strip that is today controlled by a IR and is a chore to hide.

Step 1 - Stand on Shoulders of Giants

First you will need to follow this steps to completion of where you would have a web page ready and onboard LED listening to your commands. If you run into trouble with your board and PC like I did this is the place to get pointers.

Arduino MKR1000 Getting Started by Charif Mahmoudi

https://www.hackster.io/charifmahmoudi/arduino-mkr1000-getting-started-08bb4a

Note how to listen to the IP address in the Serial Monitor - in my case the IP address stayed the same, your specific router might change.

Now that you know your board and PC are all working together. You can now control this device via your home network - we will build on top of this concept further and send PWD commands to an RGB LED and setup scene triggers.

Keep everything open - we will build on this previous sample and add RGB LED and add the Web page controls for each color.

Step 2 - Improve by Wiring up RGB LED

I used the concepts from just about any standard RGB LED concept you can find online.

RBG LED Color Chooser

http://playground.arduino.cc/Main/RGBLEDPWM

Same goes for wiring. There are many examples of this specific to your LED.

On the board I used Digital Pin 2 , 3 & 4 as they were listed as PWM in the official spec for my MKR1000 board as follows:

Step 3 - Improve by Writing Code for RGB LED

We will build on and add the Web page controls for each color.

First we add declarations for the RGB PINs.

// Init the Pins used for PWM
int redPin = 2;
int greenPin = 3;
int bluePin = 4;

Then we initialize those PINs for OUTPUT.

pinMode(redPin, OUTPUT);pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);

And finally we add a couple more URLs in the Web output.

client.print("<hr>");
client.print("Click <a href=\"/Movie\">here</a> turn on scene Movie<br>");
client.print("Click <a href=\"/Reading\">here</a> turn on scene Reading<br>");

client.print("<hr>");
client.print("Click <a href=\"/RESET\">here</a> RESET ALL<br>");

Then add the handler for the new Scenes.

if (currentLine.endsWith("GET /Movie")) {
	analogWrite(redPin, 128);                
	analogWrite(greenPin, 0);                
	analogWrite(bluePin, 50);               
}
if (currentLine.endsWith("GET /Reading")) {
	analogWrite(redPin, 255);
	analogWrite(greenPin, 128);
	analogWrite(bluePin, 255);
}
if (currentLine.endsWith("GET /RESET")) {
	analogWrite(bluePin, 0); 
	analogWrite(greenPin, 0);
	analogWrite(redPin, 0);
	digitalWrite(ledpin, LOW);
}

Step 4 - Create an App or use Browser

The UWP Windows 10 Mobile app can be built to quickly call up these scenes with a push of a button, when your device is on the same network. A HTTP GET command to your IP Address with the scene or reset command is all it takes. In the interest of time web page pointed to the IP address from Step 1 is all that is needed to get going.

Conclusion & Next Steps

As you can see sometimes it takes tinkering with some new tech and adding your own implementation. For me it was starting with an outcome and seeking an easy solution to address my mechanics of remotely controlling the RGB from a distance problem. I hope you learned from this example and can benefit from this experience in your own creations.

Hack on!

Code

WiFiLED ModifiedArduino
Based on code from Charif Mahmoudi
https://www.hackster.io/charifmahmoudi/arduino-mkr1000-getting-started-08bb4a
#include <WiFi101.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiSSLClient.h>
#include <WiFiUdp.h>

/*
* This example is modified from the original file
* https://github.com/arduino-libraries/WiFi101/blob/master/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino
*/
#include <SPI.h>
#include <WiFi101.h>

char ssid[] = "";				//  your network SSID (name)
char pass[] = "";   // your network password
int keyIndex = 0;					// your network key Index number (needed only for WEP)
int ledpin = 6;

// Init the Pins used for PWM
int redPin = 2;
int greenPin = 3;
int bluePin = 4;

bool val = true;

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
	Serial.begin(9600);				// initialize serial communication
	Serial.print("Start Serial ");
	pinMode(ledpin, OUTPUT);		// set the LED pin mode
	
	pinMode(redPin, OUTPUT);
	pinMode(greenPin, OUTPUT);
	pinMode(bluePin, OUTPUT);

	// Check for the presence of the shield
	Serial.print("WiFi101 shield: ");
	if (WiFi.status() == WL_NO_SHIELD) {
		Serial.println("NOT PRESENT");
		return; // don't continue
	}
	Serial.println("DETECTED");
	// attempt to connect to Wifi network:
	while (status != WL_CONNECTED) {
		digitalWrite(ledpin, LOW);
		Serial.print("Attempting to connect to Network named: ");
		Serial.println(ssid);                   // print the network name (SSID);
		digitalWrite(ledpin, HIGH);
		// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
		status = WiFi.begin(ssid, pass);
		// wait 10 seconds for connection:
		delay(10000);
	}
	server.begin();                           // start the web server on port 80
	printWifiStatus();                        // you're connected now, so print out the status
	digitalWrite(ledpin, HIGH);
}
void loop() {
	WiFiClient client = server.available();   // listen for incoming clients

	if (client) {                             // if you get a client,
		Serial.println("new client");           // print a message out the serial port
		String currentLine = "";                // make a String to hold incoming data from the client
		while (client.connected()) {            // loop while the client's connected
			if (client.available()) {             // if there's bytes to read from the client,
				char c = client.read();             // read a byte, then
				Serial.write(c);                    // print it out the serial monitor
				if (c == '\n') {                    // if the byte is a newline character

													// if the current line is blank, you got two newline characters in a row.
													// that's the end of the client HTTP request, so send a response:
					if (currentLine.length() == 0) {
						// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
						// and a content-type so the client knows what's coming, then a blank line:
						client.println("HTTP/1.1 200 OK");
						client.println("Content-type:text/html");
						client.println();

						// the content of the HTTP response follows the header:
						client.print("Click <a href=\"/1\">here</a> turn the LED on pin 9 on<br>");
						client.print("Click <a href=\"/0\">here</a> turn the LED on pin 9 off<br>");

						client.print("<hr>");

						client.print("Click <a href=\"/Red\">here</a> turn R on<br>");
						client.print("Click <a href=\"/Green\">here</a> turn G on<br>");
						client.print("Click <a href=\"/Blue\">here</a> turn B on<br>");

						client.print("<hr>");

						client.print("Click <a href=\"/Movie\">here</a> turn on scene Movie<br>");
						client.print("Click <a href=\"/Reading\">here</a> turn on scene Reading<br>");

						client.print("<hr>");

						client.print("Click <a href=\"/RESET\">here</a> RESET ALL<br>");

						// The HTTP response ends with another blank line:
						client.println();
						// break out of the while loop:
						break;
					}
					else {      // if you got a newline, then clear currentLine:
						currentLine = "";
					}
				}
				else if (c != '\r') {    // if you got anything else but a carriage return character,
					currentLine += c;      // add it to the end of the currentLine
				}

				// Check to see if the client request was "GET /H" or "GET /L":
				if (currentLine.endsWith("GET /1")) {
					digitalWrite(ledpin, HIGH);               // GET /H turns the LED on
				}
				if (currentLine.endsWith("GET /0")) {
					digitalWrite(ledpin, LOW);                // GET /L turns the LED off
				}
				
				if (currentLine.endsWith("GET /Red")) {
					analogWrite(redPin, 255);                // GET /R turns the LED on
				}
				if (currentLine.endsWith("GET /Green")) {
					analogWrite(greenPin, 255);                // GET /G turns the LED on
				}
				if (currentLine.endsWith("GET /Blue")) {
					analogWrite(bluePin, 255);                // GET /B turns the LED on
				}				

				if (currentLine.endsWith("GET /Movie")) {
					analogWrite(redPin, 128);                
					analogWrite(greenPin, 0);                
					analogWrite(bluePin, 50);               
				}

				if (currentLine.endsWith("GET /Reading")) {
					analogWrite(redPin, 255);
					analogWrite(greenPin, 128);
					analogWrite(bluePin, 255);
				}

				if (currentLine.endsWith("GET /RESET")) {
					analogWrite(bluePin, 0); 
					analogWrite(greenPin, 0);
					analogWrite(redPin, 0);
					digitalWrite(ledpin, LOW);
				}

			}
		}
		// close the connection:
		client.stop();
		Serial.println("client disonnected");
	}
}

void printWifiStatus() {
	// print the SSID of the network you're attached to:
	Serial.print("SSID: ");
	Serial.println(WiFi.SSID());

	// print your WiFi shield's IP address:
	IPAddress ip = WiFi.localIP();
	Serial.print("IP Address: ");
	Serial.println(ip);

	// print the received signal strength:
	long rssi = WiFi.RSSI();
	Serial.print("signal strength (RSSI):");
	Serial.print(rssi);
	Serial.println(" dBm");
	// print where to go in a browser:
	Serial.print("To see this page in action, open a browser to http://");
	Serial.println(ip);
}

Schematics

Schematic (Use Same PINs on your MKR1000)
Fritzing did not have MKR1000, I am sure there is a way to add it, I'm lazy.
2016 04 01%20mkr1000

Comments

Similar projects you might like

Wireless LED Lamp with IR Remote Control

Project showcase by Peter Wallhead

  • 5,241 views
  • 2 comments
  • 15 respects

Control an LED with the Remote Control

Project showcase by Nicholas_N

  • 9,841 views
  • 3 comments
  • 16 respects

LED Emergency Lights using WS2812 RGB LED Module

Project tutorial by bigboystoys13

  • 13,977 views
  • 7 comments
  • 33 respects

How to Use an RGB LED

by MisterBotBreak

  • 5,370 views
  • 0 comments
  • 20 respects

RGB LED Button Controller

Project showcase by Re

  • 12,138 views
  • 1 comment
  • 16 respects
Add projectSign up / Login