O QUE PRETENDEMOS COM ESSE ARTIGO?
Nessa série de artigos, vamos ver como trabalhar com IoT fazendo o PHP e Arduíno trabalharem juntos, desde aplicações simples, até um sistema de monitoramento para data center. Vamos abordar conceitos como POO, Segurança, Modelos de requisição e muito mais.
PHP + IoT, what?
Ao longo dos anos a internet evoluiu de simples páginas estáticas até chegar ao que temos hoje com estruturas complexas e ricas para melhorar a experiência do usuário.
A Internet das Coisas (IoT) é um assunto que tem sido abordado nos últimos anos sobre a interação de hardwares como recursos na internet, compreendendo aplicações que vão desde pequenos projetos experimentais até grandes projetos corporativos passando também por dispositivos domésticos.
Tá tudo isso é bacana, mas onde é que entra o PHP nisso tudo?
Ah, é aí que a coisa começa a ficar interessante. Esses dispositivos, por si só, são ótimas ferramentas de monitoramento e também de controle, porém precisam de algum intermediário para tornar essa experiência de uso mais agradável ao usuário.
E o mais legal disso tudo é que os modelos de arquitetura são bastante flexíveis, e se adicionarmos a versatilidade de uma linguagem como PHP é possível fazer coisas fascinantes.
Beleza, isso eu já entendi. Esse papo de teoria eu já li na Wikipedia, quero mesmo é saber como isso funciona (se é que funciona).
Ok, vamos lá.
Um dos modelos mais comuns propõe utilizar um Arduíno como servidor web e deixar o PHP fazer o trabalho de controlar, organizar e armazenar esses dados, caso seja necessário. Vamos ver como isso funciona?
O exemplo acima esboça como será estruturado nosso modelo.
O que vamos precisar para esse artigo?
- 1 Arduíno Uno
- 1 Ethernet shield W5100
- Um sensor de presença Pir Hc-sr501
- Um sensor de umidade/temperatura DHT22
Criando o monitor com Arduíno
Imagino que você já esteja familiarizado com o Arduíno e saiba pelo menos fazer upload de um sketch. Caso não saiba, dê uma lida aqui.
O código que vamos utilizar para esse exemplo é muito simples e consiste em construir e gerenciar um monitor de temperatura. Obter dados de versão e valores dos sensores para exibir no navegador.
Então o código Arduíno vai ser assim:
// importando bibliotecas #include <DHT.h> #include <SPI.h> #include <Ethernet.h> // definindo variaveis #define DHTPIN 2 #define DHTTYPE DHT11 #define MAX_CMD_LENGTH 25 DHT dht(DHTPIN, DHTTYPE); // configurando placa de rede byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; byte ip[] = {10, 0, 0, 9}; char buffer [128]; int portaPresenca=3; EthernetServer server(9966); #define REQ_BUF_SZ 100 #define IP_BUF_SZ 18 char HTTP_req[REQ_BUF_SZ] = {0}; char req_index = 0; void setup() { dht.begin(); pinMode(portaPresenca,INPUT); Ethernet.begin(mac, ip); Serial.begin(9600); if (!SD.begin(4)) { return; } } void loop() { Serial.begin(9600); EthernetClient client = server.available(); // try to get client if (client) { // got client? boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // save HTTP request character req_index++; } else if (c == '\n' && currentLineIsBlank) { client.println(F("HTTP/1.1 200 OK\nAccess-Control-Allow-Origin: *\nContent-Type: application/json\nConnnection: close\n")); if (startsWith(HTTP_req, "GET / ") || startsWith(HTTP_req, "GET /index.html")) { client.println(F("[{\"version\":\"0.1.1\"},{\"published\":\"2016-12-14\"},{\"status\":\"operational\"}]")); } else if (startsWith(HTTP_req, "/temperatura")) { float t = dht.readTemperature(); client.println(t); } else if (startsWith(HTTP_req, "umidade")) { float h = dht.readHumidity(); client.println(h); } else if (startsWith(HTTP_req, "presenca")) { client.println(digitalRead(portaPresenca)); } req_index = 0; StrClear(HTTP_req, REQ_BUF_SZ); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(1); client.stop(); } } bool startsWith(const char *str, const char *pre) { size_t lenpre = strlen(pre), lenstr = strlen(str); return lenstr < lenpre ? false : strncmp(pre, str, lenpre) == 0; } void StrClear(char *str, char length) { for (int i = 0; i < length; i++) { str[i] = 0; } }
Uau, isso é sensacional, mas não faço nem ideia do que está escrito aí =( E agora o que eu faço?
Calma, pra quem não é familiarizado com o Arduíno não se preocupe, em outros artigos vamos entender como tudo isso funciona, agora basta saber que ele vai criar uma micro API com os seguintes métodos.
- ObterVersao – Obtém a versão do servidor Arduíno
- ObterTemperatura – Retorna o valor em ºC
- ObterPresenca – Retorna true caso o sensor reconheça presença
- ObterUmidade – Retorna o valor da umidade em %
** IMPORTANTE ** Altere o Ip do código para um IP correspondente na sua rede.
Em seguida, faça o upload e ligue o sensor no seu Arduíno conforme o esquema abaixo:
Agora vamos testar pra ver se tudo está funcionando. Se tudo funcionar de primeira, desconfie, afinal, somos programadores =P
Uhuuuuuuuu \o/ agora é só dominar o mundo.
Calma, ainda não. Precisamos de alguém que facilite o uso dessa API, não é mesmo? Afinal, quem é que vai lembrar da URL toda vez que precisar manipular nosso dispositivo?
E é aí que o PHP dá seu show. Como o PHP é extremamente fácil de manusear e é uma linguagem que nasceu pra internet, fazer requisições http com ele é moleza. Vamos lá?
ESCREVENDO O GERENCIADOR PHP
A primeira coisa que precisamos fazer, é criar nossa interface de controle. Então, vamos criar 4 botões, um para cada funcionalidade respectivamente.
Para isso, crie um arquivo chamado de index.php e adicione esse código.
<html> <head> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <!-- Optional theme --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> </head> <body> <div class='container'> <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title">Acionar controle remoto</h3> </div> <div class="panel-body"> <a class='btn btn-success' href="request.php?action=1">Obter versão</a> <a class='btn btn-success' href="request.php?action=2">Obter Umidade</a> <a class='btn btn-warning' href="request.php?action=3">Status Sensor de Presença</a> <a class='btn btn-info' href="request.php?action=4">Obter Temperatura</a> </div> </div> </div> </body> </html>
Código HTML básico com bootstrap para deixar mais bonito. No navegador teremos algo similiar à isso:
Agora vamos fazê-los funcionar 😉
Para fazer requisições HTTP em PHP, um dos modos mais fáceis é utilizando a função get_contents(), que atende bem na maioria dos casos.
Futuramente veremos maneiras mais eficientes de fazer isso, mas para manter as coisas simples, ela vai resolver nosso problema.
<?php $action = filter_input(INPUT_GET, 'action', FILTER_VALIDATE_INT); $homepage = [ 1 => 'http://192.168.0.44/', 2 => 'http://192.168.0.44/umidade', 3 => 'http://192.168.0.44/presenca', 4 => 'http://192.168.0.44/temperatura', ]; echo get_contents($homepage[$action]); echo "<a href='index.php'>«Voltar</a>";
O código acima, faz chamadas ao servidor do arduino de acordo com o botão que foi acionado. Não se desespere com a segurança, vamos corrigir isso nos próximos artigos. Nosso objetivo até aqui foi mostrar como essa comunicação é feita e como tirar proveito da facilidade do PHP para se conectar com seu Arduíno via internet.
AO INFINITO E ALÉM
Os próximos passos que veremos nos artigos subsequentes, vão abranger os outros modelos de comunicação, utilizar PHP orientado a objetos, segurança nas requisições e mais explicações sobre o funcionamento do Arduíno e como publicar o servidor na internet.
Deixe uma resposta para Alisson SilvaCancelar resposta