아두이노 프로젝트 3. 시각장애인을 위한 스마트 지팡이

아두위키 : Arduwiki
ArduWiki (토론 | 기여)님의 2024년 5월 24일 (금) 16:10 판 (새 문서: {{#seo:|title=아두위키 : 아두이노 프로젝트|title_mode=append|keywords=아두이노, 정보과학, 메이커학습, 수행평가, 초음파 센서, 아두이노 작품, 캡스톤작품, 아두이노 예제코드, 엔트리 아두이노, 파이썬 아두이노|description=아두이노를 활용한 프로젝트(가정용 스마트 식물 관리 시스템)를 소개합니다.|image=https://arduwiki.com/html/resources/assets/arduwiki.png}} == '''개요''' == === 시각...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)


개요

시각장애인을 위한 스마트 지팡이

시각장애인이 사용하는 지팡이에 편의 및 안전 기능을 추가하여 보다 유용한 지팡이를 제작합니다.

고려사항

  • 초음파 센서를 활용해 장애물이 가까워질수록 더 강하게 진동합니다.
  • 주변이 어두워질 경우 지팡이에 부착된 네오픽셀이 자동으로 점등합니다.
  • 블루투스로 안드로이드 앱과 지팡이를 연결한 후, 지팡이의 버튼을 누르면 앱에 설정된 문자로 "목적지로 출발", "목적지에 도착", "현재 위치"를 문자로 전송합니다.

사용 하드웨어

회로 구성

기능 구현

#include <DHT.h>
// 사용 핀번호
const int dht_pin = 2;
const int ENB = 7;  //(IN3 = +, IN4 = -)


DHT dht(dht_pin, DHT11);
unsigned long past = 0;
unsigned long past2 = 0;
const unsigned long interval = 500;  // 설정 시간때마다 스마트폰으로 현재 습도 및 온도 전송[ms]
int waterState = 0;
int hum = 0;
int temp = 0;

// 사용자 조정 필요 변수
int hum_criticalPoint = 25;          // [*]습도 센싱 경계값(본 값보다 측정된 값이 낮을 시 워터펌프 작동)
const unsigned long waterdly = 500;  // [*]워터펌프 on 시간(앱에서 눌렀을 때)

void waterOnOff(bool onOff, int val = 0) {
  if (onOff == 0) {  //off
    digitalWrite(ENB, LOW);
    Serial3.write(-10);  //거치 스마트폰 전송 구분자
    Serial3.write(0);    //모터상태 전송
    waterState = 0;
  } else if (onOff == 1) {  //on
    digitalWrite(ENB, HIGH);
    Serial3.write(-10);  //거치 스마트폰 전송 구분자
    Serial3.write(10);   //모터상태 전송
    waterState = 1;
  }
  if (val != 0) {
    waterState = val;
  }
}

int dhtfunc(char choice) {
  int hh = (int)dht.readHumidity();     // 슴도
  int tt = (int)dht.readTemperature();  // 섭씨 온도
  if (isnan(hh) || isnan(tt)) {
    Serial.println("Failed to read from DHT sensor!");
    waterOnOff(0);
    return -1;
  }
  switch (choice) {
    case 'h':
      return hh;
      break;
    case 't':
      return tt;
      break;
    default:
      break;
  }
}

void setup() {
  dht.begin();
  pinMode(ENB, OUTPUT);
  digitalWrite(ENB, LOW);
  Serial.begin(9600);
  Serial.println("strat");
  Serial1.begin(9600);  // 사용자 스마트폰
  Serial3.begin(9600);  // 거치된 스마트폰
}

unsigned long ppast = 0;
void loop() {
  hum = dhtfunc('h');
  temp = dhtfunc('t');

  if (millis() - past2 > waterdly && waterState == 3) {
    waterOnOff(0);
  }
  if (Serial1.available()) {  // 사용자 스마트폰 수신 파트
    int dump = Serial1.read();
    waterOnOff(1, 3);
    past2 = millis();
  }

  // 습도 기준 워터펌프 작동 부분
  if (hum == -1 || temp == -1) {
    // 사용자 스마트폰 전송
    Serial1.write(-1);   // 전송 시작 구분자
    Serial1.write(-99);  // 습도 전송
    Serial1.write(-99);  // 섭씨 온도 전송

    // 거치 스마트폰 전송
    Serial3.write(-1);      // 전송 시작 구분자
    Serial3.write(-99);     // 습도 전송
    Serial3.write(-99);     // 섭씨 온도 전송
    if (waterState == 0) {  // 모터 상태 전송
      Serial3.write(-10);
      Serial3.write(0);
    } else {
      Serial3.write(-10);
      Serial3.write(10);
    }
    past = millis();
  } else {
    if (hum < hum_criticalPoint && waterState == 0) waterOnOff(1);
    if (hum > hum_criticalPoint && waterState == 1) waterOnOff(0);
  }


  // 스마트폰 통신 부분
  if ((millis() - past) >= interval) {  // 스마트폰으로 현재 습도 및 온도 전송(interval 마다 반복)
    // 사용자 스마트폰 전송
    Serial1.write(-1);    // 전송 시작 구분자
    Serial1.write(hum);   // 습도 전송
    Serial1.write(temp);  // 섭씨 온도 전송

    // 거치 스마트폰 전송
    Serial3.write(-1);      // 전송 시작 구분자
    Serial3.write(hum);     // 습도 전송
    Serial3.write(temp);    // 섭씨 온도 전송
    if (waterState == 0) {  // 모터 상태 전송
      Serial3.write(-10);
      Serial3.write(0);
    } else {
      Serial3.write(-10);
      Serial3.write(10);
    }
    past = millis();
  }
  delay(5);
}

자동 급수 기능

DHT11 온습도 센서를 활용해 온습도 정보를 받고, 이 값을 기준으로 워터 펌프의 작동 여부를 판단합니다.

워터 펌프 작동 여부가 어플리케이션과 거치용 디스플레이에 표시되어야 하기 때문에 해당하는 신호를 보내줍니다.

펌프가 가동되면 물이 미리 연결된 관을 타고 식물로 이동합니다.

거치용 디스플레이

거치용 디스플레이는 안드로이드 기기를 활용하며 아두이노와는 HC-06 모듈을 활용해 블루투스로 연결됩니다.

아두이노 코드에는 거치용 디스플레이로 데이터를 전송하는 코드가 포함됩니다.


블루투스로 전달받은 온도, 습도, 모터 작동 여부를 표시하는 어플리케이션을 앱 인벤터를 활용하여 간단하게 제작했습니다.

사용자용 기기

사용자용 기기 역시 안드로이드 기기를 활용하며 아두이노와는 HC-06 모듈을 활용해 블루투스로 연결됩니다.

아두이노 코드에 사용자용 기기로 데이터를 전송하는 코드가 포함됩니다.


사용자 기기용 어플리케이션을 앱 인벤터를 활용하여 제작했습니다.

어플리케이션에는 온습도 표시, 모터 가동 버튼, 음성인식(급수, 온습도 확인) 기능이 포함됩니다.

결과

사진

Comment

완성된 시스템을 실제 화분에 설치한 모습입니다.

화분 토양에 설치된 온습도 센서 데이터는 거치용 디스플레이와 사용자 기기로 전송됩니다.

수동 모터 작동(버튼, 음성인식) 혹은 습도 기준 미달 시 워터 펌프가 가동되어 통 안의 물이 흐르게 됩니다.

추신

공집사의 아두이노 프로젝트 결과물은 판매되는 제품이 아니며, 프로젝트 수준에서 간단하게 진행되었습니다.

문의 및 의뢰는 크몽 공집사로 연락주시면 감사하겠습니다.