[Arduino]<아두이노 프로젝트> 자전거 공기압 알림 IoT 프로젝트 Bicycle Air Pressure Notification IoT Project




프로젝트 목표는 따릉이 자전거의 바퀴에 대한 공기압을

실시간으로 볼 수 있게 하는것입니다.


1. 부품

사용한 부품은 다음과 같습니다.
<사각형 압력센서>


공기압 측정을 타이어에 닿는 압력을 이용해 하기때문에

압력센서를 이용하였습니다.


타이어게 공기가 많으면 땅에 닿는 면적이 작고

타이어에 공기가 없으면 땅에 닿는면적이 크다는 원리를 이용하였습니다.



<Wemos R1 D1>


와이파이를 이용해 스마트폰으로 현재 상태를 확인하기때문에

와이파이 모듈이 있는 R1 D1 보드를 썼습니다.



<릴레이>


외부전원을 써서 LED를 동작시키기 때문에 릴레이를 이용하여

아두이노로 LED 제어하였습니다.



<LED>


타이어 공기압 상태를 쉽게 확인하도록 

LED를 이용하여 가이드를 세웠습니다.



그 외로는 아크릴과 자전거 거치대, 저항, 전원 어답터 가 있습니다.



2. 아두이노

아두이노와 연결은 다음과 같이 합니다.



아두이노 코드는 다음과 같습니다. 


빨간색 부분은 사용자에 맞게 고쳐야 됩니다.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;


void setup() {
pinMode(D10, OUTPUT);
pinMode(D11, OUTPUT);
pinMode(D12, OUTPUT);
    USE_SERIAL.begin(115200);  //시리얼 열기
   // USE_SERIAL.setDebugOutput(true);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {    //카운트다운
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    WiFi.mode(WIFI_STA);
    WiFiMulti.addAP("와이파이이름", "와이파이비번");   //와이파이 연결

}

void loop() {
    // wait for WiFi connection

     
        int temp = analogRead(A0);           // 압력 감지센서에더 데이터 받아오기
       
  
    if((WiFiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;


        USE_SERIAL.print("[HTTP] begin...\n");
        
        http.begin("http://서버 IP 입력/test1.php?d="+String(temp)); //서버로 압력센서값 전송

        USE_SERIAL.print("[HTTP] GET...\n");  //시리얼에 출력
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); //에러면 표시
        }

        http.end(); //끝
    }
if(temp>0&&temp<40){
    digitalWrite(D10, LOW);
    digitalWrite(D11, LOW);
    digitalWrite(D12, HIGH);
  }
  else if(temp>40&&temp<600){
    digitalWrite(D10, LOW);
    digitalWrite(D11, HIGH);
    digitalWrite(D12, LOW);
  }
  else if(temp>600){
    digitalWrite(D10, HIGH);
    digitalWrite(D11, LOW);
    digitalWrite(D12, LOW);
  }
    delay(1000);   //1초 주기로 반복
}


test1.php는 뒤에서 추가할 것입니다.


다음은 하드웨어 입니다.


아래 사진들은 위 회로처럼 선을 연결을 하고 선정리를 한 사진입니다.



LED및 가이드는 다음과 같이 만들었습니다.


위 사진처럼 아크릴 판 중간에 LED를 부착하였습니다.


그리고 직육면체로 아크릴을 붙여서 마무리했습니다. 


중간에 있는 부품은 릴레이 입니다.


아래 사진은 가이드를 거치대에 부착하고 전원을 인가한 사진입니다.



빨간색뿐만아니라 초록색, 파란색 등 여러 색깔의 불빛이 가능합니다.




2. 데이터 베이스

데이터 베이스는 Mysql을 사용하였습니다.


데이터베이스 및 서버 사용은 다른 게시물 참조하시길 바랍니다.


아래처럼 test 데이터베이스 안에 press1 이라는 테이블을 생성하였습니다. 



그리고 그 press1 테이블의 구조는 아래 그림과 같습니다.



3. PHP 파일

PHP 파일은 아두이노에서 데이터베이스로, 데이터베이스에서 스마트폰으로

센서값을 전송하기위해서 사용하는 파일입니다.


먼저 아두이노 데이터베이스로 센서값을 전송하기 위한 php파일입니다.


이름은 test1.php 입니다.


<?php

$mysql_hostname = '서버 IP';
$mysql_username = 'mysql ID';
$mysql_password = 'mysql 비번';
$mysql_database = 'test';
$mysql_port = '3306';
$mysql_charset = 'utf8';



$dsn = 'mysql:host='.$mysql_hostname.';dbname='.$mysql_database.';port='.$mysql_port.';charset='.$mysql_charset;

$temp = $_GET['d'];  //get 방식으로 센서값 받기

try
{
$connect = new PDO( $dsn, $mysql_username, $mysql_password );  //mysql 접속

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "INSERT INTO press1 (press,created) VALUES ('$temp',now())"; //press1 테이블 안에 센서 값 넣기

    
$connect->exec($sql);

    echo "New record created successfully";  //성공시 센서값하고 정상 메세지 출력

    echo "$temp";


}
catch ( PDOException $e )
{
echo 'Connect failed : ' . $e->getMessage() . '';  //실패시 오류 메세지 출력
return false;
}

//5. 연결 종료
//pdo 는 자동 종료 됨. 구지 하고 싶다면, null 값을 준다.
$connect = null;

?>



다음은 데이터베이스에서 스마트폰으로 센서값을 전송하기 위한 php 파일입니다.


이름은 test5.php입니다.

<?php

$mysql_hostname = '서버 IP';
$mysql_username = 'mysql ID';
$mysql_password = 'mysql 비번';
$mysql_database = 'test';
$mysql_port = '3306';
$mysql_charset = 'utf8';



$dsn = 'mysql:host='.$mysql_hostname.';dbname='.$mysql_database.';port='.$mysql_port.';charset='.$mysql_charset;   


try
{
$connect = new PDO( $dsn, $mysql_username, $mysql_password );  //데이터베이스와 연결

     $statement = $connect->query("select press from press1 order by id desc limit 1");  //press1테이블에서 press값 추출
while($record1 = $statement->fetch(PDO::FETCH_ASSOC)){  
//화면에 출력하기 위해 작업
  
foreach($record1 as $column){ 
$result1 .=$column; 
  }





}
catch ( PDOException $e )
{
echo 'Connect failed : ' . $e->getMessage() . '';  //실패시 에러메세지
return false;
}


$connect = null;

?>
<?php 
echo "press:";
echo 0+$result1; //화면에 압력값 출력
echo "psi";
echo "finish" ?>


4. 앱

앱은 앱 인벤터를 이용하여 만들었습니다.


프로젝트를 올릴 수 없어서 사진으로 올리겠습니다.


 이 블럭을 실행 시키려면 arduino.txt파일을 

스마트폰 저장공간 가장 바깥쪽에 넣어야 합니다.


arduino.txt 내용은 다음과 같습니다.


place1:1.&http://서버IP/test5.php





 5. 결과

이 모든 것들을 성공적으로 하면

다음과 같은 화면이 나옵니다.



아래 사진은 실제 따릉이를 이용하여 실험한 사진입니다.


거치가 안되어있을 때는 파란색 불이 들어옵니다.



바퀴에 바람이 부족하면 빨간색 불이 들어옵니다.



바퀴에 바람을 넣고 공기압이 적당하면 초록불이 들어옵니다.



지금까지 자전거 공기압 알림 프로젝트였습니다.

Comments