본문 바로가기

Embedded/Arduino

Arduino_220706

https://arduino.stackexchange.com/questions/17355/playing-melody-with-tone-without-using-delay

 

#노래 두곡 번갈아 재생

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978


int piezoPin = 8; // 부저의 ⊕극을 오렌지 보드 8번에 연결 
int tempo = 200; // duration 옵션 값 설정 
int flag = 0;
int ledCount = 0;


void melody_1()
{
  int notes[25] = { NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, 
                 NOTE_G4, NOTE_E4,NOTE_G4, NOTE_G4, NOTE_E4, 
                 NOTE_E4, NOTE_D4, NOTE_G4,NOTE_G4, NOTE_A4,
                 NOTE_A4, NOTE_G4, NOTE_G4, NOTE_E4, 
                 NOTE_G4, NOTE_E4, NOTE_D4, NOTE_E4, NOTE_C4 }; 
  for (int i = 0; i < 12; i++) { 
    tone (piezoPin, notes[ i ], tempo); 
    delay (300); 
  } 
  //delay(100); // 멜로디 중간에 짧게 멈추는 용도 
 
  for (int i = 12; i < 25; i++) { 
    tone (piezoPin, notes[ i ], tempo); 
    delay(300); 
  } 
  
}


void melody_2()
{
  int melody[] = {
  NOTE_C5,NOTE_C5,NOTE_C5,NOTE_C5,NOTE_C5,
  NOTE_E5,NOTE_G5,NOTE_G5,NOTE_E5,NOTE_C5,
  NOTE_G5,NOTE_G5,NOTE_E5,NOTE_G5,NOTE_G5,NOTE_E5,
  NOTE_C5,NOTE_C5,NOTE_C5,

  NOTE_G5,NOTE_G5,NOTE_E5,NOTE_C5,
  NOTE_G5,NOTE_G5,NOTE_G5,
  NOTE_G5,NOTE_G5,NOTE_E5,NOTE_C5,
  NOTE_G5,NOTE_G5,NOTE_G5,

  NOTE_G5,NOTE_G5,NOTE_E5,NOTE_C5,
  NOTE_G5,NOTE_G5,NOTE_G5,NOTE_A5,NOTE_G5,
  NOTE_C6,NOTE_G5,NOTE_C6,NOTE_G5,
  NOTE_E5,NOTE_D5,NOTE_C5
  };
  
  int noteDurations[]={
  4,8,8,4,4,
  4,8,8,4,4,
  8,8,4,8,8,4,
  4,4,2,
  4,4,4,4,
  4,4,2,
  4,4,4,4,
  4,4,2,
  4,4,4,4,
  8,8,8,8,2,
  4,4,4,4,
  4,4,2
  };
 
 
  for (int i = 0; i < 49; i++) {
    int Durations = 1000/noteDurations[i];   
    tone(piezoPin, melody[i], Durations);    
    int pauseBetweenNotes = Durations *1.3 ;
    delay(pauseBetweenNotes);
    noTone(piezoPin);
  }
}

 
void setup() { 
  pinMode (piezoPin, OUTPUT); 
  Serial.begin(9600);
} 
 
void loop() { 
  int checkButton = digitalRead(2);
  if (checkButton == HIGH) {           
    if (flag == 0){                    
      flag = 1;
      ledCount = ledCount % 2;
      if(ledCount == 0){
        Serial.println("Melody #1");
        melody_1();
      }
      if(ledCount == 1){
        Serial.println("Melody #2");
        melody_2();
      }
      ledCount++;
    }
  }
  else {                            
    if (flag == 1) {
      flag = 0;           
    }
  }
  delay(100);                 
}

 

# PIEZO + LED(아기상어)

#define NOTE_C4  262
#define NOTE_D4  294
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_G4  392
#define NOTE_A4  440
 
#define PIEZO_PIN 8
 
int ledArr[] = {12,11,10,9};
int ledSize = sizeof(ledArr)/sizeof(int);
 
//notes in the melody:
int melody[] = {
  NOTE_C4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4,
  NOTE_C4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4,
  NOTE_C4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_E4,
  0,
  NOTE_C4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4,
  NOTE_C4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4,
  NOTE_C4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_E4,
  0,
  NOTE_A4, NOTE_G4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4,
  NOTE_C4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4,
  NOTE_C4, NOTE_D4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_E4,  
};
 
// note durations: 4 = quarter note, 8 = eighth note, etc
int noteDurations[] = {
  2, 2, 4, 4, 4, 8, 4, 8, 4,
  4, 4, 4, 4, 4, 8, 4, 8, 4,
  4, 4, 4, 4, 4, 8, 4, 8, 4, 4, 4, 2,
  2, 
  2, 2, 4, 4, 4, 8, 4, 8, 4,
  4, 4, 4, 4, 4, 8, 4, 8, 4,
  4, 4, 4, 4, 4, 8, 4, 8, 4, 4, 4, 2, 
  2, 
  2, 2, 4, 4, 4, 8, 4, 8, 4,
  4, 4, 4, 4, 4, 8, 4, 8, 4,
  4, 4, 4, 4, 4, 8, 4, 8, 4, 4, 4, 2, 
};
 
void setup(){
  for(int i=0; i<ledSize; i++)
    pinMode(ledArr[i], OUTPUT);
  
  for (int thisNote = 0; thisNote < sizeof(melody) / sizeof(melody[0]); thisNote++) {
    int noteDuration = 1000/noteDurations[thisNote];
    tone(PIEZO_PIN, melody[thisNote],noteDuration);
    ledON(melody[thisNote]);
 
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    
    noTone(PIEZO_PIN); 
    ledOFF();
  }
}
 
void loop(){}
  
void ledON(int piezo_melody)
{ 
  if((piezo_melody == NOTE_E4) || (piezo_melody == NOTE_G4))
   digitalWrite(ledArr[0],HIGH);
  if(piezo_melody == NOTE_C4)
   digitalWrite(ledArr[1],HIGH);
  if((piezo_melody == NOTE_A4) || piezo_melody == NOTE_D4)
   digitalWrite(ledArr[2],HIGH);
  if(piezo_melody == NOTE_F4)
   digitalWrite(ledArr[3],HIGH);      
}
 
void ledOFF()
{
  for(int i=0; i<ledSize; i++){
    digitalWrite(ledArr[i], LOW);
  }
}

 

# PIEZO + LED(학교종이 땡땡땡)

#define NOTE_C4  262
#define NOTE_D4  294
#define NOTE_E4  330
#define NOTE_G4  392
#define NOTE_A4  440
 
#define PIEZO_PIN 8
 
int ledArr[] = {12,11,10,9};
int ledSize = sizeof(ledArr)/sizeof(int);
  
int melody[] = {
NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, 
NOTE_G4, NOTE_G4, NOTE_E4,   
NOTE_G4, NOTE_G4, NOTE_E4, NOTE_E4,
NOTE_D4, 0,
NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4,
NOTE_G4, NOTE_G4, NOTE_E4,
NOTE_G4, NOTE_E4, NOTE_D4, NOTE_E4,
NOTE_C4,0};
 
int noteDurations[] = {
1,1,1,1,
1,1,2,
1,1,1,1,
3,1,
1,1,1,1,
1,1,2,
1,1,1,1,
3,1};
 
void setup() {
  for(int i=0; i<ledSize; i++)
    pinMode(ledArr[i], OUTPUT);
  
  for (int thisNote = 0; thisNote < 26; thisNote++) {
    int noteDuration = 250 * noteDurations[thisNote];
    tone(PIEZO_PIN, melody[thisNote],noteDuration);
    ledON(melody[thisNote]);
      
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(PIEZO_PIN);
    ledOFF();
  }
}
void loop() {}
  
void ledON(int piezo_melody)
{ 
  if((piezo_melody == NOTE_C4) || (piezo_melody == NOTE_D4))
   digitalWrite(ledArr[0],HIGH);
  if(piezo_melody == NOTE_E4)
   digitalWrite(ledArr[1],HIGH);
  if(piezo_melody == NOTE_G4)
   digitalWrite(ledArr[2],HIGH);
  if(piezo_melody == NOTE_A4)
   digitalWrite(ledArr[3],HIGH);      
}
 
void ledOFF()
{
  for(int i=0; i<ledSize; i++){
    digitalWrite(ledArr[i], LOW);
  }
}

RGB LED 제어

#define THR 350
int modeCount = 0;
int flag = 0;
int ledCount = 0;
 

void setup()
{
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(A0,INPUT);
  Serial.begin(9600);
}


void mode_selection(int mode)
{
  switch(mode%4){
    case 0:
    	digitalWrite(6,LOW);
    	digitalWrite(5,LOW);
    	digitalWrite(3,LOW);
    	ledCount++;
    	break;
    case 1:
    	digitalWrite(6,HIGH);
    	digitalWrite(5,LOW);
    	digitalWrite(3,LOW);
    	ledCount++;
    	break;
    case 2:
    	digitalWrite(6,LOW);
    	digitalWrite(5,HIGH);
    	digitalWrite(3,LOW);
    	ledCount++;
    	break;
    case 3:
    	digitalWrite(6,LOW);
    	digitalWrite(5,LOW);
    	digitalWrite(3,HIGH);
    	ledCount++;
    	break;
  }
}


void loop() {
  int inputValue = analogRead(A0);
  Serial.print("Sensor : ");
  Serial.print(inputValue);
  Serial.print(" Mode : ");
  Serial.println(modeCount);
  if (inputValue < THR){
    if(flag == 0){
      flag = 1;
      mode_selection(modeCount);
      modeCount++;
      ledCount = 0;
      delay(150);
    }
  }
  else if(inputValue > (THR+150)){
    if(flag == 1){
      flag = 0;
    }
  }
}

포토레지스터 값에 따라 LED켜기

void setup()
{
  pinMode(A0, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  int photoValue = analogRead(A0);
  Serial.println(photoValue);
  if(photoValue < 580){
    digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(12,HIGH);
  } 
  else{
    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
    digitalWrite(12,LOW);
  } 
}

# 포토레지스터(광센서) 동작하기

어두울때 값이 커짐

 

밝을때 값이 커짐

void setup()
{
  pinMode(A0, INPUT);
  Serial.begin(9600);
}
void loop()
{
  int photoValue = analogRead(A0);
  Serial.println(photoValue);
}

 

# RGB LED로 핑크 만들어보기

#define RED_LED 6
#define GREEN_LED 5
#define BLUE_LED 3
 
void setup()
{
   Serial.begin(9600);
   pinMode(RED_LED,OUTPUT);
   pinMode(BLUE_LED,OUTPUT);
   pinMode(GREEN_LED,OUTPUT);
}

void loop()
{
      analogWrite(RED_LED,255);
      analogWrite(GREEN_LED,105);
      analogWrite(BLUE_LED,180);
}

 

#시리얼로 LED켜기

#define RED_LED 10
#define BLUE_LED 8
#define GREEN_LED 9
 
void setup()
{
   Serial.begin(9600);
   pinMode(RED_LED,OUTPUT);
   pinMode(BLUE_LED,OUTPUT);
   pinMode(GREEN_LED,OUTPUT);
}

void loop()
{
  if(Serial.available() > 0){
    String str = Serial.readStringUntil('\n');
    Serial.print(str);
    if(str == "RED" || str == "red"){
      digitalWrite(RED_LED,HIGH);
      digitalWrite(GREEN_LED,LOW);
      digitalWrite(BLUE_LED,LOW);
      Serial.println(" : RED LED 켜짐");
    }
    else if(str == "off" || str == "OFF"){
      digitalWrite(RED_LED,LOW);
      digitalWrite(GREEN_LED,LOW);
      digitalWrite(BLUE_LED,LOW);
      Serial.println(" : LED 꺼짐");
    }
    else if(str == "BLUE" || str == "blue"){
      digitalWrite(RED_LED,LOW);
      digitalWrite(GREEN_LED,LOW);
      digitalWrite(BLUE_LED,HIGH);
      Serial.println(" : BLUE LED 켜짐");
    }
    else if(str == "GREEN" || str == "green"){
      digitalWrite(RED_LED,LOW);
      digitalWrite(GREEN_LED,HIGH);
      digitalWrite(BLUE_LED,LOW);
      Serial.println(" : Green LED 켜짐");
    }            
    else{
      Serial.println(" : 입력한 명령어가 없습니다.");
    }
  }
}

온습도 센서 사용하기 - 2

#include <DHT11.h>

#define RED_LED 10
#define BLUE_LED 8
#define GREEN_LED 9
int pin=A0;
DHT11 dht11(pin); 

void setup()
{
   Serial.begin(9600);
   pinMode(RED_LED,OUTPUT);
   pinMode(BLUE_LED,OUTPUT);
   pinMode(GREEN_LED,OUTPUT);
}

void loop()
{
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0)
  {
    Serial.print("온도:");
    Serial.print(temp);
    if(temp < 26.0f){
      digitalWrite(RED_LED,LOW);
      digitalWrite(GREEN_LED,LOW);
      digitalWrite(BLUE_LED,HIGH);

    }
    else if(temp>26.0f && temp < 30.0f){
      digitalWrite(RED_LED,LOW);
      digitalWrite(GREEN_LED,HIGH);
      digitalWrite(BLUE_LED,LOW);
    }
    else if(temp >= 30.0f){
      digitalWrite(RED_LED,HIGH);
      digitalWrite(GREEN_LED,LOW);
      digitalWrite(BLUE_LED,LOW);
    }
    
    Serial.print("C 습도:");
    Serial.print(humi);
    Serial.println("%");
  }
  else
  {
    Serial.println();
    Serial.print("Error No :");
    Serial.print(err);
    Serial.println();    

  }
  delay(2000); 
}

 

온습도 센서 사용하기

DHT11_library.zip
0.00MB

#include <DHT11.h>
int pin=A0;
DHT11 dht11(pin); 
void setup()
{
   Serial.begin(9600);
   pinMode(8,OUTPUT);
   pinMode(9,OUTPUT);
   pinMode(10,OUTPUT);
   pinMode(11,OUTPUT);
   pinMode(12,OUTPUT);
}

void loop()
{
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0)
  {
    Serial.print("온도:");
    Serial.print(temp);
    if(temp < 26.0f){
      digitalWrite(12,HIGH);
      digitalWrite(8,LOW);
      digitalWrite(9,LOW);
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
    }
    else if(temp>26.0f && temp < 30.0f){
      digitalWrite(12,LOW);
      digitalWrite(11,HIGH);
      digitalWrite(10,HIGH);
      digitalWrite(8,LOW);
      digitalWrite(9,LOW);
    }
    else if(temp >= 30.0f){
       digitalWrite(12,LOW);
      digitalWrite(8,HIGH);
      digitalWrite(9,HIGH);
      digitalWrite(10,LOW);
      digitalWrite(11,LOW);
    }
    
    Serial.print("C 습도:");
    Serial.print(humi);
    Serial.println("%");
  }
  else
  {
    Serial.println();
    Serial.print("Error No :");
    Serial.print(err);
    Serial.println();    

  }
  delay(2000); 
}

푸시버튼 사용하여 LED 켜기

VCC : 5V    / GND : 5V옆 GND  / OUT : 2번

int ledArr[] = {12,11,10,9,8};
int ledSize = sizeof(ledArr)/sizeof(ledArr[0]);
int delayTime = 200;
int count =0;
int buttonPin = 2;
int flag = 0;

void setup()
{
  for(int i=0; i<ledSize; i++)
    pinMode(ledArr[i],OUTPUT);
}

void led_on_LR()
{
  count = count % ledSize;
  for(int i=0; i<ledSize; i++){
    if(i == count){
      digitalWrite(ledArr[i],HIGH);
    }
    else{
      digitalWrite(ledArr[i],LOW);
    }
  }
  delay(delayTime);
  count++;
}

void led_on_RL()
{
  count = count % ledSize;
  for(int i=0; i<ledSize; i++){
    if(i == ledSize-1-count){
      digitalWrite(ledArr[i],HIGH);
    }
    else{
      digitalWrite(ledArr[i],LOW);
    }
  }
  delay(delayTime);
  count++;
}

void led_blink()
{
  for(int i=0; i<ledSize; i++){
    digitalWrite(ledArr[i],HIGH);
  }
  delay(delayTime);
  for(int i=0; i<ledSize; i++){
    digitalWrite(ledArr[i],LOW);
  }
  delay(delayTime);
}

void led_off()
{
  for(int i=0; i<ledSize; i++){
    digitalWrite(ledArr[i],LOW);
  }
}

void ledChange(int modeCount)
{
  if(modeCount%4 == 0)
  	led_off();
  else if(modeCount%4 == 1)
    led_on_LR();
  else if(modeCount%4 == 2)
    led_on_RL();
  else
    led_blink();
    
}

int modeCount = 0;
void loop()
{
  int inputValue = digitalRead(buttonPin);
  if (inputValue == HIGH) {           
    if (flag == 0){                    
      flag = 1;
      count=0;
      modeCount++;
    }
  }
  else {                            
    if (flag == 1) {
        flag = 0;                       
    }
  }
  ledChange(modeCount);
}

 

 

LED 제어하기

int ledArr[] = {12,11,10,9,8};
int ledSize = sizeof(ledArr)/sizeof(ledArr[0]);
int delayTime = 200;
int count =0;

void setup()
{
  for(int i=0; i<ledSize; i++)
    pinMode(ledArr[i],OUTPUT);
}

void led_on_LR()
{
  count = count % ledSize;
  for(int i=0; i<ledSize; i++){
    if(i == count){
      digitalWrite(ledArr[i],HIGH);
    }
    else{
      digitalWrite(ledArr[i],LOW);
    }
  }
  delay(delayTime);
  count++;
}

void loop()
{
   led_on_LR();
}

'Embedded > Arduino' 카테고리의 다른 글

lilyPad v220708  (0) 2022.07.08
lilyPad v220707  (0) 2022.07.07
Arduino v220704  (0) 2022.07.04
RC카+아두이노TEST  (0) 2022.06.18
lilyPad_v220429  (0) 2022.04.29