Pages: [1]   Go Down
Author Topic: Executar comandos remotos com RF 433MHz - Automação Residencial  (Read 384 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boa noite senhores, recentemente criei um post com meu código para automação residencial.
Agora é o seguinte, só falta uma penúltima etapa para terminar o código, que é separar as funções de acender/apagar lâmpadas, alarmes, sensores, em vários módulos slaves, de acordo com os cômodos da casa.
Reparem então no código principal, que tem todas as funções no mesmo arduino

Code:
#include <SPI.h>
#include <String.h>
#include <Ethernet.h>

byte mac[] = { 0x01,0x23,0x45,0x67,0x89,0xAB }; // Endereço Mac
byte ip[] = { 192, 168, 0, 50 }; // Endereço de Ip da sua Rede
EthernetServer server(80); // Porta de serviço

String readString = String(30); // string para buscar dados de endereço
boolean statusFiltro = false; // Variável para o status do led
boolean statusAlarme = false; // Status do meu alarme

/*
##########################
------Boolean Luzes-------
##########################
*/
boolean SL1C = false;
/*
##########################
------Boolean Luzes-------
##########################
*/
float temperatura = 0;
float ldr = 0;

int pin2 = 13;


//Definição dos componentes do alarme
int pinBuzzer = 7;
int pinSensorPIR = 8;
int pinLed = 9;
int valorSensorPIR = 0;

void setup(){
  // Inicia o Ethernet
  Ethernet.begin(mac, ip);
  // Define o pino como saída
  // Inicia a comunicação Serial
  Serial.begin(9600);
  
  pinMode(pinBuzzer, OUTPUT);
  pinMode(pinSensorPIR, INPUT);
  pinMode(pinLed, OUTPUT);
}

void loop(){
  // Criar uma conexão de cliente
  valorSensorPIR = digitalRead(pinSensorPIR); // Configuração do sensor
  Serial.print("Valor do Sensor PIR: ");  
  Serial.println(valorSensorPIR);
  delay(300);
  
  EthernetClient client = server.available();
  int valorLido = analogRead(0);
  temperatura = (valorLido/31);
  
  int valorLdr = analogRead(1);
  ldr = (valorLdr);
  
  if (client) {
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        // ler caractere por caractere vindo do HTTP
        if (readString.length() < 30)
        {
          // armazena os caracteres para string
          readString += (c);
        }
        
        //se o pedido HTTP terminou
        if (c == '\n')
          {
             Serial.print("Mensagem recebida: ");
             Serial.println(readString);
         if(readString.indexOf("lAlarme")>=0){ // Se o comando lAlarme for recebido ele muda o status e faz a função ligarAlarme
             Serial.println("Alarme ACTIVADO.");
            statusAlarme = true;    
         }
          if(readString.indexOf("dAlarme")>=0){ // Se receber o comando dAlarme, apenas muda o status e desliga o alarme
             Serial.println("Alarme DESACTIVADO.");
            statusAlarme = false;
            desligarAlarme();
          }
          if(readString.indexOf("lFiltro")>=0){
            statusFiltro = true;
          }
          if(readString.indexOf("dFiltro")>=0){
            statusFiltro = false;
          }
          if(readString.indexOf("L1C")>=0){ //COMANDO QUE QUERO USAR NO SLAVE
            if(SL1C){
              digitalWrite(pin2, LOW);
              SL1C = false;
            }else{
              digitalWrite(pin2, HIGH);
              SL1C = true;
            }
          }
        // dados HTML de saída começando com cabeçalho padrão
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        
        client.print("<font size='20'>");
       // separa as linhas
        
        if(statusAlarme){
        client.print("AlarmeOn");
        }else{
          client.print("AlarmeOff");
        }
      
        client.print("<P>");
        
        if(statusFiltro){
        client.print("FiltroOn");
        }else{
          client.print("FiltroOff");
        }
      
        client.print("<P>");
        
        client.print("Temperatura: ");
        client.print(temperatura);
        client.print(" graus Celsius");
        
        client.print("<P>");
        
        client.print("LDR: ");
        client.print(ldr);
        client.print(" lux");
        
        client.print("<P>");
        
        if(SL1C){
        client.print("LuzOn");
        }else{
          client.print("LuzOff");
        }
      
       client.print("<P>");
      
       if(valorSensorPIR == 1){
         client.print("MovOn");
       }else{
         client.print("MovOff");
       }
          
        
        //limpa string para a próxima leitura
        readString="";
        
        // parar cliente
        client.stop();
        }
      }
    }
  }
  if (valorSensorPIR == 1 && statusAlarme == 1) {
             ligarAlarme();
  }
  
}

void ligarAlarme() {
  digitalWrite(pinLed, HIGH);
  tone(pinBuzzer,1500);
}
void desligarAlarme() {
  //Desligando o led
  digitalWrite(pinLed, LOW);
  //Desligando o buzzer
  noTone(pinBuzzer);
}

Aí tem algumas funções. Queria fazer o seguinte. Ao receber o comando "L1C", quero que ele ligue o led que será ligado em outro arduino, o slave.

Porém não faço a menor ideia de quais alterações devo fazer no programa principal, e o que deve ter no programa secundário.
O modelo de RF 433MHz que tenho é esse:

http://blog.filipeflop.com/wireless/modulo-rf-transmissor-receptor-433mhz-arduino.html

Já tenho a biblioteca VirtualWire.h instalada, mas não está inclusa no programa.

Li vários tópicos relacionados, mas não consegui entender. Se puderem me dar a base de um led, acho que posso fazer para o restante.

Qualquer informação que esteja faltando, me avise que informarei.
Desde já agradeço.
« Last Edit: September 28, 2014, 09:18:14 pm by yago4xd » Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

O que tu estás à procura é dum protocolo de comunicação.

Ou seja, um arduino envia algo para o outro e o outro executa uma acção. Um protocolo pode ser tão simples como

Code:
Serial.print("A");

Ou bastante mais complexo com métodos para detectar e até corrigir erros de comunicação. A questão que se põe é, pretendes apenas ligar um LED num (único) arduino, ou pretendes que isto seja mais abrangente com vários Arduinos a comunicar com um central?

A comunicação é apenas num sentido ou em dois sentidos?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pretendo usar um master, central, que fique próximo ao meu roteador, e os restantes, fiquem um em cada cômodo. Não estou fazendo nada em grande escala ainda, apenas em pequena para que eu possa aumentar no final, ou seja, quero fazer com que no master, envie comandos para outros arduinos e assim, esses outros arduinos executarão os comandos.

Não necessariamente terá resposta, por exemplo, se eu executei uma função do master pro slave 2 para que o alarme fosse ativado, ele simplesmente deve executar a função abaixo no slave:

Code:
void ligarAlarme() {
  digitalWrite(pinLed, HIGH);
  tone(pinBuzzer,1500);
}

E independentemente do comando do master, esse slave em específico deve enviar ao master se algum movimento foi detectado, e quando o master receber esta resposta, haverá um client.print para indicar se houve ou não movimento.

Exemplo:

Code:
if(valorSensorPIR == 1){
         client.print("MovOn");
       }else{
         client.print("MovOff");
       }

Ou seja, será algo bidirecional, porém, não necessariamente uma resposta, e sim, um envio independente do comando do master-slave ou vice-versa.

Exemplo mais simples, que será a maioria na minha automação:

Code:
if(readString.indexOf("L1C")>=0){
            if(SL1C){
              digitalWrite(pin2, LOW);
              SL1C = false;
            }else{
              digitalWrite(pin2, HIGH);
              SL1C = true;
            }
          }

Nesse caso, este comando, apenas será enviado para o slave x fazer essa função do digitalWrite, e o slave x não precisaria voltar nenhuma informação, apenas deve executar este digitalWrite (pin2 seria o led).

Outro exemplo:

Code:
if(readString.indexOf("lFiltro")>=0){
            statusFiltro = true;
            digitalWrite(filtro, HIGH);
          }
          if(readString.indexOf("dFiltro")>=0){
            statusFiltro = false;
            digitalWrite(filtro, LOW);
          }

Neste caso, ocorrerá a mesma coisa, o master envia este comando para o slave y e o mesmo executa, ligando/delisgando o filtro. Perceba-se que o status eu consigo tirar pelo próprio master, não necessitando envio bidirecional, assim como no slave x.

O único caso que terá um envio bidirecional, é o slave do alarme, que terá que receber comandos do master para armar ou desarmar, e independente desses comandos, deverá enviar para o master se detectou presença (independente de estar armado ou não).

Bom é isso. Como disse, é em pequena escala, depois que tudo funcionar irei realizar a montagem pela casa e aí sim, será em maior escala.

PS: Para testar essa comunicação, estou usando como slave um arduino sainsmart, igual ao uno, porém, os slaves serão arduino nano. E o master, será um uno. Se necessário, mudarei para um master.

Agradeço pela colaboração.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Portanto, existe comunicação em dois sentidos... o master activa o alarme e o slave envia o estado do alarme se algo acontecer.

Como vais saber que a comunicação está a funcionar se não tens um feedback?

Se tencionas ter mais que um slave, então tens de ter algo que distinga um slave do outro. Assim sendo, vais precisar no minimo de enviar dois caracteres. Um para te indicar o comando... outro para te indicar qual o nó que o deve executar.

Como vais fazer para garantir que os nós não vão interferir um com o outro?

O problema é que no que toca a comunicações não existe grande e pequena escala. A partir do momento que tens mais que um nó, o trabalho é o mesmo que teres n... pois já tens de garantir que não existe interferência e que o protocolo é bom o suficiente para o que pretendes.

Como vais transmitir com um RF desse género, será aconselhável também teres um método de detectares erros... como um checksum, por exemplo.

Existe um post sobre automação residencial no fórum onde este assunto de comunicações foi falado e examinado em grande detalhe... são 30 e tal páginas, se não me engano, mas com muito sumo... smiley
« Last Edit: September 29, 2014, 11:03:12 am by bubulindo » Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Possuí o link deste post? Irei tentar fazer por ele minha necessidade e qualquer empecilho posto neste tópico mesmo.
Obrigado.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Uma pesquisa no fórum e não é difícil de encontrar...

http://forum.arduino.cc/index.php?topic=149801.0

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Obrigado, pesquisei meio por cima e achei alguns mas não sabia qual se referia, pois me esqueci que tinha citado que o post tinha 30 páginas.

Estou na página 5 ainda, mas antes de prosseguir, quero deixar mais claro como será a minha ideia de automatizar a casa. Pelo que vi do user do outro post, ele ainda não estava com a casa pronta, o que dava liberdade para fazer algo mais bem feito.

No meu caso, a casa já esta plantada há anos, portanto, penso em fazer um sistema híbrido, onde posso usar tanto o interruptor quanto o sistema automático. Porém, não terei como saber o real status das lâmpadas, já que não optei por usar octoacopladores nas lâmpadas. Então, o botão será "Acender/Apagar Lâmpada 1" ou seja, "Comutar estado da Lâmpada 1"

Enfim, as únicas coisas que terei o status, são coisas que só podem ser acionadas pelo sistema, como alarme, filtro, sensores, etc.

Agora vem a parte de instalação em minha casa. Penso no seguinte, cada slave ficará próximo a um quadro de interruptores do cômodo, pois assim, ficará mais próximo dos fios já existentes para ligação nos relés. E se possível, próximo há uma tomada para ligar o arduino.

Os interruptores, terei de trocar de paralelo para intermediário, já que meus relés vão passar a ser os paralelos. Já os interruptores das lâmpadas externas, pretendo desativar os mesmos, pois serão acionados pelo sensor LDR, e para isso, pretendo ligar todas as lâmpadas externas em paralelo, para que eu posso conectar todas em apenas um arduino (Não sei como vou fazer isso, mas vou buscar um fio que ligue todas essas lâmpadas, que no total são 10, e chegue até o telhado).

Pode ser que cada caixa/recipiente dos slaves fiquem expostos, mas isso é o de menos. E como é o buscado nesse tópico, tenho duas opções de ligação/comunicação entre os arduinos, tanto por fios, quando por módulos específicos.

Por fios, creio que aumentaria bastante o custo, além de ser zilhões de fios.

Já por módulos, temos o tratado em questão, que é o RF 433MHz, que vou ver no tópico que me passou se chegaram a mencionar ele.

Tem o RS-485, que ainda vou ver no que deu quanto ao user do outro post, o X10, que já vi ser eliminado no uso deste outro user, e o Xbee, que também foi descartado pelo alto custo.

Bom, todas as respostas, pode ser que eu encontre lá, mas já resolvi deixar aqui o que sei das 5 primeiras páginas, quando ler mais 5, atualizo, e assim por diante, porque deste modo, não deixarei passar nenhuma informação vital.

Obrigado pela colaboração.

PS: Além de tudo, poderia me explicar também como funciona este RS-485? Lendo um pouco mais o post do LegendBR, comecei a perceber que este módulo não faz comunicações wireless, por isso ele está sempre mencionando a passagem de 4 fios. Pra ele faz todo o sentido, já que a a casa não está pronta e pode projetar os fios, evitando perda de sinal. Mas no meu caso, teria quer ser ou Xbee ou RF 433MHz.

Mais uma coisa, como anda seu projeto de sensores? Conseguistes fazer o que queria? (Pode ser que eu descubra a resposta mais adiante no outro tópico, mas por curiosidade resolvi perguntar agora também)
« Last Edit: September 29, 2014, 11:20:36 pm by yago4xd » Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lá mais para a página 20 ou isso, a pessoa que fez o post original abandonou a ideia de usar um par de cobre para uma rede RS485 e estava a ver como fazer isto com rádios. Daí a relevância desse post para ti. No entanto, a possibilidade do rádio foi discutida várias vezes antes disso.

Como vais ligar o Arduino?
Ele vai ficar à vista? Uma fonte de alimentação para o Arduino é outro dos problemas focados nessa thread de 30 páginas... E a solução não é muito amigável.
Creio que o rádio também sofre se estiver embutido numa parede.

O meu projecto de sensores está a avançar muito pouco. Principalmente porque tenho de soldar e detesto fazer isso em veroboard. No entanto o rádio pareceu funcionar aceitavelmente bem e para o próximo mês conto ter o sistema a funcionar para testes e depurar o código.

Entretanto comprei um disco de rede... e qual não é o meu espanto ao ver que aquilo traz um servidor SQL e corre PHP. smiley Já tenho onde armazenar os dados.

Como rádio, estou a usar o nRF24L01... que se não me engano foi a solução mais razoável. O XBee é sem dúvida a mais fácil de utilizar.

Antes de prosseguires com isto, a tua mulher sabe o que pretendes fazer e como vai ficar à vista? Eu digo isto porque se dissesse à minha que ia ter de abrir uma parece ou deixar um carregador de telemóvel de fora da parede para poder ligar uma lâmpada com o telemóvel ela provavelmente pediria o divórcio.

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vamos lá.

Primeiro: O arduino será embutido em um recipiente de plástico, mas de forma alguma penso em abrir um buraco na parede para encaixar isso. Será fixado na parede, e creio que os rádios, ficarão expostos, somente a antena, para ficar menos poluído. Portanto, não será algo que vai atrapalhar o sinal. Porém, no segundo andar terão dois arduinos. Um não será ligado ao master, que é das luzes externas, portanto, não terá RF. E o outro, será para controlar a iluminação da escada e da sala do segundo andar, e o mesmo terá que se comunicar com o master, que fica no primeiro andar. Entretanto, a fixação será a mesma, e creio que mesmo em andares diferentes, os rádios vão se comunicar sem problemas.

Segundo: A alimentação será uma fonte simplificada (vou ver ainda se monto uma placa ou se compro uma) e ela será ligada em qualquer ponto de tomada próximo, ficando então exposto, a antena do rádio e o fio da fonte.

Terceiro: Não sou casado ainda hehe.. Portanto não terei que enfrentar problemas do tipo. Pelo contrário, a casa é dos meus pais, e além de ser algo do interesse deles, me motivam para amplificar meus conhecimentos.

Quarto: Sobre o rádio, verei no post de 30 páginas qual foi utilizado, o RF 433 ou este nRF24L01, que desconheço até então.

Enfim. Na minha casa mesmo, pretendo fazer algo melhor. Mas por ora, farei o mais básico.

Quanto aos slaves, tanto o arduino nano como o arduino pro mini são indicados? Pelo preço, consigo 10 peças do pro mini por R$5,00

Obrigado pela colaboração.

Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hoje em dia um carregador de telemóvel USB faz o que pretendes por um preço aceitável... desde que não seja dos chineses.

O nRF24L01 é bom... mas é complicado de trabalhar devido a não ser comunicação de duas vias. Por outro lado, os resultados dentro de casa também não são grande espingarda, eu por exemplo, no pequeníssimo teste que fiz não notei problemas.

O pro mini de 3,3V é bastante interessante e para usar os nRF ou XBee ideais devido à alimentação de 3,3V. Eu decidi usar os nano por ser preguiçoso e não pretender fazer nada de muito ambicioso... para já.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: [1]   Go Up
Jump to: