A transmissão de dados digitais através de um módulo RF é bastante comum. Os módulos RF 434 são capazes de transmitir dados de 4 bits junto com o byte de endereço. Os circuitos que usam módulos RF para transmissão de dados digitais são simples e usam ICs codificador HT12E e decodificador HT12D para conversão de dados paralelo para serial e serial para paralelo, respectivamente. Em situações da vida real, a fonte dos dados digitais são apenas os computadores, microcomputadores ou CIs digitais. O mundo real não é o digital, é analógico. Tipo, a maioria dos sensores são, na verdade, sensores analógicos e são capazes de transmitir os dados analógicos para o formato digital apenas quando um microcomputador os processa do formato analógico para o digital.
Os microcontroladores Arduino mais comumente usados em projetos de hardware também são capazes de ler dados analógicos e representá-los em formato digital. A digitalização de dados analógicos para um formato digital pode ser realizada usando a biblioteca virtualWire de código aberto do Arduino. Os dados analógicos lidos podem ser enviados em série para um transmissor de RF a partir de qualquer pino de entrada/saída digital.
Este projeto demonstra a leitura dos dados analógicos do sensor LDR por uma placa Arduino e sua transmissão para outra placa Arduino que exibe os dados de forma digitalizada em uma tela LCD.
Componentes necessários
Sr. Não | Componentes necessários | Quantidade |
---|---|---|
1 | Módulo RF Rx (434 MHz) | 1 |
2 | Módulo RF Tx (434Mhz) | 1 |
3 | LDR | 1 |
4 | LCD | 1 |
5 | Pote de 1k | 1 |
6 | Resistor de 10k | 1 |
7 | Placa de desenvolvimento Arduino pro mini | 2 |
8 | Bateria – 9V | 2 |
9 | Tábua de Pão | 2 |
10 | Conectando fios |
Figura 1: Diagrama de blocos do transmissor de dados RF analógico baseado em Arduino
Conexões de Circuito
No lado do display, os dados transmitidos serialmente são buscados por um receptor RF. O pino 2 do receptor está conectado ao pino 11 da segunda placa Arduino. Um LCD é conectado à placa Arduino para exibir a leitura do sensor recebido. O display LCD 16X2 é conectado à placa Arduino conectando seus pinos de dados aos pinos 7 a 4 da placa Arduino. Os pinos RS e E do LCD estão conectados aos pinos 3 e 2 do Arduino ProMini, respectivamente. O pino RW do LCD está aterrado.
Fig. 2: Tabela listando conexões de circuito entre Arduino Uno e Character LCD
A biblioteca de códigos padrão para interface do Arduino UNO e Arduino Pro Mini é usada no projeto para programar o LCD com a placa.
Fig. 3: Protótipo do lado do receptor do transmissor de dados RF analógico baseado em Arduino
Como funciona o circuito
O sensor LDR funciona segundo o princípio da fotocondutividade. Sua resistência é reduzida quando a luz incide sobre ele, pois a resistividade do sensor é reduzida na exposição à luz. O sensor LDR está conectado na configuração pull-up. A tensão é reduzida primeiro pelo LDR e depois pela junção de saída e pelo resistor pull-up. Quando a luz incide sobre o LDR, sua resistência é reduzida e, portanto, a queda de tensão pelo resistor pull-up no pino de dados analógico é maior. Embora quando o LDR é coberto para restringir sua exposição à luz, o valor da resistência aumenta, de modo que a queda de tensão pelo resistor pull-up no pino de dados analógicos é reduzida. A leitura analógica é realizada no pino A2 do Arduino Pro Mini. Isso pode ser feito em qualquer pino de A0 a A7 do Arduino Pro Mini.
Os dados analógicos lidos são armazenados digitalmente em uma variável no código do programa que é convertida para uma forma decimal digitalizada usando a lógica do programa. A leitura digitalizada sai em série do pino 12 da placa Arduino do lado do transmissor para o transmissor RF.
A leitura digitalizada é detectada pelo receptor RF e sai em série do pino 2 do receptor ao pino 11 da placa Arduino do lado do receptor. A leitura é exibida em uma tela LCD usando as funções da biblioteca padrão lcd.h no código do programa. A execução principal do projeto é orientada a software, portanto o código do programa é aquele que precisa ser cuidadosamente compreendido.
Fig. 4: Protótipo do lado do transmissor do transmissor de dados RF analógico baseado em Arduino
Guia de programação
No lado do transmissor, a placa Arduino deve ler a leitura analógica na forma de queda de tensão no pino de interface do sensor. Para o mesmo, a biblioteca VirtualWire é importada.
#include
Um LED foi conectado ao pino 13 para uma indicação visual da transmissão de dados. Uma variável “ledPin” é declarada e atribuída ao pino 13. O sensor LDR está conectado no pino A2, então uma variável “Sensor1Pin” é declarada e mapeada para o pino A2 do Arduino. Uma variável “Sensor1Data” é declarada para buscar leitura analógica digitalmente e o array “Sensor1CharMsg” é criado para representação decimal precisa de 3 dígitos da leitura.
//LEDs
const int ledPin = 13;
//Sensores
const int Sensor1Pin = A2;
int Sensor1Dados;
Uma função setup é chamada, dentro da qual o pino com interface do LED é definido como saída digital e o pino com interface do sensor é definido para o modo de entrada usando a função pinMode . A taxa de transmissão do Arduino é definida para 9.600 bits por segundo usando a função Serial.begin. A taxa de transmissão para saída serial é definida para 2.000 bits por segundo usando a função vw_setup da biblioteca VirtualWire.
Uma função de loop é chamada onde os dados analógicos do pino A2 são lidos usando a função analogRead e atribuídos à variável Sensor1Data. O valor Seria1Data é convertido para representação em formato decimal e armazenado no array Sensor1CharMsg usando itoa função de conversão de número inteiro para caractere.
loop vazio
As leituras armazenadas na variável e no array são armazenadas em buffer serialmente usando a função Serial.print .
O pino com interface do LED é definido como HIGH para acender o LED como indicação de transmissão de dados. A leitura armazenada no array Sensor1Char é convertida em caracteres não assinados até que todos os quatro elementos do array sejam convertidos para o formato unsigned char. Os caracteres são enviados em série usando a função vw_send e a função vw_wait_tx é usada para continuar a transmissão até que todos os dados (todos os quatro caracteres) sejam retirados em série do buffer. O LED está apagado como indicação de que a transmissão de dados foi concluída.
No lado do receptor, novamente a biblioteca VirtualWire é importada para leitura de dados analógicos.
Uma variável ledPin é atribuída ao pino 13 onde o LED indicador de recepção de dados está conectado. Uma variável Sensor1Data é declarada para ler a leitura dos dados como inteiro e o array Sensor1CharMsg é criado para mapear a forma decimal da leitura dos dados.
Uma função de configuração é chamada, onde a taxa de transmissão do Arduino do lado do receptor é definida para 9600 bits por segundo usando a função Serial.begin . O pino conectado ao LED está definido como saída digital.
O módulo transmissor e receptor de RF não possui pino Push To Talk. Eles ficam inativos quando nenhum dado está presente para transmitir ou receber, respectivamente. Portanto, vw_set_ptt_inverted(true) é usado para configurar a polaridade push to talk e solicitar que o receptor continue recebendo dados após buscar o primeiro caractere. A taxa de transmissão para entrada serial é definida para 2.000 bits por segundo usando a função vw_setup . A recepção dos dados é iniciada através da função vw_rx_start .
Uma função de loop é chamada onde os dados no buffer do microcontrolador são lidos e exibidos na tela LCD. Um array “buf” é declarado do tipo unsigned char para buscar bytes de char recebidos e a variável “buflen” é declarada para armazenar o comprimento dos dados do buffer recebidos.
O buffer de caracteres recebido é lido usando a função vw_get_message e um contador “i” é inicializado. O pino de interface do LED é definido como HIGH para indicar que os dados foram recebidos e o buffer de caracteres recebidos é convertido em tipo de dados de caracteres e armazenado na matriz Sensor1Msg.
O último caractere da matriz é definido como caractere Nulo para que, se o buffer de leitura tiver menos de quatro dígitos, ele não exiba um valor lixo na tela LCD. Os elementos do array Sensor1Msg são convertidos em números inteiros e armazenados no array Sensor1Data. Os inteiros da matriz Sensor1Data são exibidos no LCD usando a função Serial.print e o pino com interface do LED é definido como LOW para desligar o LED como uma indicação visual de que os dados foram lidos e exibidos com sucesso. A leitura analógica foi lida no projeto como a leitura de tensão no pino analógico do Arduino Pro Mini.
A leitura do sensor não foi calibrada para mostrar qualquer quantidade física real, como intensidade de luz ou luminosidade, no caso de sensor baseado em luz. No entanto, a leitura real de uma grandeza física pode ser exibida através do projeto, julgando a calibração do sensor em relação à grandeza física sob medição. A lógica para converter a leitura de tensão na medição da grandeza física sob observação pode ser incorporada na lógica do programa com base na calibração do sensor.
Código-fonte do projeto
###
#include// LED's const int ledPin = 13; // Sensors const int Sensor1Pin = A2; int Sensor1Data; char Sensor1CharMsg(4); void setup { // PinModes // LED pinMode(ledPin,OUTPUT); // Sensor(s) pinMode(Sensor1Pin,INPUT); // for debugging Serial.begin(9600); // VirtualWire setup vw_setup(2000); // Bits per sec }// Read and store Sensor 1 data Sensor1Data = analogRead(Sensor1Pin); // Convert integer data to Char array directly itoa(Sensor1Data,Sensor1CharMsg,10);// DEBUG Serial.print("Sensor1 Integer: "); Serial.print(Sensor1Data); Serial.print(" Sensor1 CharMsg: "); Serial.print(Sensor1CharMsg); Serial.println(" "); delay(1000); // END DEBUGdigitalWrite(13, true); // Turn on a light to show transmitting vw_send((uint8_t *)Sensor1CharMsg, strlen(Sensor1CharMsg)); vw_wait_tx ; // Wait until the whole message is gone digitalWrite(13, false); // Turn off a light after transmission delay(200); } // END void loop... #include// LED's int ledPin = 13; // Sensors int Sensor1Data; // RF Transmission container char Sensor1CharMsg(4);void setup { Serial.begin(9600); // sets the digital pin as output pinMode(ledPin, OUTPUT); // VirtualWire // Initialise the IO and ISR // Required for DR3100 vw_set_ptt_inverted(true); // Bits per sec vw_setup(2000);// Start the receiver PLL running vw_rx_start ; } // END void setupvoid loop { uint8_t buf(VW_MAX_MESSAGE_LEN); uint8_t buflen = VW_MAX_MESSAGE_LEN; // Non-blocking if (vw_get_message(buf, &buflen)){ int i; // Turn on a light to show received good message digitalWrite(13, true); // Message with a good checksum received, dump it. for (i = 0; i < buflen; i++){ // Fill Sensor1CharMsg Char array with corresponding // chars from buffer. Sensor1CharMsg(i) = char(buf(i)); }// Null terminate the char array // This needs to be done otherwise problems will occur // when the incoming messages has less digits than the // one before. Sensor1CharMsg(buflen) = ''; // Convert Sensor1CharMsg Char array to integer Sensor1Data = atoi(Sensor1CharMsg);// DEBUG Serial.print("Sensor 1: "); Serial.println(Sensor1Data); // END DEBUG // Turn off light to and await next message digitalWrite(13, false); } }
###
Diagramas de circuito
Diagrama de Circuito-Transmissor de Dados RF Analógico Baseado em Arduino | ![]() |
Vídeo do projeto