Как одной командой управлять всеми выходами Arduino по MQTT?

ewas
Offline
Зарегистрирован: 26.09.2016
есть такой скечь на 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();
}


 

 
sadman41
Offline
Зарегистрирован: 19.10.2016

Сочините еще один топик relayAll и ловите его, да в цикле все переключайте.

ewas
Offline
Зарегистрирован: 26.09.2016

Что то получилось, но с недостатком если команда 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();
}