IoT - Sensor de Temperatura
Autor: Atividade Tecnológica | Publicado: 2016-02-14T17:01:00-08:00


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 &nbsp;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”


pre.CICodeFormatter{
 font-family:arial;
 font-size:12px;
 border:1px dashed #CCCCCC;
 width:99%;
 height:auto;
 overflow:auto;
 background:#f0f0f0;
 line-height:20px;
 background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);
 padding:0px;
 color:#000000;
 text-align:left;
}
pre.CICodeFormatter code{
 color:#000000;
 word-wrap:normal;
}



 &lt;?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,"&lt;meta HTTP-EQUIV='Refresh' CONTENT='5;URL=temperatura.php'&gt;&lt;font face=arial size=5&gt;  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);  
 }  
 ?&gt;  



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


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






<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
 o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
 stroked="f">
 
 
  
  
  
  
  
  
  
  
  
  
  
  
 
 
 
<v:shape id="Imagem_x0020_4" o:spid="_x0000_i1031" type="#_x0000_t75"
 style='width:392.25pt;height:83.25pt;visibility:visible;mso-wrap-style:square'>
 <v:imagedata src="file:///C:\Users\Everton\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png"
  o:title=""/>
<![endif]--><!--[if !vml]--><!--[endif]-->



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



Abrindo a página "temperatura.php" no navegador podermos acompanhar as medições&nbsp;
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");  &nbsp;
É responsável pela conexão ao servidor 192.168.0.41 porta 22000, devemos alterar de acordo com as configurações do seu servidor.


pre.CICodeFormatter{
 font-family:arial;
 font-size:12px;
 border:1px dashed #CCCCCC;
 width:99%;
 height:auto;
 overflow:auto;
 background:#f0f0f0;
 line-height:20px;
 background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);
 padding:0px;
 color:#000000;
 text-align:left;
}
pre.CICodeFormatter code{
 color:#000000;
 word-wrap:normal;
}



 #include &lt;16F877A.h&gt;  
 #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&lt;10)  
   {  
   valor = read_adc ();  
   delay_ms(40);     
   valor1 = valor1 + valor;  
   contador=contador+1;  
   }  
   valor = valor1/10;  
     
   //printf(" %2.1f-&gt;" ,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.&nbsp;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







<!--[if gte vml 1]><v:shape
 id="Imagem_x0020_14" o:spid="_x0000_i1025" type="#_x0000_t75" style='width:425.25pt;
 height:192pt;visibility:visible;mso-wrap-style:square'>
 <v:imagedata src="file:///C:\Users\Everton\AppData\Local\Temp\msohtmlclip1\01\clip_image012.png"
  o:title=""/>
<![endif]--><!--[if !vml]--><!--[endif]-->