아두이노 선택하기 우노 VS 나노 VS 미니 차이(feat.핀맵) 안녕하세요. 공대 박형입니다. 오늘은 아두이노 보드 우노, 나노, 미니의 차이에 대해 알아보겠습니다. 일반적으로 사람들이 아두이노를 접할 때는 우노 보드를 많이 접합니다. 가장 사용화되어있기도 하고 처음 사용하기에 부담 없는 가격과 성능을 가지고 있기 때문이죠. 저도 처음 아두이노란 보드를 봤을 때 우노 보드였습니다. 그 당시에는 아두이노 보드에 종류가 있다고 생각하지 않았고, '아두이노' = '아두이노 우노'라고 알고 있었습니다. 그러다 작품 제작을 위해 아두이노가 더 작았으면 좋겠다고 생각하여 정보를 알아봤고, 알아보던 중 나노를 발견하고 아두이노에 많은 종류가 있다는 것을 알게 되었습니다. 자 이제 아두이노 우노, 나노, 미니를 비교..
척도 NS란? (N.S NTS) 안녕하세요. 공대 박형입니다. 오늘은 척도의 NS에대해 알아보겠습니다. 결론부터 말씀드리면 NS는 Non Scale 의 약자로써 실제 형상과 도면에 작도한 형상의 척도가 맞지 않다는 뜻입니다. N.S라고 표기하기도하며 비슷하게 NTS라고 Not To Scale 이라고 표기하기도 합니다. 주로 도면을 작도하는데 척도가 방해가되고, NS를 사용해도 형상을 이해하는 부분에서 방해가되지 않을 때 사용합니다. 척도는 도면의 표제란에 기입합니다. NS를 사용하는 경우 도면의 한 부분의 상세도를 작성할 때 추가로 척도를 기입 할 필요가 없습니다. 도면을 검도하던 중 NS를 적용하는 도면에서 상세도에 따로 척도를 기입하는 오류를 발견하여 글을 게시하게 되었습니다. 나무가 모여 숲을 이루..
[복사하고 따라하는 아두이노] 아두이노 온습도센서 제어(feat.DHT22) 안녕하세요. 공대 박형입니다. 오늘은 아두이노에서 온습도 센서를 사용하는 방법을 알아보고, 온습도 센서를 통해 LED를 제어해보겠습니다. 우선 아두이노에서 DHT온습도센서(11버전, 22버전 모두)를 사용하기 위해서는 온습도센서 관련 정보가 담겨있는 라이브러리를 추가해야 합니다. 라이브러리란 자주 사용하는 변수, 함수 등을 따로 한 파일에 미리 지정하여 저장하고, 그 지정한 파일을 불러옴으로써 내가 작성하는 코드에서 변수나 함수를 정의하지 않아도 불러온 파일에 있는 함수, 변수를 사용할 수 있는 기능이 있습니다. 사용하기 복잡하거나 까다로운 센서 같은 경우는 제조사에서 센서를 사용하기 쉬운 환경을 제공하기위해 라이브러리를 추가로..
앱인벤터 시작하기(어플리케이션 만들기) 안녕하세요 공대 박형입니다. 오늘은 앱을 제작할수 있는 앱인벤터 사이트에대해 소개해드리고 사용방법을 알려드리겠습니다. 앱 인벤터는 MIT 공대와 구글의 합작으로 간단한 어플리케이션을 만들 수 있는 도구입니다. 문자 코딩이 필요하지 않고 블록 코딩으로 프로그램을 제작하기 때문에 코딩이 익숙하지 않은 분들도 쉽게 따라하여 앱을 제작할 수 있습니다. 우선 아래 사이트에 접속합니다. appinventor.mit.edu/ MIT App Inventor | Explore MIT App Inventor MIT App Inventor for iOS on the App Store It is with great pleasure that the App Inventor team anno..
Fritzing 다운로드(구버전 무료 다운로드) 안녕하세요 공대 박형입니다. 오늘은 회로 제작 프로그램인 Fritzing 다운로드 방법에대해 알아보겠습니다. 우선 저는 학생때부터 띵커캐드를 사용해 간단한 회로를 작성하고 시물레이션했습니다. 실제 보드와 센서들로 실험을 하기 전 가상의 환경에서 실험을 할 수 있다는 점에서 매우 편리하다고 느껴 계속 사용해왔습니다. 하지만 띵커캐드 사용중에 가장 불편하게 느꼈던 부분은 내가 사용하고 싶은 부품이 없는 경우가 많다는 것이었습니다. 기본적인 저항, 다이오드, 센서는 사용할 수 있지만 통상적으로 많이 사용하지 않는 지문인식센서, 블루투스 센서 등을 포함한 회로는 띵커캐드에서 구현할 수 없습니다. 그래서 이와같은 문제를 해결하기위한 방법도 알아보았지만 마땅한 해결책..
[복사하고 따라하는 아두이노] 아두이노 블루투스 LED제어(feat.앱인벤터,HC-06) 안녕하세요 공대 박형입니다. 오늘은 블루투스 센서 HC-06을 통해 아두이노와 스마트폰을 무선 통신하여 LED를 제어해보겠습니다. 스마트폰을 이용해 아두이노와 자유롭게 통신하기위해 앱인벤터를 통해 간단한 앱도 제작해 보겠습니다. 코드부터 보시죠 #include // 블루투스 통신을 위한 라이브러리를 가져온다. SoftwareSerial BSerial(2, 3); // (RX, TX) int LED = 13; char data; void setup(){ BSerial.begin(9600); Serial.begin(9600); pinMode(13, OUTPUT); // led 제어 핀 } void loop(){ if (..
아두이노 케이블 연결 확인 안녕하세요. 오늘은 많은 분들이 아두이노를 시작하기에 앞서 어려움을 겪고 있는 부분에 대해 얘기하고 해결해보도록 하겠습니다. 아두이노를 사용하기위해서는 실물 아두이노 보드와 PC에서 코드를 업로드 하기 위한 소프트웨어 아두이노 IDE 그리고 아두이노 보드와 PC를 연결해줄 케이블이 필요합니다. 보드와 소프트웨어가 모두 준비가 되었다면 케이블을 통해 코딩한 내용을 보드에 업로드하여 아두이노를 동작시킬 수 있습니다. 하지만 분명 아두이노보드와 PC를 연결한 거 같은데 아두이노가 동작되지 않는다면??? 이 과정에서 문제가 발생했을 수 있습니다. 이를 해결하기 위해 아두이노보드와 PC가 연결되었는지 확인하는 방법을 알려드리겠습니다. 우선 PC와 아두이노보드의 케이블을 연결하고 아두이노..
ROM VS RAM VS Flash (Memory) 안녕하세요 공대 박형입니다. 오늘은 롬과 램 그리고 플래시 메모리의 차이점에 대해 알아보겠습니다. 3개의 메모리는 모두 컴퓨터 메모리이지만 RAM, ROM 및 플래시 메모리는 각각 독자적인 방식 데이터와 상호 작용합니다. 다음으로 각 유형의 메모리에 대해 간단히 설명하겠습니다 RAM (Random Access Memory) 랜덤 액세스 메모리의 약자로 마이크로프로세서가 읽고 쓸 수 있는 메모리입니다. 전원이 꺼지면 데이터가 저장되지 않는 휘발성 메모리입니다. 데이터 속도가 빠르다는 장점이 있지만 가격이 비싸다는 단점이 있습니다. 데이터 속도가 빠르기 때문에 의 주 작업은 램에서 처리됩니다. RAM에 대한 자세한 내용은 아래 링크에서 확인할 수 있습니다...
Flash Memory 플래시 메모리란?(Flash Memory) 안녕하세요 공대 박형입니다. 오늘은 플래시메모리에대해 알아보겠습니다. 플래시 메모리는 개인용 컴퓨터와 디지털 기기 간의 스토리지 및 데이터 전송에 사용되는 비휘발성 메모리 칩입니다 전자적으로 프로그램을 재작성하고 소거할 수 있는 특징을 가지고 있습니다. USB 플래시 드라이브, MP3플레이어, 디지털카메라 및 솔리드 스테이트 드라이브에 많이 사용됩니다. 플래시 메모리는 EEPROM의 일종입니다. EEPROM은 'ROM이란?' 게시글에 자세한 내용이 게시되어있습니다. https://engineerparkbro.tistory.com/m/33 ROM 롬이란?(Read Only Memory) ROM 롬이란?(Read Only Memory) 안녕하..
RAM 램이란?(Random Access Memory) 안녕하세요 공대 박형입니다. 오늘은 RAM에대해 알아보겠습니다. RAM 랜덤 액세스 메모리는 컴퓨터의 메인 메모리로써 운영체제 애플리케이션 프로그램 및 현재 사용 중인 데이터가 디바이스의 프로세서를 통해 신속하게 도달할 수 있도록 유지되는 컴퓨팅 디바이스 내의 하드웨어입니다. 램은 컴퓨터의 메인 메모리로 하드 디스크 드라이브(HDD), 솔리드 스테이트 드라이브(SSD) 등 다른 종류의 저장 메모리보다 판독이나 기입 속도가 빠르다는 특징이 있습니다. 랜덤 액세스 메모리는 휘발성 메모리입니다. 즉 데이터는 컴퓨터의 전원이 들어가 있는 동안은 저장된 데이터가 유지되지만 컴퓨터의 전원을 끄면 데이터는 없어집니다. 컴퓨터를 재부팅하면 OS 및 기타 파일이 R..
[복사하고 따라하는 아두이노] 아두이노 압력센서 사용(feat.FSR402) 안녕하세요 공대 박형입니다. 오늘은 아두이노 압력센서를 사용해보겠습니다. 코드부터 보시죠. int Led = 13; int FSRsensor = A0; // 센서값을 아나로그 A0핀 설정 int value = 0; // loop에서 사용할 변수 설정 void setup() { pinMode(Led, OUTPUT); Serial.begin(9600); } void loop() { value = analogRead(FSRsensor); // 아날로그 센서값을 value 변수에 저장 Serial.println(value); // 센서값을 시리얼 모니터에 출력 value = map(value, 0, 1023, 0, 255); // va..
ROM 롬이란?(Read Only Memory) 안녕하세요 공대 박형입니다. 오늘은 롬에대해 알아보겠습니다. ROM(Read Only Memory)는 읽기 전용 메모리의 약자로 정보를 영속적으로 보존하는 메모리 디바이스 또는 기억매체입니다 또한 랜덤 액세스 메모리(RAM)과 함께 컴퓨터의 프라이머리 메모리 유닛이기도 합니다 컴퓨터와 기타 수많은 종류의 전자제품에는 ROM 칩이 있습니다. 게임기 자동차 라디오는 모두 ROM을 사용하여 원활하게 작동합니다. ROM 칩은 플래시 드라이브나 기타 보조 메모리 디바이스 등의 외부 유닛에 내장되어 있거나 이동식 칩 상의 디바이스의 하드웨어에 탑재되어 있습니다. ROM과 같은 비휘발성 메모리는 전원이 없어도 사용 가능합니다. ROM은 제작 될 때 의 제작사에서 프로그..
[복사하고 따라하는 아두이노] 아두이노 EEPROM(feat.put&get) 안녕하세요. 공대 박형입니다. 오늘은 아두이노 EEPROM put, get 함수 예제를 실습해보겠습니다. 아두이노 EEPROM에서는 5개의 함수가 있습니다. 1.write : EEPROM의 인덱스에 전달된 매개변수 값을 저장 2.read : 매개변수로 전달되는 인덱스에 저장되어 있는 1바이트값을 읽어와서 반환 3.update : EEPROM의 인덱스에 저장된 ㄱ밧이 전달된 매개변수 값과 다를 경우 값을 저장 4.put : EEPROM의 위치에 전달된 데이터(구조체)를 저장 5.get : 매개변수로 전달되는 위치에 저장되어 있는 데이터를 가져옴 이번 시간에는 put 와 get함수를 실습해 보겠습니다. 대체적으로 많이 사용하는 방법..
[복사하고 따라하는 아두이노] 아두이노 EEPROM(feat.write&read) 안녕하세요. 공대 박형입니다. 오늘은 아두이노 EEPROM write, raed 함수 예제를 실습해보겠습니다. 아두이노 EEPROM에서는 5개의 함수가 있습니다. 1.write : EEPROM의 인덱스에 전달된 매개변수 값을 저장2.read : 매개변수로 전달되는 인덱스에 저장되어 있는 1바이트값을 읽어와서 반환3.update : EEPROM의 인덱스에 저장된 ㄱ밧이 전달된 매개변수 값과 다를 경우 값을 저장4.put : EEPROM의 위치(location)에 전달된 데이터(구조체)를 저장5.get : 매개변수로 전달되는 위치(location)에 저장되어 있는 데이터를 가져옴 이번 시간에는 write 와 read기능을 실습..
[복사하고 따라하는 아두이노] 아두이노 인터럽트 기능 안녕하세요 공대 박형입니다. 오늘은 아두이노 인터럽트 예제를 실습해보겠습니다. 코드부터 보시죠. const int r_led = 13; int sw = 2; void setup() { Serial.begin(9600); pinMode(sw, INPUT); pinMode(r_led, OUTPUT); attachInterrupt(0, r_led_off, RISING); // D2 의 신호가 0에서 1이될 때 r_led_off 함수 실행 } void loop() { digitalWrite(r_led, HIGH); delay(2000); digitalWrite(r_led, LOW); delay(2000); } void r_led_off() { digitalW..
[복사하고 따라하는 아두이노] 아두이노 타이머 사용하기 안녕하세요 공대 박형입니다. 오늘은 아두이노 타이머 예제를 실습해보겠습니다. 코드부터 보시죠. int led = 13; void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); } 이 코드에서 delay함수를 이용해 1초 동안 코드 처리를 중단시킵니다. 하지만 digitalWrite(led, HIGH);함수를처리하는시간은고려되지않았습니다. 즉 이와 같은 방법으로는 정확히 1초 간격으로 깜박이지 않고 오차가 발생합니다. 다른 방법으로 코드를 작성해보겠습니다. int led = 13;..
[아두이노 필수 이론] 아두이노 EEPROM이란? 안녕하세요 공대 박형입니다. 오늘은 비휘발성 메모리 ROM의 한 종류로 아두이노에 내장되어있는 EEPROM을 학습하겠습니다. 아두이노에는 EEPROM 1KB용량을 내장하고 있습니다. 비휘발성메모리이므로 아두이노의 전원을 꺼도 아두이노에 데이터가 남아있으므로 다음에 전원을 켰을 때 EEPROM에 저장한 데이터를 다시 사용할 수 있습니다. 예를들어 프로그램을 시작할 때 센서의 어떤 값을 조정해야한다고 가정합시다. 이 때 EEPROM에 조정된 데이터를 저장해두면 아두이노를 킬 때마다 매번 조정 할 필요가 없어집니다. 이 외에도 사용자가 어떻게 사용하느냐에따라 여러 값을 저장할 수 있어 매우 편리한 기능입니다. 하지만 다음 아두이노에서 EEPROM을 사용할 때 ..
[아두이노 필수 이론] 아두이노 인터럽트 사용법 안녕하세요 공대 박형입니다. 오늘은 아두이노 인터럽트에대해 알아보겠습니다. MCU에서 인터럽트는 소프트웨어가 가 이상 행동을하여 이벤트에 의한 프로세서의 응답입니다. 인터럽트 조건은 프로세서 인터럽트가 허가되었을 때 프로세서가 현재 실행중의 코드를 인터럽트해(정지해) 이벤트를 시기적절하게 처리하기 위한 요구입니다. 인터럽트 요구가 받아들여지면 프로세서는 현재의 실행을 일시 정지하고 그 상태를 저장하고 인터럽트 이벤트를 처리하기 위해 인터럽트 핸들러또는 인터럽트 서비스 루틴 라고 불리는 기능을 실행합니다. 이 인터럽트는 일시적인 것으로 인터럽트가 치명적인 에러를 나타내지 않는 한 인터럽트 핸들러의 종료후에 프로세서는 진핸중이던 동작을 재개합니다. 인터럽트는 ..
[아두이노 필수 이론] 아두이노 타이머 사용법 안녕하세요 공대 박형입니다. 오늘은 아두이노 타이머 기능에대해 알아보겠습니다. 우선 타이머에대해 설명드리겠습니다. 타이머는 주로 카운커와 함께 사용되며 MCU를 컨트롤하는데 매우 중요합니다 .이름이 나타내듯이 타이머는 시각과 카운트를 식별할 수 있습니다.이를 이용해LED 제어, 서보 각도 제어, PWM펄스 폭 변조 등 다양한 기능으로 구현됩니다. 그러나 처음에 마이크로 컨트롤러 내부 혹은 외부에 클락이 있음을 알아두는 것이 중요합니다. 실제로 모든 마이크로컨트롤러에는 클락이 내장되어 있습니다. 그렇지 않다면 마이크로컨트롤러 외부에 있는 클럭을 사용해야합니다. 마이크로컨트롤러에는 클락이 필요하고 프로그램이 클락에 맞춰 동작하게 됩니다. 이게 마이크로 컨트롤러의..
[복사하고 따라하는 아두이노] 아두이노 서보모터 제어 안녕하세요 공대 박형입니다. 오늘은 서보모터를 제어해보겠습니다. 코드부터 보시죠 #include Servo servo; const int servo_motor=3; int angle = 90; void setup() { Serial.begin(9600); servo.attach(servo_motor); servo.write(angle); } void loop() { servo.write(angle); Serial.print("angle = "); Serial.println(angle); delay(2000); angle += 20; if ( angle == 190) angle = 10; } 동작 영상입니다. 1초마다 각도를 20도씩 증가시키고, 각도가..
안녕하세요 공대 박형입니다. 오늘은 L293D모터 드라이버 IC를 사용하여 DC모터의 방향과 속도를 제어해보겠습니다. 코드부터 보시죠. const int enable = 11; // 속도 조정핀 const int left = 6; // 방향 조절핀 1 const int right = 5; // 방향 조절핀 2 int speed = 0; // 속도 조절 변수 int direction = 0; // 방향 조절 변수 void setup() { Serial.begin(9600); pinMode(enable,OUTPUT); pinMode(left,OUTPUT); pinMode(right,OUTPUT); Serial.println("Program start\nRight direction\n"); } void loo..
[복사하고 따라하는 아두이노] DC모터 속도 제어(feat. PWM ) 안녕하세요 공대 박형입니다. 오늘은 아두이노 DC모터를 구동시키고 PWM제어를통해 속도조절을 해보겠습니다. 코드부터 보시죠 const int dc=11; int speed = 0; void setup() { Serial.begin(9600); pinMode(dc,OUTPUT); } void loop() { analogWrite(dc,speed); Serial.print("speed = "); Serial.println(speed); speed = speed +85; // 속도를 0, 85, 170, 255, 0...순으로 if ( speed > 255 ) speed=0; // 속도가 255초과되면 0으로 변환 delay(1000); ..
안녕하세요. 공대 박형입니다. 오늘은 아두이노 초음파센서를 알아보겠습니다. 코드부터 보시죠. ( 3핀 초음파 센서 ) int distance = 0; void setup () { Serial.begin (9600); } void loop() { pinMode(9, OUTPUT); //출력 모드 digitalWrite(9, HIGH); // 초음파 송출 delay(10); digitalWrite(9, LOW); // 초음파 송출 정지 pinMode(9, INPUT); // 입력 모드 distance = 0.01723 * pulseIn(9, HIGH); // 들어온 값을 0.01723과 곱하여 거리 계산 Serial.print(distance); //계산된 거리를 cm로 출력 Serial.println(" ..
안녕하세요 공대 박형입니다. 오늘은 아두이노 pir센서를 사용해보겠습니다. 코드부터 보시죠 int g_led = 9; // 초록 led 핀 int b_led = 10; // 파란 led 핀 int r_led = 11; // 빨간 led 핀 void setup() { Serial.begin(9600); pinMode(g_led, OUTPUT); pinMode(b_led, OUTPUT); pinMode(r_led, OUTPUT); } void loop() { char data = Serial.read(); // 시리얼 값 data변수에 저장 if (data == 'g'){ digitalWrite(g_led, HIGH); // 초록 led는 키고 나머지는 off digitalWrite(b_led, LOW); ..
안녕하세요. 공대 박형입니다. 오늘은 아두이노 반복문 ( for )사용 방법을 학습하겠습니다. 반복문은 주어진 조건이 참일 때 for문 안의 코드를 반복해서 실행시켜주는 방법입니다. 주로 똑같은 동작을 반복하거나 여러 동작을 순차적으로 동작시키기위해 사용합니다. 아두이노에서 사용되는 void loop도 무한 반복문입니다. setup문을 한번 동작한 다음에 loop문을 무한으로 동작시키는 방식인데 for문 같은 경우는 동작하기 위한 조건을 제시하며 사용합니다. for문 사용 방법입니다. for ( 초기 처리 부문; 조건 부문; 변화 처리 부문) 실제로 코드를 작성하고 동작을 확이하며 학습해보겠습니다. 저번시간에 실습했던 예제를 for문을 사용하는 코드로 변환하며 실습해보겠습니다. const int sw =..
안녕하세요. 공대 박형입니다. 오늘은 제어문 if에대해 알아보겠습니다. 제어문은 크게 두가지로 나뉘는데 사용 방법에따라 조건 제어문과 반복 제어문으로 분류됩니다. 복잡한 동작을 할 수행할 때는 제어문을 사용해 프로그램을 작성하면 보다 쉽고 간결하게 프로그램을 작성할 수 있습니다. 대표적인 조건 제어문인 if문은 주어진 조건일 참(True)일 경우 작성한 코드를 실행시키고 거짓(False)일 경우 코드를 실행시키지 않고 다음 코드를 넘어가는 방식입니다. 순서도로 표현하면 아래와 같습니다. 코드 사용법은 아래와 같습니다. if ( 조건 ){ 동작 할 코드 } ex) const int sw = 7; const int led = 13; void setup() { Serial.begin(9600); pinMode..
안녕하세요 공대 박형입니다. 오늘은 아두이노 시리얼 통신을 통해 데이터를 read 해보겠습니다. 코드부터 보시죠. int g_led = 9; // 초록 led 핀 int b_led = 10; // 파란 led 핀 int r_led = 11; // 빨간 led 핀 void setup() { Serial.begin(9600); pinMode(g_led, OUTPUT); pinMode(b_led, OUTPUT); pinMode(r_led, OUTPUT); } void loop() { char data = Serial.read(); // 시리얼 값 data변수에 저장 if (data == 'g'){ digitalWrite(g_led, HIGH); // 초록 led는 키고 나머지는 off digitalWrite(..
안녕하세요 공대 박형입니다. 오늘은 아두이노 시리얼 통신을 통해 데이터를 read 해보겠습니다. 코드부터 보시죠. void setup() { Serial.begin(9600); } void loop() { if (Serial.available()){ // 만약 시리얼 통신이 온다면 char data = Serial.read(); // 시리얼 통신 값을 문자형변수 data에 저장 Serial.println(data); // 그 값을 출력 } delay(100); } 짤과 같이 시리얼 모니터를 통해 정보를 전달하면 전달한 값을 data변수에 저장하고 시리얼 모니터에 출력합니다. 하지만 char변수는 문자는 저장 가능하지만 "mom"이나 "15"같은 문자가 하나 이상인 문자열은 한번에 출력하지 못하고 하나씩 ..
안녕하세요 공대 박형입니다. 오늘은 아두이노 가변저항 제어를 해보겠습니다. 코드부터 보시죠. void setup() { Serial.begin(9600); } void loop() { int data = analogRead(A5); // A5에 연결된 가변저항의 아날로그값을 data변수에 저장 Serial.println(data); delay(100); } 회로도입니다. 가운데 선을 아날로그핀(A5)으로 연결하고 나머지 두 핀을 전원과 그라운드에 연결하면 됩니다. 실제 가변저항은 저런 모양의 것을 많이 사용합니다. 띵커캐드로 작성한 회로도와 같이 가운데 선이 아날로그 신호선, 나머지 선을 전원과 그라운드에 각각 연결하면 됩니다. 가변저항 아날로그 값을 디지털값으로 변환하여 손잡이를 돌릴 때 data변수 ..
안녕하세요 공대 박형입니다. 오늘은아두이노 조도센서세요 공대 박형입니다. 오늘은아두이노 조도센서 제어를 해보겠습니다. 코드부터 보시죠. int cds = A0; int cds_val; void setup() { Serial.begin(9600); } void loop() { cds_val = analogRead(cds); Serial.println(cds_val); delay(100); } 회로도입니다. 아날로그 핀을통해 조도센서의 빛의 세기 값을 사용할 수 있습니다. 전원부에는 1k옴 저항을 달았습니다. 조도센서를 통해 빛의 밝기에 따라 아날로그 데이터 값을 출력하는 프로그램을 완성했습니다. 시리얼 모니터를 통해 밝기에 따라 값이 변화하는것을 확인할 수 있습니다. 빛이 강할 때는 0에 가까운 숫자를, ..