2주차 버튼 제어하기: 두 판 사이의 차이

아두위키 : Arduwiki
 
(같은 사용자의 중간 판 5개는 보이지 않습니다)
282번째 줄: 282번째 줄:


==== 4-2. 코드 ====
==== 4-2. 코드 ====
//영상넣기<syntaxhighlight lang="arduino" line="1">
<div class="coders70">
<youtube>w15j1EjFnxo</youtube>
</div><syntaxhighlight lang="arduino" line="1">
void setup()
void setup()
{
{
308번째 줄: 310번째 줄:
어두워지면 자동으로 LED가 켜질 수 있도록 코드를 작성하세요.
어두워지면 자동으로 LED가 켜질 수 있도록 코드를 작성하세요.


//영상<syntaxhighlight lang="arduino" line="1">
<div class="coders70">
<youtube>n5euIczo0U4</youtube>
</div><syntaxhighlight lang="arduino" line="1">
int led = 3;
int led = 3;


364번째 줄: 368번째 줄:


==== 5-3. 코드 ====
==== 5-3. 코드 ====
[[파일:Lcd 글자.png|프레임없음|439x439픽셀]]
LCD에 "CODERSIT", "2025"를 출력해 봅시다.
LCD에 "CODERSIT", "2025"를 출력해 봅시다.


//영상<syntaxhighlight lang="arduino" line="1">
<syntaxhighlight lang="arduino" line="1">
#include <Wire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_I2C.h>
396번째 줄: 403번째 줄:
</syntaxhighlight>
</syntaxhighlight>


==== 5-4. [실습] 조도 센서의 값 LCD에 나타내기 ====
* LCD의 커서 좌표
//영상
 
[[파일:Lcd 좌표.png|프레임없음|961x961픽셀]]
 
==== 5-4. [실습] LCD에 물결 출력하기 ====
영상을 보고 문자를 출력하여 물결 모양으로 출력해 봅시다.
 
'''★ lcd.clear()''' 함수를 사용하면 lcd에 나타냈던 문자를 모두 지울 수 있습니다.
<div class="coders70">
<youtube>xs7sHnCpjNg</youtube>
</div>
 
==== 5-5. [실습] 조도 센서의 값 LCD에 나타내기 ====
<div class="coders70">
<youtube>pC1EdyVV4uQ</youtube>
</div>


위에서 배운 조도 센서와 LCD를 함께 사용해 봅시다.
위에서 배운 조도 센서와 LCD를 함께 사용해 봅시다.
563번째 줄: 584번째 줄:
</syntaxhighlight>
</syntaxhighlight>


==== 5-4. [실습] 조도 센서의 값 LCD에 나타내기 ====
 
==== 5-5. [실습] 조도 센서의 값 LCD에 나타내기 ====
<syntaxhighlight lang="arduino" line="1">
<syntaxhighlight lang="arduino" line="1">
#include <Wire.h>
#include <Wire.h>

2024년 12월 21일 (토) 19:37 기준 최신판

1. 아두이노 디지털 핀

아두이노 디지털 입출력 pin은 보드의 digital pin 0 ~ 13을 사용할 수 있습니다. 0, 1번 pin은 컴퓨터와 아두이노가 통신할 때 주로 사용하기 때문에 우리는 2 ~ 13 핀을 사용하여 디지털 입출력을 사용할 수 있습니다.

저번 시간에는 디지털 출력(digitalWrite)를 사용해보았습니다. 이번 시간에는 디지털 출력(digitalRead)를 사용해봅시다.

2. 시리얼 모니터(Sirial Monitor)

시리얼 모니터란 아두이노에서 보내주는 데이터를 아두이노 IDE에 포함되어 있는 창을 이용해 출력해 확인해볼 수 있는 것을 말합니다.

아두이노에 연결된 센서를 이용해 측정된 값을 출력해서 확인해볼 수 있습니다.

아두이노 IDE의 오른쪽 위에 시리얼 모니터를 누르면 아래에 창이 보이게 됩니다.

시리얼 모니터를 이용해 출력하는 방법을 알아봅시다.

2-1. 시리얼 모니터에 출력하기

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

int n = 1;
void loop() {
  Serial.print("n : ");
  Serial.println(n);
  delay(1000);
  n+=1;
}

위 코드를 작성해봅시다.

시리얼 모니터를 사용하기 위해서는 setup() 함수에 Serial.begin() 함수를 이용해 보드 레이트 기본값을 설정하고 시리얼 모니터를 사용하겠다고 코드를 작성합니다.

loop() 함수에서는 1초에 한 번씩 [n] 변수 값을 증가시키며 시리얼 모니터에 출력하는 코드입니다.

Serial.print() 함수는 괄호 안의 문자를 출력하는 함수이며 Serial.println() 함수는 괄호 안의 문자를 출력하고 마지막에 줄바꿈을 해주는 함수입니다.

코드를 실행시킨 후 시리얼 모니터 아이콘을 클릭하면 아두이노 IDE 아래 창에서 결과를 확인할 수 있습니다.

3. 버튼

택트 스위치(Tact Switch)는 디지털 핀에 연결하여 입력 신호로 활용 가능합니다.

3-1. 비교 연산자, 논리 연산자

비교 연산자(<, <=, >, >=, ==, !=)는 두 개의 값을 비교하는 연산자입니다. 아두이노에서 결과는 참(1) 또는 거짓(0)으로 나타납니다.

< 왼쪽 값이 오른쪽 값보다 작다. A < B
<= 왼쪽 값이 오른쪽 값보다 작거나 같다. A <= B
> 왼쪽 값이 오른쪽 값보다 크다. A > B
>= 왼쪽 값이 오른쪽 값보다 크거나 같다. A >= B
== 왼쪽 값과 오른쪽 값이 동일하다. A == B
!= 왼쪽 값과 오른쪽 값이 동일하지 않다. A != B


논리 연산자(&&, ||, !)은 참과 거짓을 연산하기 위해 사용됩니다.

and
참 && 참 1
참 && 거짓 0
거짓 && 참 0
거짓 && 거짓 0
or
참 || 참 1
참 || 거짓 1
거짓 || 참 1
거짓 || 거짓 0
not
!참 0
!거짓 1

3-2. 조건문 if, else if, else

조건문 if는 조건이 "참"인 경우 작성한 코드가 수행되고 "거짓"인 경우 수행되지 않습니다.

if (조건) {
    // code..
}


else문 안에 작성한 코드는 if문 조건이 "참"인 경우에는 실행되지 않고 "거짓"인 경우 수행됩니다.

if (조건) {
    // code..
}
else {
    // code..
}


else if는 else와 다르게 조건을 작성하여 세 개 이상의 조건을 연결하여 사용할 수 있습니다.

else와 else if를 이용해 다양한 조건을 확인하는 조건문을 작성할 수 있습니다.

if (조건) {
    // code..
}
else if(조건) {
    // code..
}
else if(조건) {
    // code..
}
else {
    // code..
}

3-3. 버튼 회로도

3-4. 코드

버튼을 이용해 버튼이 눌릴 때마다 시리얼 모니터에 "button push!"라는 문장을 출력하는 코드를 작성해봅시다.

int btn = 9;

void setup() {
  Serial.begin(9600);
  pinMode(btn, INPUT_PULLUP);
}

void loop() {
  if(digitalRead(btn) == LOW) {
    Serial.println("button push!");
  }
  delay(100);
}

아두이노에는 자체적으로 풀업 저항이 내장되어있습니다.

디지털 입력 핀 모드를 설정할 때 'INPUT_PULLUP'을 사용하면 외부에 저항을 추가하지 않아도 디지털 핀을 풀업 저항으로 사용할 수 있게 됩니다.

버튼이 눌리게 되면 digitalRead() 함수에서 [LOW]가, 버튼이 눌리지 않을 때는 [HIGH] 값이 반환됩니다.

3-5. [실습] 버튼이 눌릴 때마다 n을 1 증가시키기

변수 n을 생성하고 버튼이 눌릴 때마다 1 증가시켜 시리얼 모니터에 출력하는 코드를 작성해봅시다.

int btn = 9;

void setup() {
  Serial.begin(9600);
  pinMode(btn, INPUT_PULLUP);
}

int n = 1;
void loop() {
  if(digitalRead(btn) == LOW) {
    // code..
  }
  delay(100);
}

3-6. [실습] 버튼을 눌러 LED 켜기1

버튼이 눌리는 동안 LED가 켜지고 버튼에서 손을 떼면 LED가 꺼질 수 있도록 코드를 작성해봅시다.

int btn = 9;
int led = 10;

void setup() {
  pinMode(btn, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

int n = 1;
void loop() {
  if(digitalRead(btn) == LOW) {
    // code..
  }
  else {
    // code..
  }
  delay(100);
}

3-7. [실습] 버튼을 눌러 LED 켜기2(스위치)

다양한 변수, 조건문을 사용하여 버튼을 한 번 누르면 LED가 켜지고 다시 누르면 LED가 꺼질 수 있도록 코드를 작성해봅시다.

int btn = 9;
int led = 10;

void setup() {
  pinMode(btn, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  if(digitalRead(btn) == LOW) {
    // code..
  }
  // code..
  delay(100);
}

3-8. [실습] 버튼을 눌러 LED 여러개 제어하기

다양한 변수, 조건문을 사용하여 버튼을 누를 때마다 현재 LED는 꺼지고 다음 LED가 켜질 수 있도록 코드를 작성해봅시다.

int btn = 9;
int led1 = 10;
int led2 = 11;
int led3 = 12;

void setup() {
  pinMode(btn, INPUT_PULLUP);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
}

void loop() {
  if(digitalRead(btn) == LOW) {
    // code..
  }
  // code..
  delay(100);
}

4. 아두이노 아날로그 핀

아두이노 디지털 아날로그 입력 pin은 보드의 A0 ~ A5 를 사용할 수 있습니다.

아날로그 입력(analogRead)를 사용해 센서의 값을 읽어와 출력해 봅시다.

4-1. 조도 센서 회로도

주변 환경의 빛 강도를 측정하기 위해 설계된 센서 모듈입니다. 이 센서 모듈은 자동 조명 시스템, 식물을 위한 성장등, 빛 조건의 변화를 감지해야 하는 모든 애플리케이션에서 빛 수준을 모니터링하거나 제어해야 할 때 자주 사용됩니다.

4-2. 코드

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

void loop()
{
  int data = analogRead(A0);
  Serial.println(data);    
   
  delay(300);
}

cds 센서를 이용해 빛의 세기를 읽어와 출력해 봅시다.

센서를 손가락으로 가리면 값이 커집니다.

스마트폰 플래쉬를 켜고 cds 센서에 비추면 값이 작아집니다.

cds 센서값은 0~1023 사잇값으로 표현됩니다.

4-3. [실습] cds를 이용해 어두워지면 LED 켜기

실생활의 가로등을 생각해 보세요!

어두워지면 자동으로 LED가 켜질 수 있도록 코드를 작성하세요.

int led = 3;

void setup()
{
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int data = analogRead(A0);
  Serial.println(data);    
   
  // code ..

  delay(300);
}

5. LCD

아두이노 LCD 모듈은 문자나 숫자를 디스플레이하기 위해 사용하는 모듈입니다.

뒷 면에 가변저항이 있어 글자 밝기 조절이 가능합니다. 글자가 잘 안보이면 조절해보세요!

5-1. LCD 회로도

I2C LCD 모듈 핀 아두이노 우노 핀
VCC 5V
GND GND
SDA A4
SCL A5

5-2. 라이브러리 추가

먼저 아두이노 IDE 에서 LCD을 사용하기 위해 라이브러리를 설치합니다.

[스케치] - [라이브러리 포함] - [라이브러리 관리] 에서 "LiquidCrystal I2C"을 검색합니다. [LiquidCrystal I2C by Frank de Brabander]을 찾아 설치해주세요.

5-3. 코드


LCD에 "CODERSIT", "2025"를 출력해 봅시다.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{  
  lcd.init();
  lcd.backlight();
  
  //lcd의 위치를 (0,0)으로 지정합니다.(좌상단 기준)
  lcd.setCursor(0, 0);

  //출력할 문구를 작성합니다.
  lcd.print("CODERSIT");

  //lcd의 위치를 (0,1)로 지정합니다.
  lcd.setCursor(0, 1);

  //val 값을 출력합니다.
  int val = 2025;
  lcd.print(val);
}

void loop()
{
  
}
  • LCD의 커서 좌표

5-4. [실습] LCD에 물결 출력하기

영상을 보고 문자를 출력하여 물결 모양으로 출력해 봅시다.

★ lcd.clear() 함수를 사용하면 lcd에 나타냈던 문자를 모두 지울 수 있습니다.

5-5. [실습] 조도 센서의 값 LCD에 나타내기

위에서 배운 조도 센서와 LCD를 함께 사용해 봅시다.

조도 센서의 값을 읽어와 LCD에 나타내 봅시다.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{  
  lcd.init();
  lcd.backlight();
}

void loop()
{
  // code..
  
  lcd.setCursor(0, 0);
  lcd.print();
}

6. 실습 코드 참고하기

3-5. [실습] 버튼이 눌릴 때마다 n을 1 증가시키기

int btn = 9;

void setup() {
  Serial.begin(9600);
  pinMode(btn, INPUT_PULLUP);
}

int n = 1;
void loop() {
  if(digitalRead(btn) == LOW) {
    Serial.println("### button push!!! ###");
    Serial.println(n);
    Serial.println("######################");
    n+=1;
  }
  delay(100);
}

3-6. [실습] 버튼을 눌러 LED 켜기1

int btn = 9;
int led = 10;

void setup() {
  Serial.begin(9600);
  pinMode(btn, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

int n = 1;
void loop() {
  if(digitalRead(btn) == LOW) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
  delay(100);
}

3-7. [실습] 버튼을 눌러 LED 켜기2(스위치)

int btn = 9;
int led = 10;

void setup() {
  Serial.begin(9600);
  pinMode(btn, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

int flag = 0;

void loop() {
  if(digitalRead(btn) == LOW) {
    if (flag == 0) {
      flag = 1;
    }
    else {
      flag = 0;
    }
  }
  if(flag == 0) {
    digitalWrite(led, LOW);
  }
  else {
    digitalWrite(led, HIGH);
  }
  delay(100);
}

3-8. [실습] 버튼을 눌러 LED 여러개 제어하기

int btn = 9;
int led1 = 10;
int led2 = 11;
int led3 = 12;

void setup() {
  pinMode(btn, INPUT_PULLUP);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
}

int led_num = 1;

void loop() {
  if(digitalRead(btn) == LOW) {
    led_num += 1;
    if (led_num >= 4) {
      led_num = 1;
    } 
  }
  if (led_num == 1) {
    digitalWrite(12, LOW);
    digitalWrite(10, HIGH);
  }
  if (led_num == 2) {
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
  }
  if (led_num == 3) {
    digitalWrite(11, LOW);
    digitalWrite(12, HIGH);
  }
  delay(100);
}

4-3. [실습] cds를 이용해 어두워지면 LED 켜기

int led = 2;

void setup()
{
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int data = analogRead(A0);
  if(data>500){
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  } 
  Serial.println(data);
  delay(300);
}


5-5. [실습] 조도 센서의 값 LCD에 나타내기

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{  
  lcd.init();
  lcd.backlight();
}

void loop()
{
  int data = analogRead(A0);
  lcd.setCursor(0, 0);
  lcd.print("LED!!");
  lcd.setCursor(0, 1);
  lcd.print(data);
  delay(500);
}