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

Arduino UNO를 사용한 오징어 게임 인형 빌드

구성품 및 소모품

RGB 확산 공통 음극
× 2
SparkFun 7-세그먼트 직렬 디스플레이 - 빨간색
타이머
× 1
Texas Instruments 시프트 레지스터 - 직렬에 병렬
4자리 7 세그먼트 표시
× 1
영숫자 LCD, 16 x 2
메뉴 표시
× 1
IR 수신기(일반)
리모컨용
× 1
Arduino UNO
두뇌
× 1
SG90 마이크로 서보 모터
머리 회전
× 1
PIR 모션 센서(일반)
움직임 감지
× 1
초음파 센서 - HC-SR04(일반)
승패를 위한 거리 감지
× 1
DFRobot DFPlayer - 미니 MP3 플레이어
음성
× 1
푸시버튼 스위치, 순간
메뉴 버튼 및 시작 버튼
× 1

필요한 도구 및 기계

3D 프린터(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

완전한 기능의 오징어 게임 인형을 만들었습니다. 그녀는 당신과 함께 빨간불-초록불 게임을 합니다. 회전하는 머리, 색색의 눈, 그리고 그녀가 말하는 완성품! 그녀는 초음파 및 모션 감지를 사용하여 승패를 결정합니다. 하지만 걱정하지 마세요. 지는 경우 다시 플레이할 것인지 묻습니다.

동영상을 보고 어떻게 생각하는지 알려주세요.

Arduino UNO의 모든 핀을 사용했습니다! 지금까지 한 번도 해본 적이 없는 일이기 때문에 이것은 나 자신을 위한 성취였습니다. 이 프로젝트는 전적으로 인쇄에만 전념하는 1주를 구축하는 데 3주가 ​​걸렸습니다! 이 인형을 인쇄하는 데 6일이 걸렸습니다. 제작에 1주일, 영상 편집에 1주일.

ELEGOO가 동영상으로 만들면 무료 UNO 키트를 보내줘서 인형을 만들었습니다. 이것이 아니면 탈출실을 짓는 것입니다. 그들이 이 프로젝트를 선택하게 되어 기쁩니다. 정말 멋지게 나와서 많은 사람들을 소름 끼치는 재미있는 빌드였기 때문에 사람들이 그것을 즐겼기를 바랍니다. 그러나 더 중요한 것은 작동합니다.

다음은 이 빌드에 사용할 모든 부품입니다.

1. 인쇄 시작

인쇄하는 데 시간이 오래 걸립니다. 인형 전체를 인쇄하는 데 6일이 걸렸습니다. 색칠하는 양을 줄이기 위해 다른 색의 필라멘트도 사용했어요.

나는 thingiverse.com에서 찾은 모델을 리믹스하고 중앙을 비우고 전자 장치에 대한 액세스 구멍을 추가했습니다. 또한 Servo와 Ultra Sonic이 장착되도록 가슴판을 수정했습니다.

2. 그림을 좋아하는 사람은 없습니다.

칠할 시간입니다. 이를 위해 일반 스프레이 페인트를 사용했습니다. 눈용 LED가 얼굴 전체에서 빛을 발하지 않도록 인형 머리 안쪽(눈가리개)을 칠했습니다. 이것이 당신이 찾고 있는 효과일 수 있지만. 눈만 빛나고 싶었습니다.

3. 자석은 끌어당기지만 스틱은 붙습니다

인형의 모든 팔다리를 부착하는 한 가지 방법은 자석을 플라스틱에 녹이는 것입니다. 그녀를 떼어 놓을 수 있기를 원하는 경우입니다. 내가 이 프로젝트를 다시 하게 된다면 아마 그녀의 팔다리를 모두 붙일 것입니다. 지금 보니 자석을 사용하는 이점이 거의 없습니다. 원할 경우 더 작은 상자에 넣어 보관할 수 있다는 점만 빼면요. 이때 붙이지 말아야 할 것은 머리 부분입니다.

4. 눈이 편함

가장 쉬운 단계인 눈부터 시작합니다. 눈에는 삼색 LED를 사용했습니다. 알다시피 RGB 색상을 혼합하여 원하는 기본 색상을 얻을 수 있습니다. 신호를 PWM할 필요가 없도록 1차 및 2차 색상을 고수했습니다. 그러나 당신이 그것을 찾고 있다면 당신은 할 수 있습니다.

가장 긴 핀은 접지이며 핀 2가 됩니다.

접지를 제외하고 각 리드에 대해 220ohm 저항을 사용하여 그림과 같이 LED를 연결합니다.

장착을 위해 저는 LED를 가능한 한 눈 중앙에 가깝게, 그러나 반대쪽에 열접착했습니다. 목과 몸의 아래쪽 부분을 통과할 만큼 충분히 긴 철사를 사용해야 합니다.

5. LCD 메뉴

다음으로 가장 쉬운 구성 요소는 16x2 LCD 화면입니다. I2C 어댑터가 있는 LCD 화면을 사용해야 합니다. 그것은 당신의 삶을 훨씬 더 쉽게 만들고 IO 수를 6에서 2로 줄입니다. 이것이 연결되면 LCD가 "오징어 게임에 오신 것을 환영합니다!"와 함께 시작되어야 합니다. 디스플레이에 표시됩니다.

장착을 위해 1mm 두께의 원을 인쇄했습니다. 히트건으로 인형등에 성형할 수 있도록 얇게 만듭니다. 이것은 그녀의 등 윤곽을 파악하는 것보다 훨씬 쉽습니다(적어도 저에게는). 디스플레이와 디스플레이 마운트를 본체에 고정하기 위해 뒷면에 너트가 있는 디스플레이용 나사산 인서트를 설치했습니다.

6. 올빼미 머리만 180도 회전

서보는 한 가지 주된 이유로 어려웠습니다. 저는 서보 라이브러리를 사용하지 않습니다. 이상하게 들리지만 4자리 디스플레이 업데이트를 위해 timer1을 사용해야 했으며 서보 라이브러리도 이것을 사용합니다. 운 좋게도 서보는 0도 또는 180도 중 하나이며 이를 훨씬 쉽게 만드는 사이에는 없습니다.

Timer1은 .5ms 간격, 2000hz로 설정됩니다. 서보 주기는 20ms입니다. 0도에서 핀은 2 카운트 동안만 높고 나머지 기간 동안은 낮아야 합니다. 180도의 경우 핀은 4 카운트 동안 높고 나머지 시간에는 낮아야 합니다.

서보용 가슴판에 멋진 마운트가 있습니다. 나사로 고정하거나 제자리에 붙일 수 있습니다. 나는 또한 가슴 판에 강도를 추가하고 손상을 방지할 수 있기 때문에 가슴 판에 서보를 고정하기 위해 에폭시를 사용했습니다.

7. 박쥐처럼 들린다

다음으로 초음파 거리 모듈을 설치합니다. 250ms마다 업데이트합니다. 또한 가슴 판에 좋은 장착 위치가 있습니다. 이 모듈에는 2개의 전선만 있습니다.

나는 흉판에 초음파를 장착하기 위해 에폭시를 사용했습니다.

8. 문자열이 첨부되지 않았습니다.

리모컨용 IR 센서는 게임 플레이를 제어하려는 경우에만 필요합니다. 재미있을 줄 알았는데 이 모드는 별로 안쓰면 자동 게임 플레이로도 충분히 재미있습니다.

나는 인형의 머리카락에 클립 안에 IR 센서를 장착하기로 결정했습니다. 분명히 다른 곳에 배치하도록 선택할 수 있습니다. 숨기려고 했지만 IR이 머리를 돌릴 때 리모컨이 항상 보이지 않고 센서가 반대편에 있기 때문에 더 좋은 곳이 있을 수 있습니다.

9. 시간

다음으로 타이머 표시를 설정합니다. 이것은 4자리 디스플레이에 대한 많은 작업입니다. ELEGOO의 연결 다이어그램을 포함하겠습니다. 게임 플레이 시간은 5분 이내이므로 최상위 숫자의 사용도 없앴습니다. 그러나 사용 가능한 IO 핀이 있으면 유지하기로 결정합니다. 디스플레이를 업데이트하려면 한 번에 하나의 숫자만 활성화할 수 있기 때문에 LED를 매우 빠르게 순환해야 합니다. 이것이 카메라를 통해 볼 때 깜박거리는 것처럼 보이는 이유입니다. 깜박임이 보이지 않을 정도로 빠른 2ms 재생 빈도를 사용했습니다. 5ms에서 주변 시야에서 디스플레이를 볼 때 깜박임을 볼 수 있습니다. 또한 시프트 레지스터 74HC595가 필요합니다.

재미없는 디스플레이를 장착합니다. 나는 디스플레이를 그녀의 벨트에 통합하는 것이 가장 좋다고 결정했습니다. Squid Games의 원래 인형에는 물론 벨트가 없지만 이 디스플레이를 그녀에게 표시하려면 희생을 감수해야 했습니다. 이 경로도 선택하면 디스플레이와 동일한 크기의 정사각형을 마스킹한 다음 Dremel로 잘라냅니다. 그런 다음 에폭시 퍼티를 사용하여 디스플레이에 점진적인 전환을 추가했습니다. 그러나 이것은 필요하지 않았고, 나는 단지 이렇게 하는 것이 더 좋아 보인다고 생각했습니다.

나는 74HC595를 프로토타입 실드에 장착했습니다. 다른 솔루션은 더 적은 핀으로 더 편리한 통신을 제공하는 다른 타이머 디스플레이를 사용하는 것입니다.

10. 네가 움직이는 걸 봤어

동작 감지기는 이상한 꼬마입니다. 이것은 적외선을 사용하여 움직임을 감지합니다. 내가 배운 한 가지는 이 센서가 예열되는 데 시간이 필요하다는 것입니다. 시작 시 워밍업하는 데 1분이 필요합니다. 그래서 인형의 시작 시간은 1분입니다. 이 모듈의 또 다른 성가심은 움직임 감지를 업데이트할 수 있는 가장 빠른 시간이 약 5초라는 것입니다. 마지막 성가심은 이 센서가 얼마나 민감한지 입니다. 감도를 끝까지 낮춰도 작은 움직임도 보이고, 무슨 말인지도 모를 때도 있다. 이러한 "오탐지"를 방지하기 위해 말 눈가리개 상자 안에 센서를 장착했습니다. 상자에는 동작 감지기가 밖을 내다볼 수 있는 작은 구멍(7mm)이 있습니다. 보너스로 이렇게 하면 이 거대한 센서를 인형 외부에 장착할 필요가 없습니다. 모션 센서에는 모션 여부에 관계없이 피드백에 대해 하나의 바이너리 와이어만 있습니다.

센서를 장착하기 위해 말 눈가리개를 인쇄하여 인형 내부에 붙였습니다. 그런 다음 본체에 구멍을 뚫었습니다. 모션 센서를 고정하기 위해 블라인드 박스에 나사산 인서트를 사용했습니다.

11. 내 버튼을 누르지 마세요

마지막으로, 우리는 버튼에 있습니다. 추가 I/O 핀이 있는 경우 각 핀을 디지털 입력에 연결하는 것이 더 쉽습니다. 그러나 나는 UNO를 위해 이 사치를 가지고 있지 않았다. 대신 아날로그 입력을 사용하여 어떤 버튼이 눌렸는지 확인하기 위해 저항 값을 읽어야 했습니다. 내가 사용한 값은 1K, 2K 및 5K였습니다. 그런 다음 아날로그 입력을 낮추기 위해 220옴 저항을 사용했습니다. 그렇지 않으면 떠서 임의의 버튼을 누를 것입니다.

버튼을 LCD와 동일한 장착 플레이트에 장착했습니다. 쉽지는 않았지만 더 좋은 방법은 없었습니다. 이 버튼에 와이어를 납땜한 다음 플라스틱에 뚫린 작은 구멍을 통과하도록 하면 환자를 테스트할 수 있습니다.

12. 지금 내 말 들리니?

마지막 단계이자 아마도 가장 중요한 것은 사운드 모듈입니다. 이것은 UNO의 직렬 포트를 사용하므로 Tx 및 Rx 핀에 1K Ohm 저항을 추가해야 합니다. 그렇지 않으면 이 연결이 만들어진 후 UNO 프로그래밍이 차단됩니다. 또한 UNO가 소리가 이미 재생되고 있음을 알 수 있도록 "사용 중" 핀을 사용해야 합니다. MP3가 연속 재생되는 경우 이는 매우 중요합니다.

프로토타입 실드에 MP3 플레이어 모듈을 장착했습니다. 이 실드는 UNO에 꽂기만 하면 되기 때문에 이와 같은 장착 구성요소를 매우 편리하게 만듭니다. 이 모듈은 8ohm 스피커가 필요하며 출력은 3W입니다. 스피커는 인형 바닥에 붙였습니다. 소리가 더 잘 들리도록 스피커 아래에 작은 구멍을 뚫었습니다.

13. UNO 탑재

플랫폼에 UNO를 설치하고 프로토타입 실드를 UNO에 연결합니다. 모든 전선에 레이블을 지정했는지 확인하십시오. 그렇지 않은 경우 현재 전선이 어디로 가는지 모를 것입니다. 약간의 협상으로 모든 전선이 연결된 인형 내부에 장착된 UNO를 얻을 수 있습니다.

나는 플랫폼을 인형 바닥에 장착하기 위해 나사산 인서트를 사용했습니다.

14. 테스트 수정 테스트

디버깅 모자를 써야 할 때입니다. 소프트웨어가 GitHub에서 작동 중이므로 최소한 디버깅할 항목이 하나 줄어듭니다. 그러나 의심이 가는 경우 계속 진행하고 찾은 업데이트를 저에게 보내주십시오.

15. 놀자

그녀를 테스트하고 게임을 할 시간입니다. 게임을 프로그래밍하는 방법은 다음과 같습니다.

시작할 때 그녀는 머리를 앞으로 돌립니다.

모션 센서는 시작하는 데 1분 정도 걸립니다. 그래서 시작할 때 타이머가 있습니다. 중간에 그녀는 킥킥거리며 고개를 돌립니다. 그런 다음 그녀가 준비되면 알려줍니다.

게임을 원격으로 설정했는지 여부에 따라 그녀는 다른 말을 합니다. 자동 모드에서 그녀는 재생 버튼을 누르라고 요청합니다. 제 경우에는 이것이 맨 오른쪽 버튼입니다. 원격 모드에서 그녀는 준비가 되면 전원 버튼을 누르라고 요청할 것입니다. 그런 다음 재생 버튼을 눌러 빨간색 표시등 또는 녹색 표시등으로 전환합니다.

준비가 되었으면 이동 버튼을 누르면 10초 동안 제자리에 도착할 수 있습니다. 일반적으로 근처에 있는 다른 사람이 이 버튼을 누릅니다.

그런 다음 게임이 시작됩니다. 그녀는 그린 라이트로 시작할 것입니다. 그린 라이트의 경우 50cm 이내로 들어가야 승리가 트리거됩니다. 당신이 100cm 이내에 있으면 그녀는 당신이 가까워지고 있다고 말할 것입니다. 녹색등은 소나만 사용하고 있습니다.

적색등의 경우 모션 센서와 거리 센서가 사용됩니다. 모션 센서가 작동할 만큼 충분히 움직이거나 앞으로 10cm 이상 움직이면 게임에서 지게 됩니다. 시간이 다 되면 게임에서 지게 됩니다. 그녀는 시간이 거의 5초 남았음을 알려줄 것입니다.

마지막 멋진 기능은 그녀가 빨간불에 대해 한국어 음성으로도 말할 것이라는 점입니다. 메뉴 기능입니다. 맨 왼쪽 버튼을 눌러 메뉴 항목을 토글하고 가운데 버튼을 눌러 항목 옵션을 토글합니다.

16. 동영상 보기

이 영상은 편집하는데 오랜 시간이 걸렸습니다. 편집에만 30시간 정도 걸린 것 같아요. 하지만 만드는 것은 재미있었습니다. 재미있고 잘 나온 것 같지만 직접 보시길 바랍니다. 어떻게 생각하는지 그리고 질문이 있으면 알려주세요.

https://youtu.be/jd_4a4x3uCw

감사합니다!

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • 오징어 게임 인형 스케치
  • 오징어 게임 인형 스케치C/C++
    이것은 모든 센서와 게임 로직을 제어합니다.
    /// CodeMakesItGo Dec 2021#include #include #include #include # include #include #include /*-----(아날로그 핀)-----*/#define BUTTONS_IN A0#define SONAR_TRIG_PIN A1#define SONAR_ECHO_PIN A2 #define MOTION_IN A3/*-----( 디지털 핀 )-----*/#define LED_BLUE 13#define LED_GREEN 12#define LED_RED 11#define SEGMENT_DATA 10 // DS#define SEGMENT_CLOCK 9 // SHCP#define SEGMENT_LATCH 8 // STCP#define SEGMENT_1_OUT 7#define SEGMENT_2_OUT 6#define SEGMENT_3_OUT 5#define IR_DIGITAL_IN 4 // IR 원격#define SERVO_OUT 3#define DFPLAYER_BUSY_IN 2/*-----*/ 구성) #define TIMER_FREQUENCY 2000#define TIMER_MATCH (int)(((16E+6) / (TIMER_FREQUENCY * 64.0)) - 1)#define TIMER_2MS ((TIMER_FREQUENCY / 1000) * 2)#define #VOLUME BETTER_HURRY_S 5 // 왼쪽 5초에서 클립 재생#define WIN_PROXIMITY_CM 50 // w에 대한 cm 거리 inner#define CLOSE_PROXIMITY_CM 100 // 우승에 근접하기 위한 cm 거리#define GREEN_LIGHT_MS 3000 // 초록불 켜기 3초#define RED_LIGHT_MS 5000 // 초록불 켜기 5초#define WAIT_FOR_STOP_MOTION_MS 5000 // 움직임 감지 대기 5초 to stop/*-----( 전역 변수 )-----*/static unsigned int timer_1000ms =0;static unsigned int timer_2ms =0;static unsigned char digit =0; // 4 세그먼트의 숫자 displaystatic int countDown =60; // 시작 시 1분 카운트다운 시작static const int sonarVariance =10; // 이보다 크면 움직임을 감지합니다. gameInPlay =false;static bool faceTree =false;static bool remotePlay =false;// 0 , 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B , C, D, E, F, NULLconst 부호 없는 문자 숫자[] ={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x59, 0x77, 0x39, 0x77 };const char *MenuItems[] ={"언어", "재생 시간", "재생 유형"};typedef enum{ LANGUAGE, PLAYTIME, PLAYTYPE, MENUITEM_COUNT} MenuItemTypes;const char *Languages[] ={"영어", "한국어"};typedef enum{ ENGLISH, KOREAN, LANUAGE_COUNT} LanguageTypes;static int 언어 =0;const char *PlayTime[] ={"300", "240", "180", "120", "60", "30", "15"};typedef 열거형{ PT300, PT240, PT180, PT120, PT60, PT30, PT15, PLAYTIME_COUNT} PlayTimeTypes;const int playTimes[] ={300, 240, 180, 1520, };static int playTime =0;const char *PlayType[] ={"Auto", "Remote"};typedef enum{ AUTO, REMOTE, PLAYTYPE_COUNT} PlayTypeTypes;static int playType =0;typedef enum{ BLACK, RED, GREEN , 푸른, WHITE, YELLOW, PURPLE} EyeColors;EyeColors eyeColor =BLACK;typedef enum{ WARMUP, WAIT, READY, GREENLIGHT, REDLIGHT, WIN, LOSE} GameStates;static GameStates gameState =WARMUP;/*-----( 클래스 개체 )- ----*/FireTimer task_50ms;FireTimer task_250ms;DFPlayerMini_Fast dfPlayer;SR04 소나 =SR04(SONAR_ECHO_PIN, SONAR_TRIG_PIN);IRrecv irRecv(IR_DIGITAL_IN);decode_results;_Idir // 16x2 LCD 디스플레이/*-----( Functions )-----*/void translateIR() // 수신된 IR 코드에 따라 작업 수행{ switch (irResults.value) { case 0xFFA25D:Serial.println( "힘"); if (gameState ==WAIT) { gameInPlay =true; } 부서지다; 케이스 0xFFE21D:Serial.println("FUNC/STOP"); 부서지다; 케이스 0xFF629D:Serial.println("VOL+"); 부서지다; 케이스 0xFF22DD:Serial.println("빠른 뒤로"); 부서지다; 케이스 0xFF02FD:Serial.println("일시 중지"); 원격 재생 =! 원격 재생; 부서지다; 케이스 0xFFC23D:Serial.println("빨리 감기"); 부서지다; 케이스 0xFFE01F:Serial.println("DOWN"); 부서지다; 케이스 0xFFA857:Serial.println("VOL-"); 부서지다; 케이스 0xFF906F:Serial.println("UP"); 부서지다; 케이스 0xFF9867:Serial.println("EQ"); 부서지다; 케이스 0xFFB04F:Serial.println("ST/REPT"); 부서지다; 케이스 0xFF6897:Serial.println("0"); 부서지다; 케이스 0xFF30CF:Serial.println("1"); 부서지다; 케이스 0xFF18E7:Serial.println("2"); 부서지다; 케이스 0xFF7A85:Serial.println("3"); 부서지다; 케이스 0xFF10EF:Serial.println("4"); 부서지다; 케이스 0xFF38C7:Serial.println("5"); 부서지다; 케이스 0xFF5AA5:Serial.println("6"); 부서지다; 케이스 0xFF42BD:Serial.println("7"); 부서지다; 케이스 0xFF4AB5:Serial.println("8"); 부서지다; 케이스 0xFF52AD:Serial.println("9"); 부서지다; 케이스 0xFFFFFFFF:Serial.println("반복"); 부서지다; 기본값:Serial.println(" 기타 버튼 "); }}bool isPlayingSound(){ return (digitalRead(DFPLAYER_BUSY_IN) ==LOW);}void updateTimeDisplay(unsigned char digit, unsigned char num){ digitalWrite(SEGMENT_LATCH, LOW); shiftOut(SEGMENT_DATA, SEGMENT_CLOCK, MSBFIRST, 숫자[num]); // 활성 LOW digitalWrite(SEGMENT_1_OUT, 숫자 ==1 ? LOW :HIGH); digitalWrite(SEGMENT_2_OUT, 숫자 ==2 ? LOW :HIGH); digitalWrite(SEGMENT_3_OUT, 숫자 ==3 ? LOW :HIGH); digitalWrite(SEGMENT_LATCH, HIGH);} 무효 updateServoPosition(){ 정적 int servoPulseCount =0; 정적 부울 lastPosition =거짓; // 기간이 시작될 때만 새 값을 가져옵니다. if (servoPulseCount ==0) lastPosition =faceTree; if (!lastPosition) // 180도 { digitalWrite(SERVO_OUT, 서보펄스카운트 <5 ? HIGH :LOW); } else // 0도 { digitalWrite(SERVO_OUT, 서보펄스카운트 <1 ? HIGH :LOW); } 서보펄스카운트 =(서보펄스카운트 + 1) % 40; // 20ms 주기} 무효 updateMenuDisplay(const int 버튼){ static int menuItem =0; 정적 int menuOption =0; 스위치(버튼) { 경우 1:menuItem =(menuItem + 1) % MENUITEM_COUNT; if (menuItem ==LANGUAGE) { menuOption =언어; } else if (menuItem ==PLAYTIME) { menuOption =playTime; } else if (menuItem ==PLAYTYPE) { menuOption =playType; } else { 메뉴 옵션 =0; } 부서지다; 경우 2:if (menuItem ==LANGUAGE) { menuOption =(menuOption + 1) % LANUAGE_COUNT; 언어 =메뉴 옵션; } else if (menuItem ==PLAYTIME) { menuOption =(menuOption + 1) % PLAYTIME_COUNT; 플레이타임 =메뉴옵션; } else if (menuItem ==PLAYTYPE) { menuOption =(menuOption + 1) % PLAYTYPE_COUNT; 플레이타입 =메뉴옵션; } else { 메뉴 옵션 =0; } 부서지다; 사례 3:if (gameState ==WAIT) { gameInPlay =true; } if (gameState ==GREENLIGHT || gameState ==REDLIGHT) { gameInPlay =false; } default:break; } if (menuOption !=-1) { lcdDisplay.clear(); lcdDisplay.setCursor(0, 0); lcdDisplay.print(MenuItems[menuItem]); lcdDisplay.setCursor(0, 1); if (menuItem ==LANGUAGE) { lcdDisplay.print(Languages[menuOption]); } else if (menuItem ==PLAYTIME) { lcdDisplay.print(PlayTime[menuOption]); } else if (menuItem ==PLAYTYPE) { lcdDisplay.print(PlayType[menuOption]); } else { lcdDisplay.print("unknown option"); } } else { menuItem =0; menuOption =0; }}void handleButtons(){ static int buttonPressed =0; int value =analogRead(BUTTONS_IN); if (value <600) // buttons released { if (buttonPressed !=0) updateMenuDisplay(buttonPressed); buttonPressed =0; return; } else if (value <700) { Serial.println("button 1"); buttonPressed =1; } else if (value <900) { Serial.println("button 2"); buttonPressed =2; } else if (value <1000) { Serial.println("button 3"); buttonPressed =3; } else { Serial.println(value); buttonPressed =0; }}static int lastSonarValue =0;void handleSonar(){ int value =sonar.Distance(); if (value> lastSonarValue + sonarVariance || value  30000 || sequence ==0) { internalTimer =millis(); if(playType ==AUTO) { // press the go button when you are ready Serial.println("Press the go button when you are ready"); dfPlayer.playFolder(1, 5); } else { Serial.println("Press the power button on the remote when you are ready"); dfPlayer.playFolder(1, 6); } // eyes are blue eyeColor =BLUE; // facing players faceTree =false; gameInPlay =false; sequence++; } } else if (gameState ==READY) { currentTimer =millis(); if (sequence ==0) { // get in position, game will start in 10 seconds Serial.println("Get in position."); dfPlayer.playFolder(1, 7); countDown =10; // eyes are green eyeColor =WHITE; // facing players faceTree =false; sequence++; internalTimer =millis(); } else if (sequence ==1) { if (playType ==REMOTE) { if (remotePlay) sequence++; } else sequence++; } else if (sequence ==2) { // at 0 seconds, here we go! if (countDown ==0) { countDown =playTimes[playTime]; Serial.print("play time set to "); Serial.println(countDown); Serial.println("Here we go!"); dfPlayer.playFolder(1, 8); gameState =GREENLIGHT; sequence =0; } } } else if (gameState ==GREENLIGHT) { currentTimer =millis(); if (sequence ==0) { // eyes are green eyeColor =GREEN; // play green light Serial.println("Green Light!"); dfPlayer.playFolder(1, 9); sequence++; } else if(sequence ==1) { // play motor sound dfPlayer.playFolder(1, 19); // facing tree faceTree =true; sequence++; internalTimer =millis(); } else if (sequence ==2) { // wait 3 seconds or until remote // switch to red light if (playType ==AUTO &¤tTimer - internalTimer> GREEN_LIGHT_MS) { sequence =0; gameState =REDLIGHT; } else if (playType ==REMOTE &&remotePlay ==false) { sequence =0; gameState =REDLIGHT; } else { // look for winner button or distance if (gameInPlay ==false || lastSonarValue  WAIT_FOR_STOP_MOTION_MS) { internalTimer =millis(); sequence++; Serial.println("Done settling"); } Serial.println("Waiting to settle"); } else if (sequence ==3) { // back to green after 5 seconds if (playType ==AUTO &¤tTimer - internalTimer> RED_LIGHT_MS) { sequence =0; gameState =GREENLIGHT; } else if (playType ==REMOTE &&remotePlay ==true) { sequence =0; gameState =GREENLIGHT; } else { // can't push the button while red light // detect movement // detect distance change if (gameInPlay ==false || lastMotion ==1 || lastSonarValue  
    Project files
    All of the files for this buildhttps://github.com/CodeMakesItGo/SquidGamesDoll

    회로도

    This is how I connected all of the components to the UNO.
    The project repo
    All of the files for this build are stored here. https://github.com/CodeMakesItGo/SquidGamesDoll

    제조공정

    1. Arduino를 사용하여 모니터 Ambilight 만들기
    2. Arduino Pong 게임 - OLED 디스플레이
    3. Arduino Uno를 사용한 인간 감지 로봇 시스템
    4. Arduino와 스마트폰을 사용한 DIY 전압계
    5. IoT를 사용한 심박수 모니터
    6. Arduino Uno WiFi를 사용하는 WebServerBlink
    7. 간단한 UNO 계산기
    8. arduino를 사용한 소나 및 IDE 처리 시 표시
    9. 시력의 지속성
    10. Arduino 교육 플랫폼