Как одной командой управлять всеми выходами Arduino по MQTT?
- Войдите на сайт для отправки комментариев
Втр, 11/12/2018 - 18:31
есть такой скечь на Arduino Nano, я его допилил под свои потребности чтобы по MQTT управлять 16 реле.
Но захотелось ещё большего т.е. по одной реле управляется, а вот как организовать чтобы была возможность всеми сразу т.е. 16 реле.
Клеил тут и через массивы но что-то не пошло, знаний не хватает.
Для рассмотрения скечь укоротил до 4 реле, тут дописать несложно или моду весь выложить если кому интересно будет.
/*
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;
const int relay2 = 1;
const int relay3 = 2;
const int relay4 = 3;
const int relay5 = 4;
// 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, 32 };
void callback(char* topic, byte* payload, unsigned int length)
{
int r,hl;
////******************************************///
char receivedChar = (char)payload[0];
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
r = relay1;
//back;
digitalWrite(r, hl);
}
EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);
void reconnect()
{
while (!client.connected())
{
delay(5000);
}
}
void setup()
{
Ethernet.begin(mac, ip);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
if (client.connect("MainPowerPanel")) // "ArduinoPowerPanel"
{
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");
}
}
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
}
Сочините еще один топик relayAll и ловите его, да в цикле все переключайте.
Что то получилось, но с недостатком если команда on relayAll или off relay All она исполняется, но сервер получает только команду relayAll т.е.визуально каждая реле имеет свою клавишу и есть общая клавиша для всех вкл/откл. и получается так что все ( с 1 по 8 и релеАлл) клавиши в состоянии вкл и с клавишей релеАлл выключаешь оно стало в состояние откл, но клавиши с 1 по 8 остались в позиции вкл. то есть не изменилась почему понятно, а как сделать чтобы не писать отдельную строку для каждой реле, можно и на самом сервере прикрутить что бы свойство менять при поступлении соответствующей команды, но на ардуино как-то было бы порядочнее.
/* 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(); }