PHP + IoT – Dos LEDs aos gerenciadores inteligentes

,

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?

exemplo-de-modelo-de-comunicacao

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:

pir_sensor_bb

Agora vamos testar pra ver se tudo está funcionando. Se tudo funcionar de primeira, desconfie, afinal, somos programadores =P

response

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:

botoes
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'>&laquo;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.

 

2 respostas para “PHP + IoT – Dos LEDs aos gerenciadores inteligentes”

  1. Avatar de Ronaldo Mohr
    Ronaldo Mohr

    Ficou simples o codigo, fácil.
    Parabéns….

  2. Avatar de Alisson Silva
    Alisson Silva

    Cara pra que nunca teve contato com o Arduíno, achei super simples o seu code, além disso o PHP é uma linguagem web mais fodastíca do mundo! 🙂

    No aguardo do próximo post da série!

Obrigado por enviar o seu comentário minha jóia!