Este artigo discutirá o novo módulo receptor de sinal nooLite para Arduino e microcontroladores. O que é notável sobre este módulo? Até agora, não havia maneiras de receber informações dos sensores e controlar a transmissão de sinais dos controles remotos do sistema nooLite nos microcontroladores e no Arduino; essa possibilidade existia apenas para computadores que utilizam adaptadores USB especiais.Agora, com o lançamento do módulo MR1132, tornou-se possível receber dados sobre temperatura, umidade, iluminação e presença de pessoas na sala dos sensores sem fio do sistema nooLite em seus esboços no Arduino, a capacidade de rastrear comandos emitidos para as unidades de energia nooLite por interruptores de controle remoto e muito mais disso que estava indisponível anteriormente.Neste artigo, falarei sobre a operação deste módulo e darei um esboço de trabalho, com base no qual você pode criar facilmente seus dispositivos no MR1132. Nos artigos seguintes, falarei sobre a integração deste módulo com o popular sistema Mega Server do Arduino e sobre os maravilhosos recursos que aparecerão em conexão com essa integração.Módulo
O módulo MR1132 é muito semelhante ao seu irmão, o módulo MT1132 (sobre o qual já houve um ciclo de artigos sobre o Gimetays um , dois , três ). A diferença é que o módulo MT1132 é um transmissor e o módulo MR1132 é um receptor, e o maior efeito pode ser obtido quando usados em conjunto.Outro ponto significativo é que o transmissor MT1132 é universal e funciona tanto de 3,3 V como de 5 V (o que significa que funciona com controladores de 3,3 volts e 5 volts) e o receptor somente a partir de 5 V. Isso deve ser levado em consideração ao projetar seus dispositivos e, se necessário, usar coordenadores de nível lógico.
A conexão é tão simples quanto o módulo MT1132 - tensão de alimentação, terra e dois contatos RX e TX. O RTS pode ser puxado para a tensão de alimentação, mas tudo funcionou para mim, mesmo sem conectar esta saída.Trabalho
O módulo opera através de uma interface serial a uma velocidade de 9600. O módulo recebe comandos do controlador e, por sua vez, emite dados recebidos do ar (de sensores e controles remotos nooLite).Vamos dar uma olhada mais de perto neste ponto, para que você tenha uma compreensão clara de como este módulo funciona.Todos os comandos que o controlador pode enviar para o módulo via interface serial estão relacionados a dispositivos nooLite de "ligação" ou "desatamento", dos quais o módulo receberá dados. Não existem mais comandos de controle para este módulo. Por exemplo, você amarrou o sensor de temperatura nooLite PT112 no canal zero (32 canais no total, o que é refletido no nome do módulo) e depois o módulo começará a receber dados desse sensor e os enviará para a interface serial (onde nossa tarefa é "capturá-lo" e usá-lo em nosso canal). objetivos).Se não precisarmos mais receber dados de nenhum sensor, podemos enviar um comando de desacoplamento (neste caso, no canal zero) e o receptor não fornecerá mais informações ao controlador a partir desse sensor.Quanto às informações recebidas pelo módulo MR1132 dos dispositivos nooLite, existe um documento separado que descreve o formato de todos os comandos possíveis. Nós, no contexto desta narrativa, desta extensa lista, estaremos interessados nas equipes de sensores de temperatura, umidade e movimento. Esses comandos serão discutidos em detalhes abaixo, usando o esboço como exemplo.Sensores
Em nossos experimentos, três sensores serão usados.
Sensor de temperatura PT112 e sensor de temperatura e umidade PT111. Eles têm a mesma aparência e funcionam exatamente da mesma maneira, a diferença é que o PT112 fornece apenas informações sobre temperatura e o PT111 fornece informações sobre temperatura e umidade. Esses sensores podem funcionar no modo de sensor simples ou no modo de termostato e higrostato, mas estaremos interessados em um modo de sensor simples.
O terceiro sensor é PM111. Este é um sensor de movimento que pode controlar diretamente as unidades de energia nooLite, mas estaremos interessados apenas em nós como fonte de informações sobre o movimento e a presença de pessoas na sala.Controlador
O Arduino Mega 2560 será usado como controlador de controle e suas duas interfaces seriais - Serial (para controle de informações visuais) Serial2 (para comunicação com o módulo receptor). Serial1 é reservado para o módulo transmissor MT1132.
Esboço
Na seção setup (), duas interfaces são ativadas, uma mensagem informativa sobre o início do esboço é exibida e um comando é emitido para ligar os dispositivos nooLite no canal zero. Este é um comando de teste e você pode comentá-lo ou substituí-lo por outro comando (por exemplo, ligações em outro canal ou desatamento).void setup() {
Serial.begin(9600);
Serial2.begin(9600);
Serial.println("*** Start sketch ***");
mrBind(0);
}
Antes de trabalhar com um esboço, é necessário executar algumas etapas preliminares, a saber, vincular seus sensores ao módulo da seguinte maneira:PT112 - canal zeroPT111 - canal umPM111 - canal doisPara isso, é necessário executar o esboço três vezes, alterando o comando de ligaçãomrBind(0);
mrBind(1);
mrBind(2);
e sempre que pressionar o botão no sensor correspondente. Isso precisa ser feito apenas uma vez, e o comando de ligação pode ser comentado. Ou, em vez disso, coloque o comando desatar e desate qualquer um dos sensores conectados.Na seção loop (), existe apenas uma função mrCheck (), responsável por “capturar” as mensagens do módulo MR1132 da interface serial Serial2.void mrCheck() {
if (Serial2.available() == 8) {
mrBuf[0] = Serial2.read();
mrBuf[1] = Serial2.read();
mrBuf[2] = Serial2.read();
mrBuf[3] = Serial2.read();
if (mrBuf[0] == 79 && mrBuf[1] == 75 && mrBuf[2] == 13 && mrBuf[3] == 10) {
Serial.println("OK");
} else {
mrBuf[4] = Serial2.read();
mrBuf[5] = Serial2.read();
mrBuf[6] = Serial2.read();
mrBuf[7] = Serial2.read();
mrNewData();
}
}
}
Esta função preenche a matriz mrBuf [8] com dados provenientes do módulo ou transmite para a mensagem serial "OK", emitida pelo módulo MR1132. Além disso, o conteúdo da matriz mrBuf [8] é analisado de acordo com o formato de dados dos comandos do sistema nooLite, e as funções de esboço correspondentes estão envolvidas nisso.A função mrNewData () extrai os dados principais da matriz mrBuf [8] e, dependendo do comando recebido, envia as informações necessárias para Serial (canal, comando, temperatura, umidade, status da bateria do sensor, etc.).void mrNewData() {
mrClearData();
mrPrintHeader();
mrSetBindState();
mrPrintBindState();
mrSetChannel();
mrPrintChannel();
mrSetCommand();
mrSetDatas();
switch (mrCommand) {
case 0:
Serial.print("PIR command: ");Serial.println("OFF");
break;
case 2:
Serial.print("PIR command: "); Serial.println("ON");
break;
case 21:
mrSetDeviceType();
mrPrintDeviceType();
if (mrDeviceType == 1) {
mrSetTemperature();
mrPrintTemperature();
}
if (mrDeviceType == 2) {
mrSetTemperature();
mrPrintTemperature();
mrSetHumidity();
mrPrintHumidity();
}
break;
default:
;
}
mrSetBatteryState();
}
As funções que contêm a palavra Imprimir em seu nome estão envolvidas na saída de informações para a interface serial para controle visual.As funções a seguir descriptografam os dados no array mrBuf [8], de acordo com o formato de dados dos comandos do sistema nooLite:mrSetTogl () - valor do contador de comandos recebidosmrSetBindState () - status do módulo (binding / norm)mrSetReceiveBit () - bit de recepção de controle novo comandomrSetChannel () - número do canalmrSetCommand () - comandomrSetFormat () - formato de dadosmrSetDeviceType () - tipo de sensormrSetDatas () - preenche quatro bytes de dadosmrSetTemperature ()- obtendo o valor da temperaturamrSetHumidity () - obtendo o valor da umidademrSetBrightness () - obtendo o valor datemperatura mrSetBatteryState () - status da bateria do sensorVocê pode ver os detalhes da implementação dessas funções no código completo do esboço anexado abaixo.Aqui está o esboço completo.Código de esboço completo// TX2 16
// RX2 17
// TX1 18
// RX1 19
// nooLite MR1132 data
byte mrBuf[8];
int mrTogl = -1;
int mrBindState = -1;
int mrReceiveBit = -1;
int mrChannel = -1;
int mrCommand = -1;
int mrFormat = -1;
int mrData0 = -1;
int mrData1 = -1;
int mrData2 = -1;
int mrData3 = -1;
int mrDeviceType = -1;
int mrBatteryState = -1;
int mrHumidity = -1;
int mrBrightness = -1;
float mrTemp = -1.0;
// nooLite MR1132 bind/unbind
void mrSerialChannel(byte ch) {
switch (ch) {
case 0: Serial.println («0»); break;
case 1: Serial.println («1»); break;
case 2: Serial.println («2»); break;
case 3: Serial.println («3»); break;
case 4: Serial.println («4»); break;
case 5: Serial.println («5»); break;
case 6: Serial.println («6»); break;
case 7: Serial.println («7»); break;
case 8: Serial.println («8»); break;
case 9: Serial.println («9»); break;
case 10: Serial.println(«10»); break;
case 11: Serial.println(«11»); break;
case 12: Serial.println(«12»); break;
case 13: Serial.println(«13»); break;
case 14: Serial.println(«14»); break;
case 15: Serial.println(«15»); break;
case 16: Serial.println(«16»); break;
case 17: Serial.println(«17»); break;
case 18: Serial.println(«18»); break;
case 19: Serial.println(«19»); break;
case 20: Serial.println(«20»); break;
case 21: Serial.println(«21»); break;
case 22: Serial.println(«22»); break;
case 23: Serial.println(«23»); break;
case 24: Serial.println(«24»); break;
case 25: Serial.println(«25»); break;
case 26: Serial.println(«26»); break;
case 27: Serial.println(«27»); break;
case 28: Serial.println(«28»); break;
case 29: Serial.println(«29»); break;
case 30: Serial.println(«30»); break;
case 31: Serial.println(«31»); break;
} // switch
} // mrSerialChannel( )
void mrSerial2Channel(byte ch) {
switch (ch) {
case 0: Serial2.print(«00»); break;
case 1: Serial2.print(«01»); break;
case 2: Serial2.print(«02»); break;
case 3: Serial2.print(«03»); break;
case 4: Serial2.print(«04»); break;
case 5: Serial2.print(«05»); break;
case 6: Serial2.print(«06»); break;
case 7: Serial2.print(«07»); break;
case 8: Serial2.print(«08»); break;
case 9: Serial2.print(«09»); break;
case 10: Serial2.print(«10»); break;
case 11: Serial2.print(«11»); break;
case 12: Serial2.print(«12»); break;
case 13: Serial2.print(«13»); break;
case 14: Serial2.print(«14»); break;
case 15: Serial2.print(«15»); break;
case 16: Serial2.print(«16»); break;
case 17: Serial2.print(«17»); break;
case 18: Serial2.print(«18»); break;
case 19: Serial2.print(«19»); break;
case 20: Serial2.print(«20»); break;
case 21: Serial2.print(«21»); break;
case 22: Serial2.print(«22»); break;
case 23: Serial2.print(«23»); break;
case 24: Serial2.print(«24»); break;
case 25: Serial2.print(«25»); break;
case 26: Serial2.print(«26»); break;
case 27: Serial2.print(«27»); break;
case 28: Serial2.print(«28»); break;
case 29: Serial2.print(«29»); break;
case 30: Serial2.print(«30»); break;
case 31: Serial2.print(«31»); break;
} // switch
} // mrSerial2Channel( )
void mrPrintBind(byte ch) {
Serial.print(«Bind on channel „);
mrSerialChannel(ch);
}
void mrBind(byte ch) {
mrPrintBind(ch);
Serial2.print(“bind_mode_cell_»);
mrSerial2Channel(ch);
Serial2.write(3); // End of Text — B00000011(BIN)
}
void mrPrintUnbind(byte ch) {
Serial.println(«Unbind on channel „);
mrSerialChannel(ch);
}
void mrUnbind(byte ch) {
mrPrintUnbind(ch);
Serial2.print(“clear_one_cell_»);
mrSerial2Channel(ch);
Serial2.write(3);
}
void mrBindStop() {
Serial.println(«Bind mode off»);
Serial2.print(«bind_mode_off»);
Serial2.write(3);
}
void mrClearAll() {
Serial.println(«Clear all cell»);
Serial2.print(«clear_all_cell»);
Serial2.write(3);
}
// nooLite MR1132 print works
void mrPrintHeader() {
Serial.println();
}
void mrPrintDeviceType() {
Serial.print(«Device: „);
if (mrDeviceType == 1) {
Serial.println(“PT112»);
}
if (mrDeviceType == 2) {
Serial.println(«PT111»);
}
}
void mrPrintBindState() {
if (mrBindState == 1) {
Serial.print(«Bind State: „);
Serial.println(“ON»);
}
}
void mrPrintBatteryState() {
if (mrBatteryState == 1) {
Serial.print(«Battery State: „);
Serial.println(“LOW!»);
}
}
void mrPrintChannel() {
Serial.print(«Channel: „);
Serial.println(mrChannel);
}
void mrPrintTemperature() {
Serial.print(“Temp: „);
Serial.println(mrTemp);
}
void mrPrintHumidity() {
Serial.print(“Humidity: „);
Serial.println(mrHumidity);
}
// nooLite MR1132 data works
void mrClearData() {
mrTogl = -1;
mrBindState = -1;
mrReceiveBit = -1;
mrChannel = -1;
mrCommand = -1;
mrFormat = -1;
mrData0 = -1;
mrData1 = -1;
mrData2 = -1;
mrData3 = -1;
mrDeviceType = -1;
mrBatteryState = -1;
mrHumidity = -1;
mrBrightness = -1;
mrTemp = -1.0;
}
void mrSetTogl() {
byte b0 = bitRead(mrBuf[0], 0);
byte b1 = bitRead(mrBuf[0], 1);
byte b2 = bitRead(mrBuf[0], 2);
byte b3 = bitRead(mrBuf[0], 3);
byte b4 = bitRead(mrBuf[0], 4);
byte b5 = bitRead(mrBuf[0], 5);
mrTogl = 32*b5 + 16*b4 + 8*b3 + 4*b2 + 2*b1 + b0;
}
void mrSetBindState() {
mrBindState = bitRead(mrBuf[0], 6);
}
void mrSetReceiveBit() {
mrReceiveBit = bitRead(mrBuf[0], 7);
}
void mrSetChannel() {
mrChannel = mrBuf[1];
}
void mrSetCommand() {
mrCommand = mrBuf[2];
}
void mrSetFormat() {
mrFormat = mrBuf[3];
}
void mrSetDeviceType() {
byte tp1 = bitRead(mrBuf[5], 4);
byte tp2 = bitRead(mrBuf[5], 5);
byte tp3 = bitRead(mrBuf[5], 6);
mrDeviceType = 4*tp3 + 2*tp2 + tp1;
}
void mrSetDatas() {
mrData0 = mrBuf[4];
mrData1 = mrBuf[5];
mrData2 = mrBuf[6];
mrData3 = mrBuf[7];
}
void mrSetTemperature() {
byte t8 = bitRead(mrData1, 0);
byte t9 = bitRead(mrData1, 1);
byte t10= bitRead(mrData1, 2);
int temp2 = 1024*t10 + 512*t9 + 256*t8;
int temp = mrData0 + temp2;
byte t11 = bitRead(mrData1, 3);
if (t11 == 1) {
temp = (4096 — temp) * -1;
}
mrTemp = (float)temp / 10.0;
}
void mrSetBatteryState() {
mrBatteryState = bitRead(mrBuf[5], 7);
}
void mrSetHumidity() {
mrHumidity = mrData2;
}
void mrSetBrightness() {
mrBrightness = mrData3;
}
void mrNewData() {
mrClearData();
mrPrintHeader();
mrSetBindState();
mrPrintBindState();
mrSetChannel();
mrPrintChannel();
mrSetCommand();
mrSetDatas();
switch (mrCommand) {
case 0:
Serial.print(“PIR command: „); Serial.println(“OFF»);
break;
case 2:
Serial.print(«PIR command: „); Serial.println(“ON»);
break;
case 21:
mrSetDeviceType();
mrPrintDeviceType();
if (mrDeviceType == 1) {
mrSetTemperature();
mrPrintTemperature();
}
if (mrDeviceType == 2) {
mrSetTemperature();
mrPrintTemperature();
mrSetHumidity();
mrPrintHumidity();
}
break;
default:
;
} // switch
mrSetBatteryState();
} // newData()
void mrCheck() {
if (Serial2.available() == 8) {
mrBuf[0] = Serial2.read();
mrBuf[1] = Serial2.read();
mrBuf[2] = Serial2.read();
mrBuf[3] = Serial2.read();
if (mrBuf[0] == 79 && mrBuf[1] == 75 && mrBuf[2] == 13 && mrBuf[3] == 10) {
Serial.println(«OK»);
} else {
mrBuf[4] = Serial2.read();
mrBuf[5] = Serial2.read();
mrBuf[6] = Serial2.read();
mrBuf[7] = Serial2.read();
mrNewData();
}
}
}
void setup() {
Serial.begin(9600);
Serial2.begin(9600);
Serial.println("*** Start sketch ***");
mrBind(0);
//mrUnbind(0);
}
void loop() {
mrCheck();
} // loop()
Conclusão
Na verdade, é tudo o que você precisa para começar a trabalhar com o módulo MR1132 e usá-lo em seus esboços e projetos. Este módulo também pode ser usado para controlar sinais de consoles de parede nooLite e seu sistema agora pode saber onde e qual console funcionou e qual comando foi enviado às unidades de energia.Em breve, uma nova versão 0.15 do popular sistema Arduino Mega Server será lançada e, nesta versão, haverá suporte integrado aos módulos MR1132 e gerenciamento conveniente diretamente da página da web e muito mais.