포인투랩은 서울의 심장부! 바로 강남 지역에 위치하고 있습니다. 포인투 주변에는 맛있는 음식점들이 정말 많은데요, 사실 너무 많아서 매일 무엇을 먹어야할지 결정하는 것이 참으로 어렵습니다. 저 혼자 매일 점심을 먹는다면 매일 햄버거를 먹겠지만… 아마 그럼 JS가 아주 싫어하실거에요. 그래서 이 문제를 해결하기 위해 오늘은 아두이노를 사용해서 간단한 Decision Maker (의사결정기? 뭐라 해야할지 모르겠네요 ㅋㅋ)를 만들건데요, LED 6개를 사용해서 리셋버튼이 눌리면 1번부터 6번까지 하나를 랜덤하게 골라주는 조그만 기계입니다. 결정장애가 있는 분들도 만들어 쓰셔도 좋을거에요.이번 프로젝트는 좀 있어보이게 만들어보고 싶어서 브레드보드 대신 여기저기 납땜을 해서 제작을 해보았는데요, 그냥 빵판에 만드셔도 이쁘게 잘 꾸미시면 될 것 같습니다.
준비물:
아두이노 나노 x 1
LED (색깔은 마음대로 정해주세요) x 6
버튼형 스위치 x 1
전선들
하드웨어 연결:
LED를 Digital output 2번부터 7번까지에 330옴 저항에 직렬로 연결해줍니다. 그리고 리셋과 그라운드 사이에 스위치를 연결해주면 하드웨어 연결은 끝났습니다. 간단하죠?
저는 마침 굴러다니는 원형 플라스틱 케이스가 있어서 여기에 제작을 하기로 마음먹었습니다.
위의 회로도 대로 부품들을 연결합니다. (좀 지저분하네요.. 그냥 이쁘게 봐주세요 😉 )
Programming Arduino
int menu; void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); randomSeed(((analogRead(A0)+53)*(analogRead(A1)+15)*(analogRead(A2)*29))/64);//랜덤숫자가 실제로 랜덤하게 만들어줌 menu = random (181,241); //random number between 181 & 240 int ledStart=0; int initDelay = 65; int choice = menu%6+2; //사실 결과는 여기서 이미 나와있습니다. 나머지 코드는 LED동작과 관련된거에요. Serial.println((analogRead(A0)+53)*(analogRead(A1)+15)*(analogRead(A2)*29)); Serial.println(menu); Serial.println(choice); //Initialize LEDs circle(20,5); //5 rounds of 20ms LED circle circle(30,4); //4 rounds of 30ms LED circle circle(40,2); //앞에서 설정된 결과값이 나올때까지 LED가 뺑뺑이를 돕니다 while (ledStart+100 <= menu){ int remainder = (menu - ledStart)%6 + 2; oneway(15,remainder); ledStart++; } //결과에 가까워질수록 좀 느리게 while (ledStart+30 <= menu){ int remainder=(menu-ledStart)%6 + 2; oneway(55,remainder); ledStart++; } //더 느리게 while(ledStart<=menu){ int remainder=(menu-ledStart)%6 + 2; oneway(initDelay,remainder); ledStart++; initDelay=initDelay+10; } // 마무리 처리 if (ledStart > menu){ int lastRound=7; while(lastRound>choice){ oneway(initDelay,lastRound); lastRound--; initDelay=initDelay+10; } delay(100); digitalWrite(choice,1); } } void loop() //한번 실행되고 멈추도록 loop은 비워둡니다. {} //LED들을 순서대로 켜주고, 다시 순서대로 끄는 function void circle(int interval, int times) { for(int i=0; i<times; i++){ for(int j=2; j<8; j++){ digitalWrite(9-j, 1); delay(interval); } for(int j=2; j<8; j++){ digitalWrite(9-j,0); delay(interval); } } } //LED하나를 켜고 다시 끄는 function void oneway(int interval, int k) { digitalWrite(k,1); delay(interval); digitalWrite(k,0); delay(interval); }
위의 코드를 간단하게 설명하자면 먼저 랜덤한 숫자를 하나 받고, 그리고 그 수를 6으로 나눠서 그 나머지에 2를 더하고 (핀 2번부터 7번까지 쓰기때문에 2를 더해줍니다), LED를 뺑뺑이 돌려서 결과값을 보여줍니다. 코드에 코멘트 해둔 것 처럼 사실 결과값은 코드 앞쪽에서 이미 결정되고 나머지는 좀 긴장감을 주려고 LED를 돌리는 코드입니다.
매일 아침 출근을 하면 각자 먹고싶은 것들을 선착순으로 적어냅니다. 그리고 점심시간 직전에 요 Decision maker를 사용해서 메뉴를 골라서 점심을 먹으러 가는데요, 첫날은 아주 아무도 어떠한 불만도 없이 잘 진행이 되었답니다. 앞으로도 쭉 그랬으면 아주 보람찰 것 같습니다 😀
궁금한게 있는데 답변가능하실까요?
네 yc.chang@poin2.com 으로 메일 주세요~