코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-08-28 13:33:53
NO | 부품명 | 수량 | 상세정보 |
1 | 아두이노 보드 | 1 | |
2 | 브레드보드 | 1 | |
3 | LED | 3 | |
4 | 좌표 터치 센서 | 1 | |
5 | 케이블 | 5 | |
6 | 저항 | 3 | 330 |
부품명 | 아두이노 보드 | 브레드보드 | LED | 좌표 터치 센서 | 케이블 | 저항 |
부품사진 |
#include <Wire.h> #include <mpr121.h> int brightness; //밝기 변수 int first_X, first_Y; //처음터치될때의 좌표를 저장하는 변수 int touch_X, touch_Y; //드래그되는 동안 좌표를 저장하는 변수 int gap_X, gap_Y; //현재 좌표와 처음터치된 좌표의 차이값을 저장하는 변수 int result_X,result_Y; 각 좌표 연산 후 결과값을 저장하는 변수 boolean stateRED, stateGREEN, stateYELLOW = false; //LED의 상태 저장
//LED 핀번호 int redLED = 9; int greenLED = 10; int yellowLED = 11; // ========= setup ========= void setup() { //시리얼통신, I2C통신, 터치센서, 핀모드 초기화 Serial.begin(19200); Wire.begin(); CapaTouch.begin(); pinMode(redLED, OUTPUT); pinMode(greenLED, OUTPUT); pinMode(yellowLED, OUTPUT); delay(500); Serial.println("START"); } // ========= loop ========= void loop() {
//처음 터치된 곳의 좌표를 받는다 first_X=CapaTouch.getX(); first_Y=CapaTouch.getY(); touch_X = 0; touch_Y = 0;
//처음 터치되고 계속적인 터치가 이루어지면(드래그) 계속 값을 받는다 while(touch_X != -1 && touch_Y != -1) { touch_X = CapaTouch.getX(); touch_Y = CapaTouch.getY();
//처음 터치된 곳의 좌표와 현재 좌표와의 차이값을 구한다 gap_X = touch_X - first_X; gap_Y = touch_Y - first_Y; if(touch_X != -1 && touch_Y != -1) { //왼쪽으로 오른쪽으로 드래그 되었을 때(LED를 켠다) if(gap_Y <= 2 && gap_X > gap_Y && gap_Y >= 0) {
//좌표값의 차이값을 0부터 11로 세분화 시켜서 LED를 켜고 끈다 result_X = map(gap_X, 1, 9, 0, 11);
//0에서 2사이 일 경우 LED는 전부 꺼진상태 if(result_X >= 0 && result_X <= 2&&!stateRED&&!stateYELLOW&&!stateGREEN) { analogWrite(redLED, 0); analogWrite(greenLED, 0); analogWrite(yellowLED, 0); stateRED = false; stateGREEN = false; stateYELLOW = false; Serial.println("OFF"); }
//2초과 5이하일 경우 redLED만 켠다 else if(result_X > 2 && result_X <= 5 &&!stateYELLOW&&!stateGREEN) { analogWrite(redLED, result_Y); analogWrite(greenLED, 0); analogWrite(yellowLED, 0); stateRED = true; stateGREEN = false; stateYELLOW = false; Serial.println("redLED ON1"); }
//5초과 8미만 일 경우 redLED, greenLED를 켠다 else if(result_X > 5 && result_X < 8&&!stateYELLOW) { analogWrite(redLED, result_Y); analogWrite(greenLED, result_Y); analogWrite(yellowLED, 0); stateRED = true; stateGREEN = true; stateYELLOW = false; Serial.println("redLED, greenLED ON"); }
//8이상 11이하일경우 모든 LED를 켠다 else if(result_X >= 8 && result_X <= 11) { analogWrite(redLED, result_Y); analogWrite(greenLED, result_Y); analogWrite(yellowLED, result_Y); stateRED = true; stateGREEN = true; stateYELLOW = true; Serial.println("redLED, greenLED, yellowLED ON"); } } //오른쪽에서 왼쪽으로 드래그 할 경우(LED를 끈다) else if(gap_Y <= 2 && gap_X < gap_Y && abs(gap_X) > gap_Y && gap_Y >= 0) {
//드래그 거리에 따라 0부터 11까지 세분화 result_X = map(abs(gap_X), 1, 9, 0, 11);
//0이상 2이하일 경우 모든 LED ON상태 유지 if(result_X >= 0 && result_X <= 2 && stateRED && stateGREEN && stateYELLOW) { analogWrite(redLED, brightness); analogWrite(greenLED, brightness); analogWrite(yellowLED, brightness); stateRED = true; stateGREEN = true; stateYELLOW = true; Serial.println("redLED, greenLED, yellowLED ON"); }
//2초과 5이하일 경우 yellowLED를 끈다 else if(result_X > 2 && result_X <= 5 && stateRED && stateGREEN) { analogWrite(redLED, result_Y); analogWrite(greenLED, result_Y); analogWrite(yellowLED, 0); stateRED = true; stateGREEN = true; stateYELLOW = false; Serial.println("redLED, greenLED ON"); }
// 5초과 8미만일 경우 yellowLED와 greenLED를 끈다 else if(result_X > 5 && result_X < 8 && stateRED) { analogWrite(redLED, result_Y); analogWrite(greenLED, 0); analogWrite(yellowLED, 0); stateRED = true; stateGREEN = false; stateYELLOW = false; Serial.println("redLED ON2"); }
//8이상 11이하일 경우 모든 LED를 끈다 else if(result_X >= 8 && result_X <= 11) { analogWrite(redLED, 0); analogWrite(greenLED, 0); analogWrite(yellowLED, 0); stateRED = false; stateGREEN = false; stateYELLOW = false; Serial.println("ALL OFF"); } } //위에서 아래로 드래그할 경우(밝기를 올린다) else if(gap_X >= 0 && gap_X <= 3 && gap_Y > gap_X) { if(gap_Y > 0) { //드래그 되었을때 드래그 된 거리를 현재 밝기부터 255까지의 범위로 세분화 시킨다 brightness = map(gap_Y, 1, 13, result_Y, 255); constrain(brightness, 0, 255); }
//켜진 LED만 밝기를 올린다 if(stateRED) analogWrite(redLED, brightness); if(stateGREEN) analogWrite(greenLED, brightness); if(stateYELLOW) analogWrite(yellowLED, brightness); } //아래에서 위로 드래그할 경우(밝기를 내린다) else if(gap_X >= 0 && gap_X <= 3 && abs(gap_Y) > gap_X && gap_Y < gap_X) { if(abs(gap_Y) >= 0) { //드래그 되었을때 드래그 된 거리를 0부터 현재 밝기까지의 범위로 세분화 시킨다 brightness = map(abs(gap_Y), 1, 13, 0, result_Y); constrain(brightness, 0, 255); }
//켜진 LED만 밝기를 내린다 if(stateRED) analogWrite(redLED, result_Y - brightness); if(stateGREEN) analogWrite(greenLED, result_Y - brightness); if(stateYELLOW) analogWrite(yellowLED, result_Y - brightness); brightness = result_Y - brightness; } //오른쪽 아래부분을 눌렀을 때 모든 LED를 끈다 else if(first_X == touch_X && first_Y == touch_Y && first_X >= 8 && first_Y >= 12) { analogWrite(redLED, 0); analogWrite(greenLED, 0); analogWrite(yellowLED, 0); stateRED = false; stateGREEN = false; stateYELLOW = false; } //왼쪽 아래를 눌렀을 때 모든 LED를 마지막으로 설정된 밝기로 켠다 else if(first_X == touch_X && first_Y == touch_Y && first_X <= 2 && first_Y >= 12) { analogWrite(redLED, result_Y); analogWrite(greenLED, result_Y); analogWrite(yellowLED, result_Y); stateRED = true; stateGREEN = true; stateYELLOW = true; } //왼쪽 위를 눌렀을 때 현재 켜진 LED의 밝기를 최대로 올린다 else if((first_X == touch_X && first_Y == touch_Y && first_X <= 2 && first_Y <= 2) && (stateRED||stateGREEN||stateYELLOW)) { brightness = 255; if(stateRED) analogWrite(redLED, brightness); if(stateGREEN) analogWrite(greenLED, brightness); if(stateYELLOW) analogWrite(yellowLED, brightness); } //오른쪽 위를 눌렀을 때 현재 켜진 LED의 밝기를 희미하게 바꾼다 else if(first_X == touch_X && first_Y == touch_Y && first_X >= 8 && first_Y <= 2 && (stateRED||stateGREEN||stateYELLOW)) { brightness = 21; if(stateRED) analogWrite(redLED, brightness); if(stateGREEN) analogWrite(greenLED, brightness); if(stateYELLOW) analogWrite(yellowLED, brightness); } } result_Y = brightness; delay(20); } }
//왼쪽으로 오른쪽으로 드래그 되었을 때(LED를 켠다) if(gap_Y <= 2 && gap_X > gap_Y && gap_Y >= 0) {
//좌표값의 차이값을 0부터 11로 세분화 시켜서 LED를 켜고 끈다 result_X = map(gap_X, 1, 9, 0, 11);
//0에서 2사이 일 경우 LED는 전부 꺼진상태 if(result_X >= 0 && result_X <= 2&&!stateRED&&!stateYELLOW&&!stateGREEN) { analogWrite(redLED, 0); analogWrite(greenLED, 0); analogWrite(yellowLED, 0); stateRED = false; stateGREEN = false; stateYELLOW = false; Serial.println("OFF"); }
//2초과 5이하일 경우 redLED만 켠다 else if(result_X > 2 && result_X <= 5 &&!stateYELLOW&&!stateGREEN) { analogWrite(redLED, result_Y); analogWrite(greenLED, 0); analogWrite(yellowLED, 0); stateRED = true; stateGREEN = false; stateYELLOW = false; Serial.println("redLED ON1"); }
//5초과 8미만 일 경우 redLED, greenLED를 켠다 else if(result_X > 5 && result_X < 8&&!stateYELLOW) { analogWrite(redLED, result_Y); analogWrite(greenLED, result_Y); analogWrite(yellowLED, 0); stateRED = true; stateGREEN = true; stateYELLOW = false; Serial.println("redLED, greenLED ON"); }
//8이상 11이하일경우 모든 LED를 켠다 else if(result_X >= 8 && result_X <= 11) { analogWrite(redLED, result_Y); analogWrite(greenLED, result_Y); analogWrite(yellowLED, result_Y); stateRED = true; stateGREEN = true; stateYELLOW = true; Serial.println("redLED, greenLED, yellowLED ON"); } }
//위에서 아래로 드래그할 경우(밝기를 올린다) else if(gap_X >= 0 && gap_X <= 3 && gap_Y > gap_X) { if(gap_Y > 0) { //드래그 되었을때 드래그 된 거리를 현재 밝기부터 255까지의 범위로 세분화 시킨다 brightness = map(gap_Y, 1, 13, result_Y, 255); constrain(brightness, 0, 255); }
//켜진 LED만 밝기를 올린다 if(stateRED) analogWrite(redLED, brightness); if(stateGREEN) analogWrite(greenLED, brightness); if(stateYELLOW) analogWrite(yellowLED, brightness); }
//오른쪽 아래부분을 눌렀을 때 모든 LED를 끈다 else if(first_X == touch_X && first_Y == touch_Y && first_X >= 8 && first_Y >= 12) { analogWrite(redLED, 0); analogWrite(greenLED, 0); analogWrite(yellowLED, 0); stateRED = false; stateGREEN = false; stateYELLOW = false; }
수박쨈