코로나 바이러스가 유행하는이시기에 엘리베이터는 모두가 같은 버튼을 터치하는 고위험 장소가되었습니다. 많은 곳에서 사람들은 펌핑 페이퍼, 이쑤시개 또는 리프트 버튼을 누르기 위해 위생 티슈를 사용하는 것과 같은 엘리베이터 버튼과의 접촉을 방지하는 트릭을 발견했습니다.
따라서 자동 살균기, 비접촉식 온도 모니터링 및 사회적 거리 감지기와 같은 이전 코로나 안전 프로젝트를 계속 진행하면서 Arduino Nano를 사용하여 제스처 제어 엘리베이터 프로토 타입을 구축 할 것입니다.
이 비접촉식 엘리베이터 는 Arduino Nano, APDS9960 제스처 센서 및 OLED 디스플레이 모듈을 사용합니다. 이 제스처 기반 제어판을 사용하면 손 제스처를 만들어 리프트를 쉽게 제어 할 수 있습니다. APDS9960 센서는 제스처를 읽는 데 사용됩니다. 위, 아래 제스처는 층 번호를 설정하는 데 사용되며 왼쪽 제스처는 리프트 도어를 닫고 층 번호에 따라 리프트를 이동하는 것이고 오른쪽 제스처는 문을 열 때 사용됩니다.
필요한 구성 요소
- Arduino Nano
- OLED 디스플레이 모듈
- APDS9960 RGB 및 제스처 센서
- 브레드 보드
- 점퍼 와이어
APDS9960 RGB 및 제스처 센서
APDS9960 RGB 및 제스처 감지 모듈은 내장형 APDS-9960 센서, UV 및 IR 차단 필터, 서로 다른 방향에 민감한 4 개의 개별 다이오드, I2C 호환 인터페이스와 함께 제공되는 소형 브레이크 아웃 보드입니다. 이 센서는 주변 광 및 색상 측정, 근접 감지 및 비접촉 제스처 감지에 사용할 수 있습니다. 제스처 감지 범위는 10 ~ 20cm이며 마이크로 컨트롤러, 로봇 및 기타 여러 프로젝트를 제어하는 데 사용할 수 있습니다.
풍모:
- 작동 전압: 2.4V ~ 3.6V
- 작동 범위: 10-20cm (4-8in).
- I2C 인터페이스 (I2C 주소: 0x39).
- 주변 광 및 RGB 색상 감지, 근접
- 광학 모듈의 감지 및 제스처 감지
- 최대 400kHz의 데이터 속도를 지원하는 I2C 버스 고속 모드 호환 인터페이스.
회로도
APDS9960을 사용 하는 비접촉식 엘리베이터의 회로도 는 아래와 같습니다.
Arduino Nano와 APDS9960 센서 및 OLED 디스플레이를 연결하고 있습니다. APDS9960 센서와 OLED 디스플레이의 VCC 및 GND 핀은 Arduino의 3.3V 및 GND에 연결됩니다. APDS9960 Sensor 및 OLED Display의 SCL 및 SDA 핀은 Arduino의 A5 및 A4 핀에 각각 연결됩니다.
OLED 및 APDS9960 핀 |
Arduino Nano 핀 |
VCC |
3.3v |
GND |
GND |
SCL |
A5 |
SDA |
A4 |
Arduino 를 사용 하는 제스처 제어 엘리베이터 의 전체 설정 은 다음과 같습니다.
OLED 디스플레이 및 다른 마이크로 컨트롤러와의 인터페이스에 대해 자세히 알아 보려면 링크를 따르십시오.
코드 설명
APDS9960을 사용 하는 비접촉식 엘리베이터 의 전체 코드 는 페이지 끝에 제공됩니다. 여기서 우리는 코드의 중요한 부분을 설명합니다. 이 프로그램에서는 APDS9960 및 Adafruit_SH1106 라이브러리 를 사용할 것 입니다. APDS9960 라이브러리는 Arduino IDE에서 다운로드 할 수 있습니다. 라이브러리를 다운로드하려면 Sketch> Library Manager> Search 로 이동 한 다음 Arduino APDS9960 을 입력합니다 . 그동안 Adafruit_SH1106 라이브러리는 여기에서 다운로드 할 수 있습니다.
따라서 평소와 같이 필요한 모든 라이브러리를 포함하여 코드를 시작하십시오. Adafruit_SH1106.h 는 원래 Adafruit 라이브러리의 수정 된 버전입니다.
#포함
다음 줄에서 변수를 정의하여 사용자가 가고자하는 현재 층과 층 번호를 저장합니다.
int floornum = 0; int currentfloor = 0;
그런 다음 위쪽 화살표, 아래쪽 화살표, 문 열기 및 문 닫기 그림에 대한 비트 맵을 입력합니다. Image2cpp와 같은 변환기를 사용하여 이미지에 대한 HEX 코드를 생성 할 수 있습니다. Image2cpp 사용 방법에 대해 자세히 알아 보려면 이 Arduino QR 코드 생성기 자습서를 따르십시오.
const unsigned char up PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ………………………………………………………..}; const unsigned char down PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, …………………………… ………………………………………………………..}; const unsigned char dooropen PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xe0,, ………………………… …………………………………………………………..};
에서 설정 () 함수, 디버깅 목적으로 9600의 전송 속도에 직렬 모니터를 초기화한다. 그런 다음 다음 줄에서 다음과 같이 begin () 메서드를 사용 하여 OLED 디스플레이와 APDS9960 센서를 초기화합니다.
Serial.begin (9600); if (! APDS.begin ()) {Serial.println ("APDS9960 센서 초기화 오류!"); } Serial.println ("제스처 감지 중…"); display.begin (SH1106_SWITCHCAPVCC, 0x3C);
디스플레이 및 센서를 초기화 한 후 clearDisplay () 메서드로 디스플레이 버퍼를 지우고 display.setTextSize () 및 display.setTextColor () 메서드를 사용하여 글꼴 크기와 색상을 설정합니다.
display.setTextSize (2); display.setTextColor (WHITE); display.clearDisplay (); display.display ();
내부 공간 루프 () , 어떤 동작이 이루어진 경우 지속적으로 확인한다. 그렇다면 제스처 값을 읽고 그것이 어떤 제스처인지 (위, 아래, 오른쪽, 왼쪽) 확인하고 직렬 모니터에 해당 판독 값을 인쇄합니다. UP, DOWN 제스처는 사용자가 가고자하는 층수를 설정하는 데 사용됩니다. 왼쪽 제스처는 리프트 도어를 닫고 층 번호에 따라 리프트를 이동하는 것입니다. 오른쪽 제스처는 도어를 열 때 사용합니다.
if (APDS.gestureAvailable ()) {int gesture = APDS.readGesture (); switch (제스처) {case GESTURE_UP: Serial.println ("감지 된 UP 제스처"); display.clearDisplay (); floornum ++; home1 (); 단절; case GESTURE_DOWN: Serial.println ("아래로 동작 감지"); display.clearDisplay (); floornum-; home1 (); 단절; case GESTURE_LEFT: Serial.println ("왼쪽 제스처 감지"); display.clearDisplay (); 스타트(); 단절; case GESTURE_RIGHT: Serial.println ("오른쪽 제스처 감지"); display.clearDisplay (); home1 (); 단절; 기본값: 휴식; }
HOME1 () 함수는 엘리베이터 용 홈 화면 묘화에 사용된다. 이것은 위쪽 화살표, 아래쪽 화살표, 문 열림, 문 닫힘 표시 및 현재 층 번호로 구성됩니다. drawBitmap () 함수는 OLED 디스플레이에 이미지를 그리는 데 사용됩니다. drawBitmap () 함수 의 구문 은 다음과 같습니다.
drawBitmap (int16_t x, int16_t y, 비트 맵, int16_t w, int16_t h, colour);
어디:
int16_t x, int16_t y 는 OLED 디스플레이의 X 및 Y 좌표입니다.
비트 맵 은 비트 맵 의 이름입니다.
int16_t w, int16_t h 는 이미지의 높이와 무게입니다.
void home1 () {display.setCursor (101,23); display.println (floornum); display.drawBitmap (23, 0, 위쪽 화살표, 40, 18, WHITE); display.drawBitmap (26, 46, 아래쪽 화살표, 40, 18, WHITE); display.drawBitmap (0, 15, dooropen, 29, 30, WHITE); display.drawBitmap (60, 15, closedoor, 29, 30, WHITE); display.display (); }
시작 () 함수는 위 또는 아래로 리프트를 이동하는데 사용된다. 이를 위해 현재 층 번호는 사용자가 가고 싶은 층 번호와 비교됩니다. 층 번호가 현재 층 번호보다 큰 경우 그런 다음 리프트가 위로 이동하고 층 번호가 현재 층 번호보다 적 으면. 그러면 리프트가 아래쪽으로 이동합니다. 엘리베이터는 현재 두 층 모두에서 멈출 것입니다. 및 층 번호. 동일합니다.
void start () {while (floornum> currentfloor) {Serial.println ("going UP"); currentfloor ++; display.drawBitmap (0, 0, 위로, 100, 64, WHITE); display.setCursor (101,23); display.println (currentfloor); display.display (); display.clearDisplay (); 지연 (2000); } while (floornum <currentfloor) {Serial.println ("going Down"); currentfloor--; display.drawBitmap (0, 0, 아래, 100, 64, WHITE); display.setCursor (101,23); display.println (currentfloor); display.display (); display.clearDisplay (); 지연 (2000); } if (floornum == currentfloor) {Serial.println ("Reached"); display.clearDisplay (); home1 (); Serial.print (currentfloor); }}
제스처 제어 터치리스 리프트 테스트
하드웨어와 코드가 준비되면 Arduino Nano를 노트북에 연결하고 아래 주어진 전체 코드를 업로드하십시오. 기본적으로 볼 수 있듯이 OLED는 Elevator UI를 표시합니다.
이제 아래 비디오와 같이 손을 위아래로 흔들어 가고 싶은 층을 설정하십시오. 그런 다음 엘리베이터가 해당 층으로 이동하는 것을 확인하기 위해 왼쪽 제스처를 만듭니다. 리프트를 멈추고 싶다면 손으로 올바른 제스처를 취하십시오.
이 프로젝트의 전체 작업 비디오 및 코드는 아래에 나와 있습니다. 이 프로젝트를 재미있게 만드셨기를 바랍니다. 이 프로젝트에 대해 궁금한 점이 있으면 댓글란에 남겨주세요.