아두이노

아두이노 메가 2560 프로그래밍

모빌리티키즈 2025. 5. 24. 11:38
728x90
반응형

이 프로젝트는 아두이노 메가 2560, I2C LCD, CDS 센서, LM35 온도 센서, 스위치 3개, 주파수 발생기(SY-LD213), 그리고 초음파 센서를 활용하여 다양한 기능을 구현하는 시스템입니다. (전자산업기사 대비)

1️⃣ 회로 연결 방법

회로를 구성하기 위해 각 센서와 모듈을 아두이노 메가 2560과 연결합니다.

🔗 LCD I2C 연결

LCD 핀아두이노 메가 2560 핀설명
VCC 5V LCD 전원 공급
GND GND 그라운드 연결
SDA 20 (SDA) I2C 데이터 핀
SCL 21 (SCL) I2C 클록 핀

🎛️ CDS 센서 연결

CDS 핀아두이노 핀설명
VCC 5V 전원 공급
GND GND 그라운드 연결
SIGNAL A0 아날로그 입력
PULL-UP 10KΩ 풀업 저항 연결

🌡️ LM35 온도 센서 연결

LM35 핀아두이노 핀설명
VCC 5V 전원 공급
GND GND 그라운드 연결
SIGNAL A1 아날로그 입력
PULL-DOWN 10KΩ 풀다운 저항 연결

🔘 푸쉬버튼 스위치 연결

스위치 핀아두이노 핀설명
SW1 2 Mode 변경 버튼
SW2 3 Mode 선택 버튼
SW3 4 EEPROM 저장 버튼
PULL-UP 10KΩ 풀업 저항 연결

🔊 초음파 센서 연결

초음파 핀아두이노 핀설명
VCC 5V 전원 공급
GND GND 그라운드 연결
TRIG 7 신호 발생
ECHO 6 반사 신호 받기

⚡ 주파수 발생기(SY-LD213)

모듈 핀아두이노 핀설명
VCC 5V 전원 공급
GND GND 그라운드 연결
PWM_OUT 9 PWM 입력

2️⃣ 전체 소스 코드

아두이노 메가 2560을 기반으로 코드 작성해 보겠습니다.

 
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

// LCD 설정
#define LCD_I2C_ADDR 0x27
LiquidCrystal_I2C lcd(LCD_I2C_ADDR, 16, 2);

// 센서 및 버튼 핀 설정
#define CDS_PIN A0
#define TEMP_PIN A1
#define SW1 2
#define SW2 3
#define SW3 4
#define TRIG_PIN 7
#define ECHO_PIN 6
#define PWM_PIN 9

int mode = 1;
int cdsValue;
float tempValue;
int hours = 11, minutes = 59, seconds = 50;
int count = 0;

void setup() {
    lcd.init();
    lcd.backlight();
    pinMode(CDS_PIN, INPUT);
    pinMode(TEMP_PIN, INPUT);
    pinMode(SW1, INPUT_PULLUP);
    pinMode(SW2, INPUT_PULLUP);
    pinMode(SW3, INPUT_PULLUP);
    pinMode(TRIG_PIN, OUTPUT);
    pinMode(ECHO_PIN, INPUT);
    pinMode(PWM_PIN, OUTPUT);
    
    lcd.setCursor(0, 0);
    lcd.print("Digital Sensor");
    lcd.setCursor(0, 1);
    lcd.print("Number:");
    delay(2500);

    for (int i = 0; i < 5; i++) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Mode Button");
        lcd.setCursor(0, 1);
        lcd.print("A001 - Push SW1!");
        delay(500);
        lcd.clear();
        delay(500);
    }
}

void loop() {
    if (digitalRead(SW1) == LOW) {
        delay(50);
        if (digitalRead(SW1) == LOW) {
            mode = (mode == 1) ? 2 : 1;
            delay(500);
        }
    }
    
    if (mode == 1) {
        clockMode();
    } else {
        sensorMode();
    }
}

// ** CLOCK MODE **
void clockMode() {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Clock Mode");
    lcd.setCursor(0, 1);
    lcd.print("Push Select!");
    delay(1000);

    while (mode == 1) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("[Digital Clock]");
        lcd.setCursor(0, 1);
        lcd.print((hours < 12 ? "AM " : "PM "));
        lcd.print(hours);
        lcd.print(":");
        lcd.print(minutes);
        lcd.print(":");
        lcd.print(seconds);
        
        delay(10);
        seconds++;

        if (seconds >= 60) {
            seconds = 0;
            minutes++;
        }
        if (minutes >= 60) {
            minutes = 0;
            hours++;
        }
        if (hours >= 24) {
            hours = 0;
        }
        
        if (digitalRead(SW1) == LOW) {
            delay(50);
            if (digitalRead(SW1) == LOW) {
                mode = 2;
                delay(500);
                return;
            }
        }
    }
}

// ** SENSOR MODE **
void sensorMode() {
    while (mode == 2) {
        cdsValue = analogRead(CDS_PIN);
        tempValue = (analogRead(TEMP_PIN) * 5.0 / 1024.0) * 100;

        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("[Sensor Mode]");
        lcd.setCursor(0, 1);
        lcd.print("CDS:");
        lcd.print(cdsValue);
        lcd.print(" T:");
        lcd.print(tempValue);
        
        delay(1000);

        if (digitalRead(SW3) == LOW) {
            EEPROM.put(0, cdsValue);
            EEPROM.put(4, tempValue);
            EEPROM.put(8, hours);
            EEPROM.put(12, minutes);
            EEPROM.put(16, seconds);
        }

        if (distance() < 15) {
            mode = 1;
            return;
        }
    }
}

// 초음파 센서 거리 측정
float distance() {
    digitalWrite(TRIG_PIN, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG_PIN, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG_PIN, LOW);

    return pulseIn(ECHO_PIN, HIGH) * 0.034 / 2;
}

🎯 결론

이제 LCD 화면 구성, Mode 변경, 센서 데이터 표시, EEPROM 저장 및 초음파 초기화 기능을 모두 포함한 코드가 완성되었습니다! ✔ 시계 모드와 센서 모드 전환 기능센서 데이터 (CDS, 온도) 표시 및 EEPROM 저장초음파 센서를 활용한 초기화

이 코드를 실행해보고 추가 기능을 원하면 언제든지 알려주세요! 🚀😊 즐거운 코딩 되세요! 🎮✨

728x90
반응형