Скетч Arduino + W5100 обсуждаем, пишем, тестируем
Модератор: immortal
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
Я чуть чуть "бум бум")) Можно ссылочку на инфу?
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
-
- Сообщения: 20
- Зарегистрирован: Пн окт 22, 2018 5:30 pm
- Откуда: Сургут
- Благодарил (а): 6 раз
- Поблагодарили: 1 раз
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
woow писал(а): ↑Пн дек 10, 2018 5:32 pmэтот скечь "растянул" до 16 реле на Arduino Nano с W5100, но увы не получилось с двумя выводами D0 и D1 (иначе как Rx и Tx), скечь другой эти выводы рабочие как и все цифровые, а как только загружаю этот сразу же и отключаются, скорей всего какая то библиотека использует эти регистры, ну тогда управлять можно и 14 реле.
И есть ещё проблема при первом запуске почему-то не отрабатываются команды и на сериал мониторе они не видны, после двух -трёх нажатий начинает работать, дальше без глюков, но всё ровно так не годится MQTT команда отослана а результата нет, может кто профессиональном взглядом видит эту проблему.
тут укороченный скечь на одну реле для рассмотрения и наглядности:СпойлерПоказатьКод: Выделить всё
/* connect to mqtt server, send and recive Arduino Nano W5100 HL-58S */ #include <SPI.h> #include <Ethernet.h> #include <PubSubClient.h> const int relay1 = 2; // Update these with values suitable for your network. byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; byte server[] = { 192, 168, 1, 123 }; byte ip[] = { 192, 168, 1, 32 }; void callback(char* topic, byte* payload, unsigned int length) { int r,hl; Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); ////****/// char receivedChar = (char)payload[0]; Serial.print(receivedChar); if(receivedChar=='1') hl = LOW; else hl = HIGH; if(String(topic)=="PowerPanel/relay1") r = relay1; //back; digitalWrite(r, hl); Serial.println(); } EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attempt to connect if (client.connect("arduinoPowerPanel")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { Serial.begin(9600); Ethernet.begin(mac, ip); pinMode(relay1, OUTPUT); if (client.connect("arduinoPowerPanel")) { Serial.print("online"); client.publish("PowerPanel/relay1", "1"); client.subscribe("PowerPanel/relay1"); } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
здесь полный скечь:СпойлерПоказатьКод: Выделить всё
/* connect to mqtt server, send and recive Arduino Nano W5100 HL-58S */ #include <SPI.h> #include <Ethernet.h> #include <PubSubClient.h> const int relay1 = 0; // This output not working properly, why , i don't know :( const int relay2 = 1; // This output not working properly, why , i don't know :( const int relay3 = 2; const int relay4 = 3; const int relay5 = 4; const int relay6 = 5; const int relay7 = 6; const int relay8 = 7; const int relay9 = 8; const int relay10 = 9; const int relay11 = A0; const int relay12 = A1; const int relay13 = A2; const int relay14 = A3; const int relay15 = A4; const int relay16 = A5; // Update these with values suitable for your network. byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; byte server[] = { 192, 168, 1, 123 }; byte ip[] = { 192, 168, 1, 32 }; void callback(char* topic, byte* payload, unsigned int length) { int r,hl; Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); ////****/// char receivedChar = (char)payload[0]; Serial.print(receivedChar); if(receivedChar=='1') hl = LOW; else hl = HIGH; if(String(topic)=="PowerPanel/relay1") r = relay1; else if(String(topic)=="PowerPanel/relay2") r = relay2; else if(String(topic)=="PowerPanel/relay3") r = relay3; else if(String(topic)=="PowerPanel/relay4") r = relay4; else if(String(topic)=="PowerPanel/relay5") r = relay5; else if(String(topic)=="PowerPanel/relay6") r = relay6; else if(String(topic)=="PowerPanel/relay7") r = relay7; else if(String(topic)=="PowerPanel/relay8") r = relay8; else if(String(topic)=="PowerPanel/relay9") r = relay9; else if(String(topic)=="PowerPanel/relay10") r = relay10; else if(String(topic)=="PowerPanel/relay11") r = relay11; else if(String(topic)=="PowerPanel/relay12") r = relay12; else if(String(topic)=="PowerPanel/relay13") r = relay13; else if(String(topic)=="PowerPanel/relay14") r = relay14; else if(String(topic)=="PowerPanel/relay15") r = relay15; else if(String(topic)=="PowerPanel/relay16") r = relay16; else r = relay1; //back; digitalWrite(r, hl); Serial.println(); } EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attempt to connect if (client.connect("arduinoPowerPanel")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { Serial.begin(9600); Ethernet.begin(mac, ip); pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); pinMode(relay5, OUTPUT); pinMode(relay6, OUTPUT); pinMode(relay7, OUTPUT); pinMode(relay8, OUTPUT); pinMode(relay9, OUTPUT); pinMode(relay10, OUTPUT); pinMode(relay11, OUTPUT); pinMode(relay12, OUTPUT); pinMode(relay13, OUTPUT); pinMode(relay14, OUTPUT); pinMode(relay15, OUTPUT); pinMode(relay16, OUTPUT); if (client.connect("arduinoPowerPanel")) { Serial.print("online"); client.publish("PowerPanel/relay1", "1"); client.subscribe("PowerPanel/relay1"); client.publish("PowerPanel/relay2", "1"); client.subscribe("PowerPanel/relay2"); client.publish("PowerPanel/relay3", "1"); client.subscribe("PowerPanel/relay3"); client.publish("PowerPanel/relay4", "1"); client.subscribe("PowerPanel/relay4"); client.publish("PowerPanel/relay5", "1"); client.subscribe("PowerPanel/relay5"); client.publish("PowerPanel/relay6", "1"); client.subscribe("PowerPanel/relay6"); client.publish("PowerPanel/relay7", "1"); client.subscribe("PowerPanel/relay7"); client.publish("PowerPanel/relay8", "1"); client.subscribe("PowerPanel/relay8"); client.publish("PowerPanel/relay9", "1"); client.subscribe("PowerPanel/relay9"); client.publish("PowerPanel/relay10", "1"); client.subscribe("PowerPanel/relay10"); client.publish("PowerPanel/relay11", "1"); client.subscribe("PowerPanel/relay11"); client.publish("PowerPanel/relay12", "1"); client.subscribe("PowerPanel/relay12"); client.publish("PowerPanel/relay13", "1"); client.subscribe("PowerPanel/relay13"); client.publish("PowerPanel/relay14", "1"); client.subscribe("PowerPanel/relay14"); client.publish("PowerPanel/relay15", "1"); client.subscribe("PowerPanel/relay15"); client.publish("PowerPanel/relay16", "1"); client.subscribe("PowerPanel/relay16"); } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
Вот уж спасибо, сбасибо, спасибо.
Наконец то, я нашел работающий скейч для управления релюшками по протоколу MQTT, через плату 5100.
Почему то другие какие находил, то не компилились, то не работали. А ваш прям сразу скмпилился и заработал.
- woow
- Сообщения: 821
- Зарегистрирован: Пн июл 04, 2016 8:46 am
- Откуда: Mazeikiai
- Благодарил (а): 125 раз
- Поблагодарили: 46 раз
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
Здесь есть функция relayAll on/off соответственно если посылаешь 1 или 0 по MQTT. Но работает криво то что после этой команды реле все срабатывают и переходят в состояние соответствующей команде, но их свойства на МД сервере не меняются. Можно конечно в МД через метод свойство менять при изменении состояния если relayAll 1 то на все реле ставим 1 иначе 0, но это не правильно, должно всё в ардуинке меняться, но по ка не получается. Этот скечь на Arduino Nano можно сделать на 16 реле.
СпойлерПоказать
Код: Выделить всё
/*
connect to mqtt server, send and recive
Arduino Nano
W5100
HL-58S
*/
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
const int relay1 = 2;
const int relay2 = 3;
const int relay3 = 4;
const int relay4 = 5;
const int relay5 = 6;
const int relay6 = 7;
const int relay7 = 8;
const int relay8 = 9;
int relayAll[] = { 2, 3, 4, 5, 6, 7, 8, 9 };
int pinCount = 9;
// Update these with values suitable for your network.
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
byte server[] = { 192, 168, 1, 140 };
byte ip[] = { 192, 168, 1, 132 };
void callback(char* topic, byte* payload, unsigned int length){
int r,hl;
Serial.print(" Message arrived [");
Serial.print(topic);
Serial.print("] ");
////****///
char receivedChar = (char)payload[0];
Serial.print(receivedChar);
if(receivedChar=='1')
hl = LOW;
else
hl = HIGH;
if(String(topic)=="PowerPanel/relay1")
r = relay1;
else if(String(topic)=="PowerPanel/relay2")
r = relay2;
else if(String(topic)=="PowerPanel/relay3")
r = relay3;
else if(String(topic)=="PowerPanel/relay4")
r = relay4;
else if(String(topic)=="PowerPanel/relay5")
r = relay5;
else if(String(topic)=="PowerPanel/relay6")
r = relay6;
else if(String(topic)=="PowerPanel/relay7")
r = relay7;
else if(String(topic)=="PowerPanel/relay8")
r = relay8;
else if(String(topic)=="PowerPanel/relayAll")
r = 255;
else
r = relay1;
if (r == 255)
for (byte i = 0; i < pinCount - 1; i++)
digitalWrite(relayAll[i], hl);
else
digitalWrite(r, hl);
}
EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
void reconnect(){
// Loop until we're reconnected
while (!client.connected())
{
Serial.println(" Attempting MQTT connection...");
// Attempt to connect
if (client.connect("arduinoPowerPanel"))
{
Serial.println("connected");
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup(){
Serial.begin(9600);
Ethernet.begin(mac, ip);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
pinMode(relay5, OUTPUT);
pinMode(relay6, OUTPUT);
pinMode(relay7, OUTPUT);
pinMode(relay8, OUTPUT);
if (client.connect("arduinoPowerPanel")) {
Serial.print("online");
client.publish("PowerPanel/relay1", "1");
client.subscribe("PowerPanel/relay1");
client.publish("PowerPanel/relay2", "1");
client.subscribe("PowerPanel/relay2");
client.publish("PowerPanel/relay3", "1");
client.subscribe("PowerPanel/relay3");
client.publish("PowerPanel/relay4", "1");
client.subscribe("PowerPanel/relay4");
client.publish("PowerPanel/relay5", "1");
client.subscribe("PowerPanel/relay5");
client.publish("PowerPanel/relay6", "1");
client.subscribe("PowerPanel/relay6");
client.publish("PowerPanel/relay7", "1");
client.subscribe("PowerPanel/relay7");
client.publish("PowerPanel/relay8", "1");
client.subscribe("PowerPanel/relay8");
client.publish("PowerPanel/relayAll", "1");
client.subscribe("PowerPanel/relayAll");
}
}
void loop(){
if (!client.connected())
{
reconnect();
}
client.loop();
}
Raspberry Pi 3B+
- Bzdenchik
- Сообщения: 9
- Зарегистрирован: Вт ноя 20, 2018 11:11 pm
- Благодарил (а): 2 раза
- Поблагодарили: 0
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
Отпишитесь кто использует данное решение? Тоже зависает?
Если нет, то какие конкретно платы используете?
Если нет, то какие конкретно платы используете?
- woow
- Сообщения: 821
- Зарегистрирован: Пн июл 04, 2016 8:46 am
- Откуда: Mazeikiai
- Благодарил (а): 125 раз
- Поблагодарили: 46 раз
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
Вопрос про что? ESP8266 или W5100+Arduino?
Raspberry Pi 3B+
- Bzdenchik
- Сообщения: 9
- Зарегистрирован: Вт ноя 20, 2018 11:11 pm
- Благодарил (а): 2 раза
- Поблагодарили: 0
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
У меня nano от RobotDyn сетевухи w5500 и w5100. Зависает раз в сутки точно, бывает и чаще.
-
- Сообщения: 59
- Зарегистрирован: Ср авг 23, 2017 5:35 pm
- Благодарил (а): 2 раза
- Поблагодарили: 2 раза
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
У меня если больше 76% памяти на UNO используется то MQTT зависает. Сократил длину текстовых адресов подписок - все работает стабильно теперь.
-
- Сообщения: 6
- Зарегистрирован: Пн фев 04, 2019 10:35 pm
- Благодарил (а): 1 раз
- Поблагодарили: 0
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
А не подскажите как к этому скетчу подвязать кнопки? Скажем я хочу скетч сделать на 8 реле и к каждой реле отдельную физ. кнопку, что бы можно бло управлять релюшками как по mqtt так и кнопкойvovankin писал(а): ↑Пт дек 21, 2018 7:23 pmВот уж спасибо, сбасибо, спасибо.woow писал(а): ↑Пн дек 10, 2018 5:32 pmэтот скечь "растянул" до 16 реле на Arduino Nano с W5100, но увы не получилось с двумя выводами D0 и D1 (иначе как Rx и Tx), скечь другой эти выводы рабочие как и все цифровые, а как только загружаю этот сразу же и отключаются, скорей всего какая то библиотека использует эти регистры, ну тогда управлять можно и 14 реле.
И есть ещё проблема при первом запуске почему-то не отрабатываются команды и на сериал мониторе они не видны, после двух -трёх нажатий начинает работать, дальше без глюков, но всё ровно так не годится MQTT команда отослана а результата нет, может кто профессиональном взглядом видит эту проблему.
тут укороченный скечь на одну реле для рассмотрения и наглядности:СпойлерПоказатьКод: Выделить всё
/* connect to mqtt server, send and recive Arduino Nano W5100 HL-58S */ #include <SPI.h> #include <Ethernet.h> #include <PubSubClient.h> const int relay1 = 2; // Update these with values suitable for your network. byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; byte server[] = { 192, 168, 1, 123 }; byte ip[] = { 192, 168, 1, 32 }; void callback(char* topic, byte* payload, unsigned int length) { int r,hl; Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); ////****/// char receivedChar = (char)payload[0]; Serial.print(receivedChar); if(receivedChar=='1') hl = LOW; else hl = HIGH; if(String(topic)=="PowerPanel/relay1") r = relay1; //back; digitalWrite(r, hl); Serial.println(); } EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attempt to connect if (client.connect("arduinoPowerPanel")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { Serial.begin(9600); Ethernet.begin(mac, ip); pinMode(relay1, OUTPUT); if (client.connect("arduinoPowerPanel")) { Serial.print("online"); client.publish("PowerPanel/relay1", "1"); client.subscribe("PowerPanel/relay1"); } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
здесь полный скечь:СпойлерПоказатьКод: Выделить всё
/* connect to mqtt server, send and recive Arduino Nano W5100 HL-58S */ #include <SPI.h> #include <Ethernet.h> #include <PubSubClient.h> const int relay1 = 0; // This output not working properly, why , i don't know :( const int relay2 = 1; // This output not working properly, why , i don't know :( const int relay3 = 2; const int relay4 = 3; const int relay5 = 4; const int relay6 = 5; const int relay7 = 6; const int relay8 = 7; const int relay9 = 8; const int relay10 = 9; const int relay11 = A0; const int relay12 = A1; const int relay13 = A2; const int relay14 = A3; const int relay15 = A4; const int relay16 = A5; // Update these with values suitable for your network. byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED }; byte server[] = { 192, 168, 1, 123 }; byte ip[] = { 192, 168, 1, 32 }; void callback(char* topic, byte* payload, unsigned int length) { int r,hl; Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); ////****/// char receivedChar = (char)payload[0]; Serial.print(receivedChar); if(receivedChar=='1') hl = LOW; else hl = HIGH; if(String(topic)=="PowerPanel/relay1") r = relay1; else if(String(topic)=="PowerPanel/relay2") r = relay2; else if(String(topic)=="PowerPanel/relay3") r = relay3; else if(String(topic)=="PowerPanel/relay4") r = relay4; else if(String(topic)=="PowerPanel/relay5") r = relay5; else if(String(topic)=="PowerPanel/relay6") r = relay6; else if(String(topic)=="PowerPanel/relay7") r = relay7; else if(String(topic)=="PowerPanel/relay8") r = relay8; else if(String(topic)=="PowerPanel/relay9") r = relay9; else if(String(topic)=="PowerPanel/relay10") r = relay10; else if(String(topic)=="PowerPanel/relay11") r = relay11; else if(String(topic)=="PowerPanel/relay12") r = relay12; else if(String(topic)=="PowerPanel/relay13") r = relay13; else if(String(topic)=="PowerPanel/relay14") r = relay14; else if(String(topic)=="PowerPanel/relay15") r = relay15; else if(String(topic)=="PowerPanel/relay16") r = relay16; else r = relay1; //back; digitalWrite(r, hl); Serial.println(); } EthernetClient ethClient; PubSubClient client(server, 1883, callback, ethClient); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.println("Attempting MQTT connection..."); // Attempt to connect if (client.connect("arduinoPowerPanel")) { Serial.println("connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { Serial.begin(9600); Ethernet.begin(mac, ip); pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); pinMode(relay5, OUTPUT); pinMode(relay6, OUTPUT); pinMode(relay7, OUTPUT); pinMode(relay8, OUTPUT); pinMode(relay9, OUTPUT); pinMode(relay10, OUTPUT); pinMode(relay11, OUTPUT); pinMode(relay12, OUTPUT); pinMode(relay13, OUTPUT); pinMode(relay14, OUTPUT); pinMode(relay15, OUTPUT); pinMode(relay16, OUTPUT); if (client.connect("arduinoPowerPanel")) { Serial.print("online"); client.publish("PowerPanel/relay1", "1"); client.subscribe("PowerPanel/relay1"); client.publish("PowerPanel/relay2", "1"); client.subscribe("PowerPanel/relay2"); client.publish("PowerPanel/relay3", "1"); client.subscribe("PowerPanel/relay3"); client.publish("PowerPanel/relay4", "1"); client.subscribe("PowerPanel/relay4"); client.publish("PowerPanel/relay5", "1"); client.subscribe("PowerPanel/relay5"); client.publish("PowerPanel/relay6", "1"); client.subscribe("PowerPanel/relay6"); client.publish("PowerPanel/relay7", "1"); client.subscribe("PowerPanel/relay7"); client.publish("PowerPanel/relay8", "1"); client.subscribe("PowerPanel/relay8"); client.publish("PowerPanel/relay9", "1"); client.subscribe("PowerPanel/relay9"); client.publish("PowerPanel/relay10", "1"); client.subscribe("PowerPanel/relay10"); client.publish("PowerPanel/relay11", "1"); client.subscribe("PowerPanel/relay11"); client.publish("PowerPanel/relay12", "1"); client.subscribe("PowerPanel/relay12"); client.publish("PowerPanel/relay13", "1"); client.subscribe("PowerPanel/relay13"); client.publish("PowerPanel/relay14", "1"); client.subscribe("PowerPanel/relay14"); client.publish("PowerPanel/relay15", "1"); client.subscribe("PowerPanel/relay15"); client.publish("PowerPanel/relay16", "1"); client.subscribe("PowerPanel/relay16"); } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
Наконец то, я нашел работающий скейч для управления релюшками по протоколу MQTT, через плату 5100.
Почему то другие какие находил, то не компилились, то не работали. А ваш прям сразу скмпилился и заработал.
- woow
- Сообщения: 821
- Зарегистрирован: Пн июл 04, 2016 8:46 am
- Откуда: Mazeikiai
- Благодарил (а): 125 раз
- Поблагодарили: 46 раз
Re: Скетч Arduino + W5100 обсуждаем, пишем, тестируем
Если хотите можете попробовать этот скеч. С разу предупреждаю, что он с дефектами, надо шлифовать, а я не могу найти ошибки.Devil_Blood писал(а): ↑Сб фев 16, 2019 10:56 pmА не подскажите как к этому скетчу подвязать кнопки? Скажем я хочу скетч сделать на 8 реле и к каждой реле отдельную физ. кнопку, что бы можно бло управлять релюшками как по mqtt так и кнопкой
Они такого рода:
1. при подключении не отсылается ни какая команда то-есть он не видим, надо разбудить нажатием кнопки или командой из сервера
2. MQTT сервер получает сразу две публикации, но "работает" в дальнейшем только одна (можно это игнорировать, жить не мешает );
3. не сделал пока команду all-off, all-on (иногда нужно, практично) (можно это игнорировать, жить не мешает );
В остальном тестируйте, меняйте, может что-то и лучше этого получится сообща.
СпойлерПоказать
Код: Выделить всё
/*
arduino-nano
W5100 pins 10,11,12,13
Relay pins 2,3,4,5
Buttons pins 6,7,8,9
*/
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <Bounce2.h>
int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;
int button1 = 6;
int button2 = 7;
int button3 = 8;
int button4 = 9;
int led1Value = LOW;
int led2Value = LOW;
int led3Value = LOW;
int led4Value = LOW;
// Arduino MAC address is on a sticker on your Ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };
// Unique static IP address of this Arduino - change to adapt to your network
IPAddress ip(192,168,1,138);
// IP Address of your MQTT broker - change to adapt to your network
byte server[] = { 192, 168, 1, 140 };
// Handle and convert incoming MQTT messages
void callback(char* topic, byte* payload, unsigned int length) {
// handle message arrived
String content="";
char character;
for (int num=0;num<length;num++) {
character = payload[num];
content.concat(character);
}
Serial.print(topic);
Serial.println(content);
// Set specific virtual switches on basis of specific incoming messages
if ((topic == "led_1")&&(content == "on")) {
led1Value = HIGH;
}
if ((topic == "led_1")&&(content == "off")) {
led1Value = LOW;
}
if ((topic == "led_2")&&(content == "on")) {
led2Value = HIGH;
}
if ((topic == "led_2")&&(content == "off")) {
led2Value = LOW;
}
if ((topic == "led_3")&&(content == "on")) {
led3Value = HIGH;
}
if ((topic == "led_3")&&(content == "off")) {
led3Value = LOW;
}
if ((topic == "led_4")&&(content == "on")) {
led4Value = HIGH;
}
if ((topic == "led_4")&&(content == "off")) {
led4Value = LOW;
}
// Set digital pin states according to virtual switch settings
digitalWrite(led1,led1Value);
digitalWrite(led2,led2Value);
digitalWrite(led3,led3Value);
digitalWrite(led4,led4Value);
}
EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
// Initiate a bouncer instance for each button
Bounce bouncer1 = Bounce();
Bounce bouncer2 = Bounce();
Bounce bouncer3 = Bounce();
Bounce bouncer4 = Bounce();
void setup(){
led1Value = LOW;
led2Value = LOW;
led3Value = LOW;
led4Value = LOW;
// setup led, button, bouncer 1
pinMode(led1, OUTPUT);
pinMode(button1,INPUT);
digitalWrite(button1,HIGH);
bouncer1 .attach(button1);
bouncer1 .interval(5);
// setup led, button, bouncer 2
pinMode(led2, OUTPUT);
pinMode(button2,INPUT);
digitalWrite(button2,HIGH);
bouncer2 .attach(button2);
bouncer2 .interval(5);
// setup led, button, bouncer 3
pinMode(led3, OUTPUT);
pinMode(button3,INPUT);
digitalWrite(button3,HIGH);
bouncer3 .attach(button3);
bouncer3 .interval(5);
// setup led, button, bouncer 4
pinMode(led4, OUTPUT);
pinMode(button4,INPUT);
digitalWrite(button4,HIGH);
bouncer4 .attach(button4);
bouncer4 .interval(5);
// Setup serial connection
Serial.begin(9600);
// Setup ethernet connection to MQTT broker
Ethernet.begin(mac);
if (client.connect("arduino-switchgear")) {
Serial.println("connected");
client.subscribe("led_1");
client.subscribe("led_2");
client.subscribe("led_3");
client.subscribe("led_4");
}
}
void loop(){
// Listen for button interactions and take actions --
if (bouncer1.update()) {
if (bouncer1.read() == HIGH) {
if (led1Value == LOW) {
led1Value = HIGH;
client.publish("led_1","on");
} else {
led1Value = LOW;
client.publish("led_1","off");
}
}
}
if (bouncer2.update()) {
if (bouncer2.read() == HIGH) {
if (led2Value == LOW) {
led2Value = HIGH;
client.publish("led_2","on");
} else {
led2Value = LOW;
client.publish("led_2","off");
}
}
}
if (bouncer3.update()) {
if (bouncer3.read() == HIGH) {
if (led3Value == LOW) {
led3Value = HIGH;
client.publish("led_3","on");
} else {
led3Value = LOW;
client.publish("led_3","off");
}
}
}
if (bouncer4.update()) {
if (bouncer4.read() == HIGH) {
if (led4Value == LOW) {
led4Value = HIGH;
client.publish("led_4","on");
} else {
led4Value = LOW;
client.publish("led_4","off");
}
}
}
client.loop();
}
Raspberry Pi 3B+