Как одной командой управлять всеми выходами 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 остались в позиции вкл. то есть не изменилась почему понятно, а как сделать чтобы не писать отдельную строку для каждой реле, можно и на самом сервере прикрутить что бы свойство менять при поступлении соответствующей команды, но на ардуино как-то было бы порядочнее.