Go Down

Topic: Arduino Mega + RF433 + Interruptores Livolo (Read 6972 times) previous topic - next topic

mpsantoss

Jun 27, 2014, 07:20 pm Last Edit: Jun 27, 2014, 07:26 pm by mpsantoss Reason: 1
Prazados, boa tarde!!

Gostaria da ajuda de vocês pois estou com um projeto para ativar as lampadas de casa por RF433  com  Interruptores Livolo. No entanto estou com diversas dúvidas no código, pois não sou programador. Pesquisando consegui identificar o remoteID e código de acesso para cada botão (lâmpada) do controle.
Ai está a minha dúvida... Onde e de que forma inserir todos os outros IDs dos interruptores no código?

sendButton(1897, 0); //  - Sala
sendButton(1897, 96); // - Varanda
sendButton(1897, 120); // - Hall de entrada

Code: [Select]

#define  txPin  8 // pin connected to RF transmitter (pin 8)
byte i; // just a counter
byte pulse; // counter for command repeat
boolean high = true; // pulse "sign"

void setup() {
}

void loop() {
sendButton(6400, 120); // blink button #3 every 3 seconds using remote with remoteID #6400
delay(3000);
}

void sendButton(unsigned int remoteID, byte keycode) {
 for (pulse= 0; pulse <= 180; pulse = pulse+1) { // how many times to transmit a command
 sendPulse(1); // Start
 high = true; // first pulse is always high

 for (i = 16; i>0; i--) { // transmit remoteID
   byte txPulse=bitRead(remoteID, i-1); // read bits from remote ID
   selectPulse(txPulse);
   }

 for (i = 7; i>0; i--) { // transmit keycode
   byte txPulse=bitRead(keycode, i-1); // read bits from keycode
   selectPulse(txPulse);
   }
 }
  digitalWrite(txPin, LOW);
}

void selectPulse(byte inBit) {
     switch (inBit) {
     case 0:
      for (byte ii=1; ii<3; ii++) {
       if (high == true) {   // if current pulse should be high, send High Zero
         sendPulse(2);
       } else {              // else send Low Zero
               sendPulse(4);
       }
       high=!high; // invert next pulse
      }
       break;
     case 1:                // if current pulse should be high, send High One
       if (high == true) {
         sendPulse(3);
       } else {             // else send Low One
               sendPulse(5);
       }
       high=!high; // invert next pulse
       break;
     }
}

void sendPulse(byte txPulse) {
 switch(txPulse) { // transmit pulse
  case 1: // Start
  digitalWrite(txPin, HIGH);
  delayMicroseconds(500); // 550
  digitalWrite(txPin, LOW);
  break;
  case 2: // "High Zero"
  digitalWrite(txPin, LOW);
  delayMicroseconds(100); // 110
  digitalWrite(txPin, HIGH);
  break;
  case 3: // "High One"
  digitalWrite(txPin, LOW);
  delayMicroseconds(300); // 303
  digitalWrite(txPin, HIGH);
  break;
  case 4: // "Low Zero"
  digitalWrite(txPin, HIGH);
  delayMicroseconds(100); // 110
  digitalWrite(txPin, LOW);
  break;
  case 5: // "Low One"
  digitalWrite(txPin, HIGH);
  delayMicroseconds(300); // 290
  digitalWrite(txPin, LOW);
  break;
 }
}


Agradeço a Ajuda.

luisilva

Viva mpsantoss!

Consegue passar as características do comando e o link para a biblioteca que está a utilizar? Assim talvez seja mais fácil perceber o que está a tentar fazer e se consiga sugerir mais concretamente uma solução.

Obrigado,
LS.

mpsantoss

Prezado luisilva,

o SnifferRF me retorna o seguinte controle:
RemoteID: 1897  Keycode: 96

Pelo que vi no código, posso estar enganado, deve ser inserido no seguinte trecho em sendButton, mas como inserir mais de um.
Code: [Select]

void loop() {
sendButton(6400, 120); // blink button #3 every 3 seconds using remote with remoteID #6400
delay(3000);


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

A biblioteca livolo:
https://docs.google.com/file/d/0B0DQ7La4EBHlU2ltTmlmeHhya3M/edit

Os Interruptores:
http://www.aliexpress.com/item/Manufacturer-Livolo-Ivory-Crystal-Glass-Panel-US-AU-standard-VL-C301SR-81-2-Way-Wireless-Remote/355399157.html

Obrigado

luisilva

mpsantoss,

Depois de ver o material dos links, penso já estar em condições de conseguir ajuda-lo. No entanto tem que me explicar um pouco melhor qual é a sua ideia. Quer ter o Arduino com três botões (1 para cada lâmpada) e premindo cada botão acende a lâmpada se estiver apagada e apaga se estiver acesa?
Se a única ideia é fazer um pequeno exemplo que acenda e apague uma das lâmpadas, como o que está no código do exemplo, o programa que tem que fazer é o seguinte:

Code: [Select]
// Simple blink example of Livolo.h library for Livolo wireless light switches

#include <livolo.h>

Livolo livolo(8); // transmitter connected to pin #8


void setup() {
}

void loop() {

  livolo.sendButton(1897, 96); // blink button #3 every 3 seconds using remote with remoteID #6400
  delay(3000);
 
}


se quiser fazer o mesmo mas com outra lâmpada apenas tem que substituir a linha:
Code: [Select]
  livolo.sendButton(1897, 96); // blink button #3 every 3 seconds using remote with remoteID #6400

por:
Code: [Select]
  livolo.sendButton(1897, 0); // blink button #3 every 3 seconds using remote with remoteID #6400
para a sala, ou:

Code: [Select]
  livolo.sendButton(1897, 120); // blink button #3 every 3 seconds using remote with remoteID #6400
para o hall de entrada.

Se quiser o botões, vai ser preciso mais código, mas também não é nada do outro mundo.

NOTA: deve ter a biblioteca Livolo instalada no ambiente do Arduino.

mpsantoss

#4
Jun 27, 2014, 11:04 pm Last Edit: Jun 27, 2014, 11:16 pm by mpsantoss Reason: 1
Prezado, luisilva.

O projeto consiste no primeiro momento em controlar localmente e por internet alguns pontos de luz em minha casa, comprei alguns desses interruptores para controlar lampadas distintas, Sala, Cozinha, Hall de entrada, corredores, garagem e que possam ser acionados ou desligados remotamente.

Por RF consegui o código de ativação para cada interruptor. Existe um tópico aqui no forum que foi meu ponto de partida, só o unico que funcionou foi o que eu já especifiquei na abertura do tópico, então, com esse código que funcionou gostaria de adicionar os outros código IDs.

Conforme sua orientação eu já fiz e funciona perfeitamente, mas o que gostaria, seria de colocar todos os IDs diretamente no código e para enviar ao arduino.

Tópico: http://forum.arduino.cc/index.php?topic=153525.0

Em um segundo momento (futuramente) gostaria de também adicionar os sensores magnéticos do alarme residencial e com isso saber qual das portas e janelas estão ou foram abertas.

Grato.




luisilva

Muito bom projecto, parabéns! Penso que está uma ideia muito bem conseguida.

Se esta parte funcionou (não percebi muito bem, mas penso que foram todos, certo?) o próximo passo antes de introduzir o shield ethernet, penso que pode ser com 3 botões numa breadboard (ou outra coisa qualquer) fazer ligar/desligar cada uma das lâmpadas, como sugeri anteriormente (não sei se concorda comigo). Sendo assim, vai precisar de um código que lhe permita fazer isto. Tomando como ponto de partida este exemplo, que liga um LED quando um botão está premido, podemos fazer uma coisa semelhante, mas em vez de utilizar um LED podemos utilizar as lâmpadas:
Code: [Select]

#include <livolo.h>

Livolo livolo(8); // transmitter connected to pin #8

const int buttonPin1 = 2;
const int buttonPin2 = 3;
const int buttonPin3 = 4;

int buttonState1 = 0;
int oldState1 = 0;
int buttonState2 = 0;
int oldState2 = 0;
int buttonState3 = 0;
int oldState3 = 0;

void setup() {
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin2, INPUT);
}

void loop() {
  buttonState1 = digitalRead(buttonPin1);

  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     livolo.sendButton(1897, 96); //
  }
  if (buttonState2 != oldState2 && buttonState2 == HIGH) {
     livolo.sendButton(1897, 0); //
  }
  if (buttonState3 != oldState3 && buttonState3 == HIGH) {
     livolo.sendButton(1897, 120); //
  }
  oldState1 = buttonState1;
  oldState2 = buttonState2;
  oldState3 = buttonState3;
 
}


Tive que alterar algumas coisas em relação ao exemplo, para se poder adaptar a esta realidade (no exemplo quando o botão está premido, manda " o comando" para ligar, neste caso o comando para ligar e desligar são os mesmo, por isso o código exactamente igual não iria funcionar).

Se não tiver ou não quiser usar botões, também pode usar a porta série. Assim, temos que partir deste exemplo, para criar uma coisa como esta:
Code: [Select]
#include <livolo.h>

Livolo livolo(8); // transmitter connected to pin #8

const int ledPin1 = 30;
const int ledPin2 = 32;
const int ledPin3 = 34;

int ledState1 = HIGH;
int ledState2 = HIGH;
int ledState3 = HIGH;

char button;

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {

  if (Serial.available()) {
    button = Serial.read();
    switch (button) {
       case '1':
          livolo.sendButton(1897, 96); //
          digitalWrite(ledPin1, ledState1);
          Serial.print("led 1:");
          Serial.println(ledState1);
          ledState1 = !ledState1;
          break;
       case '2':
          livolo.sendButton(1897, 0); //
          digitalWrite(ledPin2, ledState2);
          Serial.print("led 2:");
          Serial.println(ledState2);
          ledState2 = !ledState2;
          break;
       case '3':
          livolo.sendButton(1897, 120); //
          digitalWrite(ledPin3, ledState3);
          Serial.print("led 3:");
          Serial.println(ledState3);
          ledState3 = !ledState3;
          break;
       default:
          Serial.println("error");
    }
  }
}


Neste introduzi mais alguns elementos que permitem ver o estado do sistema mesmo sem ter por perto as lâmpadas (que é o meu caso).

Como não tenho as lâmpadas aqui não sei se irá funcionar tudo correctamente, por isso teste e diga-me alguma coisa.

mpsantoss

Amigo luisilva,

Obrigado por sua atenção, acabei de efetuar o teste com o código enviado por você e o mesmo fica em loop acendendo todas as lampadas e em sequencia ele manda novamente o pulso e vai apagando na mesma sequencia. Como eu posso fazer para ele acender somente a lampada que eu desejar nesse mesmo código? que por sinal ficou ótimo, você está de parabéns.
Inseri as demais lampadas no código e ficou assim, não sei se é assim mesmo que deveria ficar.

Code: [Select]

#include <livolo.h>
Livolo livolo(8); // transmitter connected to pin #8

const int buttonPin1 = 2;
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buttonPin4 = 5;
const int buttonPin5 = 6;
const int buttonPin6 = 7;
const int buttonPin7 = 8;
const int buttonPin8 = 9;

int buttonState1 = 0;
int oldState1 = 0;
int buttonState2 = 0;
int oldState2 = 0;
int buttonState3 = 0;
int oldState3 = 0;
int buttonState4 = 0;
int oldState4 = 0;
int buttonState5 = 0;
int oldState5 = 0;
int buttonState6 = 0;
int oldState6 = 0;
int buttonState7 = 0;
int oldState7 = 0;
int buttonState8 = 0;
int oldState8 = 0;

void setup() {
// inicia a porta de comunicação Serial.
  Serial.begin(9600);
// inicia os buttonPins de input:
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
  pinMode(buttonPin6, INPUT);
  pinMode(buttonPin7, INPUT);
  pinMode(buttonPin8, INPUT);
}

void loop() {
  buttonState1 = digitalRead(buttonPin1);

  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     livolo.sendButton(1897, 0); // Sala
     Serial.println("1 - Sala");
  }
  if (buttonState2 != oldState2 && buttonState2 == HIGH) {
     livolo.sendButton(1897, 96); // Varanda Frente
     Serial.println("2 - Varanda Frente");
  }
  if (buttonState3 != oldState3 && buttonState3 == HIGH) {
     livolo.sendButton(1897, 120); // Hall de Entrada
     Serial.println("3 - Hall de Entrada");
  }
  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     livolo.sendButton(1897, 24); // Garagem
     Serial.println("4 - Garagem");
  }
  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     livolo.sendButton(1897, 108); // Corredor Lateral
     Serial.println("5 - Corredor Lateral");
  }
  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     livolo.sendButton(1897, 80); // Hall Quartos
     Serial.println("6 - Hall Quartos");
  }
  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     livolo.sendButton(1897, 48); // Cozinha
     Serial.println("7 - Cozinha");
  }
  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     livolo.sendButton(1897, 106); // Desligar tudo
     Serial.println("b - Desligar todas as lampadas");
  }
  oldState1 = buttonState1;
  oldState2 = buttonState2;
  oldState3 = buttonState3;
  oldState3 = buttonState4;
  oldState3 = buttonState5;
  oldState3 = buttonState6;
  oldState3 = buttonState7;
  oldState3 = buttonState8;
}


Mais uma vez agradeço a sua atenção.

hugo007

Antes de mais como estas a fazer o deboucing aos teus botoes?
Quote
buttonState1 = digitalRead(buttonPin1);

  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     livolo.sendButton(1897, 0); // Sala
     Serial.println("1 - Sala");
  }

Nao devias estar a guardar o valor do botão na tua oldState1 mal primes o botão.Assim como esta se mantiveres o botão pressionado a função ira ser sempre executada varias vezes ja que o micro controlador é mais rápido que tu!
Code: [Select]

  if (buttonState1 != oldState1 && buttonState1 == HIGH) {
     oldState1 = 1;
     livolo.sendButton(1897, 0); // Sala
     Serial.println("1 - Sala");
  }

Para a desencravares tens de verificar se o botao voltou a 0 , o que significa que libertas-te o botao.
Porque não usas antes variáveis do tipo boolean ja que estas so oucpam um byte e nao 2 como um int?
Assim como tens só para controlares botões estas a ocupar 32 bytes de ram para armazenar algo que apenas cabia num int se for bem feito(16 bits).Mas isto é apenas optimização tal como te disse isto não resolve o que tu dizes que faz.
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

luisilva

Não estou a perceber o que poderá ter corrido mal, uma vez que as condições são:
Code: [Select]
if (buttonState1 != oldState1 && buttonState1 == HIGH)
isto é, envia o pulso, ara acender ou apagar, se houver uma alteração do estado do botão e se o botão neste momento estiver ALTO. Isto é quando o botão é carregado, se a lâmpada estivesse ligada, desliga-a, caso contrário liga-a. Pelo que entendo do seu comentário não é isto que está a acontecer, mas sim, ele faz isto sem obedecer à ordem do botão, é isto? Também reparei que realizou algumas alterações ao código original. Se o objectivo é ter mais botões, há maneiras mais "elegantes" (e correctas de fazer isso). Apenas não fiz desse forma porque achei demasiado para apenas 3 lâmpadas. Em relação à falha de funcionamento, apenas consigo concluir que a montagem dos botões não deve ter sido bem feita.

Para tirar as dúvidas pode sempre recorrer à "segunda versão" que funciona através de porta série. Para ter acesso à dita "porta série", após a programação da placa, no ambiente de desenvolvimento (programa de PC para o Arduino) tem um botão no canto superior direito (com um ícone de uma lupa e a tag "monitor série"). Clique nesse botão. Na caixa que aparece, na linha superior, escreva o número da lâmpada que deseja activar (ou desactivar) e prima o botão enviar. Na parte inferior a opção que deve estar seleccionada é "Sem final de linha" e na caixa ao lado deve constar "9600 baud". (desculpe estar a descrever isto com tanto detalhe, mas não sei qual é o seu nível de conhecimento sobre o monitor série)

Em relação à montagem dos botões, pode ver um esquema no link seguinte:
http://www.arduino.cc/en/Tutorial/Button
Os três botões devem estar ligados aos pinos digitais 2, 3 e 4.

Teste desta forma e depois diga alguma coisa.

luisilva

@HugoPT: sim, concordo, mas o objectivo era fazer o exemplo mais básico possível, sendo assim, parti do exemplo Button e deixei ficar desta forma. A única alteração, e que era necessária, foi originada pelo facto de no exemplo original serem "enviados dois comandos" uma para acender e outro para apagar, e aqui ter o mesmo comando para as duas funções. No entanto, nada disto resolve o problema que o OP aponta.

hugo007

Quote
acabei de efectuar o teste com o código enviado por você e o mesmo fica em loop acendendo todas as lampadas e em sequência ele manda novamente o pulso e vai apagando na mesma sequencia

Tens a certeza que fizeste um pull-down nos botões?
É que se fizeste um pull-up isso explica o que relatas.
Podes explicar melhor o que acontece.Ao ler o teu comentário fico com a sensação que queres dizer que todos os ifs são corridos sem que tu mexas nos botões, é isso?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

mpsantoss

Amigos luissilva e HugoPT!!!

Esse projeto não vou usar botões físicos, primeiramente vou fazer com que os interruptores funcionem diretamente por
RF+Arduino e assim que estiver funcionando vou tentar colocar os acessos aos botões via WEB (Shield Ethernet).

Amigo HugoPT, como dito antreiormente, não sou programador e não tenho ideia de como fazer esses procedimentos
estou a verificar nos tópicos do forum e constatei que alguns usuários fazem de diversas formas diferentes, só
queria uma ajuda de vocês que são experientes tanto com Arduino como em programação para resolver esse meu problema.

Já vi 3 ou 4 códigos diferentes para a mesma coisa mas quando os exemplos são expostos e quem os desenvolveu
só colocam referência para controlar um interruptor e eu tenho 8 interruptores para controlar.

luisilva

Não sei que mais responder sem ser:

(...)
Para tirar as dúvidas pode sempre recorrer à "segunda versão" que funciona através de porta série. Para ter acesso à dita "porta série", após a programação da placa, no ambiente de desenvolvimento (programa de PC para o Arduino) tem um botão no canto superior direito (com um ícone de uma lupa e a tag "monitor série"). Clique nesse botão. Na caixa que aparece, na linha superior, escreva o número da lâmpada que deseja activar (ou desactivar) e prima o botão enviar. Na parte inferior a opção que deve estar seleccionada é "Sem final de linha" e na caixa ao lado deve constar "9600 baud". (desculpe estar a descrever isto com tanto detalhe, mas não sei qual é o seu nível de conhecimento sobre o monitor série)
(...)


A versão do código que estou a que me estava a referir é:

(...)
Code: [Select]
#include <livolo.h>

Livolo livolo(8); // transmitter connected to pin #8

const int ledPin1 = 30;
const int ledPin2 = 32;
const int ledPin3 = 34;

int ledState1 = HIGH;
int ledState2 = HIGH;
int ledState3 = HIGH;

char button;

void setup()
{
  // initialize the serial communication:
  Serial.begin(9600);
  // initialize the ledPin as an output:
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
}

void loop() {

  if (Serial.available()) {
    button = Serial.read();
    switch (button) {
       case '1':
          livolo.sendButton(1897, 96); //
          digitalWrite(ledPin1, ledState1);
          Serial.print("led 1:");
          Serial.println(ledState1);
          ledState1 = !ledState1;
          break;
       case '2':
          livolo.sendButton(1897, 0); //
          digitalWrite(ledPin2, ledState2);
          Serial.print("led 2:");
          Serial.println(ledState2);
          ledState2 = !ledState2;
          break;
       case '3':
          livolo.sendButton(1897, 120); //
          digitalWrite(ledPin3, ledState3);
          Serial.print("led 3:");
          Serial.println(ledState3);
          ledState3 = !ledState3;
          break;
       default:
          Serial.println("error");
    }
  }
}

(...)


Se entretanto tiver mais alguma questão diga.

cmsmor

Boas...
Adquiri há dias alguns interruptores Livolo dimmer + wireless.  E após algumas pesquisas cheguei a este forum em que fiquei surpreendido sobre as potencialidades destes interruptores.
Pelo que tenho lido, continuo com muitas dúvidas e que precisava de esclarecer antes de avançar para o conhecimento prático e tirar partido dos interruptores.
As minhas questões são:
- É possível ligar e controlar através da rede e/ou internet estes interruptores?
- Que componentes são necessários adquirir e está acessível a quem não percebe de programação?
Obrigado.

mpsantoss

Prezado cmsmor,

É sim possível controlar os interruptores por rede local e pela Web.

Tive um pouco afastado e não consegui dar continuidade ao tópico que como já foi dito anteriormente não sou programador e tenho muitas dúvidas nessa área.

Mas vamos lá...

Eu estou usando o seguinte material:

01 Arduino Mega;
01 Ethernet Shield Ws5100;
01 Transmissor de RF 433 MHz;
04 Interruptores Livolo para 7 lampadas.

Com a ajuda dos amigos luissilva e HugoPT Já estou conseguindo controlar os interruptores pelo computador, agora o objetivo é programar o Ethernet Shield. O próximo passo será capturar o sinal dos sensores de portas e janelas que também são de frequência 433 MHz e colocar tudo no mesmo código.

Grande Abraço.

Go Up