Após um pequeno intervalo de um ou dois anos, retomamos a análise do protocolo da nossa já veterana Estação Meteorológica Auriol! Não custa lembrar a nossos leitores que nosso método de trabalho envolvem um ou dois ciclos rápidos de desenvolvimento e quando há tempo, ocorre um terceiro ciclo longo de refinamento do projeto, No caso específico do projeto Arduino - Auriol no terceiro ciclo conseguimos aprimorar o algoritmo de extração dos dados de leitura e esta novidade será padronizada no restante do sketch. Vale registrar que entramos em 2016 com uma pequena Estação Meteorológica ESP2866 que roda um programa em Lua. Essa nova abordagem simplifica o hardware, o chip tem wifi próprio, porta serial, I2c etc. Mas não abandonaremos a filosofia das estações baseadas nos transmissores de 433MHz. A cooperação entre elas não está descartada em um próximo ciclo de desenvolvimento.
Vamos direto ao trecho de código que simplificou a forma como fazemos a leitura e decodificação das variáveis medidas pela estação, tais como velocidade do vento, direção do vento etc. O trecho em vermelho foi acrescentado ao sketch original. Abaixo temos o algoritmo original, contendo diversas translações e rotações de bits. Todo esse contorcionismo booleano foi substituido por operações elementares de leitura direta de bits do quadro transmitido pela estação. A recomposição da palavra binária é feita por meio de uma soma ponderada (o que faz a "rotação" sem a necessidade de usar a operação lógica >> ou <<. Essa mudança vai simplificar o código como um todo e facilitará a expansão para a leitura de novos sensores, pois há, agora, uma boa folga computacional para isso.
dec2binLong(myData1,28);
boolean Bit16=bitRead(myData1,25);
boolean Bit17=bitRead(myData1,26);
boolean Bit23=bitRead(myData1,23);
boolean Bit22=bitRead(myData1,22);
boolean Bit21=bitRead(myData1,21);
boolean WD=Bit16&&Bit17&&Bit23&&Bit22&&Bit21;
if (WD==true) {
Serial.print(" - Bateria=");
byte H = (myData1 >> 24) & 0x8; // Get Battery
Serial.print(H);
Serial.print(" Canal=");
H = (myData1 >> 25) & 0x3; // Get Channel
Serial.print(H);
Serial.print(" Direcao do Vento=");
byte Bit8=bitRead(myData1,12);
byte Bit7=bitRead(myData1,13);
byte Bit6=bitRead(myData1,14);
byte Bit5=bitRead(myData1,15);
byte Bit4=bitRead(myData1,16);
byte Bit3=bitRead(myData1,17);
byte Bit2=bitRead(myData1,18);
byte Bit1=bitRead(myData1,19);
byte Bit0=bitRead(myData1,20);
byte Angulo=Bit8*256+Bit7*128+Bit6*64+Bit5*32+Bit4*16+Bit3*8+Bit2*4+Bit1*2+Bit0;
Serial.print(Angulo);
Serial.println("°");
}
else {
//if ((myData1 >> 25) & 0x3 != true) {
Serial.print(" - Bateria=");
byte H = (myData1 >> 24) & 0x8; // Get Battery
Serial.print(H);
Serial.print(" Canal=");
H = (myData1 >> 25) & 0x3; // Get Channel
Serial.print(H);
Serial.print(" Temperatura=");
byte ML = (myData1 >> 16) & 0xF; // Get MMMM
ML=ML<<4;
H = (myData1 >> 12) & 0xF; // Get LLLL
H=H<<4;
// OR MMMM & LLLL nibbles together
//H = (myData1 >> 12) & 0xF; // Get HHHH
byte TL=(myData1>>20) & 0xF;
TL=TL<<4;
//int Temperature = (H << 8) | ML; // Combine HHHH MMMMLLLL
//Temperature = Temperature -900; // Remove Constant offset
byte TL0=(TL>>1) & 0x8;
byte TL1=(TL>>3) & 0x4;
byte TL2=(TL>>5) & 0x2;
byte TL3=(TL>>7) & 0x1;
byte TLL=TL0+TL1+TL2+TL3;
byte TM0=(ML>>7) & 0x1;
byte TM1=(ML>>5) & 0x2;
byte TM2=(ML>>3) & 0x4;
byte TM3=(ML>>1) & 0x8;
byte TM=TM0+TM1+TM2+TM3;
byte TH0=(H>>1) & 0x8;
byte TH1=(H>>3) & 0x4;
byte TH2=(H>>5) & 0x2;
byte TH3=(H>>7) & 0x1;
byte TH=TH0+TH1+TH2+TH3; //TMH0 e o sinal
int Temperature = TH*256+TM*16+TLL;
//Serial.print(TH);
//Serial.print(",");
//Serial.print(TM);
//Serial.print(",");
//Serial.print(TLL);
//Serial.print(",");
Serial.print(Temperature/10.0,1);