domingo, 14 de fevereiro de 2016

IoT - Sensor de Temperatura

IoT - Sensor de Temperatura

Tornar uma informação disponível a todo momento (monitoramento contínuo), é um dos conceitos proveniente da Internet das Coisas (IoT), um dos temas mais comentados do atual mercado de tecnologia. A internet das coisas torna possível fazer o monitoramento de todo o tipo de situação, através de dados captados por sensores e microchips sem a direta participação de humanos em processos rotineiros, gerando economia e aumento de produtividade quando se trata de rotinas produtivas.

Neste projeto, vamos elaborar um equipamento que deverá coletar a temperatura através do Sensor LM35 e enviar por wifi a um servidor.

Servidor Socket PHP

Primeiramente vamos criar um Servidor Socket  em PHP, para que possamos conectar nosso equipamento e enviar os valores de temperatura.
Para tal devemos ter um servidor Linux + PHP e criar o arquivo abaixo “server.php”

 <?php  
    
 $host = "0.0.0.0";  
 $port = 22000;  
 set_time_limit(0);  
    
 while(1)  
 {  
    
 $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Não foi possível criar o servidor socket.\n");  
 $result = socket_bind($socket, $host, $port) or die("Não foi possível criar o servidor socket.\n");  
 $result = socket_listen($socket, 3) or die("Não foi possível listar a porta selecionada.\n");  
    
 $spawn = socket_accept($socket) or die("Não foi possível estabelecer a conexão socket.\n");  
    
 while(1)  
 {  
  $input = socket_read($spawn, 1024);  
  $input = trim($input);  
  echo $input;  
    
  //Exemplo String Temperatura = [26.7]  
  if ( (substr($input, -1) == "]") and (substr($input, -6,1) == "[") )  
  {  
  date_default_timezone_set('America/Sao_Paulo');  
  $date = date('H:i:s d-m-Y');  
    
  $fp = fopen("temperatura.php", "w+");  
  $escreve = fwrite($fp,"<meta HTTP-EQUIV='Refresh' CONTENT='5;URL=temperatura.php'><font face=arial size=5>  Temperatura: ".substr($input, -5,4)."C - ".$date);  
  fclose($fp);  
  }  
  else  
  {  
  $output = $input;  
  if (socket_write($spawn, $output, strlen ($output)) == false) break;  
  }  
 }  
    
 socket_close($spawn);  
 socket_close($socket);  
 sleep(1);  
 }  
 ?>  

Para inicializar o Servidor Socket digite:
php -q /var/www/html/server.php

*Lembrando que a parte “/var/www/html" indica o caminho do seu servidor PHP.


Este script “server.php” sempre que receber uma nova medição do sensor, criará automaticamente um outro arquivo, chamado temperatura.php 

Abrindo a página "temperatura.php" no navegador podermos acompanhar as medições 
enviadas pelo equipamento:

A pagina possui uma atualização automática de 5 segundos.
A string enviado pelo equipamento, para ser validado pelo servidor, deverá possuir a máscara [00.0]. Ou seja, quando o equipamento medir 25.4 graus, deverá enviar [25.4]

Podemos verificar o funcionamento do servidor e abrir a página no navegador, utilizando um Terminal:



MicroControlador

O escolhido para esta aplicação foi o PIC16F877A, não por necessidade de hardware ou algo específico, e sim porque é o que tinha disponível para teste ;) e vou utilizar um velho kit que tenho (NEO201) que possui vários acessórios incluindo LM35.

Os periféricos necessários para este projeto serão USART e um canal AD, conforme esquema abaixo:

O código fonte para a aplicação segue abaixo (desenvolvido em CCS)

A linha que contém:
printf("AT+SKCT=0,0,192.168.0.41,22000\n");   
É responsável pela conexão ao servidor 192.168.0.41 porta 22000, devemos alterar de acordo com as configurações do seu servidor.

 #include <16F877A.h>  
 #device adc=10  
   
 #FUSES NOWDT          //No Watch Dog Timer  
 #FUSES HS            //High speed Osc   
 #FUSES PUT           //Power Up Timer  
 #FUSES NOPROTECT        //Code not protected from reading  
 #FUSES NODEBUG         //No Debug mode for ICD  
 #FUSES NOBROWNOUT        //No brownout reset  
 #FUSES NOLVP          //No low voltage   
 #FUSES NOCPD          //No EE protection  
 #FUSES NOWRT          //Program memory not write protected  
   
 #use delay(clock=20000000)  
 #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)  
    
 void main()  
 {  
  float valor,valor1;  
  int contador;  
    
  port_b_pullups(TRUE);  
  setup_psp(PSP_DISABLED);  
  setup_spi(SPI_SS_DISABLED);  
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);  
  setup_timer_1(T1_DISABLED);  
  setup_timer_2(T2_DISABLED,0,1);  
  setup_comparator(NC_NC_NC_NC);  
  setup_vref(FALSE);  
     
  set_tris_a(0x01);   
  setup_adc(adc_clock_div_32);   
  setup_adc_ports(AN0);   
  set_adc_channel(0);  
     
  set_tris_d(0xfe);  
  output_d(0);  
    
  printf("Equipamento OK, aguardando conexão.\n");  
  //Aguarda WIFI estabilizar (20s)  
  delay_ms(20000);  
    
  printf("AT+WJOIN\n");   
  //Aguarda WIFI se conectar ao AP (5s)  
  delay_ms(5000);   
   
  printf("AT+SKCT=0,0,192.168.0.41,22000\n");   
  //Aguarda WIFI se conectar ao servidor socket (5s)  
  delay_ms(5000);   
    
    
  while(1)  
  {  
   //Recebe leitura AD do sensor e envia para porta serial ~1 segundo por   
   //amostragem (devido ao tempo do pisca 500ms ON, 500ms OFF)  
   //Pisca PORTD,0 para indicar funcionamento do equipamento  
     
   output_low(pin_d0);  
   delay_ms(500);  
   output_high(pin_d0);  
     
   valor=0;  
   valor1=0;  
   contador=0;  
     
   //Efetua 10 leituras AD para evitar oscilações, e temporiza 10x40ms (400ms)   
   while (contador<10)  
   {  
   valor = read_adc ();  
   delay_ms(40);     
   valor1 = valor1 + valor;  
   contador=contador+1;  
   }  
   valor = valor1/10;  
     
   //printf(" %2.1f->" ,valor);   
   valor1=5 * valor * 100/1024;    
     
   printf("AT+SKSND=1,6\n");  
   delay_ms(100);  
   printf("[%2.1f]" ,valor1);     
  }  
 }  

Módulo WIFI

E por fim, vamos configurar nosso módulo WIFI !!!
O Módulo WIFI que utilizei neste projeto é o modelo TLG10UA03 (Manual)








Este módulo pode ser facilmente configurado com uso de um software (download) proprietário ou pelo terminal através de comandos AT.




* Para conectar ao módulo deve-se utilizar um conversor TTL/SERIAL.

Selecione a Porta de conexão (COM1 no meu caso), depois clique em SET e selecione a velocidade 9600. Clique em Search e o módulo deverá ser encontrado.

Configure na aba da direita o SSID (AP) que irá utilizar para conectar o módulo na internet, senha de segurança e IP caso deseje utilizar modo estático.

A configuração de IP e Porta SOCKET do servidor não é necessário configurar, uma vez que o próprio microcontrolador informa em seu código o servidor que está se conectando.

Estes módulos possuem também interface web para configuração.
Podem ser adquiridos no AliExpress, eBay, ... pelo preço de 40 a 60 reais (paguei bem mais barato, mas o Dolar...)
Lembrando que podemos utilizar qualquer módulo wifi, mais uma vez utilizei este por possuir peças para teste.



Bom, é isso pessoal. Espero que o material ajude no aprendizado! Abraços. Tom.


Vídeo do Projeto em execução