산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적

부품 및 소모품

부품 수량
아두이노 우노 1
PIR 모션 센서 (일반) 2
LED (일반) 1
점퍼 와이어 (일반) 1

앱 및 온라인 서비스

프로젝트 개요

소개

이 프로젝트는 아두이노로 쇼핑몰 출입 차량 수를 두 개의 센서로 세고, 프로세싱(Processing)과 PHP를 통해 클라우드로 데이터를 전송하며, 나중에 주차장 여유 공간 수를 확인하는 방법을 보여줍니다. 이더넷이나 와이파이 실드가 필요 없습니다!

작동 원리

센서는 주차장 입구와 출구에 설치합니다. 차가 들어오면 count를 증가시키고, 나가면 감소시킵니다. 시스템의 LED는 차량이 센서를 통과할 때마다 켜져서 정상 카운트됨을 표시합니다.

프로세싱 (Processing)

프로세싱은 다른 컴퓨터에서 프로그램을 작성하기 위한 오픈소스 언어/개발 도구입니다. 아두이노와 "대화"하게 하여 아두이노가 수집한 데이터를 표시하거나 저장할 때 유용합니다.

이 프로젝트에서는 프로세싱으로 아두이노가 시리얼 포트로 보낸 데이터(차량 수)를 수신합니다. 프로세싱 IDE를 다운로드해 설치하세요. 첨부된 프로세싱 스케치에는 loadStrings() 메서드로 PHP 파일을 호출하는 간단한 코드가 있습니다.

스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적

PHP

post-message.php 파일은 이 튜토리얼의 파일과 같습니다. 깃허브에서 zip을 다운로드 후 삼성 계정 로그인 없이 사용하도록 일부 코드를 수정했습니다. 작동하려면 WAMP/XAMPP 서버 포트 변경 및 ARTIK Cloud용 CA 인증서 설치 지침을 따르거나, SSL 인증서가 설치된 원격/호스팅 서버를 사용하세요.

파일을 acdemo 폴더에 복사해 https://localhost:8000/acdemo/post-message.php 또는 https://www.yourwebsite.com/acdemo/post-message.php로 접근 가능하게 하세요.

PHP SDK에서 수정할 파일은 ArtikCloudProxy.php와 post-message.php 두 개뿐입니다. 클라이언트 및 디바이스 ID는 여기서 확인하세요.

post-message.php에서 액세스 토큰과 디바이스 ID를 입력하세요. 토큰 발급은 여기 단계를 따르세요. 클라우드로 전송하는 데이터는 출입 차량 수(count)뿐입니다. 아틱 클라우드에 Car Counter 디바이스를 생성하고 count 필드를 만들었습니다.

스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적

아틱 클라우드 (Artik Cloud)

  1. 아틱 클라우드 로그인 → Applications > New Application
  2. 애플리케이션 세부 정보 입력
  3. 생성된 애플리케이션 클릭 → Show Client ID & Secret으로 코드 확인 (PHP 파일에 필요)
  4. 사이드 메뉴에서 애플리케이션 선택 → Permissions → Car Counter 추가, Read & Write 권한 체크

스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적 스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적 스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적

코딩 및 실행

  1. 아두이노 스케치 업로드 (처음이면 가이드 참조)
  2. 프로세싱 IDE에서 프로세싱 스케치 실행 (WAMP 서버가 켜져 있어야 함)
  3. 연결도대로 부품 연결 후 PIR 센서 앞을 지나 테스트
  4. 아틱 클라우드 로그인해 데이터 전송 확인

스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적

문제 해결

  1. 아래 링크로 아틱 클라우드 데이터 전송 확인. JSON 파일이 보여야 정상. 안 보이면 SSL 인증서 설치 확인.

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

다음 단계

차량 수 데이터를 바탕으로 쇼핑몰 앱을 만들어 방문객이 출발 전 주차 여유 공간을 확인하게 할 수 있습니다. 주차 만차 시 켜지는 표시등 추가도 가능합니다.

코드

아두이노 코드

시리얼로 차량 수 출력, 차량 통과 시 LED 점등으로 표시.

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() {
  long now = millis();
  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);
  }
}

프로세싱 스케치 (Java)

시리얼 포트로 들어오는 값을 읽어 PHP로 전송.

import processing.serial.*;

Serial myPort;
String val;

void setup() {
  String portName = Serial.list()[0]; // 윈도우면 COM1, 맥/리눅스면 0,1,2... 조정
  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)

프로세싱이 GET으로 넘긴 값을 받아 클라우드에 POST.

<?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)

아틱 클라우드 연결용 프록시 클래스. post-message.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_LAST = "/messages/last?sdids=&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(ArtikCloudProxy::API_URL . ArtikCloudProxy::API_USERS_SELF);
  }

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

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

회로도

2개의 PIR 센서와 LED 연결도

스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적 스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적

제조공정

  1. 아두이노 메가에서 푸시 버튼으로 PWM을 이용해 LED 밝기 제어하기
  2. 아두이노로 초음파 부양 장치 만들기: 단계별 가이드
  3. 스마트 IoT 자 제작: ESP8266, 아두이노 & 초음파 센서로 실시간 모니터링
  4. 아두이노 아이언맨 제작: 부품, 센서, 단계별 가이드
  5. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'
  6. 아두이노로 지구 질량 측정하기: 단계별 DIY 가이드
  7. 아두이노 릴레이 제어 가습기 자동화 – 고전압 안전 설계
  8. 아두이노 소나 & 프로세싱으로 실시간 거리 측정 및 시각화
  9. 발렌타인데이 선물: DIY 교제일수 카운터 만들기
  10. 아두이노와 프로세싱으로 실시간 디지털 나침반 만들기