아두이노 mega2560 R3은 아두이노 플랫폼의 고급형 마이크로 컨트롤러 보드이다. 일반적인 아두이노 보다 많은 입출력 핀과 강력한 메모리 및 처리 성능을 제공한다. 메가 2560은 대형 프로젝트, 특히 많은 센서, 모터, LED 등을 연결해야 하는 복잡한 프로젝트에 적합하다.
![]() |
![]() |
![]() |
주요 사양 :
작동 전압 : 5V
디지털 입출력 핀 : 54개
아날로그 입력 핀 : 16개
PWM 출력 핀 15개
플래쉬 메모리 : 256KB
SRAM : 8KB
EEPROM : 4KB
클럭 속도 : 16MHz
USB 인터페이스 : USB 타입 B 커넥터를 통해 PC와 연결 가능
ICSP 헤더 : 외부 프로그래머로 펌웨어 업로드 가능
통신 포트 : UART(4개), I2C, SPI 지원
실습 예제 :
오늘은 아두이노 Mega2560 R3에 다양한 센서 및 모듈들을 사용하여 종합 프로젝트를 만들어 보겠다.
프로젝트 작동은 온도감지, 열감지, 가스감지, 거리측정, 조이스틱으로 방향 제어, 색상감지 등이다.
1. 온도감지는 DHT11 온도감지센서로 측정된 값을 LCD 디스플레이에 현시하여 준다.
2. 열감지는 열감지 센서에 열을 가하면 빨간색 LED 다이오가 켜지면서 부저모듈로 삑 소리를 출력한다.
3. 가스감지는 MQ-135 가스감지 센서를 사용하여 가스가 감지되면 경고음이 출력된다.
4. 거리 측정은 HC-SR04 초음파 센서를 사용하여 측정된 거리를 LCD 디스플레이에 출력한다.
5. 조이스틱 모듈로는 방향에 따라 LED 다이오드를 켜줌으로 방향을 제시하여 준다.
6. 색상감지는 GY-31 TCS230 TCS3200 색상인식 센서를 사용하여 감지된 색상에 따라 3색 LED에 색을 출력하여 준다.
사용된 부품 :
아두이노 Mega2560 R3 | 2004 20X4 LCD 디스플레이 | GY-31 TCS230 TCS3200 색상인식 센서 |
![]() |
![]() |
![]() |
조이스틱 모듈 | HW-072 화염감지 센서 | HC-SR04 초음파 센서 |
![]() |
![]() |
![]() |
DHT11 온습도 센서 | 부저 모듈 | MQ-135 가스감지 센서 |
![]() |
![]() |
![]() |
회로도 :
회로 연결은 위의 회로도와 아래 표를 참고하여 아두이노 Mega2560에 모든 센서들을 연결한다.
회로 연결 :
아두이노 Mega 2560 | 2004 20X4 LCD 디스플레이 | GY-31 TCS230 TCS3200 색상인식 센서 | 조이스틱 모듈 | HW-072 화염감지 센서 | HC-SR04 초음파 센서 | DHT11 온습도 센서 | 부저 모듈 | MQ-135 가스감지 센서 |
+5V | VCC | VCC | VCC | VCC | VCC | VCC | +5V | VCC |
GND | GND | GND | GND | GND | GND | GND | GND | GND |
D2 | DO | |||||||
D3 | ||||||||
D4 | S | |||||||
D5 | TRIG | |||||||
D6 | ECHO | |||||||
D7 | DO | |||||||
D8 | S | |||||||
D9 | S0 | |||||||
D10 | S1 | |||||||
D11 | S2 | |||||||
D12 | S3 | |||||||
D13 | OUT | |||||||
A0 | AO | |||||||
A1 | AO | |||||||
A2 | VRx | |||||||
A3 | VRy | |||||||
D22 | SW | |||||||
D20 SDA | SDA | |||||||
D21 SCL | SCL |
아두이노 Mega 2560 | 조이스틱 방향등 RED | 조이스틱 방향등 BLUE | 조이스틱 방향등 GREEN | 조이스틱 방향등 YELLOW | 색감지 출력 LED | 경고등 LED |
D46 | +핀 | |||||
D48 | +핀 | |||||
D50 | +핀 | |||||
D52 | +핀 | |||||
D14 | RED | |||||
D15 | GREEN | |||||
D16 | BLUE | |||||
D3 | +핀 |
위와같이 회로를 연결하면 다음과 같은 모습을 볼 것이다.
회로 연결이 모두 완성되면 아두이노 IED에 다음과 같이 코드를 작성한다.
전체 코딩 :
#include <Adafruit_LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 8
#define DHTTYPE DHT11
#define TRIG 5
#define ECHO 6
#define S0 9 // 컬러센서 D9
#define S1 10 // 컬러센서 D10
#define S2 11 // 컬러센서 D11
#define S3 12 // 컬러센서 D12
#define sensorOut 13 // 컬러센서 출력 D13
#define redPin 14 // LED red
#define greenPin 15 // LED green
#define bluePin 16 // LED blue
int redFrequency = 0;
int blueFrequency = 0;
int greenFrequency = 0;
DHT dht(DHTPIN, DHTTYPE);
// 주소는 보통 0x27 또는 0x3F입니다.
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int analogPin = A0; //아날로그 핀
const int digitalPin = 2; // 디지털
int gasLevel = 0; // 가스농도 변수
int gasDetected = 0; // 가스감지 변수
const int ledPin = 3; // LED 핀
const int buzzerPin = 4; // 부저핀
int flameSensorDigitalPin = 7; // 디지털 핀
int flameSensorAnalogPin = A1; // 아날로그 핀
int flameDetectedDigital;
int flameValueAnalog;
//조이스틱
const int VRx = A2; // X축 아날로그 핀
const int VRy = A3; // Y축 아날로그 핀
const int SW = 22; // 버튼 디지털 핀
const int redLED = 50; // 빨간 LED 핀
const int blueLED = 52; // 파란 LED 핀
const int greenLED = 48; // 녹색 LED 핀
const int yellowLED = 46; // 노란 LED 핀
void setup() {
lcd.init(); // LCD 초기화
lcd.backlight(); // 백라이트 켜기
// 컬러센서 핀모드 설정
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(ledPin, OUTPUT); // LED 핀을 출력 모드로 설정
pinMode(flameSensorDigitalPin, INPUT); // 디지털 핀 입력 모드 설정
// 주파수 스케일링을 20%로 설정
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
//조이스틱 LED
pinMode(SW, INPUT_PULLUP); // 버튼 핀을 풀업 저항과 함께 입력으로 설정
pinMode(redLED, OUTPUT); // LED 핀을 출력으로 설정
pinMode(blueLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
Serial.begin(9600); // 시리얼 통신 시작
pinMode(digitalPin, INPUT); //디지털핀 입력
dht.begin();
}
void loop() {
//조이스틱
int xValue = analogRead(VRx); // X축 값 읽기
int yValue = analogRead(VRy); // Y축 값 읽기
int buttonState = digitalRead(SW); // 버튼 상태 읽기
if (buttonState == HIGH) { // 버튼이 눌렸을 때
digitalWrite(redLED, HIGH);
digitalWrite(blueLED, HIGH);
digitalWrite(greenLED, HIGH);
digitalWrite(yellowLED, HIGH);
} else {
// 버튼이 눌리지 않았을 때 조이스틱 방향에 따라 LED 제어
if (xValue < 400) { // 왼쪽
digitalWrite(greenLED, HIGH);
} else {
digitalWrite(greenLED, LOW);
}
if (xValue > 600) { // 오른쪽
digitalWrite(yellowLED, HIGH);
} else {
digitalWrite(yellowLED, LOW);
}
if (yValue < 400) { // 위쪽
digitalWrite(redLED, HIGH);
} else {
digitalWrite(redLED, LOW);
}
if (yValue > 600) { // 아래쪽
digitalWrite(blueLED, HIGH);
} else {
digitalWrite(blueLED, LOW);
}
}
// 컬러감지 센서
// 빨간색 포토다이오드 설정
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
redFrequency = pulseIn(sensorOut, LOW);
Serial.print("R = ");
Serial.print(redFrequency);
delay(100);
// 파란색 포토다이오드 설정
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
blueFrequency = pulseIn(sensorOut, LOW);
Serial.print("B = ");
Serial.print(blueFrequency);
delay(100);
// 초록색 포토다이오드 설정
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
greenFrequency = pulseIn(sensorOut, LOW);
Serial.print("G = ");
Serial.print(greenFrequency);
delay(100);
// 검출된 색상을 기반으로 한 LED 제어
if (redFrequency > greenFrequency && redFrequency > blueFrequency) {
// Red LED 출력
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
} else if (greenFrequency > redFrequency && greenFrequency > blueFrequency) {
// Green LED 출력
digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH);
digitalWrite(bluePin, LOW);
} else if (blueFrequency > redFrequency && blueFrequency > greenFrequency) {
// Blue LED 출력
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, HIGH);
}
else if (redFrequency == greenFrequency && redFrequency == blueFrequency) {
// 모든 LED 출력
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, HIGH);
digitalWrite(bluePin, HIGH);
} else {
// 모든 LED 전부 꺼짐
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(bluePin, LOW);
}
// 열감지 센서
// 디지털 값 읽기
flameDetectedDigital = digitalRead(flameSensorDigitalPin);
if (flameDetectedDigital == HIGH) {
digitalWrite(ledPin, HIGH);
tone(buzzerPin, 1000); // 부저를 1kHz로 설정하여 소리 출력
lcd.setCursor(0, 0); // LCD 1행 2열에 출력
lcd.print("Flame : detection");
}
else {
digitalWrite(ledPin, LOW);
noTone(buzzerPin); // 부저 소리를 끔
lcd.setCursor(0, 0); // LCD 1행 2열에 출력
lcd.print("Flame : nodetection");
}
lcd.setCursor(0, 0); // LCD 1행 1열에 출력
lcd.print("Flame : ");
lcd.print(flameValueAnalog); // LCD에 센서값 출력
// MQ135 가스감지 센서
gasLevel = analogRead(analogPin); // 아날로그 값
lcd.setCursor(0, 1);
lcd.print("GAS LEVEL : ");
lcd.print(gasLevel);
/*
gasDetected = digitalRead(digitalPin);
if (gasDetected == LOW) {
digitalWrite(ledPin, HIGH);
tone(buzzerPin, 1000); // 부저를 1kHz로 설정하여 소리 출력
lcd.setCursor(0, 2);
lcd.print("detection");
}
else {
digitalWrite(ledPin, LOW);
noTone(buzzerPin); // 부저소리를 끔
lcd.setCursor(0, 2);
lcd.print("notetection");
}
*/
// DHT11 온습도 센서 측정
float h = dht.readHumidity(); // 습도 측정
float t = dht.readTemperature(); // 온도 측정(섭씨)
lcd.setCursor(0, 2);
lcd.print("T:");
lcd.print(t);
lcd.print("C");
lcd.setCursor(10, 2);
lcd.print("H:");
lcd.print(h);
lcd.print("%");
//초음파 센서 측정
// 초음파센서의 Trig에서 초음파를 발사하는 코드
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
// pulseIn 명령어를 통해 Echo핀에 초음파가 들어오는 시간 계산
// 반환된 값에 58.2를 나누어 시간을 cm로 변경
long distance = pulseIn(ECHO, HIGH) / 58.2;
lcd.setCursor(0, 3);
lcd.print("DISTANCE : ");
lcd.print(distance);
lcd.print(" Cm");
delay(1000);
lcd.clear();
}
위와 같이 코드 작성이 끝나면 아두이노 MEGA2560에 파일을 컴파일 후 업로드 하여준다.
그러면 다음과 같은 출력 결과를 볼 수 있다.
출력 결과 :
https://www.youtube.com/watch?v=UwSN2tD3eps
'아두이노 활용' 카테고리의 다른 글
128x64 LCD를 활용한 디지털 시계 및 온도계 (0) | 2023.07.11 |
---|---|
아두이노 음성인식 (0) | 2020.08.07 |