[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] 회로 디자인 사이트
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);
}
}
- 끝 -
'프로젝트형 IoT 서비스 개발 4회차 > 2. 엣지 디바이스 제어' 카테고리의 다른 글
[Day41] 2022-03-28(월) 아두이노6 - RGB LED, 서보모터, 초음파센서 - 김서연 강사님 (0) | 2022.03.28 |
---|---|
[Day40] 2022-03-25(금) 아두이노5 - 채터링, 아날로그 입출력, RGB LED 설명 - 김서연 강사님 (4) | 2022.03.25 |
[Day39] 2022-03-24(목) 아두이노4 - LED제어3(Push button, 풀업/풀다운) - 김서연 강사님 (0) | 2022.03.24 |
[Day38] 2022-03-23(수) 아두이노3 - C언어 기초2, LED제어2 - 김서연 강사님 (0) | 2022.03.23 |
[Day36] 2022-03-21(월) 아두이노1 - 아두이노 설치/세팅/기본사용법, 시리얼 포트 - 김서연 강사님 (2) | 2022.03.21 |