Automação residencial em módulos

LegendBR:
Depois vou estudar sobre VPN e esse tal de Mikrotik que vocês estão falando. Se tiverem algum material, agradeço :D.

Pode começar por aqui Manual:TOC - MikroTik Wiki
No youtube você também vai achar muito material em português. Qualquer dúvida é só falar.

LegendBR:
Cheguei ontem em terra, e como minhas primeiras PCIs (compradas na IteadStudio) haviam chegado, já soldei os componentes. Tudo parece estar em ordem, e pelo menos a parte de conversão 12v -> 5v parece estar funcionando direitinho (só vi os leds acenderem, falta testar com o multimetro). Depois posto uma foto.

Hoje devo fazer testes de comunicação. Depois posto os resultados e a nova biblioteca de comunicação RS485, sem timeout.

Cadê, cadê, cadê?????

Não deu muito certo não, hehehe. Inventei de testar tudo de uma vez, agora vou ter que fazer testes por partes.

Pelo menos o Mega que eu comprei chegou hoje, monitorando o serial fica mais fácil de ver o que deu errado. Já identifiquei um problema com o relé com optoacoplador (exagerei no resistor, hehehe), mas assim que tiver resultados, posto.

edit: agora entendi o que é esse MikroTik, é uma marca de roteador e que também tem um OS, semelhante ao DD-WRT.

Estava vendo o manual do meu roteador e acho que ele já tem suporte VPN. Será que vale a pena comprar outro roteador?

Minha rede é composta de um roteador da GVT (todo travado) que serve como modem (e é responsável por fazer a atualização do IP dinâmico pelo no-ip), que faz routing para o TL-WR1043ND, que faz o routing para o resto da rede.

LegendBR,

Acredito que seu roteador deva funcionar a vpn sim. Mas... o mikrotik é muito mais estável e robusto.

Como você gravou o bootloader no seus chips atmel? Mesmo gravando bootloader para 8MHz precisou do cristal 16MHz no momento da gravação?

Atualizando conforme prometido: estava tendo dificuldade em testar a PCI com os 2 relés, mas acabou que a PCI mais "simples", de 5 x 5 cm, que encomendei na Elecrow, chegou, e decidi montar logo ela e testar. E para minha felicidade, tudo parece estar funcionando 100% (quer dizer, 90%, pois o capacitor acabou ficando na frente do segundo conector :blush:).

Abaixo seguem fotos das PCIs montadas, e da PCI simplificada com o "shield" ICSP (está bem ruinzinha, mas era só para testar, como funcionou, vou fazer um design e encomendar junto com uns outros shields que devo desenvolver, além de outras PCIs).

Fiz um teste de comunicação serial pelo MAX485, e está funcionando bem! Só falta eu testar a alteração da biblioteca, que parece que não está funcionando muito bem.

Fiquei bem satisfeito com o resultado da PCI simplificada, e soldar foi mais fácil do que eu imaginava, achava que ia ser muito difícil de evitar que os contatos tivessem curto, mas a máscara de solda funciona melhor do que eu achava!

Se alguém tiver alguma sugestão de modificação, por favor falem logo, pois acho que a PCI está quase final :D.

@mardden

Cara, tem um jeito de gravar sem precisar dos cristais, utilizando esse esquema.

Mas tive dificuldade em utilizá-lo, pois meu Uno está com problema na parte de comunicação USB, daí tentei utilizar o Mega, mas acho que os pinos são diferentes. Então a solução foi utilizar o esquema de ArduinoISP, e colocar o chip no Uno, aí funcionou sem problemas, consegui gravar o bootloader de 8 MHz e ele já está funcionando na placa sem cristal numa boa.

Fiz algumas alterações na PCI, agora acho que está próxima de ser final. Modifiquei o conector do VCC / GND para poder alimentar tudo com fio de 2,5 mm (pelos cálculos anteriores, o fio 24 awg do cabo de rede não iria dar certo), modifiquei os pinos para programação serial de acordo com o que me parece que é default para um cabo/adaptador FTDI, e arranjei os componentes.

Novamente, se alguém tiver sugestões para modificação/melhoria, peço que façam o quanto antes, já estou querendo encomendar as PCIs logo :stuck_out_tongue_closed_eyes:.

LegendBR,

Dica:
Eu li em algum lugar que devemos evitar trilhas em 90graus, sempre que possível usar ângulos de 45graus. Para evitar capacitância.

Crítica construtiva:
Particularmente gostei mais da ideia de placa única (placa com relé). A placa menor pelo que entendi tem o regulador de tensão,
arduino (8MHz) e o max485. Já pensou no mini-pro 8MHz? Como você vai prender mais de uma pcb dentro da caixa de interruptores?

Meu cenário atual:
Estou apanhando pra fazer o arduino em 8MHz funcionar. Já consigo gravar o bootloader (com um Duemilanove) seguindo esse site:
http://www.geocities.jp/arduino_diecimila/bootloader/index_en.html
Para gravar o programa (hex) segui esse site:
http://engenheirando.com/arduino/montando-arduino-na-protoboard/
Mas infelizmente em 8MHz funcionou apenas uma vez. Vou brincar mais um pouco e se ficar complicado partirei para o mini-pro.
Se eu for usar o mini vou desenha uma shield com regulador de tensão, max485, relé ou triac e barra de pinos para encaixar o mini-pro.
Essa semana vou fazer alguns testes com relé e triac para comparar o consumo de energia desses caras.

Segue o fluxograma do arduino master. Versão alfa ainda.

Pensei em fazer um shield para o mini pro sim, mas acabei achando mais prático fazer o "meu arduino pro", já com o regulador e o módulo RS485.

Minha ideia dessa placa foi utilizar módulos de relés prontos (comprei 10 módulos com 2 relés no eBay por pouco mais de 20 dólares), e nessa PCI algumas das portas estão desperdiçadas. Mas vou fazer uma outra PCI, agora com TRIAC, e pinos para os botões capacitivos.

edit: sobre prender na caixa, pensei em deixar solto mesmo, não pensei em prender não... acho que não tem necessidade de fixar na caixa não, a parede é fixa, hehehehe.

Sobre a crítica, quero isso mesmo, não se preocupe em criticar não, recebo críticas muito bem. Estou começando nessa área, ainda tenho muito o que aprender, e trocar informações é sempre bom :). Depois vou ver se consigo eliminar as curvas de 90°, embora ache que não via trazer muito problema, é bom previnir.

Novamente, se alguém tiver sugestões para modificação/melhoria, peço que façam o quanto antes, já estou querendo encomendar as PCIs logo

Cá vão as minhas sugestões.
Ao olhar para a tua placa não gosto particularmente da posição dos dois conectores (lado esquerdo junto ao díodo).Porque nao facialos com a borda da placa?
Para la ligares o cabo ele vai ter de andar em cima da PCB junto onde colocaste a fixaçao para os parafusos.
Podias ter dado uma arrumadela melhor nos componentes.O circuito e simples e podias ter colocado os componentes mais bonitinhos.
Quando desenhares a placa no final de teres feito o auto-routing (se fizeres com auto) faz um ratsnest á placa e aplica um polygon em ambas as faces da placa.Depois liga esse poligon a massa tocando na label e escrevendo GND.
Com isto a placa fica com aspecto mais profissional.

A uns tempos construí uma placa para sensores de temperatura e a minha placa é em parte parecida ao que tu fizeste.Também uso um max485 para fazer os nós dos slaves.Usa como termo de comparaçao as minhas tambem foram feitas na elecrow

Captura de ecra? 2013-07-21, a?s 16.41.02.png

Captura de ecra? 2013-07-21, a?s 16.43.08.png

Captura de ecra? 2013-07-21, a?s 16.41.19.png

HugoPT:
Cá vão as minhas sugestões.
Ao olhar para a tua placa não gosto particularmente da posição dos dois conectores (lado esquerdo junto ao díodo).Porque nao facialos com a borda da placa?
Para la ligares o cabo ele vai ter de andar em cima da PCB junto onde colocaste a fixaçao para os parafusos.

Nas primeiras placas estava assim, mas quando adicionei os parafusos de fixação tive que colocar os conectores mais para frente. Qual a sua sugestão, retirar os parafusos de fixação? Colocá-los ao lado dos conectores, deixando-os fora da borda? No início eu nem estaca pensando em utilizar parafuso de fixação, mas depois, pensando melhor, acho que vai ficar bem legal deixar a placa fixada no fundo da caixa de luz.

HugoPT:
Podias ter dado uma arrumadela melhor nos componentes.O circuito e simples e podias ter colocado os componentes mais bonitinhos.

Pois é, a arrumação dos componentes é meu grande problema, hehehehe. O que está me dificultando é a conversão de 12v para 5v, a quantidade de componentes é considerável, e o LM2576 ocupa bastante espaço.

HugoPT:
Quando desenhares a placa no final de teres feito o auto-routing (se fizeres com auto) faz um ratsnest á placa e aplica um polygon em ambas as faces da placa.Depois liga esse poligon a massa tocando na label e escrevendo GND.
Com isto a placa fica com aspecto mais profissional.

Comecei fazendo fazendo auto-routing, mas depois achei melhor eu mesmo traçar os caminhos, basicamente para poder utilizar a maior trilha possível (auto-routing utiliza uma trilha padrão, daí ter que ficar apagando trilha e traçando de novo, ou então ficar modificando o tamanho, dá mais trabalho).

Sobre a malha GND, já apliquei na parte de baixo, você acha que vale a pena colocar na parte de cima também?

HugoPT:
A uns tempos construí uma placa para sensores de temperatura e a minha placa é em parte parecida ao que tu fizeste.Também uso um max485 para fazer os nós dos slaves.Usa como termo de comparaçao as minhas tambem foram feitas na elecrow

Com certeza vou dar uma olhada na sua PCI, valeu! =D

Depois dos conselhos do HugoPT e do mardden, fiz uma outra PCI, mais organizada e com 3 TRIACs. Segue em anexo.

Coloquei malha GND nos dois lados. O que talvez não ficou muito bom foi o deslocamento entre o conector da alimentação (VCC / GND) e o da comunicação RS485 (A / B). Mas como eles devem acabar ficando em cabos diferentes, esse não deve ser grande problema.

Como sempre, aguardo comentários/sugestões :D.

Parece melhor.
Ja agora ao reparar que usas um LM2576 onde esta a bobine ?
Por acaso não a suprimiste por pensares que ela e desprezável pois não?

HugoPT:
Parece melhor.
Ja agora ao reparar que usas um LM2576 onde esta a bobine ?
Por acaso não a suprimiste por pensares que ela e desprezável pois não?

Ela está ao lado do diodo. Estou utilizando um indutor que tem formato de resistência. Quando utilizei essa "fonte" para alimentar o raspberry pi, o indutor aqueceu, mas para essa PCI, parece estar tranquilo.

Depois vou testar com mais carga para ver como ele reage.

LegendBR,

Desse jeito fico com preguiça de fazer minha placa. Essa com os triacs esta perfeita.

Você vai alimentar o atmel com 5V ou 3.3V?
Veja os testes de consumo nesse site:
http://www.dossant.com/projects/experiments/arduino-power-consumption-study/
Existe uma boa queda no consumo quando alimenta o atmel com 3.3V a 8MHz.

mardden:
LegendBR,

Desse jeito fico com preguiça de fazer minha placa. Essa com os triacs esta perfeita.

Você vai alimentar o atmel com 5V ou 3.3V?
Veja os testes de consumo nesse site:
http://www.dossant.com/projects/experiments/arduino-power-consumption-study/
Existe uma boa queda no consumo quando alimenta o atmel com 3.3V a 8MHz.

Pode usar a vontade :). Depois posto os arquivos do Eagle para que você possa trabalhar nele também.

Por enquanto o esquema está todo com 5v, porque acho que tem mais módulos que são alimentados por 5v do que 3.3v (sensores, etc.). Mas achei muito estranho esse link do consumo de energia do ATMega328PU, como a corrente cai de 12.2 mA para 3.6 mA? Para mim, a lógica é que aumente a corrente já que você vai diminuir a ddp. Vou dar uma lida no datasheet para ver se descubro alguma coisa.

edit: dei uma olhada no datasheet, e pelo o que eu entendi, com 3.3v o ATMega328 fica com frequência de 4 MHz, e não 8 MHz. Isso não chega a ser um problema, mas pode explicar o porque da queda do consumo. Vou estudar para ver se vale a pena modificar a alimentação para 3.3v.

edit2: lembrei agora que o MAX485 trabalha em 5v, e não com 3.3v. Tem outros CIs RS485 que trabalham com 3.3v, então temos que prestar atenção se vamos modificar a tensão da placa. E encontrar o LM2576-3.3v está mais difícil do que o 5.0v, estou achando que vou ficar com 5v mesmo, uma vez que a diferença no consumo não vai ser tão grande.

LegendBR,

Qual a configuração dos efuse, lfuse e hfuse que você esta usando no seu atmel a 8MHz?

Pergunta difícil, hein? Hehehe

Segui esse guia, tem um texto para adicionar em um arquivo txt para possibilitar gravar o bootloader, lá tem os valores que você está perguntando.

Se quiser passar em minha casa para tentar resolver essa bronca, manda uma MP ;).

edit: a noite tem código exemplo com 2 slaves e 1 master. :smiley:

LegendBR:
Pergunta difícil, hein? Hehehe

Segui esse guia, tem um texto para adicionar em um arquivo txt para possibilitar gravar o bootloader, lá tem os valores que você está perguntando.

Se quiser passar em minha casa para tentar resolver essa bronca, manda uma MP ;).

Vou tentar novamente. Se não conseguir vou pedir socorro. :smiley:

LegendBR:
edit: a noite tem código exemplo com 2 slaves e 1 master. :smiley:

Legal. Estamos aguardando.

mardden:
Vou tentar novamente. Se não conseguir vou pedir socorro. :smiley:

Depois diz se conseguiu ;).

Só para dar um feedback: depois de muito quebrar a cabeça, consegui um código que "funciona". Ainda está dando alguns problemas de timeout, mas amanhã vou olhar com mais calma e tentar descobrir o que é, por hoje chega, hehehehe.

Mas já vou adiantar o setup: estou com 2 slaves e um master. O slave 1 tem um botão, que controla sua lâmpada (está ligado em um MOC + TRIAC); o slave 2 tem dois botões, sendo um para sua lâmpada (um led) e outro botão para a lâmpada do slave 1; o master tem dois botões, um para cada lâmpada dos slaves.

Como dito, o sistema está funcionando, mas ainda está dando uns erros de mensagens não recebidas. Será que já é o problema da falta de resistência na extremidade? Depois vou tentar dar um delay antes de responder, tirar um slave, enfim. Vamos aos experimentos :).

edit: testei novamente, pelo jeito era algum mal contato, agora está tudo 100%, sem timeout. Mas por via das dúvidas, vou colocar resistores de pull-up / pull-down nas PCIs. Só fiquei na dúvida se devo colocar em todas as PCIs, só em uma, etc.

Atualizando com códigos, foto, nova versão de PCI e uma nova PCI / shield.

Vou ter que dividir o post, porque ficou muito grande :stuck_out_tongue_closed_eyes:

Seguem os códigos:

Master (2 botões, um controlando cada lampada de cada slave):

#include <MasterSlaveFuji.h>

#define DEBOUNCE 50

MasterSlaveFuji *rs485;

byte buttonPin[2] = {5,6};
long lastButtonPress[2];
bool buttonIsPressed[2] = {false, false};
bool hasChanged[2] = {false, false};
bool lampOn[2] = {false, false};

#define ID 0

void setup()
{
  Serial3.begin(9600);
  Serial.begin(115200);
  rs485 = new MasterSlaveFuji(ID, &Serial3, 2);
  pinMode(buttonPin[0], INPUT_PULLUP);
  pinMode(buttonPin[1], INPUT_PULLUP);
}

void loop()
{
  
  // Verifica botões
  for (int i = 0; i < 2; i++)
  {
    if (digitalRead(buttonPin[i]) == LOW)  // Botao pressionado
    {
      if (!buttonIsPressed[i]) // Primeiro click
      {
        lastButtonPress[i] = millis();
        buttonIsPressed[i] = true;
      }
      else if ((millis() > (lastButtonPress[i] + DEBOUNCE)) && !hasChanged[i]) // Verificacao Debounce
      {
        lampOn[i] = !lampOn[i]; // Inverte lampada
        hasChanged[i] = true; // Debounce
        rs485->sendENQ(i+1, 'L', 1, rs485->Positive, '0', '0', '0', '0' + lampOn[i]); // Envia comando para modificar lampada (L01)
        rs485->waitForAnswer(200); // Aguarda resposta do slave, com timeout de 200 ms
        if (rs485->hasNewMessage()) // Verifica se recebeu resposta
        {
          if (rs485->type == rs485->ACK) // Verifica se o comando enviado foi entendido
          {
            Serial.print("Conhecido! Lampada do Slave ");
            Serial.print(i+1);
            Serial.print(" mudada para ");
            Serial.println((lampOn[i]?"On.":"Off."));
          }
          else if (rs485->type == rs485->NAK) // Verifica se o comando não foi conhecido
          {
            Serial.print("Comando não conhecido! Slave "); 
            Serial.println(i+1);
          }
          else // Se o type não for nem ACK nem NAK, tem algo errado
          {
            Serial.print("Type não conhecido! Slave "); // 
            Serial.println(i+1);
          }
        }
        else // Se não há nova resposta, houve timeout
        {
          Serial.print("Timeout! Slave ");
          Serial.println(i+1);
        }
      }
    }
    else // Botao nao pressionado (digitalRead == HIGH)
    {
      buttonIsPressed[i] = false;
      hasChanged[i] = false;
    }
  }
  
  // Solicita status das lampadas
  for (int i = 0; i < 2; i++)
  {
    rs485->sendENQ(i+1, 'S', 1, rs485->Positive, '0', '0', '0', '0'); // Questiona status das lampadas (S01)
    rs485->waitForAnswer(200); // Aguarda resposta do slave, com timeout de 200 ms
    if (rs485->hasNewMessage()) // Verifica se recebeu resposta
    {
      if (rs485->type == rs485->ACK) // Se o comando foi entendido, a resposta está OK
      {
        
        if ((rs485->data4 - '0') != lampOn[i]) // Verifica se foi modificada o status da lampada
        {
          lampOn[i] = rs485->data4 - '0'; // Guarda novo status
          Serial.print("Lampada do Slave ");
          Serial.print(i+1);
          Serial.print(" mudou para ");
          Serial.println((lampOn[i]?"On.":"Off."));
        }
      }
      else if (rs485->type == rs485->NAK) // Verifica se o comando não foi conhecido
      {
        Serial.print("Comando não conhecido! Status Slave "); 
        Serial.println(i+1);
      }
      else // Se o type não for nem ACK nem NAK, tem algo errado
      {
        Serial.print("Type não conhecido! Status Slave "); // 
        Serial.println(i+1);
      }
    }
    else // Nao houve nova mensagem - timeout
    {
      Serial.print("Status Timeout! Slave ");
      Serial.println(i+1);
    }
  }
  
  // Verifica status do botão do Slave 2
  rs485->sendENQ(2, 'B', 1, rs485->Positive, '0', '0', '0', '0'); // Questiona status do botao do slave 2 (B01)
  rs485->waitForAnswer(200); // Aguarda resposta
  if (rs485->hasNewMessage()) // Se houver resposta...
  {
    if (rs485->type == rs485->ACK) // Se a resposta foi de entendido...
    {
      if (rs485->data4 == '1') // Se o botao foi pressionado...
      {
        lampOn[0] = !lampOn[0]; // Modifica status da lampada do slave 1
        // Envia comando para o Slave 1 com novo status da lampada (L01)
        rs485->sendENQ(1, 'L', 1, rs485->Positive, '0', '0', '0', '0' + lampOn[0]); 
        rs485->waitForAnswer(100); // Aguarda resposta...
        if (rs485->hasNewMessage()) // Houve resposta...
        {
          if (rs485->type == rs485->ACK) // Comando foi entendido...
          {
            Serial.println("Conhecido! Comando do Botao 2 do Slave 2");
          }
          else  if (rs485->type == rs485->NAK) // Verifica se o comando não foi conhecido
          {
            Serial.print("Não conhecido! Comando do Botao 2 do Slave 2"); 
          }
          else // Se o type não for nem ACK nem NAK, tem algo errado
          {
            Serial.print("Type não conhecido! Comando do Botao 2 do Slave 2");
          }
        }
        else // Nao houve resposta - timeout
        {
          Serial.println("Timeout! Comando do Botao 2 do Slave 2");
        }
      }
    }
    else if (rs485->type == rs485->NAK) // Comando nao conhecido
    {
      Serial.println("Não conhecido! Botao 2 do Slave 2");
    }
    else
    {
      Serial.println("Type não conhecido! Botao 2 do Slave 2");
    }
  }
  else // Nao houve resposta - timeout
  {
    Serial.println("Timeout! Botao 2 do Slave 2");
  }  
}

Slave 1 (um botão que acende/apaga uma lâmpada por MOC + TRIAC):

#include <MasterSlaveFuji.h>

MasterSlaveFuji *rs485;

#define ID 1
#define DEBOUNCE 50
#define BUTTON_PIN 12
#define LAMP_PIN 13

long lastButtonPress;
bool buttonIsPressed = false;
bool hasChanged = false;
bool lampOn = false;

void setup(){

  Serial.begin(9600);
  rs485 = new MasterSlaveFuji(ID, &Serial, 2);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(LAMP_PIN,OUTPUT);
}

void loop(){
  
  // Atualiza dados
  rs485->update();
  if (rs485->hasNewMessage()) // Se houve mensagem nova...
  {
    switch(rs485->function) // Acao de acordo com a funcao
    {
      case 'L': // Caso a funcao seja 'L', atualizar status da lampada
        lampOn = rs485->data4 - '0'; // Atualiza status da lampada
        rs485->sendACK(); // Envia comando que foi entendido
        break;
      case 'S': // Caso a funcao seja 'S', informar status da lampada
        // Envia resposta com o status da lampada
        rs485->sendACK(0, 'S', 1, rs485->Positive, '0', '0', '0', '0' + lampOn);
        break;
      default: // Se a funcao nao for 'L' nem 'S', o comando nao e conhecido
        rs485->sendNAK();
    }
  }
  
  // Verifica se o botao foi pressionado, com debounce
  if (digitalRead(BUTTON_PIN) == LOW)
  {
    if (!buttonIsPressed)
    {
      lastButtonPress = millis();
      buttonIsPressed = true;
    }
    else if ((millis() > (lastButtonPress + DEBOUNCE)) && !hasChanged)
    {
      lampOn = !lampOn;
      hasChanged = true;
    }
  }
  else
  {
    buttonIsPressed = false;
    hasChanged = false;
  }
  
  digitalWrite(LAMP_PIN, lampOn);
  
}

Slave 2 (dois botões, um que controla um led no próprio slave, e outro que controla a lâmpada do outro slave):

#include <MasterSlaveFuji.h>

MasterSlaveFuji *rs485;

#define ID 2
#define DEBOUNCE 50
#define LAMP_PIN 13

byte buttonPin[2] = {11,12};
long lastButtonPress[2];
bool buttonIsPressed[2] = {false, false};
bool hasChanged[2] = {false, false};

bool lampOn;
bool button2Pressed;

void setup(){

  Serial.begin(9600);
  rs485 = new MasterSlaveFuji(ID, &Serial, 2);
  pinMode(buttonPin[0], INPUT_PULLUP);
  pinMode(buttonPin[1], INPUT_PULLUP);
  pinMode(LAMP_PIN,OUTPUT);
  lampOn = false;
  button2Pressed = false;
}

void loop(){
  
  // Atualiza RS485
  rs485->update();
  if (rs485->hasNewMessage()) // Se houver nova mensagem...
  {
    switch(rs485->function)
    {
      case 'L': // Caso a funcao seja 'L', atualizar status da lampada
        lampOn = rs485->data4 - '0'; // Atualiza status da lampada
        rs485->sendACK(); // Envia comando que foi entendido
        break;
      case 'S': // Caso a funcao seja 'S', informar status da lampada
        // Envia resposta com o status da lampada
        rs485->sendACK(0, 'S', 1, rs485->Positive, '0', '0', '0', '0' + lampOn);
        break;
      case 'B': // Caso a funcao seja 'B', informa se o botao foi pressionado
        rs485->sendACK(0, 'B', 1, rs485->Positive, '0', '0', '0', '0' + button2Pressed);
        button2Pressed = false; // status do botao ja enviado, retorna para falso
        break;
      default: // Caso a funcao nao seja nenhuma das anteriores, responder que nao entendeu
        rs485->sendNAK();
    }
  }
  
  // Verifica botoes
  for (int i = 0; i < 2; i++)
  {
    if (digitalRead(buttonPin[i]) == LOW)
    {
      if (!buttonIsPressed[i])
      {
        lastButtonPress[i] = millis();
        buttonIsPressed[i] = true;
      }
      else if ((millis() > (lastButtonPress[i] + DEBOUNCE)) && !hasChanged[i])
      {
        if (i == 0) // Se for pressionado o botao 1, mudar status da lampada
        {
          lampOn = !lampOn;
        }
        else // Se for o botao 2, preparar para informar o master
        {
          button2Pressed = true;
        }
        hasChanged[i] = true;
      }
    }
    else
    {
      buttonIsPressed[i] = false;
      hasChanged[i] = false;
    }
  }
  
  digitalWrite(LAMP_PIN, lampOn);
  
}

A biblioteca do RS485 (MasterSlaveFuji) também foi atualizada. Tem um pequeno "ajuste" que tive que fazer para eliminar uns erros que estavam acontecendo, com lixo chegando no Master, talvez seja problema de falta de resistor de pull-up/down, resistor de impedância de valor diferente do convencional (150 ohms, ao invés de 120 ohms), enfim, depois tento descobrir o que aconteceu. Ainda tenho uns erros de timeout, mas novamente, espero que seja algo com relação aos resistores.

Também não consegui fazer funcionar com uma baud rate maior do que 9600 (tentei com 14400, e não deu certo), novamente espero que com os resistores resolva este problema.

O tempo entre envio do questionamento e resposta do slave para o baud rate de 9600 está em 35 ms. Com 14400, é de 25 ms, mas como falei, dá erro de timeout. Então, mantendo 9600 de baud rate, e se forem os cerca de 30 nós que estimo, seriam uns 2 segundos para questionar todos os nós (alguns precisarão informar status de botões, sensores, etc.). Esse tempo pode até ser maior, então espero que eu consiga aumentar o baud rate e manter funcionando.

De acordo com os problemas que estava tendo, decidi modificar a PCI dos slaves para ter a possibilidade de colocar resistores de pull-up/down, além de reorganizar os componentes do circuito de conversão para 5v, para ficar mais parecido com o layout descrito no datasheet to LM2576.

Aproveitei e fiz logo a "PCI de entrada", que ficará na caixa principal da automação junto com o Mega. Nessa caixa ficará a entrada da alimentação dos slaves, e a conexão para o Mega entrar na rede RS-485.

Só estou na dúvida como fazer a conexão dessa PCI com o Mega... por enquanto, coloquei conectores fêmeas para conectar por fios pino/pino com os pinos do Mega, mas não confio muito nesse tipo de conexão... acho que o ideal seria um shield, mas da forma que estou pensando em fazer minha rede de automação, terei duas redes, uma para cada andar da casa, então fazer por shield talvez dê muito certo... alguém tem alguma sugestão? Minha preocupação em utilizar fios jumpers é válida, ou não preciso me preocupar tanto com isso?

MasterSlaveFuji.zip (1.9 KB)