공부중

[Arduino] RGB LED, PWM 본문

프로그래밍/Arduino

[Arduino] RGB LED, PWM

복습 2025. 1. 24. 06:03
728x90

 

1. 이론 

 RGB LED

 

2. RGB LED 실습 

#define LED_R 11
#define LED_G 10
#define LED_B 9

void setup() {
  // Serial.begin(9600);
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);

}

void loop() {
  digitalWrite(LED_R, 255);  
  digitalWrite(LED_G, 145);  
  digitalWrite(LED_B, 98);  


}

 

 

 

 

 

 

 

3. LGB LED 랜덤 출력 

 

// 변수 선언
long randNumber1;
long randNumber2;
long randNumber3;

#define LED_R 11
#define LED_G 10
#define LED_B 9

void setup() {
  // 시리얼 통신 시작
  Serial.begin(9600);

  // 핀 모드 설정
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
}

void loop() {
  // 무작위 숫자 생성
  randNumber1 = random(0, 256); // 0에서 255 사이의 값을 생성
  randNumber2 = random(0, 256);
  randNumber3 = random(0, 256);

  // LED에 무작위 밝기 적용
  analogWrite(LED_R, randNumber1);
  analogWrite(LED_G, randNumber2);
  analogWrite(LED_B, randNumber3);

  // 생성된 무작위 수 출력
  Serial.print(randNumber1);
  Serial.print('/');
  Serial.print(randNumber2);
  Serial.print('/');
  Serial.print(randNumber3);
  Serial.println('/');
  
  // 500 밀리초 동안 대기
  delay(500);
}

 

 

 

4. 조도 센서로 밝기 제어 

// 조도 센서로 밝기 제어 

int pins_LED[] = {9, 10, 11};  // 예시로, PWM이 가능한 핀 번호를 지정

void setup() {
  Serial.begin(9600);
}

void loop() {
  int ADC_value = analogRead(A0);  // ADC 값
  int PWM_value = ADC_value >> 2;  // PWM 값
  // int PWM_value = ADC_value / 4;  // 위와 동일. ADC 값을 4로 나누어 0-255 범위로 조정

  Serial.print("ADC value: ");
  Serial.print(ADC_value);
  Serial.print(", PWM value: ");
  Serial.println(PWM_value);

  for(int i = 0; i < 3; i++){
    analogWrite(pins_LED[i], PWM_value);
  }

  delay(1000);
}

 

2칸 >>(비트 쉬프트 연산)을 하는 이유, 즉, 4로 나누는 이유 : 아날로그가 표현하는 값은 0~1023의 값을 표현하는데, PWM은 0~255의 값을 표현하기 떄문이다. 

 

 

 

 

 

 

 

 

5. PWM 신호를 사용하여 단음 재생 

부저 연결 

 

int piezo = 9; // 피에조 부저가 연결된 핀 번호
int sw = 8;    // 버튼이 연결된 핀 번호

int numTones = 8;  // 연주할 톤의 개수
int tones[] = {261, 294, 330, 349, 392, 440, 494, 523}; // 각 톤에 해당하는 주파수

void setup() {
  pinMode(piezo, OUTPUT); // 피에조 핀을 출력으로 설정
  pinMode(sw, INPUT_PULLUP); // 버튼 핀을 내부 풀업 저항을 사용한 입력으로 설정
}

void loop() {
  if (digitalRead(sw) == LOW) { // 버튼이 눌렸을 때
    for (int i = 0; i < numTones; i++) { // 모든 톤을 연주
      tone(piezo, tones[i]); // 피에조 부저에서 톤 출력
      delay(500); // 각 톤을 500ms 동안 연주
    }
    noTone(piezo); // 모든 톤 연주 후 부저 끄기
  }
}

 

 

6. 부저를 사용해서 노래 만들기 

말할 수 없는 비밀 시크릿 secret 앞부분 열심히 만들어봤다. 

너무 열심해 해서 영상까지 찍었다.

 

int piezo = 9; // 피에조 부저가 연결된 핀 번호
int sw = 8;    // 버튼이 연결된 핀 번호

int numTones = 50;  // 연주할 톤의 개수
int tones[] = {
  247, // 낮은 시
  330, // 미
  370, // 파#
  392, // 솔
  494, // 시
  440, // 라
  392, // 솔
  370, // 파#
  392, // 솔
  370, // 파#
  440, // 라
  523, // 높은 도
  0, 
  494, // 시
  440, // 라
  370, // 파#
  392, // 솔
  494, // 시
  659, // 높은 미
  0,
  440, // 라
  330, // 미
  392, // 솔
  370, // 파#
  440, // 라
  587, // 높은 레
  0, 
  294, // 레
  392, // 솔
  370, // 파#
  392, // 솔
  370, // 파#
  330, // 미
  392, // 솔
  523, // 높은 도
  0, 
  440, // 라
  494, // 시
  523, // 높은 도
  587, // 높은 레
  494, // 시
  392, // 솔
  0,
  330, // 미
  523, // 높은 도
  494, // 시
  440, // 라
  392,  // 솔
  440, // 라
  494 // 시
};

void setup() {
  pinMode(piezo, OUTPUT); // 피에조 핀을 출력으로 설정
  pinMode(sw, INPUT_PULLUP); // 버튼 핀을 내부 풀업 저항을 사용한 입력으로 설정
}

void loop() {
  if (digitalRead(sw) == LOW) { // 버튼이 눌렸을 때
    for (int i = 0; i < numTones; i++) { // 모든 톤을 연주
      tone(piezo, tones[i], 500); // 피에조 부저에서 톤 출력, 500ms 동안 지속
      delay(500); // 다음 톤 전에 대기
    }
    noTone(piezo); // 모든 톤 연주 후 부저 끄기
  }
}

 

 

 

 

728x90

'프로그래밍 > Arduino' 카테고리의 다른 글

[Arduino] 모터  (0) 2025.01.25
버스 공공데이터 활용  (0) 2025.01.25
[Arduino] 초음파 센서  (0) 2025.01.24
[Arduino] 온습도 센서(DHT11)  (0) 2025.01.23
[Arduino] 조도센서 CDS 실습  (0) 2025.01.23