본문 바로가기

Embedded/Arduino

lilyPad_v220428

#FADE / Blink 동시에 진행

#define UP 0
#define DOWN 1

int ledArr[] = {10, 9, 3};
 
int ledSize = sizeof(ledArr) / sizeof(ledArr[0]);
const int minPWM = 0;
const int maxPWM = 255;

byte fadeDirection = UP;
int fadeValue = 0;
byte fadeIncrement = 5;
unsigned long previousFadeMillis;
unsigned long previousMillis;

int fadeInterval = 20;

int ledState = LOW;
int blinkInterval = 1000;

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

void doTheFade(int *pwmPin, unsigned long thisMillis) {
   if (thisMillis - previousFadeMillis >= fadeInterval) {
      if (fadeDirection == UP) {
         fadeValue = fadeValue + fadeIncrement;
         if (fadeValue >= maxPWM) {
            fadeValue = maxPWM;
            fadeDirection = DOWN;
         }
      } else {
         fadeValue = fadeValue - fadeIncrement;
         if (fadeValue <= minPWM) {
            fadeValue = minPWM;
            fadeDirection = UP;
         }
      }
      for(int i=0; i<ledSize; i++)
      	analogWrite(ledArr[i], fadeValue);
      previousFadeMillis = thisMillis;
   }
}

void doTheBlink(int ledPin, unsigned long thisMillis)
{
  if (thisMillis - previousMillis >= blinkInterval) {
    
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
    previousMillis = thisMillis;
  }
}

void loop() {
  unsigned long currentMillis = millis();
  doTheFade(ledArr, currentMillis);
  doTheBlink(2, currentMillis);
}

 

# 3개의 LED 연속 FADE 

int ledArr[] = {10, 9, 3};
int fadeTime = 20;
 
int ledSize = sizeof(ledArr) / sizeof(ledArr[0]);
int brightness = 0;
 
void setup()
{
  for(int i=0; i<ledSize; i++)
  	pinMode(ledArr[i], OUTPUT);
  Serial.begin(9600);
}

void fade_one(int pinNum, int fadeInterval)
{
    for (brightness = 0; brightness <= 255; brightness += 5) {
      analogWrite(pinNum, brightness);
      delay(fadeInterval); 
    }
    for (brightness = 255; brightness >= 0; brightness -= 5) {
      analogWrite(pinNum, brightness);
      delay(fadeInterval); 
    }
}

void fade_all(int *pins, int size, int fadeInterval)
{
    Serial.println( sizeof(pins));  
  
    for (brightness = 0; brightness <= 255; brightness += 5) {
      for(int i=0; i<size; i++){
      	analogWrite(pins[i], brightness);
      }
      delay(fadeInterval); 
    }
    for (brightness = 255; brightness >= 0; brightness -= 5) {
      for(int i=0; i<size; i++){
      	analogWrite(pins[i], brightness);
      }
      delay(fadeInterval); 
    }
}

void loop()
{
  fade_all(ledArr, ledSize, fadeTime);
  for(int i=0; i<ledSize; i++){
    fade_one(ledArr[i],fadeTime); 
  }
}

# 시리얼 통신으로 제어하기

int ledArr[] = {10,9,3,2};
const long interval = 100;
 
String str;
int ledSize = sizeof(ledArr) / sizeof(ledArr[0]);
 
unsigned long previousMillis = 0;
int modeSelect = 0;
int ledCount = 0;
 
#define LED_OFF 0
#define LED_ON 1
#define LED_UP 4
#define LED_DOWN 5
 
 
void setup()
{
  for(int i=0; i<ledSize; i++)
  	pinMode(ledArr[i], OUTPUT);
  Serial.begin(9600); // 시리얼 통신 시작
}
 
void led_on()
{
  for(int i=0; i<ledSize; i++){
    digitalWrite(ledArr[i],HIGH);
  }
}
 
void led_off()
{
  for(int i=0; i<ledSize; i++){
    digitalWrite(ledArr[i],LOW);
  }
}
 
void led_up(int count)
{
  
  int i = ledSize - 1 - (count % ledSize);
  for(int n=0; n<ledSize; n++){
    if(n==i)
      digitalWrite(ledArr[n], HIGH);
    else
      digitalWrite(ledArr[n], LOW);
  }
}
void led_dn(int count)
{
  int i = count % ledSize;
  for(int n=ledSize-1; n>=0; n--){
    if(n==i)
      digitalWrite(ledArr[n], HIGH);
    else
      digitalWrite(ledArr[n], LOW);
  }
}


 
void mode_selector(int mode)
{
  switch(mode){
    case 10:
      digitalWrite(10,HIGH);
      break;
    case 9:
      digitalWrite(9,HIGH);
      break;
    case 3:
      digitalWrite(3,HIGH);
      break;
    case 2:
      digitalWrite(2,HIGH);
      break;
    case LED_ON:
      led_on();
      break;
    case LED_OFF:
      led_off();
      break;
    case LED_UP:
      led_up(ledCount);
      break;
    case LED_DOWN:
      led_dn(ledCount);
      break;
  }
}
 
 
void loop()
{
  if(Serial.available() > 0){
    str = Serial.readStringUntil('\n');
    Serial.print(str);
    if(str == "10"){
      modeSelect = 10;
      Serial.println(" : 10번 켜짐");
    }
    else if(str == "9"){
      modeSelect = 9;
      Serial.println(" : 9번 켜짐");
    }
    else if(str == "3"){
      modeSelect = 3;
      Serial.println(" : 3번 켜짐");
    }
    else if(str == "2"){
      modeSelect = 2;
      Serial.println(" : 2번 켜짐");
    }
    else if(str == "on" || str == "ON"){
      modeSelect = LED_ON;
      Serial.println(" : LED 켜짐");
    }
    else if(str == "off" || str == "OFF"){
      modeSelect = LED_OFF;
      Serial.println(" : LED 꺼짐");
    }
    else if(str == "up" || str == "UP"){
      modeSelect = LED_UP;
      mode_selector(LED_OFF);
      ledCount = 0;
      Serial.println(" : LED 위에서 아래로");
    }
    else if(str == "dn" || str == "DN" || 
            str == "down" || str == "DOWN"){
      modeSelect = LED_DOWN;
      mode_selector(LED_OFF);
      ledCount = 0;
      Serial.println(" : LED 아래에서 위로");
    }            
    else{
      Serial.println(" : zzz입력한 명령어가 없습니다.");
    }
  }
  
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval){
    previousMillis = currentMillis;
    mode_selector(modeSelect);
    ledCount++;
  }
}

 

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

RC카+아두이노TEST  (0) 2022.06.18
lilyPad_v220429  (0) 2022.04.29
Arduino_v220428 - piezo only  (0) 2022.04.28
arduino_v220427  (0) 2022.04.27
arduino_v220425  (0) 2022.04.25