Medidor de temperatura sem fio

Autor: Leonardo Sehn Alves

Licença de textos, imagens e esquema dos circuitos: Creative Commons Sharealike

Licença do software: GPL 3.0

Objetivos: A Estação Meteorológica tem entre seus objetivos um monitoramento de variáveis climáticas, podendo resultar em diversa aplicações a partir disso. Mais informações aqui: http://cta.if.ufrgs.br/projects/estacao-meteorologica-modular. Esses protótipos iniciais buscam uma familiarização e utilização efetiva de conceitos que serão imprescindíveis nas versões finais. O primeiro protótipo usava apenas um medidor de temperatura com um mostrador dinâmico. Agora, esta segunda versão já faz uso da transmissão sem fio de um dado climático que é a temperatura.

Esse protótipo é constituído por dois módulos, um sensor-transmissor, que mede a temperatura e envia a informação por radiofrequências, e um mostrador-receptor, que recebe essa informação por radiofrequências e mostra no LCD.

Sensor

Esse módulo consiste simplesmente em um Arduino recebendo informação de um termístor sobre a tensão que passa no transistor e que guarda dependência com a temperatura, o programa então realiza a conversão para temperatura e envia para o Serial do Arduino, que envia a informação para o Serial do XBee, nosso módulo transmissor de radiofrequências. Segue o circuito e o programa do sensor-transmissor.

Circuito

Imagem do Circuito do Sensor-Transmissor

Programa

 1 //Medidor Temperatura Wireless
 2 
 3 #include <SoftwareSerial.h> // inicializa biblioteca de comunicaçao Serial
 4 
 5 SoftwareSerial mySerial(2,3); // define as portas Seriais do XBee como pinos 2 e 3
 6 
 7 float entrada=0;
 8 float t=0;
 9 byte sensor=A5; // define pino analogico como sendo o sensor
10 byte ledpin=13;
11 
12 void setup()
13 {
14   Serial.begin(9600); // inicializa Serial do Arduino com taxa 9600 bauds
15   mySerial.begin(9600); // inicializa Serial do XBee com mesma taxa
16   pinMode(ledpin,OUTPUT); //debugging led
17 }
18 
19 void loop()
20 {
21   digitalWrite(ledpin,HIGH);
22   delay(700);
23   entrada=analogRead(sensor); // atribui a uma variavel a leitura de tensao na porta analogica 5
24   t=entrada*0.488758553; // realiza conversao para temperatura de acordo com precisao do Arduino e do XBee
25   Serial.println(t); // manda para o Serial informaçao da temperatura
26   if (mySerial.available()) {
27     Serial.print((char)mySerial.read()); // manda informaçao do Serial do XBee para o do Arduino
28   }
29   if (Serial.available()) {
30     mySerial.print((char)Serial.read()); // e vice-versa
31   }
32   digitalWrite(ledpin,LOW);
33   delay(700);
34 }

XBee

Para configurar o XBee de forma a obter uma comunicação com o outro módulo, é necessário primeiramente baixar o firmware com o programa X-CTU. A partir de então, existem várias maneiras de se programar os XBees e estabelecer uma comunicação entre eles, bem como vários guias na internet nesse sentido, o importante é tentar se apropriar dos conceitos e não se ater a uma fórmula pronta.
Explicando sucintamente, no meu caso (estou usando o XBee series 2, então só garanto funcionar para ele) baixei o firmware usando XBee explorer, você vai precisar configurar a porta USB como uma das COM's se estiver usando linux, digite o comando:
ln -s /dev/ttyUSB(número da porta USB que aparece para você) ~/.wine/dosdevices/com(número desejado para usar no X-CTU)
Então vá na aba modem configuration e escolha o modem XB-24ZB, então selecione a função Zigbee Router AT e a versão mais alta disponível (os número são hexadecimais, e estou usando a versão 228C). Então selecione Write. Pronto, você já baixou o firmware, agora basta programá-lo para se comunicar com o outro XBee. É possível fazê-lo pelo próprio X-CTU, escolha um PANID (que é um número identificador da rede que seus XBees estarão compartilhando) entre 0 e FFFF, então procure em endereçamento e digite o Serial Number High (que é compartilhado por todos XBees e igual a 0013A200), e por fim digite o Serial Number Low do outro XBee com o qual este pretende estabelecer comunicação (é possível encontrar esse número escrito no verso do XBee abaixo do Serial Number High). Agora é só selecionar Write novamente (concordo que ficou redundante) e seu XBee estará apto a "conversar" com o outro assim que ele também estiver programado, retomarei a configuração do outro XBee depois de apresentar o módulo mostrador-receptor como um todo.

Mostrador

Esse modulo consiste em um Arduino ligado a um LCD e um XBee, que recebe a informação do sensor via radiofrequência. O módulo então armazena o array de informação em uma variável e a imprime tanto no Serial do Arduino quanto no LCD, informando quase instantaneamente a temperatura medida no outro módulo. O circuito e o programa estão dispostos abaixo.

Circuito

Programa

 1 //Mostrador de Temperatura Wireless
 2 
 3 #include <LiquidCrystal.h> // inicializa biblioteca lcd
 4 
 5 LiquidCrystal lcd(12, 11, 7, 6, 5, 4); // define os pinos do lcd
 6 
 7 #include <SoftwareSerial.h>
 8 
 9 SoftwareSerial zbSerial(2,3); // define o Serial do XBee nas portas 2 e 3
10 
11 #define arraySize 8 // tamanho do array de informacao recebido
12 char inData1[arraySize]; // define array
13 int index1 = 0; // contador no array
14 char inChar1; // caracteres do array
15 
16 void setup()
17 {
18   Serial.begin(9600);
19   zbSerial.begin(9600); // inicia Serial do XBee com mesma taxa
20   lcd.begin(16, 2); // inicia todos cursores
21   lcd.print("A temperatura do CTA eh"); // imprime frase na tela
22 
23 }
24 
25 void loop()
26 {
27   if (zbSerial.available()) { // se receber algo no Serial do XBee
28     index1=0;
29     while(zbSerial.available() && index1 < arraySize-1) // varre enquanto ha caracteres disponiveis
30     {
31       delay(50); // tempo de atraso para processar informacao
32     inChar1 = zbSerial.read(); // le cada caracter
33     inData1[index1] = inChar1; // adiciona no array
34     index1++;
35     inData1[index1] = '\0'; // Adiciona um zero no final
36     }
37     Serial.print(inData1); // imprime variavel no Serial do Arduino
38     lcd.setCursor(0, 1); // define cursor da primeira coluna, segunda linha
39     for(int c=0;c<5;c++) // para os cinco primeiros caracteres
40      {
41        lcd.setCursor(c,1); // define cursor correspondente
42        lcd.print(inData1[c]); // e imprime
43      }
44     lcd.setCursor(5,1); // define o cursor subsequente
45     lcd.print((char)223); // imprime o simbolo de grau
46     lcd.print("C"); // Celsius
47   }
48   index1=0;
49 
50 }

XBee

Retomando a configuração para o XBee do módulo receptor, devemos também fazer o download do firmware usando o X-CTU. Primeiro selecione a porta (se estiver usando linux siga a descrição de configuração de porta USB contida no módulo sensor), então vá na aba modem configuration e escolha o modem XB-24ZB, então selecione a função Zigbee Coordinator AT e a versão mais alta disponível (os número são hexadecimais, e estou usando a versão 208C). Então selecione Write. Pronto, você já baixou o firmware, agora basta programá-lo para se comunicar com o outro XBee. É possível fazê-lo pelo próprio X-CTU, escolha o mesmo PANID (pois é o número identificador da rede que seus XBees estarão compartilhando) estabelecido no outro módulo, então procure em endereçamento e digite o Serial Number High (que é compartilhado por todos XBees e igual a 0013A200), e por fim digite o Serial Number Low do outro XBee (e que está escrito no verso do XBee abaixo do Serial Number High). Agora é só selecionar Write novamente (e novamente redundante!) e seus XBees estarão, agora sim, aptos a "conversar" um com o outro.

Mais informações para o funcionamento do projeto

É necessário, para que o projeto tenha sucesso, que os dois XBees se comuniquem devidamente. Na realidade, não irei indicar passo a passo como fazê-lo, pois existem diversas maneiras de se fazer isso. Entretanto as orientações acima em conjunto com alguma pesquisa na rede já devem ser suficientes.

Outro ponto que talvez seja digno de nota, como é o Serial do Arduino que está reagindo a e promovendo ações no sensor, então deixamos a chave do Shield no sentido do UART nesse módulo, e como é o XBee o encarregado no módulo mostrador, então deixamos a chave do Shield no sentido do DLINE nesse módulo.

Fiquem em paz e voltamos em breve!

sensor_wireless_temp1_bb.png - Imagem do Circuito do Sensor-Transmissor (4.3 MB) Leonardo Sehn, 20/02/2013 16:33

sensor_wireless_temp1_bb.redimensionado.png - Imagem do Circuito do Sensor-Transmissor (124.8 kB) Leonardo Sehn, 26/02/2013 13:33