본문 바로가기

프로젝트형 IoT 서비스 개발 4회차/2. 엣지 디바이스 제어

[Day37] 2022-03-22(화) 아두이노2 - C언어 기초1, LED제어1 - 김서연 강사님

728x90

[1] C언어 기초1

  - <아두이노 마스터1 우노보드 기초 - 신동욱> p34~p71

  1. 데이터 타입

    1) 논리형

      - boolean : 1바이트, 0(false) 또는 1(true), 두 상태 표시

    2) 문자형

      - char : 1바이트, -128~127, 해당 범위 숫자나 그 숫자에 해당하는 ASCII 문자 표시

      - unsigned char : 1바이트, 0~255, 해당 범위 숫자나, 그 숫자에 해당하는 ASCII 문자 표시

    3) 정수형

      - byte : 1바이트, 0~255, 양의 정수

      - int : 2바이트, -32768~32767, 해당 범위 양수와 음수, 음수는 양수의 2의 보수 형태로 저장

      - unsigned int(word) : 2바이트, 0~65535, 양의 정수

      - long : 4바이트 -2^31~2^31-1, 해당 범위 양수와 음수, 음수는 양수의 2의 보수 형태로 저장

      - unsigned long : 4바이트 0~2^32-1, 양의 정수

    4) 실수형

      - float : 4바이트, 소수 7자리

      - double : 4바이트, 소수 14자리

    5) 문자열

      - string : double과 동일하나 문자열을 저장

 

  2. 조건문

    1) if문

      -> if(조건문){

            실행문

          }

    2) if else문

      -> if(조건문){

            실행문1

           }else{

             실행문2

           }

    3) else if문

      -> if(조건문1){

            실행문1

          }else if(조건문2){

            실행문2

          }

          .... 

          }else{

            실행문N

          }

 

if ~ else if ~ else문 예제

/*
주민번호의 7번의 값을 입력 받아
남자, 여자, 기타를 출력하는 예제를 if~else if로 작성
- 1,3: 남자
- 2,4: 여자
- 나머지: 기타
- 한글로 출력이 가능한지 테스트
- 영문으로 수정해서 테스트
- char로 입력받아서 비교
*/
void setup() {
  Serial.begin(9600);
}

void loop() {
  char id = 0;
  if(Serial.available()){
    id = Serial.read();
    if(id == '1' || id == '3'){
      Serial.println("남자");
    }else if(id == '2' || id == '4'){
      Serial.println("여자");
    }else{
      Serial.println("기타");
    }
  }
}

 

    4) switch문

      -> switch(변수 또는 수식){

            case value1:

                실행문1

                 break;

            case value2:

                 실행문2            

                 break;

            ...

            default:

                 실행문N            

          }

 

      - 변수 또는 수식을 평가하여 그 값에 해당하는 실행문을 실행하고, 해당되는 것이 없으면 default 실행

      - break문 없으면, switch문을 나가지 않고 break문을 만날 때까지 다음 case부터 마지막 default까지 다 들어간다.

        (모래를 떨어뜨려서 큰 알갱이부터 작은 알갱이 순으로 거르려고 하는데, 거름망이 없으면 그냥 통과하듯이)

      - 여러 case에 같은 명령문을 주고 싶은 경우, 명령문 없이 case 만 쓰고 마지막 하나에서 명령문을 쓰면 된다.

      - 범위로 조건을 주는 경우에는 if문을 써야 한다.

 

switch문 예제1

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

void loop() {
  char ssn = 0;
  if(Serial.available()){
    char ssn = Serial.read();
    switch(ssn){
      case '1':
      case '3':
        Serial.println("남자");
        break;
      case '2':
      case '4':
        Serial.println("여자");
        break;
      default:
        Serial.println("기타");
    }

switch문 예제2

/*
  입력된 값이 a이면 led_on
  입력된 값이 b이면 led_off
  그 외 값이 입력되면 restart 메시지가 출력될 수 있도록 switch문을 이용해서 작성
*/
void setup() {
  Serial.begin(9600);
}

void loop() {
  char input = 0;
  if(Serial.available()){
    input = Serial.read();
    switch(input){
      case 'a':
        Serial.println("led_on");
        break;
      case 'b':
        Serial.println("led_off");
        break;
      default:
        Serial.println("restart");
    }
  }
}

 

3. 반복문

  1) for문

    -> for(①카운터 변수 기화; ②종료 건식; ④카운터 변수 감 연산){

          ③반복 실행문

        }

 

    - ( ) 안에 들어가는 것들 외우는 방법 : for문 보면 초조한 증상 -> 초.조.증. (열혈강의 C언어본색-박정민 참고)

    - 컴퓨터 안에서 for문 실행 과정

      -> ①초기화

      -> ②조건식 확인(참) -> ③실행문 -> ④증감

      -> ②조건식 확인(참) -> ③실행문 -> ④증감

      -> ...

      -> ②조건식 확인(거짓) -> for문 종료

    - 반복 횟수로 컨트롤 하고 싶을 때 for문 사용

    - 카운트 변수를 for문 밖에서도 활용하고 싶으면, 변수 선언을 for문 밖에서 하면 된다.

 

for문 예제1

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

void loop() {
  for(int i=1; i<=5; i++){
    Serial.println("hello~~~");
  }
  Serial.println("============");
  delay(3000);
}

for문 예제2

/* serial_for_exam1
1부터 100까지의 총합, 짝수합, 홀수합을 다음과 같이 출력하기
총합, 짝수합, 홀수합
총합, 짝수합, 홀수합
총합, 짝수합, 홀수합
총합, 짝수합, 홀수합
....
*/
void setup() {
  Serial.begin(9600);
}

void loop() {
  int i, total = 0, even = 0, odd = 0;
  for(i=1; i<101; i++){
    if(i%2==0){
      even += i;
    }
    else{
      odd += i;
    }
    total += i;
  }
  Serial.print(total);
  Serial.print(", ");
  Serial.print(even);
  Serial.print(", ");
  Serial.println(odd);
  delay(1000);
}

for문 예제3

/* serial_for_exam2
  단을 입력 받아서 입력 받은 단을 출력하기
  2*1=2
  2*2=4
  2*3=4
  ....
  2*9=18
*/

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

void loop() {
  int num = 0;
  if(Serial.available()){
    num = Serial.parseInt();
    for(int i=1; i<10; i++){
      Serial.print(num);
      Serial.print('*');
      Serial.print(i);
      Serial.print('=');
      Serial.println(num*i);
    }
  }
}

 

  2) while문

    -> while(①종료 조건식){

          ②반복 실행문

        }

 

    - 컴퓨터 안에서 while문 동작 과정

      -> ①조건식 확인(참) -> ②실행문

      -> ①조건식 확인(참) -> ②실행문

      -> ...

      -> ①조건식 확인(거짓) -> while문 종료

 

  4. 배열 및 문자열

    1) 배열

      ① 선언

        -> 변수타입 배열명[데이터갯수]

        -> ex> int array[10];    // int형 변수 10개를 담는 배열 array

      ② 초기화

        - 선언과 동시에 초기화

          -> ex1> int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

          -> ex2> int array[10] = {0}    // 전부 0으로 초기화

        - 선언 후 개별적으로 초기화

          -> ex> int array[10];    // 선언

                -> array[0] = 1; ..... array[9] = 10;    // 하나씩 초기화

 

배열 예제1

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

void loop() {
  // 배열을 선언하면서 초기값을 정의
  int myarr[5] = {0};
  // 배열의 요소를 액세스 - 배열변수[index] - index는 0번부터 순차적으로
  Serial.println(myarr[0]);
  Serial.println(myarr[1]);
  Serial.println(myarr[2]);
  Serial.println(myarr[3]);
  Serial.println(myarr[4]);
  Serial.println("============");
  // 배열의 요소 값을 수정
  myarr[3] = 100;
  for(int i=0; i<5; i++){
    Serial.println(myarr[i]);
  }
  Serial.println("------------");
  delay(1000);
}

배열 예제2

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

void loop() {
  // 배열을 선언하면서 초기값을 정의
  int myarr[5] = {100, 90, 88, 78, 99};
  for(int i=0; i<5; i++){
    Serial.println(myarr[i]);
  }
  Serial.println("------------");
  delay(1000);
}

 

[2] 회로 디자인 사이트

https://www.tinkercad.com/

 

Tinkercad | From mind to design in minutes

Tinkercad is a free, easy-to-use app for 3D design, electronics, and coding.

www.tinkercad.com

 

[3] 디지털 입출력

  0. 디지털 입출력

    - 아두이노 보드에 연결하는 모든 디바이스들을 제어하는데 있어 가장 기본적인 기능

    - 출력 디바이스(LED, 모터 등) : 0(LOW), 1(HIGH)을 출력하여 ON/OFF

    - 입력 디바이스(스위치, 센서 등) : 상태를 읽어 ON/OFF 상태 확인

    - 아래 사진에서 DIGITAL 부분에 0~13번 핀 사용(0, 1은 시리얼 포트 통신용)

    1) pinMode(핀번호, 모드)

      - 지정된 디지털 I/O 핀에 대한 입출력 방향 설정

      - 핀번호 : 설정하고 싶은 디지털 핀 번호

      - 모드

        - INPUT : 입력 핀으로 설정

        - INPUT_PULLUP : 내부 풀업 저항을 사용하는 입력 핀 설정

        - OUTPUT : 출력 핀으로 설정

    2) digitalWrite(핀번호, 값)

      - 지정된 디지털 I/O 핀에 디지털 값 출력

      - 핀번호 : 출력 핀 번호

      - 값 : LOW(0, 0V) / HIGH(1, 5V)

    3) digitalRead(핀번호)

      - 지정된 디지털 I/O 핀으로부터 디지털 값 입력 받음

      - 핀번호 : 입력 핀 번호

      - 리턴 값 : 디지털 값 0(LOW, 0V) / 1(HIGH, 5V)

  1. LED 5개 제어(핀 번호 직접 입력)

    - LED 5개를 서로 다른 5개 디지털 핀에 연결하여 순차적으로 켜졌다가 순차적으로 꺼지도록 제어

    1) CODE

// led_exam1 : 13~9번 핀에 각각 저항과 LED를 연결하여 1초마다 순차적으로 켰다가 순차적으로 끄기
void setup() {
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(12, HIGH);
  delay(1000);
  digitalWrite(11, HIGH);
  delay(1000);
  digitalWrite(10, HIGH);
  delay(1000);
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
  digitalWrite(12, LOW);
  delay(1000);
  digitalWrite(11, LOW);
  delay(1000);
  digitalWrite(10, LOW);
  delay(1000);
  digitalWrite(9, LOW);
  delay(1000);
}

    2) 회로 디자인

    3) 동작

 

  2. LED 5개 제어(for문, 배열 사용)

    - 회로 및 동작은 동일

    - sizeof( )

      -> 변수의 크기(용량)를 byte 수로 리턴

      -> int형 배열의 요소 수를 구하려면, sizeof( ) 로 구한 값을 int의 크기로 나누어 주면 된다.

      -> sizeof(led) / sizeof(int)

      -> 배열의 요소 수 = sizeof(배열명) / sizeof(배열의 데이터 타입)

// led_exam3_for_array
// for문 사용
int led[5] = {13, 12, 11, 10, 9};
void setup() {
  for(int i=0; i<sizeof(led)/sizeof(int); i++){
    pinMode(led[i], OUTPUT);  
  }
}

void loop() {
  for(int i=0; i<sizeof(led)/sizeof(int); i++){
    digitalWrite(led[i], HIGH);
    delay(1000);
  }
for(int i=0; i<sizeof(led)/sizeof(int); i++){
    digitalWrite(led[i], LOW);
    delay(1000);
  }
}

    - 꺼지는 것만 거꾸로 꺼지도록 코드 수정

// led_exam3_for_array
// 13~9번 핀에 연결된 LED를 1초마다 13~9 순으로 켰다가 9~13 순으로 끄기
// for문 사용
int led[5] = {13, 12, 11, 10, 9};
void setup() {
  for(int i=0; i<sizeof(led)/sizeof(int); i++){
    pinMode(led[i], OUTPUT);  
  }
}

void loop() {
  for(int i=0; i<sizeof(led)/sizeof(int); i++){
    digitalWrite(led[i], HIGH);
    delay(1000);
  }
  for(int i=sizeof(led)/sizeof(int)-1; i>=0; i--){
    digitalWrite(led[i], LOW);
    delay(1000);
  }
}

- 끝 -

728x90