Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)

Компоненты и материалы

Программное обеспечение и сервисы

Описание проекта

Введение

Проект демонстрирует подсчет машин на парковке с помощью двух PIR-датчиков на входе и выходе. Arduino отправляет счетчик на ПК через Serial. Приложение на Processing читает данные и через PHP-скрипт передает их в облако. Не требуется Ethernet/WiFi-шилд — используется USB-соединение с компьютером.

Принцип работы

Датчики устанавливаются на въезде и выезде. При проезде машины счетчик инкрементируется (въезд) или декрементируется (выезд). Светодиод мигает при каждом срабатывании, подтверждая учет.

Processing (ПК)

Processing — открытый инструмент для взаимодействия ПК с Arduino. Скетч Processing открывает Serial-порт, читает значение счетчика и вызывает PHP-скрипт функцией loadStrings() для отправки в облако.

Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)

PHP (Сервер)

PHP-скрипт post-message.php принимает параметр count от Processing и POST-запросом отправляет в ARTIK Cloud (или другой бэкенд). Требуется веб-сервер (WAMP/XAMPP или хостинг) с SSL. Необходимо отредактировать ArtikCloudProxy.php и post-message.php, вставив свои CLIENT_ID, DEVICE_ID, ACCESS_TOKEN.

Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)

Настройка ARTIK Cloud (исторически)

  1. Создать приложение в ARTIK Cloud, получить Client ID / Secret.
  2. Добавить тип устройства "Car Counter" с полем count (integer).
  3. Выдать права Read/Write приложению.

Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP) Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP) Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)

Запуск

  1. Загрузить скетч в Arduino UNO.
  2. Запустить WAMP/XAMPP (если локально) и скетч Processing.
  3. Проверить срабатывание PIR-датчиков (светодиод должен мигать).
  4. Проверить приход данных в облако (дашборд ARTIK / ThingSpeak).

Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)

Устранение неполадок

Проверьте PHP-скрипт напрямую в браузере: https://localhost:8000/acdemo/post-message.php?count=10. Должен вернуть JSON. Если нет — проблема в SSL-сертификате или настройках сервера.

Дальнейшее развитие

На основе данных о заполненности можно сделать приложение для покупателей: свободные места до приезда в ТЦ. Добавить индикатор "Парковка заполнена".

Код

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);
  }
}

Processing Sketch

import processing.serial.*;
Serial myPort;
String val;

void setup() {
  String portName = Serial.list()[0]; // на Windows обычно COM1, COM3 и т.д.
  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("YOUR_ACCESS_TOKEN");
$data = '{"count":' . $count . '}';
$payload = array("data"=>$data, "sdid"=>"YOUR_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 = "YOUR_CLIENT_ID";
  const DEVICE_ID = "YOUR_DEVICE_ID";
  const API_URL = "https://api.artik.cloud/v1.1";
  const API_USERS_SELF = "/users/self";
  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) return json_decode($json);
    else { var_dump($json); return $json; }
  }
  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) return json_decode($json);
    else { var_dump($json); return $json; }
  }
  public function getUsersSelf(){ return $this->getCall(self::API_URL . self::API_USERS_SELF); }
  public function sendMessage($payload){ return $this->postCall(self::API_URL . self::API_MESSAGES_POST, $payload); }
  public function getMessagesLast($devices, $count){
    $apiPath = str_replace("<DEVICES>", $devices, self::API_MESSAGES_LAST);
    $apiPath = str_replace("<COUNT>", $count, $apiPath);
    return $this->getCall(self::API_URL.$apiPath);
  }
}
?>

Схемы подключения

Подключение 2 PIR-датчиков и светодиода к Arduino UNO:

Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP) Умный счетчик парковки: Отслеживание машин в реальном времени (Arduino, Processing, PHP)

Производственный процесс

  1. Управление яркостью LED с ШИМ через кнопку на Arduino Mega
  2. Создание ультразвукового левитатора на Arduino: пошаговое руководство
  3. Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
  4. Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
  5. Find Me: Умный поисковик вещей на Arduino и Bluetooth
  6. Измерение массы Земли с Arduino: пошаговое руководство по DIY
  7. DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
  8. Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
  9. Подарок на День святого Валентина: Счетчик дней вместе своими руками
  10. Цифровой компас в реальном времени на Arduino и Processing