codeword

Boas pessoal, agradecia que alguém me explica se, caso seja possivel , como é k eide fazer o programa para enviar pelo tx 433mhz um code word com o objectivo de ser recebido por um RX 433mhz e descodificado por um ht12d e dai recebendo aos 4 bits de dados..

Uma das minhas varias tentativas foi usar a biblioteca rcswitch, mas sem sucesso Agradeço desde já...

https://www.youtube.com/watch?v=e8RhXtst7ME Sei que não tudo o que pretendes, mas talvez te consiga dar uma ajudinha. Por acaso também encomendei uns módulos de comunicação 315Mhz e 433Mhz, quando chegarem posso experimentá-los e depois digo-te algo mais detalhado.

José Coelho

Okay, fico a aguardar. Abraço

Este foi um dos códigos que tentei..

include

RCSwitch mySwitch = RCSwitch();

void setup() { mySwitch.enableTransmit(10); // Using Pin #10 }

void loop() { mySwitch.send("010100010001"); delay(1000); }

Esse 0101010101 não é o que tu pensas que é…

Dito isto, que é que tu pensas que é?

Boas amigo, Pensava que era os 8 bits "01010001"adress n. e os 4 bits "0001" data.

Que os 8 bits d adress n. Com os 4 bits d data td junto, formaria uma codeword. K seria interpretado pelo ht12d e caso os 8 bits de adress n. Fosse igual, ele iria descodificar a informação e nos daria os 4 bits d dados. Mas pelos vistos não é bem assim, n é? Podias me ajudar?

Sem olhar à biblioteca rcswitch, arrisco a dizer que isto

"010100010001"

são 12 bytes. Um byte por cada caractér dessa string. Ao colocares o valor entre aspas estás a definir uma string... e não deve ser isso que queres.

De onde veio essa sequência de 0's e 1's?

Tens mais informação acerca desse HT12D para saber o que é que ele está à espera?

Esses 0 e 1 sao codigos binarios . para defenir os estados lógicos dos pin de adress n. Pin de A0 a A7 e pin d dados D0 a D3

A informação que tenho é o que vem no data sheet

Então devo retirar as aspas? E é preciso colocar desta forma?

include

RCSwitch mySwitch = RCSwitch();

void setup() { mySwitch.enableTransmit(10); // Using Pin #10 }

void loop() { mySwitch.send(010100010001b); delay(1000); }

A forma correcta é 0b0101010101010...

Não respondeste ao que perguntei.

Ah OK.

Estas t a referir se tenho mais informação acerca do ht12d? Como t disse tenho o fatasheet dele... Ja o li e foi d la que retirei a sequencia de leitura. Mas agr dei mais uma olhadela no decoder timing e n tou a perceber la MT bem aquilo... Talvez seja aqui k esteja o problema.... Será que podes dar uma olhadela no datasheet para me explicares o que é que tou a fazer de mal?

Será que podes passar o link do datasheet?

Que dispositivo é que vai receber estes dados?

O link do datasheet é este. http://www.botskool.com/downloads/electronics/datasheets/HT12D.pdf

O dispositivo é um simples rele.

Mau... estamos desentendidos.

Um relé é uma bobine e um contacto, logo não tem uma antena ou endereço para poderes usar o módulo 433MHz.

Portanto, o teu arduino manda um comando, e do outro lado o que é que vai receber esse comando? Vai ser um módulo com outro Arduino? Sem saber o que está do outro lado, torna-se difícil saber porque é que o envio não funciona. Também se torna difícil saber ao certo se precisas do tal ht12d ou não. Percebes??

Pretendo accionar um rele remotamente por RF.

Arduino ---> TX 433mhz ---> Aïr ---> RX 433 MHz ---> ht12D ---> rele

Pensava que tavas a perguntar o que estava no final.

aqui tá o pdf, http://www.holtek.com.tw/pdf/consumer/2_12ev120.pdf final da pagina 5 e começo da pagina 6 tem a forma de onda do preamble, start bit e data.

entao a unica coisa que tenho que alterar no meu programa é acrescentar 12 bits ao 12 bits(8 bits adress e 4 bits de data) que ja tinha? asssim?

RCSwitch mySwitch = RCSwitch();

void setup() { mySwitch.enableTransmit(10); // Using Pin #10 }

void loop() { mySwitch.send("0b000000000001000100001001");// "000000000001"bits de ´pilot and Sync´ + "00010000" bits de adress bit + "1001" bits de data delay(1000); }

:/ será isto??

codigo 000000001111

____________________________________M_MM_MM_MM_MM_MM_MM_MM_MM__M__M__M__M
-----------------preamble----------|S|a0|a1|a2|a3|a4|a5|a6|a7|d0|d1|d2|d3  S=startbit                     
cada simbolo acima equivale a uma oscilação do clock que é 1/3000Hz = aprox 330us

você consegue fazer isso com um pé nas costas, usando digitalwrite e delayMicroseconds.

fabio_h, com a dica que me destes ja consegui comunicar com o ht12d, so tive de alterar a frequencia de oscilaçao dos 330us para 333us, esta pequena diferença era o suficiente para ja nao conseguir comunicar.

o programa ficou assim:

//CODEWORD "000000001111"

int Dout = 10; // digital pin 10

void setup() { pinMode(Dout, OUTPUT); // sets the digital pin as output }

void loop() {

//S --> 1 digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(333); // pauses for 333 microseconds

//A0 --> 0 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(333); // pauses for 330 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(666); // pauses for 666 microseconds

//A1 --> 0 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(333); // pauses for 330 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(666); // pauses for 666 microseconds

//A2 --> 0 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(333); // pauses for 330 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(666); // pauses for 666 microseconds

//A3 --> 0 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(333); // pauses for 330 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(666); // pauses for 666 microseconds

//A4 --> 0 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(333); // pauses for 330 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(666); // pauses for 666 microseconds

//A5 --> 0 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(333); // pauses for 330 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(666); // pauses for 666 microseconds

//A6 --> 0 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(333); // pauses for 330 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(666); // pauses for 666 microseconds

//A7 --> 0 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(333); // pauses for 330 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(666); // pauses for 666 microseconds

//D0 --> 1 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(666); // pauses for 666 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(333); // pauses for 333 microseconds

//D1 --> 1 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(666); // pauses for 666 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(333); // pauses for 333 microseconds

//D2 --> 1 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(666); // pauses for 666 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(333); // pauses for 333 microseconds

//D3 --> 1 digitalWrite(Dout, LOW); // sets the pin off delayMicroseconds(666); // pauses for 666 microseconds digitalWrite(Dout, HIGH); // sets the pin on delayMicroseconds(333); // pauses for 333 microseconds digitalWrite(Dout, LOW); // sets the pin off

Quase isso. O inicio é um delay de aprox. 12ms, depois high por 330us, ai A0 ser 0 é low por 330us e high por 660us, se fosse 1 seria low por 660 e high por 330. Esses tempos só serão corretos se usar o resistor indicado no datasheet. Talvez precise enviar essa sequência por 2 ou 3 vezes seguidas para sincronizar. Se tem o ht12d na protoboard seria legal fazer uma ligação direta entre Dout XD e o input do ht12d, elimina outros problemas do RF como inversão de fase, má recepção, etc