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.
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
php -q /var/www/html/server.php
*Lembrando que a parte “/var/www/html" indica o caminho do seu servidor PHP.
Abrindo a página "temperatura.php" no navegador podermos acompanhar as medições
enviadas pelo equipamento:
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:
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.
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.
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