Create your own Smart Lights using Arduino Ethernet.



1 iot

This Project describes about controlling the Smart Light by using the Arduino Ethernet Shield.The controlling of the Light can be done with the help of Mobile,tablet and the Desktop


Arduino Ethernet

Push button

10K Ohm resistor



To program your Arduino you need to install the Arduino IDE and the following libraries (if you do not know how to install a library checkout this tutorial)

PubSubClientThis is a fork of the original PubSubClient setting the max packet size to 512 bytes (needed for Lelylan to work).

Hardware Setup:

This schema represents the led, resistor and pushbutton setup. With this setup each time you press the button, the LED is turned on and off.

Lelylan Setup

Open Lelylan Dashboard and create a new device by following 3 simple steps (if you are new to Lelylan, you can sign up for free).

1) Set a meaningful name (e.g. bedroom light).

2) Choose the device type. For this tutorial choose Basic Light.

What is a type? A type defines what a device is by defining its properties, functions and statuses. For this tutorial you do not need to now more about.

3) Choose “Connect with MQTT” as connectivity option.

In this tutorial we’ll use MQTT, a publish subscribe protocol for the Internet of Things.

4) Get the Device ID and Device Secret.

Once the device is created, click the settings link (placed under the device name) and get the device ID and device secret. You’ll need them in the next section.


Once the (virtual) device is defined on Lelylan you need to make it communicate with Arduino. Copy the sketch below and change the following variables: deviceIddeviceSecretoutTopicinTopic and clientId (it will not take more than one minute).

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

/* ------------------ */
/* ------------------ */

char* deviceId     = "<DEVICE-ID>";             // * set your device id (will be the MQTT client username)
char* deviceSecret = "<DEVICE-SECRET>";         // * set your device secret (will be the MQTT client password)
char* outTopic     = "devices/<DEVICE-ID>/set"; // * MQTT channel where physical updates are published
char* inTopic      = "devices/<DEVICE-ID>/get"; // * MQTT channel where lelylan updates are received
char* clientId     = "<CLIENT-ID>";             // * set a random string (max 23 chars, will be the MQTT client id)

/* ------------ */
/* ------------ */

/* Server settings */
byte server[] = { 178, 62, 108, 47 }; // MQTT server address

/* Sample payload published to lelylan */
/* The id is the status property id of the basic light /*
/* */ 
char* payloadOn  = "{\"properties\":[{\"id\":\"518be5a700045e1521000001\",\"value\":\"on\"}]}";
char* payloadOff = "{\"properties\":[{\"id\":\"518be5a700045e1521000001\",\"value\":\"off\"}]}";

/* Ethernet configuration */
byte mac[] = { 0xA0, 0xA0, 0xBA, 0xAC, 0xAE, 0x12 };
EthernetClient ethClient;

/* MQTT communication */
void callback(char* topic, byte* payload, unsigned int length); // subscription callback
PubSubClient client(server, 1883, callback, ethClient);         // mqtt client

/* Pins configuration */
int inPin = 2; // button
int outPin = 4; // led

/* Button and led logics */
int state = HIGH;     // current state of the output pin
int reading;          // current reading from the input pin
int previous = LOW;   // previous reading from the input pin
long time = 0;        // the last time the output pin was toggled
long debounce = 200;  // the debounce time, increase if the output flickers

/* arduino setup */
void setup() {

  Serial.print("Connected with IP: ");

  lelylanConnection();      // MQTT server connection
  pinMode(inPin, INPUT);    // button pin setup
  pinMode(outPin, OUTPUT);  // led pin setup

/* arduino loop */
void loop() {

  char* value;
  reading = digitalRead(inPin);  // read the button state

  // if the input just went from LOW and HIGH and we've waited long enough to ignore
  // any noise on the circuit, toggle the output pin and remember the time
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == LOW) {
      Serial.println("[PHYSICAL] Led turned on");
      state = HIGH;
    } else {
      Serial.println("[PHYSICAL] Led turned off");
      state = LOW;

    time = millis();

  // effectively update the light status
  digitalWrite(outPin, state);
  previous = reading;

/* MQTT server connection */
void lelylanConnection() {
  // add reconnection logics
  if (!client.connected()) {
    // connection to MQTT server
    if (client.connect(clientId, deviceId, deviceSecret)) {
      Serial.println("[PHYSICAL] Successfully connected with MQTT");
      lelylanSubscribe(); // topic subscription

/* MQTT publish */
void lelylanPublish(char* value) {
  if (value == "on")
    client.publish(outTopic, payloadOn); // light on
    client.publish(outTopic, payloadOff); // light off

/* MQTT subscribe */
void lelylanSubscribe() {

/* Receive Lelylan message and confirm the physical change */
void callback(char* topic, byte* payload, unsigned int length) {
  // copu the payload content into a char*
  char* json;
  json = (char*) malloc(length + 1);
  memcpy(json, payload, length);
  json[length] = '\0';

  // update the physical status and confirm the executed update
  if (String(payloadOn) == String(json)) {
    Serial.println("[LELYLAN] Led turned on");
    state = HIGH;
  } else {
    Serial.println("[LELYLAN] Led turned off");
    state = LOW;

  digitalWrite(outPin, state);





201802,W5500,Ethernet,Arduino,Smart Light.


William Bergamo,Andrea Reginato



Please Login to comment
Notify of