Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Contador Inteligente de Vagas: Rastreamento de Veículos em Tempo Real com Arduino, Processing e PHP

Componentes e Materiais

Componente Quantidade
Arduino UNO 1
Sensor PIR de Movimento 2
LED (genérico) 1
Jumpers (genéricos) 1

Aplicativos e Serviços Online

Sobre o Projeto

Introdução

Este projeto demonstra como usar Arduino para contar carros que entram e saem de um estacionamento usando dois sensores, enviar os dados para a nuvem via Processing e PHP, e visualizar o número de vagas disponíveis. Não é necessário shield Ethernet ou WiFi!

Como Funciona

Os sensores devem ser colocados na entrada e saída do estacionamento. Basicamente, incrementa-se o contador a cada carro que entra e decrementa quando sai. O LED indica que o veículo foi contado corretamente, acendendo a cada passagem.

Processing

Processing é uma linguagem/ferramenta open-source para escrever programas em outros computadores. Útil quando você quer que esses computadores "conversem" com um Arduino, por exemplo, para exibir ou salvar dados coletados.

Neste projeto, usamos Processing para receber os dados (contagem de carros) enviados pelo Arduino via porta serial. Baixe e instale a Processing IDE. No sketch anexo, há código simples que chama o arquivo PHP usando o método loadStrings().

PHP

O arquivo post-message.php é baseado no tutorial do Samsung ARTIK Cloud. Baixamos o ZIP do GitHub e editamos algumas linhas para usar sem login na conta Samsung. Para funcionar, siga as instruções sobre mudança de porta do servidor WAMP/XAMP e instalação do certificado CA para ARTIK Cloud. Alternativamente, use servidor remoto/hospedado com SSL instalado.

Copie os arquivos para uma pasta (ex: acdemo) acessível via https://localhost:8000/acdemo/post-message.php ou https://www.seusite.com/acdemo/post-message.php.

Dois arquivos do SDK PHP precisam de edição: ArtikCloudProxy.php e post-message.php. Você pode ver seu Client ID e Device ID no painel.

No post-message.php, insira seu access token e device ID. A forma mais fácil de obter o token é seguir os passos da documentação. Enviamos apenas o número de carros que entram/saem. Criamos um device no Artik Cloud chamado Car Counter com campo count.

Artik Cloud

  1. Faça login no Artik Cloud → Applications → New Application
  2. Preencha os detalhes necessários
  3. Após criar, clique no nome da aplicação → Show Client ID & Secret (necessários para os arquivos PHP)
  4. No menu lateral, selecione a aplicação → Permissions. Adicione Car Counter e marque Read & Write

Codificação

  1. Faça upload do sketch para o Arduino UNO
  2. Execute o sketch Processing na Processing IDE. Certifique-se que o servidor WAMP está ligado se usando computador local
  3. Se a montagem estiver correta, passe diante do sensor PIR para testar
  4. Faça login no Artik Cloud para verificar se os dados estão sendo enviados

Solução de Problemas

Teste se os dados estão sendo enviados corretamente:

https://localhost:8000/acdemo/post-message.php?count=10

Se não retornar JSON, verifique a instalação do certificado SSL.

Próximos Passos

Com base nos dados de contagem, você pode criar um app para shoppers visualizarem vagas disponíveis antes de ir ao shopping. Também pode adicionar indicador luminoso que acende quando o estacionamento está cheio.

Código

Código Arduino

int pirPinIN = 7;
int pirPinOUT = 10;
int led = 13;
static long counter = 0;

void setup() {
  pinMode(pirPinIN, INPUT);
  pinMode(pirPinOUT, INPUT);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(pirPinIN) == HIGH) {
    counter++;
    Serial.println(counter);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
  }
  if (digitalRead(pirPinOUT) == HIGH) {
    counter--;
    Serial.println(counter);
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
  }
}

Sketch Processing

import processing.serial.*;

Serial myPort;
String val;

void setup() {
  String portName = Serial.list()[0]; // ajuste o índice conforme sua porta
  myPort = new Serial(this, portName, 9600);
}

void draw() {
  if (myPort.available() > 0) {
    val = myPort.readStringUntil('\n');
    int count = parseInt(val);
    if (count >= 0) {
      loadStrings("https://localhost:8000/acdemo/post-message.php?count=" + val);
    }
  }
  println(val);
}

post-message.php

<?php
$count = filter_input(INPUT_GET, 'count', FILTER_SANITIZE_NUMBER_INT);
require('ArtikCloudProxy.php');
$proxy = new ArtikCloudProxy();
$proxy->setAccessToken("SEU_ACCESS_TOKEN");
$data = '{"count":' . $count . '}';
$payload = array("data"=>$data, "sdid"=>"SEU_DEVICE_ID", "type"=>"message");
$payload = json_encode($payload, JSON_HEX_QUOT | JSON_HEX_TAG);
$response = $proxy->sendMessage($payload);
header('Content-Type: application/json');
echo json_encode($response);
?>

ArtikCloudProxy.php

<?php
class ArtikCloudProxy {
  const CLIENT_ID = "SEU_CLIENT_ID";
  const DEVICE_ID = "SEU_DEVICE_ID";
  const API_URL = "https://api.artik.cloud/v1.1";
  const API_USERS_SELF = "/users/self";
  const API_MESSAGES_LAST = "/messages/last?sdids=<DEVICES>&count=<COUNT>";
  const API_MESSAGES_POST = "/messages";

  public $token = null;
  public $user = null;

  public function __construct(){ }

  public function setAccessToken($someToken){
    $this->token = $someToken;
    $this->user = $this->getUsersSelf();
  }

  public function getCall($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPGET, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization:bearer '.$this->token));
    $json = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if($status == 200){ $response = json_decode($json); }
    else{ var_dump($json); $response = $json; }
    return $response;
  }

  public function postCall($url, $payload){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, (String) $payload);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: bearer '.$this->token));
    $json = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if($status == 200){ $response = json_decode($json); }
    else{ var_dump($json); $response = $json; }
    return $response;
  }

  public function getUsersSelf(){
    return $this->getCall(API_URL . API_USERS_SELF);
  }

  public function sendMessage($payload){
    return $this->postCall(API_URL . API_MESSAGES_POST, $payload);
  }

  public function getMessagesLast($deviceCommaSeparatedList, $countByDevice){
    $apiPath = API_MESSAGES_LAST;
    $apiPath = str_replace("<DEVICES>", $deviceCommaSeparatedList, $apiPath);
    $apiPath = str_replace("<COUNT>", $countByDevice, $apiPath);
    return $this->getCall(API_URL.$apiPath);
  }
}
?>

Esquemáticos

Diagrama para conectar os 2 sensores PIR e o LED:

Contador Inteligente de Vagas: Rastreamento de Veículos em Tempo Real com Arduino, Processing e PHP

Contador Inteligente de Vagas: Rastreamento de Veículos em Tempo Real com Arduino, Processing e PHP

Processo de manufatura

  1. Controle de Brilho de LED com PWM via Botão no Arduino Mega
  2. Construa um Dispositivo de Levitação Ultrassônica com Arduino – Guia Passo a Passo
  3. Construa um Pote Inteligente IoT com ESP8266, Arduino e Sensor Ultrassônico – Monitoramento em Tempo Real
  4. Construa um Homem de Ferro com Arduino: Componentes, Sensores e Guia Passo a Passo
  5. Find Me: Localizador Inteligente de Objetos com Arduino e Bluetooth
  6. Medir a Massa da Terra com Arduino: Guia DIY Passo a Passo
  7. Controlador de Umidificador DIY com Arduino e Relé – Configuração Segura de Alta Tensão
  8. Medição de Distância em Tempo Real com Sonar Arduino e Visualização no Processing
  9. Presente de Dia dos Namorados: Contador DIY de Dias Juntos
  10. Construa uma Bússola Digital em Tempo Real com Arduino e Processing