1#include <SPI.h>
2#include <YunClient.h>
3#include <PubSubClient.h>
4
5
6
7char* deviceId = "<DEVICE-ID>";
8char* deviceSecret = "<DEVICE-SECRET>";
9char* outTopic = "devices/<DEVICE-ID>/set";
10char* inTopic = "devices/<DEVICE-ID>/get";
11char* clientId = "<CLIENT-ID>";
12
13
14
15
16byte server[] = { 96, 126, 109, 170 };
17
18
20char* payloadOn = "{\\"properties\\":[{\\"id\\":\\"518be5a700045e1521000001\\",\\"value\\":\\"on\\"}]}";
21char* payloadOff = "{\\"properties\\":[{\\"id\\":\\"518be5a700045e1521000001\\",\\"value\\":\\"off\\"}]}";
22
23byte mac[] = { 0xA0, 0xA0, 0xBA, 0xAC, 0xAE, 0x12 };
24YunClient yun;
25
26void callback(char* topic, byte* payload, unsigned int length);
27PubSubClient client(server, 1883, callback, yun);
28
29int inPin = 3;
30int outPin = 13;
31
32int state = HIGH;
33int reading;
34int previous = LOW;
35long time = 0;
36long debounce = 200;
37
38void setup() {
39 Serial.begin(9600);
40 delay(500);
41 Serial.println("Start initialization of Yun...");
42 Bridge.begin();
43 Serial.println("Bridge finished setup");
44 Serial.println("Starting connection to lelylan...");
45 lelylanConnection();
46 pinMode(inPin, INPUT);
47 pinMode(outPin, OUTPUT);
48}
49
50void loop() {
51 lelylanConnection();
52 char* value;
53 reading = digitalRead(inPin);
54
55
56 if (reading == HIGH && previous == LOW && millis() - time > debounce) {
57 if (state == LOW) {
58 Serial.println("[PHYSICAL] Led turned on");
59 lelylanPublish("on");
60 state = HIGH;
61 } else {
62 Serial.println("[PHYSICAL] Led turned off");
63 lelylanPublish("off");
64 state = LOW;
65 }
66 time = millis();
67 }
68
69 digitalWrite(outPin, state);
70 previous = reading;
71}
72
73void lelylanConnection() {
74
75 if (!client.connected()) {
76
77 if (client.connect(clientId, deviceId, deviceSecret)) {
78 Serial.println("[PHYSICAL] Successfully connected with MQTT");
79 lelylanSubscribe();
80 }
81 }
82 client.loop();
83}
84
85void lelylanPublish(char* value) {
86 if (value == "on")
87 client.publish(outTopic, payloadOn);
88 else
89 client.publish(outTopic, payloadOff);
90}
91
92void lelylanSubscribe() {
93 client.subscribe(inTopic);
94}
95
96void callback(char* topic, byte* payload, unsigned int length) {
97
98 char* json;
99 json = (char*) malloc(length + 1);
100 memcpy(json, payload, length);
101 json[length] = '\\0';
102
103 if (String(payloadOn) == String(json)) {
104 Serial.println("[LELYLAN] Led turned on");
105 lelylanPublish("on");
106 state = HIGH;
107 } else {
108 Serial.println("[LELYLAN] Led turned off");
109 lelylanPublish("off");
110 state = LOW;
111 }
112 digitalWrite(outPin, state);
113 free(json);
114}