-
Notifications
You must be signed in to change notification settings - Fork 0
/
ControllinoRelay.ino
96 lines (75 loc) · 2.43 KB
/
ControllinoRelay.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <Controllino.h>
#include <Ethernet.h>
#include <MQTT.h> // https://github.com/256dpi/arduino-mqtt
#include <ArduinoQueue.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {10, 3, 10, 88}; // <- change to match your network
char broker[] = "10.3.10.103";
EthernetClient net;
MQTTClient client;
ArduinoQueue<int> queue(20);
unsigned long lastMillis = 0;
void messageReceived(String &topic, String &payload) {
Serial.println("incoming: " + topic + " - " + payload);
// Note: Do not use the client in the callback to publish, subscribe or
// unsubscribe as it may cause deadlocks when other things arrive while
// sending and receiving acknowledgments. Instead, change a global variable,
// or push to a queue and handle it in the loop after calling `client.loop()`.
for (int i = 0; i <= 9; i++) {
if (topic == "controllino/relay/r" + String(i) && payload == "on") {
digitalWrite(CONTROLLINO_R0+i, HIGH);
queue.enqueue(i);
}
if (topic == "controllino/relay/r" + String(i) && payload == "off") {
digitalWrite(CONTROLLINO_R0+i, LOW);
queue.enqueue(i);
}
}
}
void connect() {
Serial.print("connecting...");
while (!client.connect("Controllino", "public", "public")) {
Serial.print(".");
delay(1000);
}
Serial.println("\nconnected!");
client.subscribe("hello");
for (int i = 0; i <= 9; i++) {
client.subscribe("controllino/relay/r" + String(i));
}
}
void setup() {
pinMode(CONTROLLINO_R0, OUTPUT);
pinMode(CONTROLLINO_R1, OUTPUT);
pinMode(CONTROLLINO_R2, OUTPUT);
pinMode(CONTROLLINO_R3, OUTPUT);
pinMode(CONTROLLINO_R4, OUTPUT);
pinMode(CONTROLLINO_R5, OUTPUT);
pinMode(CONTROLLINO_R6, OUTPUT);
pinMode(CONTROLLINO_R7, OUTPUT);
pinMode(CONTROLLINO_R8, OUTPUT);
pinMode(CONTROLLINO_R9, OUTPUT);
Serial.begin(115200);
Ethernet.begin(mac);
client.begin("10.3.10.103", net);
client.onMessage(messageReceived);
connect();
// Since all relays are off on restart, publich their state.
for (int i = 0; i <= 9; i++) {
client.publish("/controllino/relay/r" + String(i) + "/status", "off");
}
}
void loop() {
client.loop();
if (!client.connected()) {
connect();
}
while( !queue.isEmpty() ) {
int item = queue.dequeue();
String state = "off";
if(digitalRead(CONTROLLINO_R0+item) == 1){
state = "on";
}
client.publish("/controllino/relay/r" + String(item) + "/status", state );
}
}