메이커 Maker

음주 측정 킥보드 개발 완료 보고서

지구빵집 2022. 1. 13. 09:12
반응형

 

 

음주 측정 킥보드 개발 완료 보고서 

 

음주 측정 킥보드 개요

 

전동 킥보드 음주 운전 전동 킥보드 산업이 국내에서 인기를 끌며 해마다 전동 킥보드를 이용하는 사람이 늘고 있다. 이에 따라 전동 킥보드로 인한 사고 또한 늘고 있는 추세이다. 어드벤쳐 디자인1 4조는 전동 킥보드 사고율 증가의 원인을 찾아보았고 주변 사례에 주목한 결과, 전동 킥보드 음주운전이 사고율 증가의 주요 인자로 작용하고 있음을 파악하였다.

 

 

1조) 의료 폐기물 수거 로봇

2조) 자기야 선물~ 디자인 인테리어 무드등

3조) 미니약국

동상 - 4조) 음주 측정 후 운행하는 킥보드

5조) 스마트 만능 스탠드

6조) 분실 방지 선반

은상 - 7조) 마음까지 따뜻해지는 난로

8조) 흡연 감지 카메라

9조) 스마트 세탁기

대상 - 10조) 감염병 예방 음성인식 자판기

금상 - 11조) 환자 치료를 돕는 AI 링거 걸이

동상 - 12조) 방충망 청소 로봇

동상 - 13조) 인체 감지 세이프 헬멧

 

 

도로교통공단 교통사고분석시스템(TAAS)에 따르면 2017년 10건이었던 개인형 이동수단(PM) 음주 사고는 2020년 108건으로 약 98% 증가한 수치를 보이고 있다. 이에 정부에서는 개인형 이동수단(PM)의 음주 운전에 대한 법률을 강화하는 등 이를 막기 위한 노력을 하고 있지만, 사고의 원초적 예방을 위해서는 음주 후 운전을 막아야 한다는 생각으로 음주 측정 킥보드를 개발하게 되었다.  

 

가해운전자 차종 및 음주정도별 교통사고 ( 도로교통공단 TAAS)

 

음주 측정 킥보드 “음주 측정 킥보드”는 주변에서 흔히 볼 수 있는 대여형 전동 킥보드에 음주 측정 장치를 달아 음주 운전의 사전 예방을 통해 전동 킥보드 음주 운전으로 인한 사고율 감소를 기대할 수 있는 제품이다. 사용자가 전동 킥보드를 이용하기 위해서 제품에 부착되어 있는 감지부에 숨을 불어넣게 되면, 센서가 체내 알코올 농도를 측정하여 사용자의 이용 가능 여부를 파악한다. 이용이 가능한 경우, 바퀴에 부착된 잠금장치가 열리게 되고, 이용이 불가능한 경우에는 잠금장치가 열리지 않게 된다.

 

음주 측정 키보드는 상단부와 하단부로 구성된다. 상단부는 사용자의 음주 유무를 판단하기 위한 감지부( MQ3알코올 센서, 온습도 센서 )와 제품의 상태를 사용자에게 전달하는 led,피에조 부저 , 하단부와의 통신을 위한 블루투스 모듈로 구성되어 있다. 하단부는 킥보드 사용을 차단하기 위한 서보모터와 상단부와의 통신을 위한 블루투스 모듈로 이루어져 있다. 이에 대한 외관 이미지 및 기능 설명을 아래에 나타내었다.

 

구성 외관 이미지와 기능
상단부 - 사용자의 이용 가능 여부를 측정 및 판단 후 부저 및 LED로 알려주는 상단부
하단부 - 상단부에서 얻은 센서값을 통해 바퀴를 제어할 수 있는 하단부

 

기본적으로 센서 입력부, 통신부, 구동 출력부로 구분할 수 있다. 물리적인 위치로 구분하면 상단부, 하단부로 구분이 할 수 있다. 상단부와 하단부의 통신은 블루투스로 이루어져 상단부에서 판단한 사용자의 음주 유무로 하단부 차단장치의 lock on, lock off를 결정한다. 

 

음주 측정 킥보드 전체 구성

 

음주 측정 킥보드의 구성 , 상단부와 하단부

 

 

구성품 테스트 코드 정리할 것

 

 

 

 

상단부 코드

 

#include <SoftwareSerial.h>
#include <DHT.h>
#define DHTPIN A1 // 온습도 핀번호
#define DHTTYPE DHT11 // 센서 모델명

int HM10TX = 3;
int HM10RX = 4;
int mq3Pin = A5;    // MQ-3 센서핀을 아두이노 보드의 A5 핀으로 설정
int redPin = 6;     // LED 센서의 R 핀을 아두이노 보드의 7번 핀으로 설정 
int greenPin = 7;   // LED ㅓ센서의 R 핀을 아두이노 보드의 6번 핀으로 설정
int bluePin = 5;    // LED 센서의 R 핀을 아두이노 보드의 5번 핀으로 설정
int alchhol_judge = 123; //알코올 판단 전역변수
int speaker = 12; //피에조 부저의 핀을 아두이노 12번 핀으로 설정
int note2[] = {2093,2349,2637,2793,3136,3520,3951,4186}; //피에조 부저의 음계 리스트,알코올 검사 통과일 경우_추후에 리스트 안 내용 변경필요
int note1[] = {3136,3136,3136,3136,3136,3136,3136,3136}; //피에조 부저의 음계 리스트,알코올 검사 불통일 경우_추후에 리스트 안 내용 변경필요
int note = 2093;
//번튼
int sw = 10;       // 스위치(SW) 핀 설정
int state = 0;      // 제품 상태 (  1 사용시작 0 사용종료 )
int reading;          // SW 상태
int previous = 0;   // SW 이전 상태

long time = 0;        // LED가 ON/OFF 토글된 마지막 시간
long debounce = 100;  // Debounce 타임 설정
//버튼
unsigned long switchtime = 0;
unsigned long counttime = 0;
//온습도
DHT dht(DHTPIN, DHTTYPE);
//온습도
int alcohol(void);
void DisplayAndSpk(void);
void control_HM10_AT(void);
void bluetooth_t(void);
void button(void);
float Humidity(void);
float Tem(void);


SoftwareSerial HM10(HM10TX, HM10RX); // 소프트웨어 시리얼 (TX,RX),블루투스 이름 HM10으로 SET

void setup(){
  Serial.begin(9600);          // 아두이노 보드와 PC간의 통신속도 설정  
  HM10.begin(9600); //자신의 모델에 맞는 속도값으로 조정
  pinMode(redPin,OUTPUT);       // LED의 R,G,B 핀을 출력으로 설정
  pinMode(greenPin,OUTPUT);
  pinMode(bluePin,OUTPUT);
//
  pinMode(sw, INPUT_PULLUP); // SW 를 설정, 아두이노 풀업저항 사용
//

}

void loop(){
  while(1){
    float H = Humidity();
    Serial.print("h: ");   // MQ-3 센서 출력값을 시리얼 모니터로 출력
    Serial.println(H);   // MQ-3 센서 출력값을 시리얼 모니터로 출력
    delay(50);
    while(1){
      button();
      alcohol();
      if (state == 1){ //사용시작, 측정시작
        analogWrite(redPin,0);     // 초록색 LED가 켜짐
        analogWrite(greenPin,255);
        analogWrite(bluePin,0);
        float Rhumidity =  Humidity();
        float Rtem = Tem();
        float deltaHumidity = Rhumidity - H;
        if (alchhol_judge == 0){ // 음주상태인 경우 
          DisplayAndSpk();
          state = 0; //버튼 전역변수 초기화, 초기상태로 돌아감
          break; 
        }
        else if (alchhol_judge == 1){ 
          unsigned long counttime = (millis() - time)/1000;
          if (deltaHumidity >= 10){
            DisplayAndSpk();
            bluetooth_t();
            while(state == 1){
              analogWrite(redPin,0);    
              analogWrite(greenPin,0);
              analogWrite(bluePin,255); // 파랑핀
              button();
            } 
          }
          else if (counttime >= 10){
            state = 0;
            break;
          }
        }
      }
      else{
        Serial.println("사용종료상태");
        analogWrite(redPin,0);    
        analogWrite(greenPin,0);
        analogWrite(bluePin,0);
        break;
      }
    }
    break;
  } 
}

int alcohol(void){
  int alcoholVal = analogRead(mq3Pin); 
  if (alcoholVal>= 300){ // 이후에 혈중알콜 농도에 일대일 대응하는 값으로 수정
    alchhol_judge = 0;
  }
  else{
    alchhol_judge = 1;
  } 
}

void DisplayAndSpk(void){ //혈중알코올농도가 0.03퍼센트에 일대일대응되는 값으로 변경
  
    if( alchhol_judge == 0){                  
      analogWrite(redPin,255);     // 빨간색 LED가 켜짐
      analogWrite(greenPin,0);
      analogWrite(bluePin,0);
      int elementCount = sizeof(note1) / sizeof(note1[0]);
      for (int i=0; i < elementCount; i++){    //피에조 부저 플레이
        tone(speaker,note1[i],500); //tone 함수 (핀번호,진동수,지속시간)
        delay(250); // 일단 부품오면 알아보기 뭔지모르겟당
      }
      delay(100);
     }
        
    else if(alchhol_judge == 1){          
      analogWrite(redPin,0);
      analogWrite(greenPin,0);
      analogWrite(bluePin,255);     // 파란색 LED가 켜짐
      int elementCount = sizeof(note2) / sizeof(note2[0]);
      for (int i=0; i < elementCount; i++){    //피에조 부저 플레이
        tone(speaker,note2[i],500); //tone 함수 (핀번호,진동수,지속시간)
        delay(250); // 일단 부품오면 알아보기 뭔지모르겟당
      }
      delay(100);
    }
}

void bluetooth_t(void){
  if (alchhol_judge == 0){
    Serial.println(0);
    HM10.write('0');
    }
  else if(alchhol_judge == 1){
    Serial.println(1);
    HM10.write('1');
    }
  alchhol_judge = 123; // 전역변수 초기화
}

void button(void){

    reading = digitalRead(sw);  // SW 상태 읽음
 
  //SW 가 눌려졌고 스위치 토글 눌림 경과시간이 Debounce 시간보다 크면 실행
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == 1){    // 제품이 사용시작(1)이면 사용종료(0) 로 바꿔준다.
      HM10.write('0'); //차단기 닫힘,사용종료
      state = 0;
    }
    else{              // 제품이 사용종료(0)이면 사용시작(1) 로 바꿔준다.
      state = 1;
      
    }
    time = millis();
  }
  
  previous = reading;
  
}

float Humidity(void){

    float h = dht.readHumidity();

    return h;
}

float Tem(void){

    float t = dht.readTemperature();
   
    return t;
}

 

하단부 코드

 

#include <SoftwareSerial.h>
#include <Servo.h>

Servo servo;
int pos = 0;
void bluetooth_r(void);
SoftwareSerial HM10(5, 6); // 소프트웨어 시리얼 (TX,RX)

void setup() {
servo.attach(3);
Serial.begin(9600);            // 통신속도 9600으로 설정
HM10.begin(9600);
servo.write(8);
}

void loop() {
bluetooth_r();
}

void bluetooth_r(void){
if (HM10.available())
{
char str = HM10.read();
Serial.println(str);
if (str=='1'){
for (pos = 8; pos<=103; pos+=1){
servo.write(pos);
delay(5);
}
}
else if(str == '0'){
for (pos = 103; pos>=8; pos-=1){
servo.write(pos);
delay(5);
}
}
}
}

 

음주 측정 킥보드

 

 

반응형