Arduino-퀵 가이드

Arduino는 사용하기 쉬운 하드웨어 및 소프트웨어를 기반으로 한 프로토 타입 플랫폼 (오픈 소스)입니다. 프로그래밍 할 수있는 회로 기판 (마이크로 컨트롤러라고 함)과 컴퓨터 코드를 작성하고 물리적 기판에 업로드하는 데 사용되는 Arduino IDE (통합 개발 환경)라는 기성 소프트웨어로 구성됩니다.

주요 기능은-

  • Arduino 보드는 다양한 센서에서 아날로그 또는 디지털 입력 신호를 읽고이를 모터 활성화, LED 켜기 / 끄기, 클라우드에 연결 및 기타 여러 작업과 같은 출력으로 전환 할 수 있습니다.

  • Arduino IDE (업로드 소프트웨어라고 함)를 통해 보드의 마이크로 컨트롤러에 일련의 명령을 전송하여 보드 기능을 제어 할 수 있습니다.

  • 대부분의 이전 프로그래밍 가능 회로 기판과 달리 Arduino는 새로운 코드를 기판에로드하기 위해 추가 하드웨어 (프로그래머라고 함)가 필요하지 않습니다. USB 케이블을 사용하면됩니다.

  • 또한 Arduino IDE는 단순화 된 버전의 C ++를 사용하므로 프로그래밍을 더 쉽게 배울 수 있습니다.

  • 마지막으로, Arduino는 마이크로 컨트롤러의 기능을보다 접근하기 쉬운 패키지로 분리하는 표준 폼 팩터를 제공합니다.

보드 유형

사용되는 마이크로 컨트롤러에 따라 다양한 종류의 Arduino 보드를 사용할 수 있습니다. 그러나 모든 Arduino 보드에는 한 가지 공통점이 있습니다. 즉, Arduino IDE를 통해 프로그래밍됩니다.

차이는 입력 및 출력 수 (단일 보드에서 사용할 수있는 센서, LED 및 버튼 수), 속도, 작동 전압, 폼 팩터 등을 기반으로합니다. 일부 보드는 내장형으로 설계되었으며 프로그래밍이 없습니다. 인터페이스 (하드웨어), 별도로 구매해야합니다. 일부는 3.7V 배터리로 직접 실행할 수 있고 다른 일부는 최소 5V가 필요합니다.

다음은 사용 가능한 다양한 Arduino 보드 목록입니다.

Arduino boards based on ATMEGA328 microcontroller

보드 이름 작동 볼트 시계 속도 디지털 I / O 아날로그 입력 PWM UART 프로그래밍 인터페이스
Arduino Uno R3 5V 16MHz 14 6 6 1 ATMega16U2를 통한 USB
Arduino Uno R3 SMD 5V 16MHz 14 6 6 1 ATMega16U2를 통한 USB
레드 보드 5V 16MHz 14 6 6 1 FTDI를 통한 USB
Arduino Pro 3.3v / 8MHz 3.3V 8MHz 14 6 6 1 FTDI 호환 헤더
Arduino Pro 5V / 16MHz 5V 16MHz 14 6 6 1 FTDI 호환 헤더
Arduino mini 05 5V 16MHz 14 8 6 1 FTDI 호환 헤더
Arduino Pro mini 3.3v / 8mhz 3.3V 8MHz 14 8 6 1 FTDI 호환 헤더
Arduino Pro mini 5v / 16mhz 5V 16MHz 14 8 6 1 FTDI 호환 헤더
Arduino 이더넷 5V 16MHz 14 6 6 1 FTDI 호환 헤더
Arduino Fio 3.3V 8MHz 14 8 6 1 FTDI 호환 헤더
LilyPad Arduino 328 메인 보드 3.3V 8MHz 14 6 6 1 FTDI 호환 헤더
LilyPad Arduino 단순 보드 3.3V 8MHz 9 4 5 0 FTDI 호환 헤더

Arduino boards based on ATMEGA32u4 microcontroller

보드 이름 작동 볼트 시계 속도 디지털 I / O 아날로그 입력 PWM UART 프로그래밍 인터페이스
Arduino Leonardo 5V 16MHz 20 12 7 1 기본 USB
Pro 마이크로 5V / 16MHz 5V 16MHz 14 6 6 1 기본 USB
프로 마이크로 3.3V / 8MHz 5V 16MHz 14 6 6 1 기본 USB
LilyPad Arduino USB 3.3V 8MHz 14 6 6 1 기본 USB

Arduino boards based on ATMEGA2560 microcontroller

보드 이름 작동 볼트 시계 속도 디지털 I / O 아날로그 입력 PWM UART 프로그래밍 인터페이스
Arduino Mega 2560 R3 5V 16MHz 54 16 14 4 ATMega16U2B를 통한 USB
Mega Pro 3.3V 3.3V 8MHz 54 16 14 4 FTDI 호환 헤더
Mega Pro 5V 5V 16MHz 54 16 14 4 FTDI 호환 헤더
Mega Pro Mini 3.3V 3.3V 8MHz 54 16 14 4 FTDI 호환 헤더

Arduino boards based on AT91SAM3X8E microcontroller

보드 이름 작동 볼트 시계 속도 디지털 I / O 아날로그 입력 PWM UART 프로그래밍 인터페이스
Arduino Mega 2560 R3 3.3V 84MHz 54 12 12 4 USB 네이티브

이 장에서는 Arduino 보드의 다양한 구성 요소에 대해 알아 봅니다. Arduino 보드 제품군에서 가장 인기있는 보드이기 때문에 Arduino UNO 보드를 연구 할 것입니다. 또한 전자 및 코딩을 시작하기에 가장 좋은 보드입니다. 일부 보드는 아래 제공된 것과 약간 다르게 보이지만 대부분의 Arduino에는 이러한 구성 요소의 대부분이 공통적으로 있습니다.

Power USB

Arduino 보드는 컴퓨터의 USB 케이블을 사용하여 전원을 공급할 수 있습니다. USB 케이블을 USB 연결 (1)에 연결하기 만하면됩니다.

Power (Barrel Jack)

Arduino 보드는 배럴 잭 (2)에 연결하여 AC 주 전원 공급 장치에서 직접 전원을 공급받을 수 있습니다.

Voltage Regulator

전압 조정기의 기능은 Arduino 보드에 제공되는 전압을 제어하고 프로세서 및 기타 요소에서 사용하는 DC 전압을 안정화하는 것입니다.

Crystal Oscillator

수정 발진기는 Arduino가 시간 문제를 처리하는 데 도움이됩니다. Arduino는 시간을 어떻게 계산합니까? 답은 수정 발진기를 사용하는 것입니다. Arduino 크리스탈 위에 인쇄 된 숫자는 16.000H9H입니다. 주파수가 16,000,000 Hertz 또는 16MHz임을 알려줍니다.

Arduino Reset

Arduino 보드를 재설정 할 수 있습니다. 즉, 처음부터 프로그램을 시작할 수 있습니다. 두 가지 방법으로 UNO 보드를 재설정 할 수 있습니다. 먼저 보드의 리셋 버튼 (17)을 사용합니다. 둘째, 외부 리셋 버튼을 RESET (5)이라고 표시된 Arduino 핀에 연결할 수 있습니다.

Pins (3.3, 5, GND, Vin)

  • 3.3V (6)-3.3 출력 전압 공급

  • 5V (7) − 5 출력 볼트 공급

  • Arduino 보드와 함께 사용되는 대부분의 구성 요소는 3.3V 및 5V에서 잘 작동합니다.

  • GND (8) (Ground) − Arduino에는 여러 개의 GND 핀이 있으며, 그중 어느 것이 든 회로를 접지하는 데 사용할 수 있습니다.

  • Vin (9)-이 핀은 AC 주 전원 공급 장치와 같은 외부 전원에서 Arduino 보드에 전원을 공급하는데도 사용할 수 있습니다.

Analog pins

Arduino UNO 보드에는 6 개의 아날로그 입력 핀 A0 ~ A5가 있습니다. 이 핀은 습도 센서 또는 온도 센서와 같은 아날로그 센서의 신호를 읽고 마이크로 프로세서에서 읽을 수있는 디지털 값으로 변환 할 수 있습니다.

Main microcontroller

각 Arduino 보드에는 자체 마이크로 컨트롤러 (11)가 있습니다. 보드의 두뇌라고 가정 할 수 있습니다. Arduino의 메인 IC (집적 회로)는 보드마다 약간 다릅니다. 마이크로 컨트롤러는 일반적으로 ATMEL Company의 것입니다. Arduino IDE에서 새 프로그램을로드하기 전에 보드에 어떤 IC가 있는지 알아야합니다. 이 정보는 IC 상단에서 확인할 수 있습니다. IC 구성 및 기능에 대한 자세한 내용은 데이터 시트를 참조하십시오.

ICSP pin

대부분 ICSP (12)는 MOSI, MISO, SCK, RESET, VCC 및 GND로 구성된 Arduino 용 작은 프로그래밍 헤더 인 AVR입니다. 종종 SPI (Serial Peripheral Interface)라고하며, 이는 출력의 "확장"으로 간주 될 수 있습니다. 실제로 출력 장치를 SPI 버스의 마스터에 슬레이브하고 있습니다.

Power LED indicator

이 LED는 Arduino를 전원에 연결하면 보드가 올바르게 켜졌 음을 나타 내기 위해 켜집니다. 이 표시등이 켜지지 않으면 연결에 문제가있는 것입니다.

TX and RX LEDs

보드에는 TX (송신) 및 RX (수신)의 두 가지 레이블이 있습니다. Arduino UNO 보드의 두 곳에 나타납니다. 먼저 디지털 핀 0과 1에서 직렬 통신을 담당하는 핀을 나타냅니다. 둘째, TX와 RX가 주도했습니다 (13). 직렬 데이터를 보내는 동안 TX LED가 다른 속도로 깜박입니다. 깜박임 속도는 보드에서 사용하는 전송 속도에 따라 다릅니다. 수신 프로세스 중에 RX가 깜박입니다.

Digital I/O

Arduino UNO 보드에는 14 개의 디지털 I / O 핀 (15) (이 중 6 개는 PWM (Pulse Width Modulation) 출력 제공)이 있습니다. 이러한 핀은 입력 디지털 핀으로 작동하여 논리 값 (0 또는 1)을 읽거나 디지털로 작동하도록 구성 할 수 있습니다. 출력 핀을 사용하여 LED, 릴레이 등과 같은 다른 모듈을 구동합니다. "~"라고 표시된 핀을 사용하여 PWM을 생성 할 수 있습니다.

AREF

AREF는 Analog Reference를 나타냅니다. 아날로그 입력 핀의 상한값으로 외부 기준 전압 (0 ~ 5V 사이)을 설정하는 데 사용되기도합니다.

Arduino UNO 보드의 주요 부분에 대해 학습 한 후 Arduino IDE를 설정하는 방법을 배울 준비가되었습니다. 이것을 배우면 Arduino 보드에 프로그램을 업로드 할 준비가 된 것입니다.

이 섹션에서는 컴퓨터에 Arduino IDE를 설정하고 USB 케이블을 통해 프로그램을 수신하도록 보드를 준비하는 방법을 간단한 단계로 배우게됩니다.

Step 1− 먼저 Arduino 보드 (원하는 보드를 선택할 수 있음)와 USB 케이블이 있어야합니다. Arduino UNO, Arduino Duemilanove, Nano, Arduino Mega 2560 또는 Diecimila를 사용하는 경우 다음 이미지와 같이 USB 프린터에 연결할 종류 인 표준 USB 케이블 (A 플러그 대 B 플러그)이 필요합니다.

Arduino Nano를 사용하는 경우 다음 이미지와 같이 대신 A to Mini-B 케이블이 필요합니다.

Step 2 − Download Arduino IDE Software.

Arduino 공식 웹 사이트 의 다운로드 페이지 에서 다양한 버전의 Arduino IDE를 얻을 수 있습니다 . 운영 체제 (Windows, IOS 또는 Linux)와 호환되는 소프트웨어를 선택해야합니다. 파일 다운로드가 완료된 후 파일의 압축을 풉니 다.

Step 3 − Power up your board.

Arduino Uno, Mega, Duemilanove 및 Arduino Nano는 USB 연결을 통해 컴퓨터 또는 외부 전원 공급 장치에서 자동으로 전원을 끌어옵니다. Arduino Diecimila를 사용하는 경우 보드가 USB 연결에서 전원을 끌어 오도록 구성되어 있는지 확인해야합니다. 전원은 USB와 전원 잭 사이의 3 개 핀 중 2 개에 맞는 작은 플라스틱 조각 인 점퍼로 선택됩니다. USB 포트에 가장 가까운 두 핀에 있는지 확인하십시오.

USB 케이블을 사용하여 Arduino 보드를 컴퓨터에 연결하십시오. 녹색 전원 LED (PWR 표시)가 켜져 야합니다.

Step 4 − Launch Arduino IDE.

Arduino IDE 소프트웨어를 다운로드 한 후 폴더의 압축을 풀어야합니다. 폴더 내에서 무한대 레이블 (application.exe)이있는 응용 프로그램 아이콘을 찾을 수 있습니다. 아이콘을 두 번 클릭하여 IDE를 시작하십시오.

Step 5 − Open your first project.

소프트웨어가 시작되면 두 가지 옵션이 있습니다.

  • 새 프로젝트를 만듭니다.
  • 기존 프로젝트 예제를 엽니 다.

새 프로젝트를 생성하려면 파일 → New.

기존 프로젝트 예제를 열려면 File → Example → Basics → Blink를 선택합니다.

여기에서는 이름이있는 예제 중 하나만 선택합니다. Blink. 약간의 시간 지연으로 LED를 켜고 끕니다. 목록에서 다른 예를 선택할 수 있습니다.

Step 6 − Select your Arduino board.

프로그램을 보드에 업로드하는 동안 오류를 방지하려면 컴퓨터에 연결된 보드와 일치하는 올바른 Arduino 보드 이름을 선택해야합니다.

도구 → 보드로 이동하여 보드를 선택하십시오.

여기에서는 튜토리얼에 따라 Arduino Uno 보드를 선택했지만 사용중인 보드와 일치하는 이름을 선택해야합니다.

Step 7 − Select your serial port.

Arduino 보드의 직렬 장치를 선택하십시오. 이동Tools → Serial Port메뉴. 이는 COM3 이상일 가능성이 높습니다 (COM1 및 COM2는 일반적으로 하드웨어 직렬 포트 용으로 예약 됨). 확인하려면 Arduino 보드를 분리하고 메뉴를 다시 열 수 있습니다. 사라지는 항목은 Arduino 보드에 있어야합니다. 보드를 다시 연결하고 해당 직렬 포트를 선택합니다.

Step 8 − Upload the program to your board.

프로그램을 보드에 업로드하는 방법을 설명하기 전에 Arduino IDE 도구 모음에 나타나는 각 기호의 기능을 시연해야합니다.

A − 컴파일 오류가 있는지 확인하는 데 사용됩니다.

B − Arduino 보드에 프로그램을 업로드하는 데 사용됩니다.

C − 새 스케치를 만드는 데 사용되는 바로 가기.

D − 예제 스케치 중 하나를 직접 여는 데 사용됩니다.

E − 스케치를 저장하는 데 사용됩니다.

F − 보드에서 직렬 데이터를 수신하고 직렬 데이터를 보드로 전송하는 데 사용되는 직렬 모니터.

이제 환경에서 "업로드"버튼을 클릭하기 만하면됩니다. 몇 초 동안 기다리십시오. 보드에서 RX 및 TX LED가 깜박이는 것을 볼 수 있습니다. 업로드에 성공하면 상태 표시 줄에 "업로드 완료"메시지가 나타납니다.

Note − Arduino Mini, NG 또는 기타 보드가있는 경우 Arduino 소프트웨어에서 업로드 버튼을 클릭하기 직전에 보드에서 물리적으로 재설정 버튼을 눌러야합니다.

이 장에서 우리는 Arduino 프로그램 구조를 심도있게 연구하고 Arduino 세계에서 사용되는 새로운 용어를 더 많이 배울 것입니다. Arduino 소프트웨어는 오픈 소스입니다. Java 환경의 소스 코드는 GPL에 따라 릴리스되고 C / C ++ 마이크로 컨트롤러 라이브러리는 LGPL에 있습니다.

Sketch − 첫 번째 새로운 용어는“sketch”.

구조

Arduino 프로그램은 세 가지 주요 부분으로 나눌 수 있습니다. Structure, Values (변수 및 상수) 및 Functions. 이 튜토리얼에서는 Arduino 소프트웨어 프로그램에 대해 단계별로 배우고 구문이나 컴파일 오류없이 프로그램을 작성하는 방법을 배웁니다.

우리는 Structure. 소프트웨어 구조는 두 가지 주요 기능으로 구성됩니다.

  • Setup () 기능
  • Loop () 함수
Void setup ( ) {

}
  • PURPOSEsetup()스케치가 시작되면 함수가 호출됩니다. 변수, 핀 모드를 초기화하고 라이브러리 사용을 시작하는 데 사용합니다. 설정 기능은 Arduino 보드의 전원을 켜거나 재설정 할 때마다 한 번만 실행됩니다.

  • INPUT −-

  • OUTPUT −-

  • RETURN −-

Void Loop ( ) {

}
  • PURPOSE − 생성 후 setup() 초기 값을 초기화하고 설정하는 함수, loop()함수는 이름이 암시하는대로 정확하게 수행하고 연속적으로 반복하여 프로그램이 변경되고 응답 할 수 있도록합니다. Arduino 보드를 능동적으로 제어하는 ​​데 사용하십시오.

  • INPUT −-

  • OUTPUT −-

  • RETURN −-

C의 데이터 유형은 다양한 유형의 변수 또는 함수를 선언하는 데 사용되는 광범위한 시스템을 나타냅니다. 변수의 유형은 저장소에서 차지하는 공간의 양과 저장된 비트 패턴이 해석되는 방식을 결정합니다.

다음 표는 Arduino 프로그래밍 중에 사용할 모든 데이터 유형을 제공합니다.

부울 부호없는 문자 바이트 int 부호없는 정수 워드
부호없는 long 짧은 흙손 더블 정렬 문자열-문자 배열 문자열 객체

void 키워드는 함수 선언에서만 사용됩니다. 함수가 호출 된 함수에 정보를 반환하지 않을 것으로 예상됨을 나타냅니다.

Void Loop ( ) {
   // rest of the code
}

부울

부울은 true 또는 false의 두 값 중 하나를 보유합니다. 각 부울 변수는 1 바이트의 메모리를 차지합니다.

boolean val = false ; // declaration of variable with type boolean and initialize it with false
boolean state = true ; // declaration of variable with type boolean and initialize it with true

문자 값을 저장하는 1 바이트 메모리를 차지하는 데이터 유형입니다. 문자 리터럴은 'A'와 같이 작은 따옴표로 작성되며 여러 문자의 경우 문자열은 큰 따옴표 "ABC"를 사용합니다.

그러나 문자는 숫자로 저장됩니다. ASCII 차트 에서 특정 인코딩을 볼 수 있습니다 . 이는 문자의 ASCII 값이 사용되는 문자에 대해 산술 연산을 수행 할 수 있음을 의미합니다. 예를 들어 'A'+ 1은 대문자 A의 ASCII 값이 65이기 때문에 값 66을 갖습니다.

Char chr_a = ‘a’ ;//declaration of variable with type char and initialize it with character a
Char chr_c = 97 ;//declaration of variable with type char and initialize it with character 97

부호없는 문자

Unsigned char1 바이트의 메모리를 차지하는 부호없는 데이터 유형입니다. unsigned char 데이터 유형은 0에서 255까지의 숫자를 인코딩합니다.

Unsigned Char chr_y = 121 ; // declaration of variable with type Unsigned char and initialize it with character y

바이트

바이트는 0에서 255까지의 8 비트 부호없는 숫자를 저장합니다.

byte m = 25 ;//declaration of variable with type byte and initialize it with 25

int

정수는 숫자 저장을위한 기본 데이터 유형입니다. int는 16 비트 (2 바이트) 값을 저장합니다. 이는 -32,768에서 32,767의 범위를 산출합니다 (최소값 -2 ^ 15 및 최대 값 (2 ^ 15)-1).

그만큼 int크기는 보드마다 다릅니다. 예를 들어 Arduino Due에서int32 비트 (4 바이트) 값을 저장합니다. 이것은 -2,147,483,648에서 2,147,483,647 사이의 범위를 산출합니다 (최소값 -2 ^ 31 및 최대 값 (2 ^ 31)-1).

int counter = 32 ;// declaration of variable with type int and initialize it with 32

부호없는 정수

부호없는 정수 (부호없는 정수)는 2 바이트 값을 저장하는 방식에서 int와 동일합니다. 그러나 음수를 저장하는 대신 양수 값만 저장하여 유용한 범위 인 0 ~ 65,535 (2 ^ 16)-1)을 생성합니다. Due는 0에서 4,294,967,295 (2 ^ 32-1) 범위의 4 바이트 (32 비트) 값을 저장합니다.

Unsigned int counter = 60 ; // declaration of variable with 
   type unsigned int and initialize it with 60

워드

Uno 및 기타 ATMEGA 기반 보드에서 단어는 16 비트 부호없는 숫자를 저장합니다. Due 및 Zero에서는 32 비트 부호없는 숫자를 저장합니다.

word w = 1000 ;//declaration of variable with type word and initialize it with 1000

긴 변수는 숫자 저장을위한 확장 크기 변수이며 -2,147,483,648에서 2,147,483,647까지 32 비트 (4 바이트)를 저장합니다.

Long velocity = 102346 ;//declaration of variable with type Long and initialize it with 102346

부호없는 긴

부호없는 long 변수는 숫자 저장을위한 확장 크기 변수이며 32 비트 (4 바이트)를 저장합니다. 표준 long과 달리 부호없는 long은 음수를 저장하지 않으며 범위는 0에서 4,294,967,295 (2 ^ 32-1)입니다.

Unsigned Long velocity = 101006 ;// declaration of variable with 
   type Unsigned Long and initialize it with 101006

짧은

short는 16 비트 데이터 유형입니다. 모든 Arduino (ATMega 및 ARM 기반)에서 short는 16 비트 (2 바이트) 값을 저장합니다. 이는 -32,768에서 32,767의 범위를 산출합니다 (최소값 -2 ^ 15 및 최대 값 (2 ^ 15)-1).

short val = 13 ;//declaration of variable with type short and initialize it with 13

흙손

부동 소수점 숫자의 데이터 유형은 소수점이있는 숫자입니다. 부동 소수점 숫자는 정수보다 해상도가 더 크기 때문에 아날로그 및 연속 값을 근사화하는 데 자주 사용됩니다.

부동 소수점 숫자는 최대 3.4028235E + 38, 최저 -3.4028235E + 38 일 수 있습니다. 32 비트 (4 바이트) 정보로 저장됩니다.

float num = 1.352;//declaration of variable with type float and initialize it with 1.352

더블

Uno 및 기타 ATMEGA 기반 보드에서 배정 밀도 부동 소수점 숫자는 4 바이트를 차지합니다. 즉, double 구현은 정밀도가 향상되지 않고 float와 정확히 동일합니다. Arduino Due에서 double은 8 바이트 (64 비트) 정밀도를 갖습니다.

double num = 45.352 ;// declaration of variable with type double and initialize it with 45.352

변수 유형을 설명하기 전에 확인해야 할 매우 중요한 주제는 다음과 같습니다. variable scope.

가변 범위 란 무엇입니까?

Arduino가 사용하는 C 프로그래밍 언어의 변수에는 scope라는 속성이 있습니다. 범위는 프로그램의 영역이며 변수를 선언 할 수있는 세 곳이 있습니다. 그들은-

  • 호출되는 함수 또는 블록 내부 local variables.
  • 호출되는 함수 매개 변수의 정의에서 formal parameters.
  • 호출되는 모든 기능 외에 global variables.

지역 변수

함수 또는 블록 내에서 선언 된 변수는 지역 변수입니다. 해당 함수 또는 코드 블록 내부에있는 명령문에서만 사용할 수 있습니다. 지역 변수는 자체 외부에서 작동하는 것으로 알려져 있지 않습니다. 다음은 지역 변수를 사용한 예입니다.

Void setup () {

}

Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

글로벌 변수

전역 변수는 일반적으로 프로그램의 맨 위에있는 모든 함수 외부에서 정의됩니다. 전역 변수는 프로그램의 수명 내내 그 값을 유지합니다.

전역 변수는 모든 함수에서 액세스 할 수 있습니다. 즉, 전역 변수는 선언 후 전체 프로그램에서 사용할 수 있습니다.

다음 예제는 전역 및 지역 변수를 사용합니다-

Int T , S ;
float c = 0 ; Global variable declaration

Void setup () {

}

Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

연산자는 특정 수학적 또는 논리 함수를 수행하도록 컴파일러에 지시하는 기호입니다. C 언어는 내장 연산자가 풍부하며 다음 유형의 연산자를 제공합니다.

  • 산술 연산자
  • 비교 연산자
  • 부울 연산자
  • 비트 연산자
  • 복합 연산자

산술 연산자

변수 A가 10을 보유하고 변수 B가 20을 보유한다고 가정하면-

보기 예

운영자 이름 간단한 운영자 기술
할당 연산자 = 등호 왼쪽에있는 변수에 등호 오른쪽에있는 값을 저장합니다. A = B
부가 + 두 개의 피연산자를 더합니다. A + B는 30을 줄 것입니다
빼기 - 첫 번째에서 두 번째 피연산자를 뺍니다. A-B는 -10을 줄 것입니다.
곱셈 * 두 피연산자 곱하기 A * B는 200을 줄 것입니다
분할 / 분자를 분모로 나누기 B / A는 2를 줄 것입니다
모듈로 % 계수 연산자 및 정수 나누기 후의 나머지 B % A는 0을 제공합니다.

비교 연산자

변수 A가 10을 보유하고 변수 B가 20을 보유한다고 가정하면-

보기 예

운영자 이름 간단한 운영자 기술
동일 == 두 피연산자의 값이 같은지 확인하고, 예이면 조건이 참이됩니다. (A == B)는 사실이 아닙니다.
같지 않음 ! = 두 피연산자의 값이 같은지 확인하고, 값이 같지 않으면 조건이 참이됩니다. (A! = B) 참
이하 < 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작은 지 확인하고, 그렇다면 조건이 참이됩니다. (A <B)가 참
~보다 큰 > 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 큰지 확인하고, 그렇다면 조건이 참이됩니다. (A> B)는 사실이 아닙니다.
보다 작거나 같음 <= 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작거나 같은지 확인하고, 그렇다면 조건이 참이됩니다. (A <= B) 참
보다 크거나 같음 > = 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 크거나 같은지 확인하고, 그렇다면 조건이 참이됩니다. (A> = B)는 사실이 아닙니다.

부울 연산자

변수 A가 10을 보유하고 변수 B가 20을 보유한다고 가정하면-

보기 예

운영자 이름 간단한 운영자 기술
&& 논리 AND 연산자라고합니다. 두 피연산자가 모두 0이 아니면 조건이 참이됩니다. (A && B)가 참
또는 || 논리 OR 연산자라고합니다. 두 피연산자 중 하나가 0이 아니면 조건이 참이됩니다. (A || B) 참
아니 ! 논리 NOT 연산자라고합니다. 피연산자의 논리 상태를 반전하는 데 사용합니다. 조건이 참이면 논리 NOT 연산자는 거짓으로 만듭니다. ! (A && B)는 거짓입니다.

비트 연산자

변수 A가 60을 보유하고 변수 B가 13을 보유한다고 가정하면-

보기 예

운영자 이름 간단한 운영자 기술
& 이진 AND 연산자는 두 피연산자에 모두있는 경우 결과에 비트를 복사합니다. (A & B)는 0000 1100 인 12를 줄 것입니다.
또는 | 이진 OR 연산자는 피연산자 중 하나에 있으면 비트를 복사합니다. (A | B)는 0011 1101 인 61을 제공합니다.
xor ^ 이진 XOR 연산자는 하나의 피연산자에만 설정되어 있지만 둘 다에 설정되지 않은 경우 비트를 복사합니다. (A ^ B)는 0011 0001 인 49를 제공합니다.
아니 ~ Binary Ones Complement Operator는 단항이며 비트를 '뒤집는'효과가 있습니다. (~ A)는 -60 (1100 0011)을 제공합니다.
왼쪽으로 이동 << 이진 왼쪽 시프트 연산자. 왼쪽 피연산자 값은 오른쪽 피연산자에 지정된 비트 수만큼 왼쪽으로 이동합니다. << 2는 1111 0000 인 240을 제공합니다.
오른쪽으로 이동 >> 이진 오른쪽 시프트 연산자. 왼쪽 피연산자 값은 오른쪽 피연산자에 지정된 비트 수만큼 오른쪽으로 이동합니다. A >> 2는 0000 1111 인 15를 제공합니다.

복합 연산자

변수 A가 10을 보유하고 변수 B가 20을 보유한다고 가정하면-

보기 예

운영자 이름 간단한 운영자 기술
증가 ++ 증가 연산자, 정수 값을 1 씩 증가시킵니다. A ++는 11을 줄 것입니다
감소 - 감소 연산자, 정수 값을 1 씩 감소 A-- 9를 줄 것입니다
화합물 추가 + = AND 할당 연산자를 추가합니다. 왼쪽 피연산자에 오른쪽 피연산자를 추가하고 결과를 왼쪽 피연산자에 할당합니다. B + = A는 B = B + A와 같습니다.
복합 빼기 -= AND 할당 연산자를 뺍니다. 왼쪽 피연산자에서 오른쪽 피연산자를 빼고 결과를 왼쪽 피연산자에 할당합니다. B-= A는 B = B-A와 같습니다.
복합 곱셈 * = 곱하기 AND 할당 연산자. 오른쪽 피연산자와 왼쪽 피연산자를 곱하고 결과를 왼쪽 피연산자에 할당합니다. B * = A는 B = B * A와 같습니다.
복합 분할 / = AND 할당 연산자를 나눕니다. 왼쪽 피연산자를 오른쪽 피연산자로 나누고 결과를 왼쪽 피연산자에 할당합니다. B / = A는 B = B / A와 같습니다.
복합 모듈로 % = 계수 AND 할당 연산자. 두 개의 피연산자를 사용하여 모듈러스를 취하고 결과를 왼쪽 피연산자에 할당합니다. B % = A는 B = B % A와 같습니다.
복합 비트 또는 | = 비트 포함 OR 및 할당 연산자 A | = 2는 A = A | 2
복합 비트 및 & = 비트 AND 할당 연산자 A & = 2는 A = A & 2와 동일합니다.

의사 결정 구조에서는 프로그래머가 프로그램에서 평가하거나 테스트 할 하나 이상의 조건을 지정해야합니다. 조건이 참인 경우 실행될 명령문과 함께 있어야하며, 조건이 거짓 인 경우 실행될 다른 명령문이 선택적으로 함께 있어야합니다.

다음은 대부분의 프로그래밍 언어에서 발견되는 일반적인 의사 결정 구조의 일반적인 형태입니다.

제어문은 프로그램 실행의 흐름을 제어하는 ​​소스 코드의 요소입니다. 그들은-

S.NO. 제어문 및 설명
1

If 문

괄호 안의 표현식과 명령문 또는 명령문 블록을 사용합니다. 표현식이 참이면 명령문 또는 명령문 블록이 실행되고 그렇지 않으면 이러한 명령문을 건너 뜁니다.

2

If… else 문

if 문 뒤에는 표현식이 거짓 일 때 실행되는 선택적 else 문이 올 수 있습니다.

If… else if… else 문

그만큼 if 문 뒤에는 선택 사항이 올 수 있습니다. else if...else 단일 if ... else if 문을 사용하여 다양한 조건을 테스트하는 데 매우 유용합니다.

4

switch case 문

if 문과 유사하게 switch...case 프로그래머가 다양한 조건에서 실행되어야하는 다른 코드를 지정할 수 있도록하여 프로그램의 흐름을 제어합니다.

5

조건부 연산자? :

조건부 연산자? : C에서 유일한 삼항 연산자입니다.

프로그래밍 언어는보다 복잡한 실행 경로를 허용하는 다양한 제어 구조를 제공합니다.

루프 문을 사용하면 문 또는 문 그룹을 여러 번 실행할 수 있으며 다음은 대부분의 프로그래밍 언어에서 루프 문의 일반적인 형식입니다.

C 프로그래밍 언어는 루핑 요구 사항을 처리하기 위해 다음 유형의 루프를 제공합니다.

S.NO. 루프 및 설명
1

while 루프

while 루프는 괄호 안의 표현식 ()이 거짓이 될 때까지 계속 반복됩니다. 테스트 된 변수를 변경해야합니다. 그렇지 않으면 while 루프가 종료되지 않습니다.

2

do… while 루프

그만큼 do…while루프는 while 루프와 유사합니다. while 루프에서 루프의 본문을 수행하기 전에 루프의 시작 부분에서 루프 연속 조건이 테스트됩니다.

for 루프

for loop미리 정해진 횟수만큼 명령문을 실행합니다. 루프에 대한 제어 표현식은 완전히 for 루프 괄호 안에서 초기화, 테스트 및 조작됩니다.

4

중첩 루프

C 언어를 사용하면 다른 루프 내에서 하나의 루프를 사용할 수 있습니다. 다음 예는 개념을 보여줍니다.

5

무한 루프

종료 조건이없는 루프이므로 무한 루프가됩니다.

함수를 사용하면 프로그램을 코드 세그먼트로 구성하여 개별 작업을 수행 할 수 있습니다. 함수를 생성하는 일반적인 경우는 프로그램에서 동일한 작업을 여러 번 수행해야하는 경우입니다.

코드 조각을 함수로 표준화하면 몇 가지 장점이 있습니다.

  • 함수는 프로그래머가 체계적으로 유지되도록 도와줍니다. 종종 이것은 프로그램을 개념화하는 데 도움이됩니다.

  • 함수는 한 곳에서 하나의 작업을 코드화하여 함수를 한 번만 생각하고 디버깅하면됩니다.

  • 이렇게하면 코드를 변경해야하는 경우 수정 오류가 발생할 가능성도 줄어 듭니다.

  • 함수는 코드 섹션이 여러 번 재사용되기 때문에 전체 스케치를 더 작고 간결하게 만듭니다.

  • 모듈 식으로 만들어 다른 프로그램에서 코드를 더 쉽게 재사용 할 수 있으며 함수를 사용하면 코드를 더 읽기 쉽게 만들 수 있습니다.

Arduino 스케치 또는 프로그램에는 두 가지 필수 기능, 즉 setup () 및 loop ()가 있습니다. 다른 함수는이 두 함수의 대괄호 외부에 만들어야합니다.

함수를 정의하는 가장 일반적인 구문은 다음과 같습니다.

함수 선언

함수는 루프 함수 위 또는 아래에있는 다른 함수 외부에서 선언됩니다.

우리는 두 가지 다른 방법으로 함수를 선언 할 수 있습니다.

첫 번째 방법은 함수의 일부를 작성하는 것입니다. a function prototype -로 구성된 루프 함수 위에

  • 함수 반환 유형
  • 기능 명
  • 함수 인수 유형, 인수 이름을 쓸 필요 없음

함수 프로토 타입 뒤에는 세미콜론 (;)이 와야합니다.

다음 예제는 첫 번째 메서드를 사용하는 함수 선언의 데모를 보여줍니다.

int sum_func (int x, int y) // function declaration {
   int z = 0;
   z = x+y ;
   return z; // return the value
}

void setup () {
   Statements // group of statements
}

Void loop () {
   int result = 0 ;
   result = Sum_func (5,6) ; // function call
}

함수 정의 또는 선언이라고하는 두 번째 부분은 다음으로 구성된 루프 함수 아래에 선언되어야합니다.

  • 함수 반환 유형
  • 기능 명
  • 함수 인수 유형, 여기에 인수 이름을 추가해야합니다.
  • 함수 본문 (함수가 호출 될 때 실행되는 함수 내부의 문)

다음 예제는 두 번째 방법을 사용하여 함수 선언을 보여줍니다.

int sum_func (int , int ) ; // function prototype

void setup () {
   Statements // group of statements
}

Void loop () {
   int result = 0 ;
   result = Sum_func (5,6) ; // function call
}

int sum_func (int x, int y) // function declaration {
   int z = 0;
   z = x+y ;
   return z; // return the value
}

두 번째 방법은 루프 함수 위에 함수를 선언합니다.

문자열은 텍스트를 저장하는 데 사용됩니다. LCD 또는 Arduino IDE 직렬 모니터 창에 텍스트를 표시하는 데 사용할 수 있습니다. 문자열은 사용자 입력을 저장하는데도 유용합니다. 예를 들어, 사용자가 Arduino에 연결된 키패드에 입력하는 문자.

Arduino 프로그래밍에는 두 가지 유형의 문자열이 있습니다.

  • C 프로그래밍에서 사용되는 문자열과 동일한 문자 배열.
  • 스케치에서 문자열 객체를 사용할 수있게 해주는 Arduino 문자열.

이 장에서는 Arduino 스케치에서 문자열, 객체 및 문자열 사용에 대해 배웁니다. 장이 끝나면 스케치에 사용할 문자열 유형을 배웁니다.

string 형 문자 배열

우리가 배울 첫 번째 유형의 문자열은 유형의 일련의 문자 인 문자열입니다. char. 이전 장에서 우리는 배열이 무엇인지 배웠습니다. 메모리에 저장된 동일한 유형의 변수의 연속적인 시리즈. 문자열은 char 변수의 배열입니다.

문자열은 문자열 끝에 하나의 추가 요소가있는 특수 배열로, 항상 값이 0 (영)입니다. 이를 "널로 끝나는 문자열"이라고합니다.

string 형 문자 배열 예제

이 예제는 문자열을 만들고 직렬 모니터 창에 인쇄하는 방법을 보여줍니다.

Example

void setup() {
   char my_str[6]; // an array big enough for a 5 character string
   Serial.begin(9600);
   my_str[0] = 'H'; // the string consists of 5 characters
   my_str[1] = 'e';
   my_str[2] = 'l';
   my_str[3] = 'l';
   my_str[4] = 'o';
   my_str[5] = 0; // 6th array element is a null terminator
   Serial.println(my_str);
}

void loop() { 

}

다음 예제는 문자열이 무엇으로 구성되는지 보여줍니다. 문자열이 끝나는 위치를 표시하기 위해 인쇄 가능한 문자와 배열의 마지막 요소가 0 인 문자 배열. 문자열은 다음을 사용하여 Arduino IDE 직렬 모니터 창에 인쇄 할 수 있습니다.Serial.println() 그리고 문자열의 이름을 전달합니다.

이 동일한 예제는 아래와 같이 더 편리한 방법으로 작성할 수 있습니다.

Example

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

이 스케치에서 컴파일러는 문자열 배열의 크기를 계산하고 자동으로 null로 문자열을 0으로 종료합니다. 길이가 6 개 요소이고 5 개 문자 다음에 0이 오는 배열이 이전 스케치에서와 똑같은 방식으로 생성됩니다.

string 형 배열 조작

다음 스케치와 같이 스케치 내에서 문자열 배열을 변경할 수 있습니다.

void setup() {
   char like[] = "I like coffee and cake"; // create a string
   Serial.begin(9600);
   // (1) print the string
   Serial.println(like);
   // (2) delete part of the string
   like[13] = 0;
   Serial.println(like);
   // (3) substitute a word into the string
   like[13] = ' '; // replace the null terminator with a space
   like[18] = 't'; // insert the new word
   like[19] = 'e';
   like[20] = 'a';
   like[21] = 0; // terminate the string
   Serial.println(like);
}

void loop() {

}

결과

I like coffee and cake
I like coffee
I like coffee and tea

스케치는 다음과 같은 방식으로 작동합니다.

문자열 생성 및 인쇄

위의 스케치에서 새 문자열이 생성 된 다음 직렬 모니터 창에 표시하기 위해 인쇄됩니다.

문자열 단축

문자열의 14 번째 문자를 null로 끝나는 0 (2)으로 대체하여 문자열을 줄입니다. 0부터 계산하는 문자열 배열의 요소 번호 13입니다.

문자열이 인쇄 될 때 모든 문자는 0으로 끝나는 새로운 널까지 인쇄됩니다. 다른 문자는 사라지지 않습니다. 그것들은 여전히 ​​메모리에 존재하고 문자열 배열은 여전히 ​​같은 크기입니다. 유일한 차이점은 문자열과 함께 작동하는 모든 함수는 첫 번째 null 종결 자까지만 문자열을 볼 수 있다는 것입니다.

문자열에서 단어 변경

마지막으로 스케치는 "cake"라는 단어를 "tea"(3)로 대체합니다. 먼저 like [13]의 null 종결자를 공백으로 바꿔야 문자열이 원래 생성 된 형식으로 복원됩니다.

새 문자는 "cake"라는 단어의 "cak"를 "tea"라는 단어로 덮어 씁니다. 이것은 개별 문자를 덮어 써서 수행됩니다. "cake"의 'e'는 새로운 null 종료 문자로 대체됩니다. 결과는 문자열이 실제로 두 개의 널 문자로 종료됩니다. 원래 문자는 문자열의 끝에 있고 새 문자는 "cake"에서 'e'를 대체합니다. 문자열을 인쇄하는 함수가 첫 번째 널 (null) 종결자를 만나면 문자열 문자 인쇄를 중지하므로 새 문자열이 인쇄 될 때 차이가 없습니다.

string 형 배열을 조작하는 함수

이전 스케치는 문자열의 개별 문자에 액세스하여 수동 방식으로 문자열을 조작했습니다. string 형 배열을 더 쉽게 조작하기 위해 고유 한 함수를 작성하거나 다음의 일부 문자열 함수를 사용할 수 있습니다.C 언어 도서관.

S. 아니. 기능 및 설명
1

String()

버전 0019부터 핵심의 일부인 String 클래스를 사용하면 문자 배열보다 더 복잡한 방식으로 텍스트 문자열을 사용하고 조작 할 수 있습니다. 문자열을 연결하고, 추가하고, 하위 문자열을 검색하고 교체하는 등의 작업을 수행 할 수 있습니다. 단순한 문자 배열보다 더 많은 메모리를 사용하지만 더 유용합니다.

참고로, 문자 배열은 작은 's'가있는 문자열로 참조되고 String 클래스의 인스턴스는 대문자 S가있는 문자열로 참조됩니다. "큰 따옴표"로 지정된 상수 문자열은 문자 배열로 처리됩니다. String 클래스의 인스턴스가 아닙니다.

2

charAt()

문자열의 특정 문자에 액세스합니다.

compareTo()

두 문자열을 비교하여 하나가 다른 문자열보다 앞이나 뒤에 오는지 또는 같은지 테스트합니다. 문자열은 문자의 ASCII 값을 사용하여 문자별로 비교됩니다. 예를 들어 'a'는 'b'앞에오고 'A'뒤에옵니다. 숫자는 문자 앞에옵니다.

4

concat()

매개 변수를 문자열에 추가합니다.

5

c_str()

문자열의 내용을 C 스타일의 null로 끝나는 문자열로 변환합니다. 이것은 내부 문자열 버퍼에 대한 직접 액세스를 제공하므로주의해서 사용해야합니다. 특히 반환 된 포인터를 통해 문자열을 수정해서는 안됩니다. String 객체를 수정하거나 소멸되면 이전에 c_str ()에 의해 반환 된 모든 포인터가 유효하지 않게되며 더 이상 사용해서는 안됩니다.

6

endsWith()

문자열이 다른 문자열의 문자로 끝나는 지 여부를 테스트합니다.

7

equals()

두 문자열이 같은지 비교합니다. 비교는 대소 문자를 구분합니다. 즉, 문자열 "hello"가 문자열 "HELLO"와 동일하지 않습니다.

8

equalsIgnoreCase()

두 문자열이 같은지 비교합니다. 비교는 대소 문자를 구분하지 않습니다. 즉, String ( "hello")이 String ( "HELLO")과 같습니다.

9

getBytes()

문자열의 문자를 제공된 버퍼에 복사합니다.

10

indexOf()

다른 문자열 내에서 문자 또는 문자열을 찾습니다. 기본적으로 문자열의 처음부터 검색하지만 주어진 색인에서 시작할 수도 있으므로 문자 또는 문자열의 모든 인스턴스를 찾을 수 있습니다.

11

lastIndexOf()

다른 문자열 내에서 문자 또는 문자열을 찾습니다. 기본적으로 문자열의 끝에서 검색하지만 지정된 색인에서 역방향으로 작업 할 수도 있으므로 문자 또는 문자열의 모든 인스턴스를 찾을 수 있습니다.

12

length()

문자열의 길이를 문자로 반환합니다. (여기에는 후행 널 문자가 포함되지 않습니다.)

13

remove()

제공된 색인에서 문자열 끝까지 또는 제공된 색인에서 색인을 더한 값으로 문자를 제거하는 문자열을 제자리에서 수정합니다.

14

replace()

String replace () 함수를 사용하면 주어진 문자의 모든 인스턴스를 다른 문자로 바꿀 수 있습니다. replace를 사용하여 문자열의 하위 문자열을 다른 하위 문자열로 바꿀 수도 있습니다.

15

reserve()

String reserve () 함수를 사용하면 문자열을 조작하기 위해 메모리에 버퍼를 할당 할 수 있습니다.

16

setCharAt()

문자열의 문자를 설정합니다. String의 기존 길이를 벗어난 인덱스에는 영향을주지 않습니다.

17

startsWith()

문자열이 다른 문자열의 문자로 시작하는지 여부를 테스트합니다.

18

toCharArray()

문자열의 문자를 제공된 버퍼에 복사합니다.

19

substring()

문자열의 하위 문자열을 가져옵니다. 시작 색인은 포함되지만 (해당 문자는 하위 문자열에 포함됨) 선택적 종료 색인은 배타적입니다 (해당 문자는 하위 문자열에 포함되지 않음). 끝 인덱스가 생략되면 하위 문자열은 문자열의 끝까지 계속됩니다.

20

toInt()

유효한 문자열을 정수로 변환합니다. 입력 문자열은 정수로 시작해야합니다. 문자열에 정수가 아닌 숫자가 포함 된 경우 함수는 변환 수행을 중지합니다.

21

toFloat()

유효한 문자열을 부동 소수점으로 변환합니다. 입력 문자열은 숫자로 시작해야합니다. 문자열에 숫자가 아닌 문자가 포함 된 경우 함수는 변환 수행을 중지합니다. 예를 들어 문자열 "123.45", "123"및 "123fish"는 각각 123.45, 123.00 및 123.00으로 변환됩니다. '123.456'은 대략 123.46입니다. 부동 소수점의 정밀도는 6 ~ 7 자리이며 더 긴 문자열은 잘릴 수 있습니다.

22

toLowerCase()

문자열의 소문자 버전을 가져옵니다. 1.0부터 toLowerCase ()는 새로운 문자열을 반환하지 않고 제자리에서 문자열을 수정합니다.

23

toUpperCase()

문자열의 대문자 버전을 가져옵니다. 1.0부터 toUpperCase ()는 새로운 문자열을 반환하지 않고 제자리에서 문자열을 수정합니다.

24

trim()

선행 및 후행 공백이 제거 된 문자열 버전을 가져옵니다. 1.0부터 trim ()은 새 문자열을 반환하지 않고 제자리에서 문자열을 수정합니다.

다음 스케치는 일부 C 문자열 함수를 사용합니다.

void setup() {
   char str[] = "This is my string"; // create a string
   char out_str[40]; // output from string functions placed here
   int num; // general purpose integer
   Serial.begin(9600);

   // (1) print the string
   Serial.println(str);

   // (2) get the length of the string (excludes null terminator)
   num = strlen(str);
   Serial.print("String length is: ");
   Serial.println(num);

   // (3) get the length of the array (includes null terminator)
   num = sizeof(str); // sizeof() is not a C string function
   Serial.print("Size of the array: ");
   Serial.println(num);

   // (4) copy a string
   strcpy(out_str, str);
   Serial.println(out_str);

   // (5) add a string to the end of a string (append)
   strcat(out_str, " sketch.");
   Serial.println(out_str);
   num = strlen(out_str);
   Serial.print("String length is: ");
   Serial.println(num);
   num = sizeof(out_str);
   Serial.print("Size of the array out_str[]: ");
   Serial.println(num);
}

void loop() {

}

결과

This is my string
String length is: 17
Size of the array: 18
This is my string
This is my string sketch.
String length is: 25
Size of the array out_str[]: 40

스케치는 다음과 같은 방식으로 작동합니다.

문자열 인쇄

새로 생성 된 문자열은 이전 스케치에서와 같이 직렬 모니터 창에 인쇄됩니다.

문자열의 길이 가져 오기

strlen () 함수는 문자열의 길이를 가져 오는 데 사용됩니다. 문자열의 길이는 인쇄 가능한 문자 전용이며 널 종결자를 포함하지 않습니다.

문자열에는 17 개의 문자가 포함되어 있으므로 직렬 모니터 창에 17 개의 문자가 인쇄되어 있습니다.

배열의 길이 얻기

연산자 sizeof ()는 문자열을 포함하는 배열의 길이를 가져 오는 데 사용됩니다. 길이에는 널 (NULL) 종료자가 포함되므로 길이는 문자열 길이보다 하나 더 많습니다.

sizeof ()는 함수처럼 보이지만 기술적으로는 연산자입니다. C 문자열 라이브러리의 일부는 아니지만 스케치에서 배열 크기와 문자열 크기 (또는 문자열 길이)의 차이를 보여주기 위해 사용되었습니다.

문자열 복사

strcpy () 함수는 str [] 문자열을 out_num [] 배열에 복사하는 데 사용됩니다. strcpy () 함수는 전달 된 두 번째 문자열을 첫 번째 문자열로 복사합니다. 문자열의 복사본은 이제 out_num [] 배열에 존재하지만 배열의 18 개 요소 만 차지하므로 배열에는 여전히 22 개의 빈 char 요소가 있습니다. 이러한 자유 요소는 메모리의 문자열 뒤에 있습니다.

문자열이 배열에 복사되어 문자열 끝에 문자열을 추가하는 스케치의 다음 부분에서 사용할 추가 공간이 배열에 있습니다.

문자열에 문자열 추가 (연결)

스케치는 하나의 문자열을 다른 문자열에 결합하며이를 연결이라고합니다. 이것은 strcat () 함수를 사용하여 수행됩니다. strcat () 함수는 전달 된 두 번째 문자열을 전달 된 첫 번째 문자열의 끝에 넣습니다.

연결 후 새 문자열 길이를 표시하기 위해 문자열 길이가 인쇄됩니다. 그런 다음 배열의 길이가 인쇄되어 40 개 요소의 긴 배열에 25 자 길이의 문자열이 있음을 보여줍니다.

25 자 길이의 문자열은 null로 끝나는 0으로 인해 실제로 배열에서 26자를 차지한다는 점을 기억하십시오.

배열 경계

문자열과 배열로 작업 할 때 문자열이나 배열의 범위 내에서 작업하는 것이 매우 중요합니다. 예제 스케치에서는 문자열을 조작하는 데 사용할 수있는 메모리를 할당하기 위해 40 자 길이의 배열이 생성되었습니다.

배열이 너무 작게 만들어져 배열보다 큰 문자열을 여기에 복사하려고하면 문자열이 배열 끝 부분에 복사됩니다. 배열의 끝을 넘어서는 메모리에는 스케치에 사용 된 다른 중요한 데이터가 포함될 수 있으며이 데이터는 문자열로 덮어 쓰여집니다. 문자열 끝을 초과하는 메모리가 초과되면 스케치가 중단되거나 예기치 않은 동작이 발생할 수 있습니다.

Arduino 프로그래밍에 사용되는 두 번째 유형의 문자열은 String Object입니다.

개체는 무엇입니까?

객체는 데이터와 함수를 모두 포함하는 구조입니다. String 객체는 변수처럼 생성되고 값이나 문자열을 할당 할 수 있습니다. String 개체에는 String 개체에 포함 된 문자열 데이터에 대해 작동하는 함수 (OOP (개체 지향 프로그래밍)에서 "메서드"라고 함)가 포함되어 있습니다.

다음 스케치와 설명을 통해 객체가 무엇인지, String 객체가 어떻게 사용되는지 명확하게 알 수 있습니다.

void setup() { 
   String my_str = "This is my string.";
   Serial.begin(9600);

   // (1) print the string
   Serial.println(my_str);

   // (2) change the string to upper-case
   my_str.toUpperCase();
   Serial.println(my_str);

   // (3) overwrite the string
   my_str = "My new string.";
   Serial.println(my_str);

   // (4) replace a word in the string
   my_str.replace("string", "Arduino sketch");
   Serial.println(my_str);

   // (5) get the length of the string
   Serial.print("String length is: ");
   Serial.println(my_str.length());
}

void loop() { 

}

결과

This is my string.
THIS IS MY STRING.
My new string.
My new Arduino sketch.
String length is: 22

문자열 객체가 생성되고 스케치 상단에 값 (또는 문자열)이 지정됩니다.

String my_str = "This is my string." ;

이것은 이름을 가진 String 객체를 생성합니다 my_str "This is my string."의 값을 제공합니다.

이것은 변수를 만들고 정수와 같은 값을 할당하는 것과 비교할 수 있습니다.

int my_var = 102;

스케치는 다음과 같은 방식으로 작동합니다.

문자열 인쇄

문자열은 문자 배열 문자열처럼 직렬 모니터 창에 인쇄 할 수 있습니다.

문자열을 대문자로 변환

생성 된 문자열 객체 my_str에는 작동 할 수있는 여러 함수 또는 메서드가 있습니다. 이러한 메서드는 개체 이름, 점 연산자 (.), 사용할 함수 이름을 차례로 사용하여 호출됩니다.

my_str.toUpperCase();

그만큼 toUpperCase() 함수는 my_strString 유형이고 객체에 포함 된 문자열 데이터 (또는 텍스트)를 대문자로 변환하는 객체입니다. String 클래스에 포함 된 함수 목록은 Arduino String 참조에서 찾을 수 있습니다. 기술적으로 String은 클래스라고하며 String 개체를 만드는 데 사용됩니다.

문자열 덮어 쓰기

할당 연산자는 새 문자열을 할당하는 데 사용됩니다. my_str 이전 문자열을 대체하는 객체

my_str = "My new string." ;

할당 연산자는 문자 배열 문자열에서 사용할 수 없지만 String 개체에서만 작동합니다.

문자열에서 단어 바꾸기

replace () 함수는 전달 된 첫 번째 문자열을 전달 된 두 번째 문자열로 대체하는 데 사용됩니다. replace ()는 String 클래스에 내장 된 또 다른 함수이므로 String 객체 my_str에서 사용할 수 있습니다.

문자열의 길이 얻기

string의 길이는 length ()를 사용하여 쉽게 얻을 수 있습니다. 예제 스케치에서 length ()에 의해 반환 된 결과는 중간 변수를 사용하지 않고 Serial.println ()에 직접 전달됩니다.

문자열 개체를 사용하는 경우

String 객체는 string 형 문자 배열보다 사용하기가 훨씬 쉽습니다. 객체에는 문자열에 대해 여러 작업을 수행 할 수있는 내장 함수가 있습니다.

String 객체 사용의 주요 단점은 많은 메모리를 사용하고 Arduinos RAM 메모리를 빠르게 사용할 수 있다는 것입니다. 이로 인해 Arduino가 중단되거나 충돌하거나 예기치 않게 동작 할 수 있습니다. Arduino의 스케치가 작고 객체 사용을 제한하면 문제가 없습니다.

문자 배열 문자열은 사용하기가 더 어려우며 이러한 유형의 문자열에서 작동하려면 자체 함수를 작성해야 할 수도 있습니다. 장점은 만드는 string 형 배열의 크기를 제어 할 수 있으므로 배열을 작게 유지하여 메모리를 절약 할 수 있다는 것입니다.

문자열 배열로 배열 경계의 끝을 초과하여 쓰지 않도록해야합니다. String 객체에는이 문제가 없으며 작동하기에 충분한 메모리가있는 경우 문자열 경계를 처리합니다. String 객체는 메모리가 부족할 때 존재하지 않는 메모리에 쓰기를 시도 할 수 있지만 작동중인 문자열의 끝 부분에는 쓰지 않습니다.

문자열이 사용되는 곳

이 장에서 우리는 문자열, 그들이 메모리에서 어떻게 동작하는지 그리고 그 동작에 대해 연구했습니다.

문자열의 실제 사용은 직렬 모니터 창에서 사용자 입력을 가져오고 입력을 문자열에 저장하는 방법을 연구 할 때이 과정의 다음 부분에서 다룰 것입니다.

Arduino는 4 가지 시간 조작 기능을 제공합니다. 그들은-

S. 아니. 기능 및 설명
1

지연 () 함수

방법 delay()기능 작동은 매우 간단합니다. 단일 정수 (또는 숫자) 인수를 허용합니다. 이 숫자는 시간을 나타냅니다 (밀리 초로 측정).

2

delayMicroseconds () 함수

그만큼 delayMicroseconds()함수는 단일 정수 (또는 숫자) 인수를받습니다. 밀리 초에는 천 마이크로 초가 있고 1 초에는 백만 마이크로 초가 있습니다.

millis () 함수

이 함수는 Arduino 보드가 현재 프로그램을 실행하기 시작하는 시점의 밀리 초 수를 반환하는 데 사용됩니다.

4

micros () 함수

micros () 함수는 Arduino 보드가 현재 프로그램을 실행하기 시작한 시점부터 마이크로 초 수를 반환합니다. 이 숫자는 오버플로됩니다. 즉, 약 70 분 후에 0으로 돌아갑니다.

배열은 동일한 유형의 연속적인 메모리 위치 그룹입니다. 배열의 특정 위치 또는 요소를 참조하기 위해 배열의 이름과 배열에있는 특정 요소의 위치 번호를 지정합니다.

아래 그림은 11 개의 요소를 포함하는 C라는 정수 배열을 보여줍니다. 배열 이름 다음에 대괄호 ([])로 묶인 특정 요소의 위치 번호를 제공하여 이러한 요소 중 하나를 참조합니다. 위치 번호는 공식적으로 아래 첨자 또는 색인이라고합니다 (이 번호는 배열의 시작 부분에서 요소 수를 지정합니다). 첫 번째 요소는 아래 첨자 0 (영)을 가지며 때로는 0 요소라고도합니다.

따라서 배열 C의 요소는 C [0] ( "C sub zero"로 발음), C [1], C [2] 등입니다. 배열 C에서 가장 높은 첨자는 10으로 배열의 요소 수 (11)보다 1이 적습니다. 배열 이름은 다른 변수 이름과 동일한 규칙을 따릅니다.

아래 첨자는 정수 또는 정수 표현식이어야합니다 (정수 유형 사용). 프로그램이 표현식을 첨자로 사용하는 경우 프로그램은 표현식을 평가하여 첨자를 결정합니다. 예를 들어, 변수 a가 5이고 변수 b가 6이라고 가정하면 명령문은 배열 요소 C [11]에 2를 더합니다.

첨자 배열 이름은 lvalue이며, 배열이 아닌 변수 이름처럼 할당의 왼쪽에서 사용할 수 있습니다.

주어진 그림에서 배열 C를 좀 더 자세히 살펴 보겠습니다. 전체 배열의 이름은 C입니다. 11 개 요소는 C [0] ~ C [10]으로 참조됩니다. C [0]의 값은 -45, C [1]의 값은 6, C [2]의 값은 0, C [7]의 값은 62, C [10]의 값은 다음과 같습니다. 78.

배열 C의 처음 세 요소에 포함 된 값의 합계를 인쇄하려면 다음과 같이 작성합니다.

Serial.print (C[ 0 ] + C[ 1 ] + C[ 2 ] );

C [6]의 값을 2로 나누고 그 결과를 변수 x에 할당하려면 다음과 같이 씁니다.

x = C[ 6 ] / 2;

배열 선언

배열은 메모리 공간을 차지합니다. 요소의 유형과 배열에 필요한 요소 수를 지정하려면 다음 형식의 선언을 사용하십시오.

type arrayName [ arraySize ] ;

컴파일러는 적절한 양의 메모리를 예약합니다. (메모리를 예약하는 선언은 정의로 더 잘 알려져 있습니다.) arraySize는 0보다 큰 정수 상수 여야합니다. 예를 들어 컴파일러에게 정수 배열 C에 대해 11 개의 요소를 예약하도록 지시하려면 다음 선언을 사용하십시오.

int C[ 12 ]; // C is an array of 12 integers

참조가 아닌 데이터 유형의 값을 포함하도록 배열을 선언 할 수 있습니다. 예를 들어 문자열 유형의 배열을 사용하여 문자열을 저장할 수 있습니다.

배열을 사용한 예

이 섹션에서는 배열을 선언, 초기화 및 조작하는 방법을 보여주는 많은 예제를 제공합니다.

예제 1 : 배열 선언 및 루프를 사용하여 배열 요소 초기화

프로그램은 10 요소 정수 배열을 선언합니다. n. 라인 a–b는 a를 사용합니다.For배열 요소를 0으로 초기화하는 문입니다. 다른 자동 변수와 마찬가지로 자동 배열은 암시 적으로 0으로 초기화되지 않습니다. 첫 번째 출력 문 (c 행)은 배열을 표 형식으로 인쇄하는 후속 for 문 (d–e 행)에 인쇄 된 열의 열 표제를 표시합니다.

Example

int n[ 10 ] ; // n is an array of 10 integers

void setup () {

}

void loop () {
   for ( int i = 0; i < 10; ++i ) // initialize elements of array n to 0 {
      n[ i ] = 0; // set element at location i to 0
      Serial.print (i) ;
      Serial.print (‘\r’) ;
   }
   for ( int j = 0; j < 10; ++j ) // output each array element's value {
      Serial.print (n[j]) ;
      Serial.print (‘\r’) ;
   } 
}

Result − 다음 결과를 생성합니다 −

Element Value

0

1

2

3

4

5

6

7

8

9

0

0

0

0

0

0

0

0

0

0

예제 2 : 이니셜 라이저 목록을 사용하여 선언에서 배열 초기화

배열의 요소는 배열 이름 뒤에 등호 부호와 중괄호로 구분 된 쉼표로 구분 된 이니셜 라이저 목록을 사용하여 배열 선언에서 초기화 할 수도 있습니다. 프로그램은 이니셜 라이저 목록을 사용하여 10 개의 값 (라인 a)으로 정수 배열을 초기화하고 배열을 표 형식 (라인 b-c)으로 인쇄합니다.

Example

// n is an array of 10 integers
int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 } ;

void setup () {

}

void loop () {
   for ( int i = 0; i < 10; ++i ) {
      Serial.print (i) ;
      Serial.print (‘\r’) ;
   }
   for ( int j = 0; j < 10; ++j ) // output each array element's value {
      Serial.print (n[j]) ;
      Serial.print (‘\r’) ;
   } 
}

Result − 다음 결과를 생성합니다 −

Element Value

0

1

2

3

4

5

6

7

8

9

32

27

64

18

95

14

90

70

60

37

예 3 : 배열 요소 합산

종종 배열의 요소는 계산에 사용되는 일련의 값을 나타냅니다. 예를 들어 배열의 요소가 시험 성적을 나타내는 경우 교수는 배열 요소의 합계를 구하고 그 합계를 사용하여 시험의 학급 평균을 계산할 수 있습니다. 프로그램은 10 요소 정수 배열에 포함 된 값을 합산합니다.a.

Example

const int arraySize = 10; // constant variable indicating size of array
int a[ arraySize ] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };
int total = 0;

void setup () {

}
void loop () {
   // sum contents of array a
   for ( int i = 0; i < arraySize; ++i )
      total += a[ i ];
   Serial.print (“Total of array elements : ”) ;
   Serial.print(total) ;
}

Result − 다음 결과를 생성합니다 −

Total of array elements: 849

배열은 Arduino에 중요하며 더 많은주의가 필요합니다. 배열과 관련된 다음과 같은 중요한 개념은 Arduino에 명확해야합니다.

S.NO. 개념 및 설명
1 함수에 배열 전달

배열 인수를 함수에 전달하려면 대괄호없이 배열 이름을 지정하십시오.

2 다차원 배열

2 차원 배열 (즉, 첨자)은 종종 행과 열로 배열 된 정보로 구성된 값 테이블을 나타냅니다.

Arduino 보드의 핀은 입력 또는 출력으로 구성 할 수 있습니다. 이러한 모드에서 핀의 기능을 설명합니다. 대부분의 Arduino 아날로그 핀은 디지털 핀과 똑같은 방식으로 구성 및 사용할 수 있습니다.

INPUT으로 구성된 핀

Arduino 핀은 기본적으로 입력으로 구성되므로 다음을 사용하여 명시 적으로 입력으로 선언 할 필요가 없습니다. pinMode()입력으로 사용할 때. 이 방식으로 구성된 핀은 높은 임피던스 상태에 있다고합니다. 입력 핀은 샘플링하는 회로에 대해 극히 작은 요구 사항을 생성합니다. 이는 핀 앞에있는 100 메가 옴의 직렬 저항에 해당합니다.

이는 입력 핀을 한 상태에서 다른 상태로 전환하는 데 매우 적은 전류가 필요함을 의미합니다. 이는 정전 용량 터치 센서를 구현하거나 LED를 포토 다이오드로 읽는 것과 같은 작업에 핀을 유용하게 만듭니다.

pinMode (pin, INPUT)로 구성된 핀은 아무것도 연결되지 않았거나 다른 회로에 연결되지 않은 와이어가 연결된 상태에서 핀 상태의 임의의 변화를보고하거나 환경에서 전기적 노이즈를 포착하거나 상태를 용량 적으로 결합합니다. 근처 핀의.

풀업 저항기

풀업 저항은 입력이없는 경우 입력 핀을 알려진 상태로 조정하는 데 유용합니다. 이는 입력에 풀업 저항 (+ 5V까지) 또는 풀다운 저항 (접지에 대한 저항)을 추가하여 수행 할 수 있습니다. 10K 저항은 풀업 또는 풀다운 저항에 적합한 값입니다.

입력으로 구성된 핀과 함께 내장 풀업 저항 사용

Atmega 칩에는 소프트웨어에서 액세스 할 수있는 20,000 개의 풀업 저항이 내장되어 있습니다. 이러한 내장 풀업 저항은pinMode()INPUT_PULLUP으로. 이는 INPUT 모드의 동작을 효과적으로 반전시킵니다. 여기서 HIGH는 센서가 꺼져 있음을 의미하고 LOW는 센서가 켜져 있음을 의미합니다. 이 풀업의 값은 사용 된 마이크로 컨트롤러에 따라 다릅니다. 대부분의 AVR 기반 보드에서 값은 20kΩ에서 50kΩ 사이로 보장됩니다. Arduino Due에서는 50kΩ에서 150kΩ 사이입니다. 정확한 값은 보드의 마이크로 컨트롤러 데이터 시트를 참조하십시오.

INPUT_PULLUP으로 구성된 핀에 센서를 연결할 때 다른 쪽 끝은 접지에 연결해야합니다. 간단한 스위치의 경우 스위치가 열리면 핀이 HIGH로, 스위치를 눌렀을 때 LOW로 표시됩니다. 풀업 저항은 입력으로 구성된 핀에 희미하게 연결된 LED를 비추기에 충분한 전류를 제공합니다. 프로젝트의 LED가 작동하는 것처럼 보이지만 매우 어둡다면 이것이 진행중인 것일 수 있습니다.

핀이 HIGH인지 LOW인지를 제어하는 ​​동일한 레지스터 (내부 칩 메모리 위치)가 풀업 저항을 제어합니다. 결과적으로 핀이 INPUT 모드에있을 때 풀업 저항이 켜지도록 구성된 핀은 핀이 pinMode ()를 사용하여 OUTPUT 모드로 전환되면 핀이 HIGH로 구성됩니다. 이것은 다른 방향에서도 작동하며, HIGH 상태로 남겨진 출력 핀은 pinMode ()를 사용하여 입력으로 전환되면 풀업 저항이 설정됩니다.

Example

pinMode(3,INPUT) ; // set pin to input without using built in pull up resistor
pinMode(5,INPUT_PULLUP) ; // set pin to input using built in pull up resistor

OUTPUT으로 구성된 핀

pinMode ()를 사용하여 OUTPUT으로 구성된 핀은 낮은 임피던스 상태에 있다고합니다. 이는 다른 회로에 상당한 양의 전류를 제공 할 수 있음을 의미합니다. Atmega 핀은 최대 40mA (밀리 암페어)의 전류를 다른 장치 / 회로에 소싱 (양의 전류 제공) 또는 싱크 (음의 전류 제공) 할 수 있습니다. 이것은 LED를 밝게 비추거나 (직렬 저항을 잊지 마세요) 많은 센서를 실행하지만 릴레이, 솔레노이드 또는 모터를 실행하기에는 충분한 전류가 아닙니다.

출력 핀에서 고전류 장치를 실행하려고 시도하면 핀의 출력 트랜지스터가 손상되거나 파손되거나 전체 Atmega 칩이 손상 될 수 있습니다. 종종 이로 인해 마이크로 컨트롤러에서 "데드"핀이 발생하지만 나머지 칩은 여전히 ​​적절하게 작동합니다. 이러한 이유로 특정 애플리케이션에 핀에서 끌어온 최대 전류가 필요하지 않은 경우 OUTPUT 핀을 470Ω 또는 1k 저항을 통해 다른 장치에 연결하는 것이 좋습니다.

pinMode () 함수

pinMode () 함수는 특정 핀이 입력 또는 출력으로 동작하도록 구성하는 데 사용됩니다. INPUT_PULLUP 모드로 내부 풀업 저항을 활성화 할 수 있습니다. 또한 INPUT 모드는 내부 풀업을 명시 적으로 비활성화합니다.

pinMode () 함수 구문

Void setup () {
   pinMode (pin , mode);
}
  • pin − 모드를 설정하려는 핀 번호

  • mode − INPUT, OUTPUT 또는 INPUT_PULLUP.

Example

int button = 5 ; // button connected to pin 5
int LED = 6; // LED connected to pin 6

void setup () {
   pinMode(button , INPUT_PULLUP); 
   // set the digital pin as input with pull-up resistor
   pinMode(button , OUTPUT); // set the digital pin as output
}

void setup () {
   If (digitalRead(button ) == LOW) // if button pressed {
      digitalWrite(LED,HIGH); // turn on led
      delay(500); // delay for 500 ms
      digitalWrite(LED,LOW); // turn off led
      delay(500); // delay for 500 ms
   }
}

digitalWrite () 함수

그만큼 digitalWrite()함수는 HIGH 또는 LOW 값을 디지털 핀에 쓰는 데 사용됩니다. 핀이 pinMode () 를 사용하여 OUTPUT으로 구성된 경우 해당 전압은 HIGH의 경우 5V (또는 3.3V 보드의 경우 3.3V), LOW의 경우 0V (접지)로 설정됩니다. 핀이 INPUT으로 구성된 경우 digitalWrite ()는 입력 핀의 내부 풀업을 활성화 (HIGH) 또는 비활성화 (LOW)합니다. 내부 풀업 저항을 활성화하려면 pinMode () 를 INPUT_PULLUP 으로 설정하는 것이 좋습니다 .

pinMode ()를 OUTPUT으로 설정하지 않고 LED를 핀에 연결하면 digitalWrite (HIGH) 호출시 LED가 어두워 질 수 있습니다. pinMode ()를 명시 적으로 설정하지 않으면 digitalWrite ()는 큰 전류 제한 저항처럼 작동하는 내부 풀업 저항을 활성화합니다.

digitalWrite () 함수 구문

Void loop() {
   digitalWrite (pin ,value);
}
  • pin − 모드를 설정하려는 핀 번호

  • value − HIGH 또는 LOW.

Example

int LED = 6; // LED connected to pin 6

void setup () {
   pinMode(LED, OUTPUT); // set the digital pin as output
}

void setup () { 
   digitalWrite(LED,HIGH); // turn on led
   delay(500); // delay for 500 ms
   digitalWrite(LED,LOW); // turn off led
   delay(500); // delay for 500 ms
}

analogRead () 함수

Arduino는 핀 중 하나에 적용된 전압이 있는지 감지하고 digitalRead () 함수를 통해보고 할 수 있습니다. 온 / 오프 센서 (물체의 존재를 감지)와 값이 지속적으로 변하는 아날로그 센서 사이에는 차이가 있습니다. 이 유형의 센서를 읽으려면 다른 유형의 핀이 필요합니다.

Arduino 보드의 오른쪽 하단에 "Analog In"이라고 표시된 6 개의 핀이 있습니다. 이 특수 핀은 전압이 적용되었는지 여부뿐만 아니라 그 값도 알려줍니다. 사용하여analogRead() 기능을 사용하면 핀 중 하나에 적용된 전압을 읽을 수 있습니다.

이 함수는 0에서 5V 사이의 전압을 나타내는 0에서 1023 사이의 숫자를 반환합니다. 예를 들어 핀 번호 0에 2.5V의 전압이 적용되면 analogRead (0)는 512를 반환합니다.

analogRead () 함수 구문

analogRead(pin);
  • pin − 읽을 아날로그 입력 핀의 수 (대부분의 보드에서 0 ~ 5, Mini 및 Nano에서 0 ~ 7, Mega에서 0 ~ 15)

Example

int analogPin = 3;//potentiometer wiper (middle terminal) 
   // connected to analog pin 3 
int val = 0; // variable to store the value read

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

void loop() {
   val = analogRead(analogPin); // read the input pin
   Serial.println(val); // debug value
}

이 장에서는 몇 가지 고급 입력 및 출력 기능에 대해 알아 봅니다.

analogReference () 함수

아날로그 입력에 사용되는 기준 전압 (즉, 입력 범위의 상단으로 사용되는 값)을 구성합니다. 옵션은-

  • DEFAULT − 5V (5V Arduino 보드) 또는 3.3V (3.3V Arduino 보드)의 기본 아날로그 기준

  • INTERNAL − ATmega168 또는 ATmega328에서는 1.1V, ATmega8에서는 2.56V에 해당하는 내장 참조 (Arduino Mega에서는 사용할 수 없음)

  • INTERNAL1V1 − 내장 1.1V 레퍼런스 (Arduino Mega 만 해당)

  • INTERNAL2V56 − 내장 2.56V 레퍼런스 (Arduino Mega 만 해당)

  • EXTERNAL − AREF 핀에 적용된 전압 (0 ~ 5V 만 해당)이 기준으로 사용됩니다.

analogReference () 함수 구문

analogReference (type);

type − 모든 유형의 다음 사용 가능 (DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL)

AREF 핀의 외부 기준 전압에 대해 0V 미만 또는 5V 이상을 사용하지 마십시오. AREF 핀에서 외부 참조를 사용하는 경우 아날로그 참조를 EXTERNAL로 설정해야합니다.analogRead()함수. 그렇지 않으면 활성 기준 전압 (내부 생성)과 AREF 핀이 단락되어 Arduino 보드의 마이크로 컨트롤러가 손상 될 수 있습니다.

또는 5K 저항을 통해 외부 기준 전압을 AREF 핀에 연결하여 외부 기준 전압과 내부 기준 전압을 전환 할 수 있습니다.

저항은 AREF 핀에 내부 32K 저항이 있기 때문에 기준으로 사용되는 전압을 변경합니다. 둘은 전압 분배기 역할을합니다. 예를 들어 저항을 통해 2.5V를 적용하면 AREF 핀에서 2.5 * 32 / (32 + 5) = ~ 2.2V가됩니다.

Example

int analogPin = 3;// potentiometer wiper (middle terminal) connected to analog pin 3 
int val = 0; // variable to store the read value

void setup() {
   Serial.begin(9600); // setup serial
   analogReference(EXTERNAL); // the voltage applied to the AREF pin (0 to 5V only) 
      // is used as the reference.
}

void loop() {
   val = analogRead(analogPin); // read the input pin
   Serial.println(val); // debug value
}

모든 데이터는 문자, 숫자 및 다양한 특수 기호를 포함하는 문자로 컴퓨터에 입력됩니다. 이 섹션에서는 개별 문자를 검사하고 조작하기위한 C ++의 기능에 대해 설명합니다.

문자 처리 라이브러리에는 문자 데이터의 유용한 테스트 및 조작을 수행하는 여러 기능이 포함되어 있습니다. 각 함수는 int로 표시되는 문자 또는 인수로 EOF를받습니다. 문자는 종종 정수로 조작됩니다.

EOF는 일반적으로 -1 값을 가지며 일부 하드웨어 아키텍처에서는 음수 값이 char 변수에 저장되는 것을 허용하지 않습니다. 따라서 문자 처리 함수는 문자를 정수로 조작합니다.

다음 표는 문자 처리 라이브러리의 기능을 요약 한 것입니다. 문자 처리 라이브러리의 함수를 사용할 때<cctype> 머리글.

S. 아니. 프로토 타입 및 설명
1

int isdigit( int c )

c가 숫자이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

2

int isalpha( int c )

c가 문자이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

int isalnum( int c )

c가 숫자 또는 문자이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

4

int isxdigit( int c )

c가 16 진수 문자이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

(2 진수, 8 진수, 10 진수 및 16 진수에 대한 자세한 설명은 부록 D, 숫자 체계를 참조하십시오.)

5

int islower( int c )

c가 소문자이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

6

int isupper( int c )

c가 대문자이면 1을 반환합니다. 그렇지 않으면 0입니다.

7

int isspace( int c )

c가 공백 문자 인 경우 1을 반환합니다. 줄 바꿈 ( '\ n'), 공백

( ''), 용지 공급 ( '\ f'), 캐리지 리턴 ( '\ r'), 가로 탭 ( '\ t') 또는 세로 탭 ( '\ v')-그렇지 않으면 0입니다.

8

int iscntrl( int c )

c가 줄 바꿈 ( '\ n'), 용지 공급 ( '\ f'), 캐리지 리턴 ( '\ r'), 가로 탭 ( '\ t'), 세로 탭 ( ')과 같은 제어 문자이면 1을 반환합니다. \ v '), 경고 ('\ a ') 또는 백 스페이스 ('\ b ')-그렇지 않으면 0입니다.

9

int ispunct( int c )

c가 공백, 숫자 또는 문자가 아닌 인쇄 문자이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

10

int isprint( int c )

c가 공백 ( '')을 포함하는 인쇄 문자이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

11

int isgraph( int c )

c가 공백 ( '')이 아닌 인쇄 문자이면 1을 반환하고 그렇지 않으면 0을 반환합니다.

다음 예제는 함수 사용을 보여줍니다. isdigit, isalpha, isalnumisxdigit. 함수isdigit인수가 숫자 (0-9)인지 여부를 결정합니다. 함수isalpha인수가 대문자 (AZ)인지 소문자 (a–z)인지 결정합니다. 함수isalnum인수가 대문자, 소문자 또는 숫자인지 여부를 결정합니다. 함수isxdigit 인수가 16 진수 (A–F, a–f, 0–9)인지 여부를 결정합니다.

예 1

void setup () {
   Serial.begin (9600);
   Serial.print ("According to isdigit:\r");
   Serial.print (isdigit( '8' ) ? "8 is a": "8 is not a");
   Serial.print (" digit\r" );
   Serial.print (isdigit( '8' ) ?"# is a": "# is not a") ;
   Serial.print (" digit\r");
   Serial.print ("\rAccording to isalpha:\r" );
   Serial.print (isalpha('A' ) ?"A is a": "A is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha('A' ) ?"b is a": "b is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha('A') ?"& is a": "& is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha( 'A' ) ?"4 is a":"4 is not a");
   Serial.print (" letter\r");
   Serial.print ("\rAccording to isalnum:\r");
   Serial.print (isalnum( 'A' ) ?"A is a" : "A is not a" );

   Serial.print (" digit or a letter\r" );
   Serial.print (isalnum( '8' ) ?"8 is a" : "8 is not a" ) ;
   Serial.print (" digit or a letter\r");
   Serial.print (isalnum( '#' ) ?"# is a" : "# is not a" );
   Serial.print (" digit or a letter\r");
   Serial.print ("\rAccording to isxdigit:\r");
   Serial.print (isxdigit( 'F' ) ?"F is a" : "F is not a" );
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( 'J' ) ?"J is a" : "J is not a" ) ;
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( '7' ) ?"7 is a" : "7 is not a" ) ;

   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( '$' ) ? "$ is a" : "$ is not a" );
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( 'f' ) ? “f is a" : "f is not a");
   
}

void loop () {

}

결과

According to isdigit:
8 is a digit
# is not a digit
According to isalpha:
A is a letter
b is a letter
& is not a letter
4 is not a letter
According to isalnum:
A is a digit or a letter

8 is a digit or a letter
# is not a digit or a letter
According to isxdigit:
F is a hexadecimal digit
J is not a hexadecimal digit
7 is a hexadecimal digit

$ is not a hexadecimal digit
f is a hexadecimal digit

조건부 연산자를 사용합니다. (?:)문자열 "이"인지 또는 문자열 "이"가 아닌지 결정하기 위해 각 함수를 사용하여 테스트 된 각 문자의 출력에 인쇄해야합니다. 예 : linea '8'이 숫자임을 나타냅니다. 즉, isdigittrue (0이 아닌) 값을 반환합니다. 문자열 "8 is a"가 인쇄됩니다. '8'이 숫자가 아닌 경우 (예 :isdigit 0을 반환) 문자열 "8 is not a"가 인쇄됩니다.

예 2

다음 예제는 함수 사용을 보여줍니다. islowerisupper. 함수islower인수가 소문자 (a–z)인지 여부를 결정합니다. 함수isupper 인수가 대문자 (A–Z)인지 여부를 결정합니다.

int thisChar = 0xA0;

void setup () {
   Serial.begin (9600);
   Serial.print ("According to islower:\r") ;
   Serial.print (islower( 'p' ) ? "p is a" : "p is not a" );
   Serial.print ( " lowercase letter\r" );
   Serial.print ( islower( 'P') ? "P is a" : "P is not a") ;
   Serial.print ("lowercase letter\r");
   Serial.print (islower( '5' ) ? "5 is a" : "5 is not a" );
   Serial.print ( " lowercase letter\r" );
   Serial.print ( islower( '!' )? "! is a" : "! is not a") ;
   Serial.print ("lowercase letter\r");

   Serial.print ("\rAccording to isupper:\r") ;
   Serial.print (isupper ( 'D' ) ? "D is a" : "D is not an" );
   Serial.print ( " uppercase letter\r" );
   Serial.print ( isupper ( 'd' )? "d is a" : "d is not an") ;
   Serial.print ( " uppercase letter\r" );
   Serial.print (isupper ( '8' ) ? "8 is a" : "8 is not an" );
   Serial.print ( " uppercase letter\r" );
   Serial.print ( islower( '$' )? "$ is a" : "$ is not an") ;
   Serial.print ("uppercase letter\r ");
}

void setup () {

}

결과

According to islower:
p is a lowercase letter
P is not a lowercase letter
5 is not a lowercase letter
! is not a lowercase letter

According to isupper:
D is an uppercase letter
d is not an uppercase letter
8 is not an uppercase letter
$ is not an uppercase letter

예제 3

다음 예제는 함수 사용을 보여줍니다. isspace, iscntrl, ispunct, isprintisgraph.

  • 함수 isspace 인수가 공백 ( ''), 용지 공급 ( '\ f'), 줄 바꿈 ( '\ n'), 캐리지 리턴 ( '\ r'), 가로 탭 ( '\)과 같은 공백 문자인지 여부를 결정합니다. t ') 또는 수직 탭 ('\ v ').

  • 함수 iscntrl 인수가 가로 탭 ( '\ t'), 세로 탭 ( '\ v'), 용지 공급 ( '\ f'), 경고 ( '\ a'), 백 스페이스 ( '\ b)와 같은 제어 문자인지 여부를 결정합니다. '), 캐리지 리턴 ('\ r ') 또는 개행 ('\ n ').

  • 함수 ispunct 인수가 $, #, (,), [,], {,},;, : 또는 %와 같은 공백, 숫자 또는 문자 이외의 인쇄 문자인지 여부를 결정합니다.

  • 함수 isprint 인수가 화면에 표시 할 수있는 문자 (공백 문자 포함)인지 여부를 결정합니다.

  • 함수 isgraph isprint와 동일한 문자를 테스트하지만 공백 문자는 포함되지 않습니다.

void setup () {
   Serial.begin (9600);
   Serial.print ( " According to isspace:\rNewline ") ;
   Serial.print (isspace( '\n' )? " is a" : " is not a" );
   Serial.print ( " whitespace character\rHorizontal tab") ;
   Serial.print (isspace( '\t' )? " is a" : " is not a" );
   Serial.print ( " whitespace character\n") ;
   Serial.print (isspace('%')? " % is a" : " % is not a" );
   
   Serial.print ( " \rAccording to iscntrl:\rNewline") ;
   Serial.print ( iscntrl( '\n' )?"is a" : " is not a" ) ;
   Serial.print (" control character\r");
   Serial.print (iscntrl( '$' ) ? " $ is a" : " $ is not a" );
   Serial.print (" control character\r");
   Serial.print ("\rAccording to ispunct:\r");
   Serial.print (ispunct(';' ) ?"; is a" : "; is not a" ) ;
   Serial.print (" punctuation character\r");
   Serial.print (ispunct('Y' ) ?"Y is a" : "Y is not a" ) ;
   Serial.print ("punctuation character\r");
   Serial.print (ispunct('#' ) ?"# is a" : "# is not a" ) ;
   Serial.print ("punctuation character\r");

   Serial.print ( "\r According to isprint:\r");
   Serial.print (isprint('$' ) ?"$ is a" : "$ is not a" );
   Serial.print (" printing character\rAlert ");
   Serial.print (isprint('\a' ) ?" is a" : " is not a" );
   Serial.print (" printing character\rSpace ");
   Serial.print (isprint(' ' ) ?" is a" : " is not a" );
   Serial.print (" printing character\r");
   
   Serial.print ("\r According to isgraph:\r");
   Serial.print (isgraph ('Q' ) ?"Q is a" : "Q is not a" );
   Serial.print ("printing character other than a space\rSpace ");
   Serial.print (isgraph (' ') ?" is a" : " is not a" );
   Serial.print ("printing character other than a space ");
}

void loop () {

}

결과

According to isspace:
Newline is a whitespace character
Horizontal tab is a whitespace character
% is not a whitespace character
According to iscntrl:
Newline is a control character
$ is not a control character
According to ispunct:
; is a punctuation character
Y is not a punctuation character
# is a punctuation character
According to isprint:
$ is a printing character
Alert is not a printing character
Space is a printing character
According to isgraph:
Q is a printing character other than a space
Space is not a printing character other than a space

Arduino Math 라이브러리 (math.h)에는 부동 소수점 숫자를 조작하는 데 유용한 여러 가지 수학 함수가 포함되어 있습니다.

라이브러리 매크로

다음은 헤더 math.h에 정의 된 매크로입니다-

매크로 기술
나를 2.7182818284590452354 상수 e.
M_LOG2E

1.4426950408889634074

/ * log_2 e * /

e를 밑이 2 인 로그
M_1_PI

0.31830988618379067154

/ * 1 / pi * /

상수 1 / pi
M_2_PI

0.63661977236758134308

/ * 2 / pi * /

상수 2 / pi
M_2_SQRTPI

1.12837916709551257390

/ * 2 / sqrt (pi) * /

상수 2 / sqrt (pi)
M_LN10

2.30258509299404568402

/ * log_e 10 * /

10의 자연 로그
M_LN2

0.69314718055994530942

/ * log_e 2 * /

2의 자연 로그
M_LOG10E

0.43429448190325182765

/ * log_10 e * /

e를 밑이 10 인 로그
M_PI

3.14159265358979323846

/ * 파이 * /

상수 파이
M_PI_2

3.3V1.57079632679489661923

/ * pi / 2 * /

상수 pi / 2
M_PI_4

0.78539816339744830962

/ * pi / 4 * /

상수 pi / 4
M_SQRT1_2

0.70710678118654752440

/ * 1 / sqrt (2) * /

상수 1 / sqrt (2)
M_SQRT2

1.41421356237309504880

/ * sqrt (2) * /

2의 제곱근
acosf - acos () 함수의 별칭
asinf - asin () 함수의 별칭
atan2f - atan2 () 함수의 별칭
cbrtf - cbrt () 함수의 별칭
ceilf - ceil () 함수의 별칭
copysignf - copysign () 함수의 별칭
coshf - cosh () 함수의 별칭
expf - exp () 함수의 별칭
fabsf - fabs () 함수의 별칭
fdimf - fdim () 함수의 별칭
플로어 - floor () 함수의 별칭
fmaxf - fmax () 함수의 별칭
fminf - fmin () 함수의 별칭
fmodf - fmod () 함수의 별칭
frexpf - frexp () 함수의 별칭
hypotf - hypot () 함수의 별칭
무한대 - INFINITY 상수
isfinitef - isfinite () 함수의 별칭
Isinff - isinf () 함수의 별칭
Isnanf - isnan () 함수의 별칭
ldexpf - ldexp () 함수의 별칭
log10f - log10 () 함수의 별칭
logf - log () 함수의 별칭
lrintf - lrint () 함수의 별칭
lroundf - lround () 함수의 별칭

라이브러리 기능

다음 함수는 헤더에 정의되어 있습니다. math.h

S. 아니. 라이브러리 기능 및 설명
1

double acos (double __x)

acos () 함수는 __x 아크 코사인의 주요 값을 계산합니다. 반환 된 값은 [0, pi] 라디안 범위에 있습니다. [-1, +1] 범위에 있지 않은 인수에 대해 도메인 오류가 발생합니다.

2

double asin (double __x)

asin () 함수는 __x 아크 사인의 주요 값을 계산합니다. 반환 된 값은 [-pi / 2, pi / 2] 라디안 범위에 있습니다. [-1, +1] 범위에 있지 않은 인수에 대해 도메인 오류가 발생합니다.

double atan (double __x)

atan () 함수는 __x 아크 탄젠트의 주요 값을 계산합니다. 반환 된 값은 [-pi / 2, pi / 2] 라디안 범위에 있습니다.

4

double atan2 (double __y, double __x)

atan2 () 함수는 반환 값의 사분면을 결정하기 위해 두 인수의 부호를 사용하여 __y / __x의 아크 탄젠트의 주요 값을 계산합니다. 반환 된 값은 [-pi, + pi] 라디안 범위에 있습니다.

5

double cbrt (double __x)

cbrt () 함수는 __x의 세제곱근을 반환합니다.

6

double ceil (double __x)

ceil () 함수는 부동 소수점 숫자로 표현 된 __x보다 크거나 같은 가장 작은 정수 값을 반환합니다.

7

static double copysign (double __x, double __y)

copysign () 함수는 __x를 반환하지만 부호는 __y입니다. __x 또는 __y가 NaN 또는 0 인 경우에도 작동합니다.

8

double cos(double __x)

cos () 함수는 라디안으로 측정 된 __x의 코사인을 반환합니다.

9

double cosh (double __x)

cosh () 함수는 __x의 쌍곡 코사인을 반환합니다.

10

double exp (double __x)

exp () 함수는 __x의 지수 값을 반환합니다.

11

double fabs (double __x)

fabs () 함수는 부동 소수점 숫자 __x의 절대 값을 계산합니다.

12

double fdim (double __x, double __y)

fdim () 함수는 max (__ x-__y, 0)을 반환합니다. __x 또는 __y 또는 둘 다 NaN이면 NaN이 반환됩니다.

13

double floor (double __x)

floor () 함수는 부동 소수점 숫자로 표현 된 __x보다 작거나 같은 가장 큰 정수 값을 반환합니다.

14

double fma (double __x, double __y, double __z)

fma () 함수는 부동 소수점 곱하기 더하기를 수행합니다. 이것은 연산 (__x * __y) + __z이지만 중간 결과는 대상 유형으로 반올림되지 않습니다. 이것은 때때로 계산의 정밀도를 향상시킬 수 있습니다.

15

double fmax (double __x, double __y)

fmax () 함수는 __x 및 __y 두 값 중 더 큰 값을 반환합니다. 인수가 NaN이면 다른 인수가 반환됩니다. 두 인수가 모두 NaN이면 NaN이 반환됩니다.

16

double fmin (double __x, double __y)

fmin () 함수는 __x 및 __y 두 값 중 작은 값을 반환합니다. 인수가 NaN이면 다른 인수가 반환됩니다. 두 인수가 모두 NaN이면 NaN이 반환됩니다.

17

double fmod (double __x, double__y)

fmod () 함수는 __x / __y의 부동 소수점 나머지를 반환합니다.

18

double frexp (double __x, int * __pexp)

frexp () 함수는 부동 소수점 숫자를 정규화 된 분수와 정수 2의 거듭 제곱으로 나눕니다. __pexp가 가리키는 int 객체에 정수를 저장합니다. __x가 일반 부동 소수점 숫자 인 경우 frexp () 함수는 v 값을 반환하므로 v는 간격 [1/2, 1) 또는 0의 크기를 가지며 __x는 v 곱하기 2의 __pexp 제곱과 같습니다. __x가 0이면 결과의 두 부분이 모두 0입니다. __x가 유한 수가 아니면 frexp ()는 __x를있는 그대로 반환하고 __pexp에 의해 0을 저장합니다.

Note −이 구현은 지수 저장을 건너 뛰는 지시어로 제로 포인터를 허용합니다.

19

double hypot (double __x, double__y)

hypot () 함수는 sqrt (__ x * __ x + __y * __ y)를 반환합니다. 길이가 __x 및 __y 인 직각 삼각형의 빗변의 길이 또는 원점에서 점 (__x, __y)까지의 거리입니다. 오류가 훨씬 적기 때문에 직접 공식 대신이 함수를 사용하는 것이 현명합니다. 작은 __x 및 __y로 언더 플로가 없습니다. 결과가 범위 내에 있으면 오버플로가 없습니다.

20

static int isfinite (double __x)

isfinite () 함수는 __x가 유한 한 경우 0이 아닌 값을 반환합니다. 더하기 또는 빼기 무한대가 아니라 NaN.

21

int isinf (double __x)

함수 isinf ()는 인수 __x가 양의 무한대이면 1을 반환하고, __x가 음의 무한대이면 -1을, 그렇지 않으면 0을 반환합니다.

Note − GCC 4.3은이 함수를 두 무한도 모두에 대해 1 값을 반환하는 인라인 코드로 대체 할 수 있습니다 (gcc 버그 # 35509).

22

int isnan (double __x)

함수 isnan ()은 __x 인수가 "숫자가 아님"(NaN) 개체, 그렇지 않으면 0.

23

double ldexp (double __x, int __exp )

ldexp () 함수는 부동 소수점 숫자에 정수 2의 제곱을 곱합니다. 이는 __x의 값에 2의 제곱을 곱한 __exp를 반환합니다.

24

double log (double __x)

log () 함수는 __x 인수의 자연 로그를 반환합니다.

25

double log10(double __x)

log10 () 함수는 __x 인수의 로그를 밑이 10으로 반환합니다.

26

long lrint (double __x)

lrint () 함수는 __x를 가장 가까운 정수로 반올림하여 중간 케이스를 짝수 정수 방향으로 반올림합니다. (즉, 1.5 및 2.5 값은 모두 2로 반올림됩니다.) 이 함수는 rint () 함수와 비슷하지만 반환 값의 유형이 다르며 오버플로가 가능합니다.

Returns

반올림 된 long 정수 값입니다. __x가 유한 수가 아니거나 오버플로가 아니면이 실현은 LONG_MIN 값 (0x80000000)을 반환합니다.

27

long lround (double __x)

lround () 함수는 __x를 가장 가까운 정수로 반올림하지만 케이스의 중간을 0에서 멀어지게 반올림합니다 (가장 가까운 짝수 정수 대신). 이 함수는 round () 함수와 유사하지만 반환 값의 유형이 다르며 오버플로가 가능합니다.

Returns

반올림 된 long 정수 값입니다. __x가 유한 수가 아니거나 오버플로가 발생한 경우이 실현은 LONG_MIN 값 (0x80000000)을 반환합니다.

28

double modf (double __x, double * __iptr )

modf () 함수는 __x 인수를 정수 부분과 분수 부분으로 나눕니다. 각 부분은 인수와 같은 부호를 갖습니다. __iptr이 가리키는 객체에 정수 부분을 double로 저장합니다.

modf () 함수는 __x의 부호있는 소수 부분을 반환합니다.

Note−이 구현은 제로 포인터에 의한 쓰기를 건너 뜁니다. 그러나 GCC 4.3은이 기능을 저장을 피하기 위해 NULL 주소 사용을 허용하지 않는 인라인 코드로 대체 할 수 있습니다.

29

float modff (float __x, float * __iptr)

modf ()의 별칭입니다.

30

double pow (double __x, double __y)

pow () 함수는 __x의 값을 지수 __y로 반환합니다.

31

double round (double __x)

round () 함수는 __x를 가장 가까운 정수로 반올림하지만 경우를 반올림합니다 (가장 가까운 짝수 정수 대신). 오버플로는 불가능합니다.

Returns

반올림 된 값입니다. __x가 정수이거나 무한대이면 __x 자체가 반환됩니다. __x가NaN, 다음 NaN 반환됩니다.

32

int signbit (double __x)

signbit () 함수는 __x의 값에 부호 비트가 설정된 경우 0이 아닌 값을 반환합니다. IEEE 754 부동 소수점이 0에 서명 할 수 있기 때문에 이것은`__x <0.0 '과 동일하지 않습니다. 비교`-0.0 <0.0 '은 거짓이지만`signbit (-0.0)'은 0이 아닌 값을 반환합니다.

33

double sin (double __x)

sin () 함수는 라디안으로 측정 된 __x의 사인을 반환합니다.

34

double sinh (double __x)

sinh () 함수는 __x의 쌍곡 사인을 반환합니다.

35

double sqrt (double __x)

sqrt () 함수는 __x의 음이 아닌 제곱근을 반환합니다.

36

double square (double __x)

square () 함수는 __x * __x를 반환합니다.

Note −이 기능은 C 표준 정의에 속하지 않습니다.

37

double tan (double __x)

tan () 함수는 라디안으로 측정 된 __x의 탄젠트를 반환합니다.

38

double tanh ( double __x)

tanh () 함수는 __x의 쌍곡 탄젠트를 반환합니다.

39

double trunc (double __x)

trunc () 함수는 __x를 절대 값이 더 크지 않은 가장 가까운 정수로 반올림합니다.

다음 예제는 가장 일반적인 math.h 라이브러리 함수를 사용하는 방법을 보여줍니다.

double double__x = 45.45 ;
double double__y = 30.20 ;

void setup() {
   Serial.begin(9600);
   Serial.print("cos num = ");
   Serial.println (cos (double__x) ); // returns cosine of x
   Serial.print("absolute value of num = ");
   Serial.println (fabs (double__x) ); // absolute value of a float
   Serial.print("floating point modulo = ");
   Serial.println (fmod (double__x, double__y)); // floating point modulo
   Serial.print("sine of num = ");
   Serial.println (sin (double__x) ) ;// returns sine of x
   Serial.print("square root of num : ");
   Serial.println ( sqrt (double__x) );// returns square root of x
   Serial.print("tangent of num : ");
   Serial.println ( tan (double__x) ); // returns tangent of x
   Serial.print("exponential value of num : ");
   Serial.println ( exp (double__x) ); // function returns the exponential value of x.
   Serial.print("cos num : ");

   Serial.println (atan (double__x) ); // arc tangent of x
   Serial.print("tangent of num : ");
   Serial.println (atan2 (double__y, double__x) );// arc tangent of y/x
   Serial.print("arc tangent of num : ");
   Serial.println (log (double__x) ) ; // natural logarithm of x
   Serial.print("cos num : ");
   Serial.println ( log10 (double__x)); // logarithm of x to base 10.
   Serial.print("logarithm of num to base 10 : ");
   Serial.println (pow (double__x, double__y) );// x to power of y
   Serial.print("power of num : ");
   Serial.println (square (double__x)); // square of x
}

void loop() {

}

결과

cos num = 0.10
absolute value of num = 45.45
floating point modulo =15.25
sine of num = 0.99
square root of num : 6.74
tangent of num : 9.67
exponential value of num : ovf
cos num : 1.55
tangent of num : 0.59
arc tangent of num : 3.82
cos num : 1.66
logarithm of num to base 10 : inf
power of num : 2065.70

움직이는 물체의 거리 나 각속도를 계산하는 것과 같이 삼각법을 실제로 사용해야합니다. Arduino는 프로토 타입을 작성하여 요약 할 수있는 기존 삼각 함수 (sin, cos, tan, asin, acos, atan)를 제공합니다. Math.h에는 삼각 함수의 프로토 타입이 포함되어 있습니다.

삼각법 정확한 구문

double sin(double x); //returns sine of x radians
double cos(double y); //returns cosine of y radians
double tan(double x); //returns the tangent of x radians
double acos(double x); //returns A, the angle corresponding to cos (A) = x
double asin(double x); //returns A, the angle corresponding to sin (A) = x
double atan(double x); //returns A, the angle corresponding to tan (A) = x

double sine = sin(2); // approximately 0.90929737091
double cosine = cos(2); // approximately -0.41614685058
double tangent = tan(2); // approximately -2.18503975868

Arduino Due는 Atmel SAM3X8E ARM Cortex-M3 CPU를 기반으로하는 마이크로 컨트롤러 보드입니다. 32 비트 ARM 코어 마이크로 컨트롤러를 기반으로 한 최초의 Arduino 보드입니다.

중요한 기능-

  • 54 개의 디지털 입력 / 출력 핀 (이 중 12 개를 PWM 출력으로 사용할 수 있음)이 있습니다.
  • 12 개의 아날로그 입력
  • 4 개의 UART (하드웨어 직렬 포트)
  • 84MHz 클록, USB OTG 가능 연결
  • DAC (디지털-아날로그) 2 개, TWI 2 개, 전원 잭, SPI 헤더, JTAG 헤더
  • 재설정 버튼 및 지우기 버튼

Arduino Due Board의 특성

작동 볼트 CPU 속도 아날로그 입 / 출력 디지털 IO / PWM EEPROM [KB] SRAM [KB] 플래시 [KB] USB UART
3.3 볼트 84MHz 12/2 54/12 - 96 512 2 마이크로 4

통신

  • 4 하드웨어 UART
  • 2 개의 I2C
  • 1 CAN 인터페이스 (자동차 통신 프로토콜)
  • 1 SPI
  • 인터페이스 JTAG (10 핀) 1 개
  • 1 개의 USB 호스트 (예 : Leonardo)
  • 1 프로그래밍 포트

대부분의 Arduino 보드와 달리 Arduino Due 보드는 3.3V에서 실행됩니다. I / O 핀이 허용 할 수있는 최대 전압은 3.3V입니다. 3.3V보다 높은 전압을 I / O 핀에 적용하면 보드가 손상 될 수 있습니다.

보드에는 마이크로 컨트롤러를 지원하는 데 필요한 모든 것이 포함되어 있습니다. 마이크로 USB 케이블로 컴퓨터에 연결하거나 AC-DC 어댑터 또는 배터리로 전원을 공급하여 시작할 수 있습니다. Due는 3.3V에서 작동하는 모든 Arduino 실드와 호환됩니다.

Arduino Zero

Zero는 UNO가 구축 한 플랫폼의 간단하고 강력한 32 비트 확장입니다. Zero 보드는 향상된 성능을 제공하고 장치에 대한 다양한 프로젝트 기회를 가능하게하여 제품군을 확장하며 32 비트 애플리케이션 개발에 대해 학습하기위한 훌륭한 교육 도구 역할을합니다.

중요한 기능은-

  • Zero 애플리케이션은 스마트 IoT 장치, 웨어러블 기술, 하이테크 자동화에서 미친 로봇 공학에 이르기까지 다양합니다.

  • 이 보드는 32 비트 ARM Cortex® M0 + 코어를 특징으로하는 Atmel의 SAMD21 MCU에 의해 구동됩니다.

  • 가장 중요한 기능 중 하나는 추가 하드웨어없이 완전한 디버그 인터페이스를 제공하는 Atmel의 Embedded Debugger (EDBG)로, 소프트웨어 디버깅의 사용 편의성을 크게 향상시킵니다.

  • EDBG는 장치 및 부트 로더 프로그래밍에 사용할 수있는 가상 COM 포트도 지원합니다.

Arduino Zero 보드의 특성

작동 볼트 CPU 속도 아날로그 입 / 출력 디지털 IO / PWM EEPROM [KB] SRAM [KB] 플래시 [KB] USB UART
3.3 볼트 48MHz 6/1 10 월 14 일 - 32 256 2 마이크로 2

대부분의 Arduino 및 Genuino 보드와 달리 Zero는 3.3V에서 실행됩니다. I / O 핀이 허용 할 수있는 최대 전압은 3.3V입니다. 3.3V보다 높은 전압을 I / O 핀에 적용하면 보드가 손상 될 수 있습니다.

보드에는 마이크로 컨트롤러를 지원하는 데 필요한 모든 것이 포함되어 있습니다. 마이크로 USB 케이블로 컴퓨터에 연결하거나 AC-DC 어댑터 또는 배터리로 전원을 공급하여 시작할 수 있습니다. Zero는 3.3V에서 작동하는 모든 쉴드와 호환됩니다.

펄스 폭 변조 또는 PWM은 펄스 트레인에서 펄스 폭을 변경하는 데 사용되는 일반적인 기술입니다. PWM에는 모터 및 LED의 유효 전력을 제한하는 서보 및 속도 컨트롤러 제어와 같은 많은 애플리케이션이 있습니다.

PWM의 기본 원리

펄스 폭 변조는 기본적으로 높고 낮은 시간이 다양한 구형파입니다. 기본 PWM 신호는 다음 그림에 나와 있습니다.

PWM과 관련된 다양한 용어가 있습니다-

  • On-Time − 시간 신호의 지속 시간이 길다.

  • Off-Time − 시간 신호의 지속 시간이 짧습니다.

  • Period − PWM 신호의 on-time과 off-time의 합으로 표현됩니다.

  • Duty Cycle − PWM 신호 기간 동안 켜져있는 시간 신호의 백분율로 표시됩니다.

기간

그림과 같이 T on 은 on-time, T off 는 신호의 off-time을 나타냅니다. 기간은 켜짐 및 꺼짐 시간의 합계이며 다음 방정식과 같이 계산됩니다.

듀티 사이클

듀티 사이클은 해당 기간의 온 타임으로 계산됩니다. 위에서 계산 된주기를 사용하여 듀티 사이클은 다음과 같이 계산됩니다.

analogWrite () 함수

그만큼 analogWrite()함수는 아날로그 값 (PWM 웨이브)을 핀에 씁니다. 다양한 밝기로 LED를 켜거나 다양한 속도로 모터를 구동하는 데 사용할 수 있습니다. analogWrite () 함수를 호출 한 후, 핀은 다음 번에 analogWrite ()를 호출하거나 동일한 핀에서 digitalRead () 또는 digitalWrite ()를 호출 할 때까지 지정된 듀티 사이클의 일정한 구형파를 생성합니다. 대부분의 핀에서 PWM 신호의 주파수는 약 490Hz입니다. Uno 및 유사한 보드에서 핀 5 및 6의 주파수는 약 980Hz입니다. Leonardo의 핀 3과 11도 980Hz에서 실행됩니다.

대부분의 Arduino 보드 (ATmega168 또는 ATmega328 포함)에서이 기능은 핀 3, 5, 6, 9, 10 및 11에서 작동합니다. Arduino Mega에서는 핀 2 ~ 13 및 44 ~ 46에서 작동합니다. ATmega8 만 지원하는 보드 analogWrite() 핀 9, 10 및 11에서

Arduino Due는 analogWrite()핀 2 ~ 13, 핀 DAC0 및 DAC1. PWM 핀과 달리 DAC0 및 DAC1은 디지털-아날로그 변환기이며 진정한 아날로그 출력으로 작동합니다.

analogWrite ()를 호출하기 전에 핀을 출력으로 설정하기 위해 pinMode ()를 호출 할 필요가 없습니다.

analogWrite () 함수 구문

analogWrite ( pin , value ) ;

value − 듀티 사이클 : 0 (항상 꺼짐)에서 255 (항상 켜짐) 사이.

Example

int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value

void setup() {
   pinMode(ledPin, OUTPUT); // sets the pin as output
}

void loop() {
   val = analogRead(analogPin); // read the input pin
   analogWrite(ledPin, (val / 4)); // analogRead values go from 0 to 1023, 
      // analogWrite values from 0 to 255
}

난수를 생성하기 위해 Arduino 난수 함수를 사용할 수 있습니다. 두 가지 기능이 있습니다.

  • randomSeed(seed)
  • random()

randomSeed (시드)

randomSeed (seed) 함수는 Arduino의 의사 난수 생성기를 재설정합니다. random ()에 의해 반환 된 숫자의 분포는 본질적으로 무작위이지만 시퀀스는 예측 가능합니다. 생성기를 임의의 값으로 재설정해야합니다. 연결되지 않은 아날로그 핀이있는 경우 주변 환경에서 임의의 노이즈가 발생할 수 있습니다. 전파, 우주선, 휴대폰의 전자기 간섭, 형광등 등이 여기에 해당합니다.

randomSeed(analogRead(5)); // randomize using noise from analog pin 5

랜덤 ()

랜덤 함수는 의사 난수를 생성합니다. 다음은 구문입니다.

random () 문 구문

long random(max) // it generate random numbers from 0 to max
long random(min, max) // it generate random numbers from min to max

long randNumber;

void setup() {
   Serial.begin(9600);
   // if analog input pin 0 is unconnected, random analog
   // noise will cause the call to randomSeed() to generate
   // different seed numbers each time the sketch runs.
   // randomSeed() will then shuffle the random function.
   randomSeed(analogRead(0));
}

void loop() {
   // print a random number from 0 to 299
   Serial.print("random1=");
   randNumber = random(300);
   Serial.println(randNumber); // print a random number from 0to 299
   Serial.print("random2=");
   randNumber = random(10, 20);// print a random number from 10 to 19
   Serial.println (randNumber);
   delay(50);
}

이제 비트 및 바이트와 같은 일부 기본 개념에 대한 지식을 새로 고쳐 보겠습니다.

비트

비트는 이진수입니다.

  • 이진법은 두 자리, 0과 1을 사용합니다.

  • 숫자의 자릿수가 동일한 값을 갖지 않는 십진수 시스템과 유사하게 비트의 '유의성'은 이진수에서의 위치에 따라 다릅니다. 예를 들어, 10 진수 666의 숫자는 동일하지만 값이 다릅니다.

바이트

바이트는 8 비트로 구성됩니다.

  • 비트가 숫자이면 바이트가 숫자를 나타내는 것이 논리적입니다.

  • 모든 수학적 연산을 수행 할 수 있습니다.

  • 바이트의 숫자도 동일한 의미를 갖지 않습니다.

  • 가장 왼쪽 비트에는 MSB (Most Significant Bit)라는 가장 큰 값이 있습니다.

  • 가장 오른쪽 비트는 최소값을 가지므로이를 LBS (Least Significant Bit)라고합니다.

  • 8 개의 0과 1 바이트의 1은 256 개의 다른 방식으로 결합 될 수 있으므로 1 바이트로 표현할 수있는 가장 큰 10 진수는 255입니다 (하나의 조합은 0을 나타냄).

인터럽트는 다른 작업을 수행 할 수 있도록 Arduino의 현재 작업을 중지합니다.

집에 앉아 누군가와 이야기하고 있다고 가정 해 보겠습니다. 갑자기 전화벨이 울립니다. 채팅을 중단하고 전화를 받아 발신자와 통화합니다. 전화 통화를 마치면 전화가 울리기 전에 상대방과 채팅으로 돌아갑니다.

마찬가지로, 주요 루틴을 누군가와 채팅하는 것으로 생각할 수 있습니다. 전화벨이 울리면 채팅이 중단됩니다. 인터럽트 서비스 루틴은 전화 통화 프로세스입니다. 전화 대화가 끝나면 기본 채팅 루틴으로 돌아갑니다. 이 예는 인터럽트로 인해 프로세서가 작동하는 방식을 정확하게 설명합니다.

메인 프로그램이 실행 중이고 회로에서 일부 기능을 수행합니다. 그러나 인터럽트가 발생하면 다른 루틴이 수행되는 동안 메인 프로그램이 중단됩니다. 이 루틴이 완료되면 프로세서는 다시 기본 루틴으로 돌아갑니다.

중요한 기능

다음은 인터럽트에 대한 몇 가지 중요한 기능입니다.

  • 인터럽트는 다양한 소스에서 발생할 수 있습니다. 이 경우 디지털 핀 중 하나의 상태 변경에 의해 트리거되는 하드웨어 인터럽트를 사용하고 있습니다.

  • 대부분의 Arduino 설계에는 각각 디지털 I / O 핀 2와 3에 하드 와이어 된 두 개의 하드웨어 인터럽트 ( "interrupt0"및 "interrupt1"이라고 함)가 있습니다.

  • Arduino Mega에는 핀 21, 20, 19 및 18에 추가 인터럽트 ( "interrupt2"~ "interrupt5")를 포함하여 6 개의 하드웨어 인터럽트가 있습니다.

  • "Interrupt Service Routine"(일반적으로 ISR이라고 함)이라는 특수 기능을 사용하여 루틴을 정의 할 수 있습니다.

  • 루틴을 정의하고 상승 에지, 하강 에지 또는 둘 다에서 조건을 지정할 수 있습니다. 이러한 특정 조건에서 인터럽트가 서비스됩니다.

  • 입력 핀에서 이벤트가 발생할 때마다 해당 기능이 자동으로 실행되도록 할 수 있습니다.

인터럽트 유형

두 가지 유형의 인터럽트가 있습니다.

  • Hardware Interrupts − 외부 인터럽트 핀이 높거나 낮을 때와 같은 외부 이벤트에 대한 응답으로 발생합니다.

  • Software Interrupts− 소프트웨어에서 보낸 명령에 대한 응답으로 발생합니다. "Arduino 언어"가 지원하는 유일한 인터럽트 유형은 attachInterrupt () 함수입니다.

Arduino에서 인터럽트 사용

인터럽트는 타이밍 문제를 해결하는 데 도움이되므로 Arduino 프로그램에서 매우 유용합니다. 인터럽트의 좋은 적용은 로터리 엔코더를 읽거나 사용자 입력을 관찰하는 것입니다. 일반적으로 ISR은 가능한 한 짧고 빠릅니다. 스케치에서 여러 ISR을 사용하는 경우 한 번에 하나만 실행할 수 있습니다. 다른 인터럽트는 현재의 인터럽트가 우선 순위에 따라 달라지는 순서로 완료된 후에 실행됩니다.

일반적으로 전역 변수는 ISR과 기본 프로그램간에 데이터를 전달하는 데 사용됩니다. ISR과 기본 프로그램간에 공유되는 변수가 올바르게 업데이트되도록하려면 변수를 휘발성으로 선언하십시오.

attachInterrupt 문 구문

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs; 
   //this function must take no parameters and return nothing. 
   //This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.

다음 세 가지 상수는 유효한 값으로 미리 정의되어 있습니다.

  • LOW 핀이 낮을 때마다 인터럽트를 트리거합니다.

  • CHANGE 핀이 값을 변경할 때마다 인터럽트를 트리거합니다.

  • FALLING 핀이 높은 곳에서 낮은 곳으로 갈 때마다.

Example

int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT); //set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
   //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
   digitalWrite(13, state); //pin 13 equal the state value
} 

void blink() { 
   //ISR function
   state = !state; //toggle the state when the interrupt occurs
}

이 데이터 교환을 달성하기 위해 수백 개의 통신 프로토콜이 정의되었습니다. 각 프로토콜은 병렬 또는 직렬의 두 범주 중 하나로 분류 할 수 있습니다.

병렬 통신

입력 / 출력 포트를 통한 Arduino와 주변 장치 간의 병렬 연결은 최대 수 미터의 짧은 거리에 이상적인 솔루션입니다. 그러나 장거리 통신을 위해 두 장치 간의 통신이 필요한 다른 경우에는 병렬 연결을 사용할 수 없습니다. 병렬 인터페이스는 동시에 여러 비트를 전송합니다. 일반적으로 8, 16 또는 그 이상의 와이어를 통해 전송되는 데이터 버스가 필요합니다. 데이터는 1과 0의 거대한 파동으로 전송됩니다.

병렬 통신의 장단점

병렬 통신에는 확실히 장점이 있습니다. 직렬보다 빠르고 간단하며 구현하기가 비교적 쉽습니다. 그러나 많은 입 / 출력 (I / O) 포트와 라인이 필요합니다. 프로젝트를 기본 Arduino Uno에서 Mega로 옮겨야했다면 마이크로 프로세서의 I / O 라인이 매우 소중 할 수 있다는 것을 알고 있습니다. 따라서 직렬 통신을 선호하여 핀 공간의 잠재적 인 속도를 희생합니다.

직렬 통신 모듈

오늘날 대부분의 Arduino 보드는 표준 장비로 직렬 통신을위한 여러 다른 시스템으로 구축됩니다.

사용되는 시스템은 다음 요인에 따라 다릅니다.

  • 마이크로 컨트롤러가 데이터를 교환해야하는 장치는 몇 개입니까?
  • 데이터 교환은 얼마나 빨라야합니까?
  • 이 장치 사이의 거리는 얼마입니까?
  • 데이터를 동시에주고받을 필요가 있습니까?

직렬 통신과 관련하여 가장 중요한 것 중 하나는 Protocol, 엄격하게 준수해야합니다. 장치가 상호 교환하는 데이터를 올바르게 해석 할 수 있도록 적용해야하는 규칙 집합입니다. 다행히 Arduino는이를 자동으로 처리하므로 프로그래머 / 사용자의 작업이 간단한 쓰기 (전송할 데이터) 및 읽기 (수신 된 데이터)로 축소됩니다.

직렬 통신의 유형

직렬 통신은 다음과 같이 더 분류 될 수 있습니다.

  • Synchronous − 동기화 된 장치는 동일한 클럭을 사용하고 타이밍이 서로 동기화됩니다.

  • Asynchronous − 비동기식 장치는 자체 클럭을 가지며 이전 상태의 출력에 의해 트리거됩니다.

장치가 동기식인지 아닌지 쉽게 알 수 있습니다. 연결된 모든 장치에 동일한 시계가 제공되면 동기식입니다. 클럭 라인이 없으면 비동기입니다.

예를 들어 UART (Universal Asynchronous Receiver Transmitter) 모듈은 비동기식입니다.

비동기 직렬 프로토콜에는 여러 가지 기본 제공 규칙이 있습니다. 이러한 규칙은 강력하고 오류없는 데이터 전송을 보장하는 메커니즘 일뿐입니다. 외부 클럭 신호를 피하기 위해 얻은 이러한 메커니즘은 다음과 같습니다.

  • 동기화 비트
  • 데이터 비트
  • 패리티 비트
  • 전송 속도

동기화 비트

동기화 비트는 각 데이터 패킷과 함께 전송되는 2 개 또는 3 개의 특수 비트입니다. 시작 비트와 정지 비트입니다. 이름 그대로이 비트는 패킷의 시작과 끝을 각각 표시합니다.

항상 하나의 시작 비트 만 있지만 정지 비트의 수는 1 개 또는 2 개로 구성 할 수 있습니다 (일반적으로 1 개로 유지됨).

시작 비트는 항상 1에서 0으로가는 유휴 데이터 라인으로 표시되며, 정지 비트는 라인을 1로 유지하여 유휴 상태로 다시 전환됩니다.

데이터 비트

각 패킷의 데이터 양은 5 ~ 9 비트 크기로 설정할 수 있습니다. 물론 표준 데이터 크기는 기본 8 비트 바이트이지만 다른 크기에는 용도가 있습니다. 7 비트 데이터 패킷은 특히 7 비트 ASCII 문자 만 전송하는 경우 8보다 효율적일 수 있습니다.

패리티 비트

사용자는 패리티 비트가 있어야하는지 여부를 선택할 수 있으며, 그렇다면 패리티가 홀수인지 짝수인지 여부를 선택할 수 있습니다. 데이터 비트 중 1이 짝수이면 패리티 비트는 0입니다. 홀수 패리티는 그 반대입니다.

전송 속도

전송 속도라는 용어는 초당 전송되는 비트 수 [bps]를 나타내는 데 사용됩니다. 이것은 바이트가 아니라 비트를 의미합니다. 일반적으로 프로토콜에서는 각 바이트가 여러 제어 비트와 함께 전송되어야합니다. 이는 직렬 데이터 스트림의 1 바이트가 11 비트로 구성 될 수 있음을 의미합니다. 예를 들어, 전송 속도가 300bps이면 초당 최대 37 바이트와 최소 27 바이트가 전송 될 수 있습니다.

Arduino UART

다음 코드는 Arduino가 시작될 때 hello world를 보내도록합니다.

void setup() {
   Serial.begin(9600); //set up serial library baud rate to 9600
   Serial.println("hello world"); //print hello world
}

void loop() {

}

Arduino 스케치가 Arduino에 업로드 된 후

Arduino IDE의 오른쪽 상단 섹션에서 직렬 모니터 를 엽니 다 .

직렬 모니터의 상단 상자에 아무거나 입력하고 키보드에서 send 또는 Enter를 누릅니다. 이것은 Arduino에 일련의 바이트를 보냅니다.

다음 코드는 입력으로받는 모든 것을 반환합니다.

다음 코드는 제공된 입력에 따라 Arduino가 출력을 제공하도록합니다.

void setup() {
   Serial.begin(9600); //set up serial library baud rate to 9600
}

void loop() {
   if(Serial.available()) //if number of bytes (characters) available for reading from { 
      serial port
      Serial.print("I received:"); //print I received
      Serial.write(Serial.read()); //send what you read
   }
}

그것을주의해라 Serial.printSerial.println 실제 ASCII 코드를 다시 보내지 만 Serial.write실제 텍스트를 다시 보냅니다. 자세한 정보는 ASCII 코드를 참조하십시오.

I2C (Inter-integrated circuit)는 마이크로 컨트롤러와 차세대 특수 집적 회로 간의 직렬 데이터 교환을위한 시스템입니다. 그것은 그들 사이의 거리가 짧을 때 사용됩니다 (수신기와 송신기는 일반적으로 동일한 인쇄판에 있습니다). 두 개의 컨덕터를 통해 연결이 설정됩니다. 하나는 데이터 전송에 사용되고 다른 하나는 동기화 (클럭 신호)에 사용됩니다.

다음 그림에서 볼 수 있듯이 한 장치는 항상 마스터입니다. 통신이 시작되기 전에 하나의 슬레이브 칩의 주소 지정을 수행합니다. 이러한 방식으로 하나의 마이크로 컨트롤러가 112 개의 서로 다른 장치와 통신 할 수 있습니다. 전송 속도는 일반적으로 100Kb / 초 (표준 모드) 또는 10Kb / 초 (저속 전송 속도 모드)입니다. 3.4 Mb / sec의 전송 속도를 가진 시스템이 최근 등장했습니다. I2C 버스를 통해 통신하는 장치 간의 거리는 몇 미터로 제한됩니다.

보드 I2C 핀

I2C 버스는 SCL과 SDA의 두 신호로 구성됩니다. SCL은 클럭 신호이고 SDA는 데이터 신호입니다. 현재 버스 마스터는 항상 클럭 신호를 생성합니다. 일부 슬레이브 장치는 시간에 따라 클럭을 낮게 설정하여 마스터가 더 많은 데이터를 전송하도록 지연시킬 수 있습니다 (또는 마스터가 데이터를 클럭 아웃하기 전에 데이터를 준비하는 데 더 많은 시간이 필요함). 이것을 "시계 스트레칭"이라고합니다.

다음은 다른 Arduino 보드의 핀입니다.

  • Uno, Pro Mini A4 (SDA), A5 (SCL)
  • Mega, Due 20 (SDA), 21 (SCL)
  • Leonardo, Yun 2 (SDA), 3 (SCL)

Arduino I2C

I2C를 사용하여 두 개의 Arduino 보드를 연결하는 두 가지 모드 (마스터 코드 및 슬레이브 코드)가 있습니다. 그들은-

  • 마스터 송신기 / 슬레이브 수신기
  • 마스터 수신기 / 슬레이브 송신기

마스터 송신기 / 슬레이브 수신기

이제 마스터 송신기와 슬레이브 수신기가 무엇인지 살펴 보겠습니다.

마스터 송신기

다음 기능은 와이어 라이브러리를 초기화하고 I2C 버스를 마스터 또는 슬레이브로 결합하는 데 사용됩니다. 일반적으로 한 번만 호출됩니다.

  • Wire.begin(address) − 주소는 마스터가 지정되지 않았기 때문에 우리의 경우 7 비트 슬레이브 주소이며 버스에 마스터로 결합됩니다.

  • Wire.beginTransmission(address) − 주어진 주소로 I2C 슬레이브 장치로 전송을 시작합니다.

  • Wire.write(value) − 마스터에서 슬레이브 장치로의 전송을 위해 바이트를 큐에 넣습니다 (beginTransmission () 및 endTransmission () 호출 사이).

  • Wire.endTransmission() − beginTransmission ()에 의해 시작된 슬레이브 장치로의 전송을 종료하고 wire.write ()에 의해 큐에 넣은 바이트를 전송합니다.

Example

#include <Wire.h> //include wire library

void setup() //this will run only once { 
   Wire.begin(); // join i2c bus as master
} 

short age = 0; 

void loop() {   
   Wire.beginTransmission(2); 
   // transmit to device #2
   Wire.write("age is = ");
   Wire.write(age); // sends one byte
   Wire.endTransmission(); // stop transmitting
   delay(1000); 
}

슬레이브 수신기

다음 기능이 사용됩니다-

  • Wire.begin(address) − 주소는 7 비트 슬레이브 주소입니다.

  • Wire.onReceive(received data handler) − 슬레이브 디바이스가 마스터로부터 데이터를받을 때 호출되는 함수입니다.

  • Wire.available() − Wire.read ()를 사용하여 검색 할 수있는 바이트 수를 반환합니다. Wire.onReceive () 핸들러 내에서 호출해야합니다.

Example

#include <Wire.h> //include wire library

void setup() {  //this will run only once
   Wire.begin(2); // join i2c bus with address #2
   Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing 
   Serial.begin(9600); // start serial for output to print what we receive 
}

void loop() {   
   delay(250); 
}

//-----this function will execute whenever data is received from master-----//

void receiveEvent(int howMany) { 
   while (Wire.available()>1) // loop through all but the last {
      char c = Wire.read(); // receive byte as a character
      Serial.print(c); // print the character
   }
}

마스터 수신기 / 슬레이브 송신기

이제 마스터 수신기와 슬레이브 송신기가 무엇인지 살펴 보겠습니다.

마스터 수신기

마스터는 요청하고 고유 주소가 지정된 슬레이브 Arduino에서 전송 된 데이터 바이트를 읽도록 프로그래밍되어 있습니다.

다음 기능이 사용됩니다-

Wire.requestFrom(address,number of bytes)− 마스터가 슬레이브 장치에서 바이트를 요청하는 데 사용됩니다. 그런 다음 wire.available () 및 wire.read () 함수를 사용하여 바이트를 검색 할 수 있습니다.

Example

#include <Wire.h> //include wire library void setup() { 
   Wire.begin(); // join i2c bus (address optional for master) 
   Serial.begin(9600); // start serial for output
} 

void loop() { 
   Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
   while (Wire.available()) // slave may send less than requested {
      char c = Wire.read(); // receive a byte as character
      Serial.print(c); // print the character
   } 
   delay(500); 
}

슬레이브 송신기

다음 기능이 사용됩니다.

Wire.onRequest(handler) − 마스터가이 슬레이브 장치에 데이터를 요청할 때 함수가 호출됩니다.

Example

#include <Wire.h> 

void setup() { 
   Wire.begin(2); // join i2c bus with address #2
   Wire.onRequest(requestEvent); // register event
} 

Byte x = 0;

void loop() { 
   delay(100); 
} 

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()

void requestEvent() { 
   Wire.write(x); // respond with message of 1 bytes as expected by master
   x++; 
}

SPI (Serial Peripheral Interface) 버스는 최대 4 개의 컨덕터 (일반적으로 3 개)를 사용하는 직렬 통신용 시스템입니다. 하나의 컨덕터는 데이터 수신, 하나는 데이터 전송, 하나는 동기화 용, 다른 하나는 통신 할 장치를 선택하는 데 사용됩니다. 전이중 연결이므로 데이터가 동시에 전송 및 수신됩니다. 최대 전송 속도는 I2C 통신 시스템에서보다 높습니다.

보드 SPI 핀

SPI는 다음 네 개의 와이어를 사용합니다.

  • SCK − 이것은 마스터에 의해 구동되는 직렬 클럭입니다.

  • MOSI − 이것은 마스터에 의해 구동되는 마스터 출력 / 슬레이브 입력입니다.

  • MISO − 이것은 마스터에 의해 구동되는 마스터 입력 / 슬레이브 출력입니다.

  • SS − 이것은 슬레이브 선택 와이어입니다.

다음 기능이 사용됩니다. SPI.h를 포함해야합니다.

  • SPI.begin() − SCK, MOSI 및 SS를 출력으로 설정하고 SCK 및 MOSI를 로우, SS를 하이로 설정하여 SPI 버스를 초기화합니다.

  • SPI.setClockDivider(divider)− 시스템 클록에 상대적인 SPI 클록 분배기를 설정합니다. AVR 기반 보드에서 사용 가능한 디바이더는 2, 4, 8, 16, 32, 64 또는 128입니다. 기본 설정은 SPI_CLOCK_DIV4이며, SPI 클럭을 시스템 클럭 주파수의 1/4로 설정합니다. 20MHz에서 보드).

  • Divider − (SPI_CLOCK_DIV2, SPI_CLOCK_DIV4, SPI_CLOCK_DIV8, SPI_CLOCK_DIV16, SPI_CLOCK_DIV32, SPI_CLOCK_DIV64, SPI_CLOCK_DIV128) 일 수 있습니다.

  • SPI.transfer(val) − SPI 전송은 동시 송수신을 기반으로합니다. 수신 된 데이터는 receivedVal로 반환됩니다.

  • SPI.beginTransaction(SPISettings(speedMaximum, dataOrder, dataMode)) − speedMaximum은 클럭, dataOrder (MSBFIRST 또는 LSBFIRST), dataMode (SPI_MODE0, SPI_MODE1, SPI_MODE2 또는 SPI_MODE3)입니다.

SPI에는 다음과 같은 네 가지 작동 모드가 있습니다.

  • Mode 0 (the default) − 클럭은 일반적으로 낮고 (CPOL = 0), 데이터는 낮음에서 높음 (선행 에지)으로 전환 될 때 샘플링됩니다 (CPHA = 0).

  • Mode 1 − 클럭은 일반적으로 낮고 (CPOL = 0), 데이터는 높음에서 낮음 (후행 에지)으로 전환 될 때 샘플링됩니다 (CPHA = 1).

  • Mode 2 − 클럭은 일반적으로 높고 (CPOL = 1), 데이터는 높음에서 낮음 (선행 에지)으로 전환 될 때 샘플링됩니다 (CPHA = 0).

  • Mode 3 − 클럭은 일반적으로 높고 (CPOL = 1), 데이터는 낮음에서 높음 (후행 에지)으로 전환 될 때 샘플링됩니다 (CPHA = 1).

  • SPI.attachInterrupt(handler) − 슬레이브 디바이스가 마스터로부터 데이터를받을 때 호출되는 함수입니다.

이제 두 개의 Arduino UNO 보드를 함께 연결합니다. 하나는 마스터로 다른 하나는 슬레이브로.

  • (SS) : 핀 10
  • (MOSI) : 핀 11
  • (MISO) : 핀 12
  • (SCK) : 핀 13

땅은 일반적입니다. 다음은 두 보드 간의 연결을 도식적으로 나타낸 것입니다.

SPI가 마스터이고 SPI가 슬레이브 인 예를 살펴 보겠습니다.

마스터로서의 SPI

#include <SPI.h>

void setup (void) {
   Serial.begin(115200); //set baud rate to 115200 for usart
   digitalWrite(SS, HIGH); // disable Slave Select
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW); // enable Slave Select
   // send test string
   for (const char * p = "Hello, world!\r" ; c = *p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH); // disable Slave Select
   delay(2000);
}

SLAVE로서의 SPI

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;

void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT); // have to send on master in so it set as output
   SPCR |= _BV(SPE); // turn on SPI in slave mode
   indx = 0; // buffer empty
   process = false;
   SPI.attachInterrupt(); // turn on interrupt
}
ISR (SPI_STC_vect) // SPI interrupt routine { 
   byte c = SPDR; // read byte from SPI Data Register
   if (indx < sizeof buff) {
      buff [indx++] = c; // save data in the next index in the array buff
      if (c == '\r') //check for the end of the word
      process = true;
   }
}

void loop (void) {
   if (process) {
      process = false; //reset the process
      Serial.println (buff); //print the array on serial monitor
      indx= 0; //reset button to zero
   }
}

LED는 다양한 응용 분야에서 사용되는 작고 강력한 조명입니다. 먼저 마이크로 컨트롤러의 Hello World 인 LED 점멸 작업을 시작하겠습니다. 조명을 켜고 끄는 것만 큼 간단합니다. 이 중요한 기준을 설정하면 더 복잡한 실험을 진행할 때 견고한 기반이됩니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × LED
  • 1 × 330Ω 저항기
  • 2 × 점퍼

순서

회로도를 따라 아래 그림과 같이 브레드 보드의 구성 요소를 연결합니다.

Note− LED의 극성을 알아 보려면 자세히 살펴보십시오. 두 다리 중 더 짧은 전구의 평평한 가장자리 쪽은 음극 단자를 나타냅니다.

저항기와 같은 구성 요소는 브레드 보드 소켓에 제대로 맞도록 단자를 90 ° 각도로 구부려 야합니다. 터미널을 더 짧게자를 수도 있습니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

/*
   Blink
   Turns on an LED on for one second, then off for one second, repeatedly.
*/

// the setup function runs once when you press reset or power the board

void setup() {  // initialize digital pin 13 as an output.
   pinMode(2, OUTPUT);
}

// the loop function runs over and over again forever

void loop() {
   digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
   delay(1000); // wait for a second
   digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
   delay(1000); // wait for a second
}

참고할 코드

pinMode(2, OUTPUT)− Arduino의 핀 중 하나를 사용하기 전에 Arduino Uno R3에 INPUT인지 OUTPUT인지 알려줘야합니다. 이를 위해 pinMode ()라는 내장 "함수"를 사용합니다.

digitalWrite(2, HIGH) − 핀을 OUTPUT으로 사용하는 경우 HIGH (출력 5V) 또는 LOW (출력 0V)로 명령 할 수 있습니다.

결과

LED가 켜지고 꺼지는 것을 볼 수 있습니다. 필요한 출력이 표시되지 않으면 회로를 올바르게 조립했는지 확인하고 코드를 보드에 업로드했는지 확인하십시오.

이 예제는 LED를 페이드 오프 할 때 analogWrite () 함수를 사용하는 방법을 보여줍니다. AnalogWrite는 펄스 폭 변조 (PWM)를 사용하여 디지털 핀을 켜고 끄면서 매우 빠르게 켜고 끄고 페이딩 효과를 만듭니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × LED
  • 1 × 330Ω 저항기
  • 2 × 점퍼

순서

회로도를 따라 아래 그림과 같이 브레드 보드의 구성 요소를 연결합니다.

Note− LED의 극성을 알아 보려면 자세히 살펴보십시오. 두 다리 중 더 짧은 전구의 평평한 가장자리 쪽은 음극 단자를 나타냅니다.

저항기와 같은 구성 요소는 브레드 보드 소켓에 제대로 맞도록 단자를 90 ° 각도로 구부려 야합니다. 터미널을 더 짧게자를 수도 있습니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

/*
   Fade
   This example shows how to fade an LED on pin 9 using the analogWrite() function.

   The analogWrite() function uses PWM, so if you want to change the pin you're using, be
   sure to use another PWM capable pin. On most Arduino, the PWM pins are identified with
   a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.
*/

int led = 9; // the PWM pin the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by
// the setup routine runs once when you press reset:

void setup() {
   // declare pin 9 to be an output:
   pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:

void loop() {
   // set the brightness of pin 9:
   analogWrite(led, brightness);
   // change the brightness for next time through the loop:
   brightness = brightness + fadeAmount;
   // reverse the direction of the fading at the ends of the fade:
   if (brightness == 0 || brightness == 255) {
      fadeAmount = -fadeAmount ;
   }
   // wait for 30 milliseconds to see the dimming effect
   delay(300);
}

참고할 코드

핀 9를 LED 핀으로 선언 한 후에는 코드의 setup () 함수에서 할 일이 없습니다. 코드의 메인 루프에서 사용할 analogWrite () 함수에는 두 개의 인수가 필요합니다. 하나는 쓸 핀을 함수에 알려주고 다른 하나는 쓸 PWM 값을 나타냅니다.

LED를 껐다가 켜려면 PWM 값을 0 (완전히 꺼져 있음)에서 255 (완전히 켜짐)까지 점진적으로 늘린 다음 다시 0으로 늘려주기를 완료합니다. 위의 스케치에서 PWM 값은 밝기라는 변수를 사용하여 설정됩니다. 루프를 통과 할 때마다 변수 값만큼 증가합니다.fadeAmount.

밝기가 값의 극단 (0 또는 255)이면 fadeAmount가 음수로 변경됩니다. 즉, fadeAmount가 5이면 -5로 설정됩니다. -5이면 5로 설정됩니다. 다음에 루프를 통해이 변경으로 인해 밝기가 방향도 변경됩니다.

analogWrite()PWM 값을 매우 빠르게 변경할 수 있으므로 스케치 끝의 지연이 페이드 속도를 제어합니다. 지연 값을 변경하고 페이딩 효과가 어떻게 변경되는지 확인하십시오.

결과

LED 밝기가 점차적으로 변경되는 것을 볼 수 있습니다.

이 예제는 아날로그 핀 0에서 아날로그 입력을 읽는 방법을 보여줍니다. 입력은 analogRead ()에서 전압으로 변환되고 Arduino 소프트웨어 (IDE)의 직렬 모니터로 인쇄됩니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × 5K 가변 저항기 (전위차계)
  • 2 × 점퍼

순서

회로도를 따라 아래 그림과 같이 브레드 보드의 구성 요소를 연결합니다.

전위차계

전위차계 (또는 포트)는 간단한 전기 기계 변환기입니다. 입력 연산자의 회전 또는 선형 운동을 저항 변화로 변환합니다. 이 변경은 하이파이 시스템의 볼륨에서 거대한 컨테이너 선박의 방향에 이르기까지 모든 것을 제어하는 ​​데 사용됩니다 (또는 사용 가능).

우리가 아는 포트는 원래 가변 저항기 (본질적으로 가변 권선 저항기)로 알려져있었습니다. 사용 가능한 냄비의 다양성은 이제 매우 놀랍고 초보자 (특히)가 주어진 작업에 적합한 유형을 결정하는 것은 매우 어려울 수 있습니다. 동일한 작업에 모두 사용할 수있는 몇 가지 다른 팟 유형은 작업을 더 어렵게 만듭니다.

왼쪽 이미지는 냄비의 표준 회로도 기호를 보여줍니다. 오른쪽 이미지는 전위차계입니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

/*
   ReadAnalogVoltage
   Reads an analog input on pin 0, converts it to voltage, 
   and prints the result to the serial monitor.
   Graphical representation is available using serial plotter (Tools > Serial Plotter menu)
   Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
*/

// the setup routine runs once when you press reset:

void setup() {
   // initialize serial communication at 9600 bits per second:
   Serial.begin(9600);
}

// the loop routine runs over and over again forever:

void loop() {
   // read the input on analog pin 0:
   int sensorValue = analogRead(A0);
   // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
   float voltage = sensorValue * (5.0 / 1023.0);
   // print out the value you read:
   Serial.println(voltage);
}

참고할 코드

아래 주어진 프로그램 또는 스케치에서 설정 기능에서 가장 먼저 수행하는 작업은 보드와 컴퓨터간에 회선을 사용하여 초당 9600 비트로 직렬 통신을 시작하는 것입니다.

Serial.begin(9600);

코드의 메인 루프에서 전위차계에서 나오는 저항 값 (0에서 1023 사이, int 데이터 유형에 완벽 함)을 저장할 변수를 설정해야합니다.

int sensorValue = analogRead(A0);

값을 0-1023에서 전압에 해당하는 범위로 변경하려면 핀이 읽고 있으며 다른 변수 인 부동 소수점을 만들고 약간의 계산을 수행해야합니다. 0.0에서 5.0 사이의 숫자를 조정하려면 5.0을 1023.0으로 나누고 여기에 sensorValue를 곱합니다.

float voltage= sensorValue * (5.0 / 1023.0);

마지막으로이 정보를 직렬 창에 인쇄해야합니다. 마지막 코드 줄에서 Serial.println () 명령을 사용하여이 작업을 수행 할 수 있습니다.

Serial.println(voltage)

이제 상단 녹색 막대의 오른쪽에있는 아이콘을 클릭하거나 Ctrl + Shift + M을 눌러 Arduino IDE에서 직렬 모니터를 엽니 다.

결과

0.0-5.0 범위의 숫자가 꾸준하게 표시됩니다. 포트를 돌리면 핀 A0의 전압에 따라 값이 변경됩니다.

이 예제는 아날로그 핀 0에서 아날로그 입력을 읽고 analogRead ()의 값을 전압으로 변환 한 다음 Arduino 소프트웨어 (IDE)의 직렬 모니터로 인쇄하는 방법을 보여줍니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × 5k ohm 가변 저항기 (전위차계)
  • 2 × 점퍼
  • 8 × LED 또는 사용 가능 (아래 이미지와 같이 LED 막대 그래프 표시)

순서

회로도를 따라 아래 그림과 같이 브레드 보드의 구성 요소를 연결합니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

10 세그먼트 LED 막대 그래프

이 10 세그먼트 막대 그래프 LED는 많은 용도로 사용됩니다. 설치 공간이 작고 연결이 간단하여 프로토 타입 또는 완제품에 사용하기 쉽습니다. 기본적으로 이들은 각각 개별 양극 및 음극 연결이있는 10 개의 개별 파란색 LED가 함께 장착되어 있습니다.

노란색, 빨간색 및 녹색 색상으로도 제공됩니다.

Note−이 막대 그래프의 핀 배치는 데이터 시트에 나열된 것과 다를 수 있습니다. 장치를 180도 회전하면 변경 사항이 수정되어 11 번 핀이 첫 번째 핀이됩니다.

Arduino 코드

/*
   LED bar graph
   Turns on a series of LEDs based on the value of an analog sensor. 
   This is a simple way to make a bar graph display. 
   Though this graph uses 8LEDs, you can use any number by
      changing the LED count and the pins in the array.
   This method can be used to control any series of digital
      outputs that depends on an analog input.
*/

// these constants won't change:
const int analogPin = A0; // the pin that the potentiometer is attached to
const int ledCount = 8; // the number of LEDs in the bar graph
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // an array of pin numbers to which LEDs are attached

void setup() {
   // loop over the pin array and set them all to output:
   for (int thisLed = 0; thisLed < ledCount; thisLed++) {
      pinMode(ledPins[thisLed], OUTPUT);
   }
}

void loop() {
   // read the potentiometer:
   int sensorReading = analogRead(analogPin);
   // map the result to a range from 0 to the number of LEDs:
   int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
   // loop over the LED array:
   for (int thisLed = 0; thisLed < ledCount; thisLed++) {
      // if the array element's index is less than ledLevel,
      // turn the pin for this element on:
      if (thisLed < ledLevel) {
         digitalWrite(ledPins[thisLed], HIGH);
      }else { // turn off all pins higher than the ledLevel:
         digitalWrite(ledPins[thisLed], LOW);
      }
   }
}

참고할 코드

스케치는 다음과 같이 작동합니다. 먼저 입력 내용을 읽습니다. 입력 값을 출력 범위 (이 경우 10 개의 LED)에 매핑합니다. 그런 다음for-loop출력을 반복합니다. 시리즈의 출력 번호가 매핑 된 입력 범위보다 낮 으면이를 켭니다. 그렇지 않으면 끄십시오.

결과

아날로그 판독 값이 증가하면 LED가 하나씩 켜지고, 판독 값이 감소하는 동안 하나씩 꺼지는 것을 볼 수 있습니다.

이 예에서는 키보드 라이브러리를 사용하여 ARDUINO UNO의 핀 2가 접지로 당겨질 때 컴퓨터의 사용자 세션에서 로그 아웃합니다. 스케치는 동시에 두 개 또는 세 개의 키 순서로 키 누르기를 시뮬레이션하고 잠시 후에 해제합니다.

Warning − 사용시 Keyboard.print()명령, Arduino는 컴퓨터의 키보드를 인수합니다. 이 함수로 스케치를 실행하는 동안 컴퓨터를 제어 할 수 없도록하려면 Keyboard.print ()를 호출하기 전에 안정적인 제어 시스템을 설정하십시오. 이 스케치는 핀을지면으로 당긴 후에 만 ​​키보드 명령을 보내도록 설계되었습니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Leonardo, Micro 또는 Due 보드
  • 1 × 푸시 버튼
  • 1 × 점퍼

순서

회로도를 따르고 아래 이미지와 같이 브레드 보드의 구성 요소를 연결합니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

이 예에서는 Arduino IDE 1.6.7을 사용해야합니다.

Note− Arduino 라이브러리 파일에 키보드 라이브러리를 포함해야합니다. 다음 스크린 샷과 같이 이름 라이브러리 (강조 표시됨)가있는 파일 내에 키패드 라이브러리 파일을 복사하여 붙여 넣습니다.

Arduino 코드

/*
   Keyboard logout
   This sketch demonstrates the Keyboard library.
   When you connect pin 2 to ground, it performs a logout.
   It uses keyboard combinations to do this, as follows:
   On Windows, CTRL-ALT-DEL followed by ALT-l
   On Ubuntu, CTRL-ALT-DEL, and ENTER
   On OSX, CMD-SHIFT-q
   To wake: Spacebar.
   Circuit:
   * Arduino Leonardo or Micro
   * wire to connect D2 to ground.
*/

#define OSX 0
#define WINDOWS 1
#define UBUNTU 2

#include "Keyboard.h"

// change this to match your platform:
int platform = WINDOWS;

void setup() {
   // make pin 2 an input and turn on the
   // pullup resistor so it goes high unless
   // connected to ground:
   
   pinMode(2, INPUT_PULLUP);
   Keyboard.begin();
}

void loop() {
   while (digitalRead(2) == HIGH) {
      // do nothing until pin 2 goes low
      delay(500);
   }
   
   delay(1000);
   
   switch (platform) {
      case OSX:
      Keyboard.press(KEY_LEFT_GUI);
	  
      // Shift-Q logs out:
      Keyboard.press(KEY_LEFT_SHIFT);
      Keyboard.press('Q');
      delay(100);
	  
      // enter:
      Keyboard.write(KEY_RETURN);
      break;
	  
      case WINDOWS:
      // CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(100);
      Keyboard.releaseAll();
	  
      //ALT-l:
      delay(2000);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press('l');
      Keyboard.releaseAll();
      break;
	  
      case UBUNTU:
      // CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
	  
      delay(1000);
      Keyboard.releaseAll();
	  
      // Enter to confirm logout:
      Keyboard.write(KEY_RETURN);
      break;
   }
   
   // do nothing:
   while (true);
}

Keyboard.releaseAll();

   // enter:
      Keyboard.write(KEY_RETURN);
      break;
      case WINDOWS:
	  
   // CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(100);
      Keyboard.releaseAll();
	  
   //ALT-l:
      delay(2000);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press('l');
      Keyboard.releaseAll();
      break;
	  
   case UBUNTU:
      // CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(1000);
      Keyboard.releaseAll();
	  
      // Enter to confirm logout:
      Keyboard.write(KEY_RETURN);
      break;
   }
   
// do nothing:
   while (true);
}

참고할 코드

프로그램을 보드에 업로드하기 전에 현재 사용중인 올바른 OS를 플랫폼 변수에 할당해야합니다.

스케치가 실행되는 동안 버튼을 누르면 핀 2가 접지에 연결되고 보드는 로그 아웃 시퀀스를 USB 연결 PC로 보냅니다.

결과

핀 2를 접지에 연결하면 로그 아웃 작업을 수행합니다.

로그 아웃하려면 다음 키보드 조합을 사용합니다.

  • 의 위에 Windows, CTRL-ALT-DEL 다음에 ALT-l

  • 의 위에 Ubuntu, CTRL-ALT-DEL 및 ENTER

  • 의 위에 OSX, CMD-SHIFT-q

이 예에서 버튼을 누르면 텍스트 문자열이 키보드 입력으로 컴퓨터에 전송됩니다. 문자열은 버튼을 누른 횟수를보고합니다. Leonardo를 프로그래밍하고 연결했으면 좋아하는 텍스트 편집기를 열어 결과를 확인하세요.

Warning − 사용시 Keyboard.print()명령을 내리면 Arduino가 컴퓨터의 키보드를 대신합니다. 이 기능을 사용하여 스케치를 실행하는 동안 컴퓨터의 제어권을 잃지 않도록 전화하기 전에 신뢰할 수있는 제어 시스템을 설정하십시오.Keyboard.print(). 이 스케치에는 버튼을 누른 후에 만 ​​실행되도록 키보드를 토글하는 푸시 버튼이 포함되어 있습니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Leonardo, Micro 또는 Due 보드
  • 1 × 순간 푸시 버튼
  • 1 × 10k ohm 저항기

순서

회로도를 따라 아래 그림과 같이 브레드 보드의 구성 요소를 연결합니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

/*
   Keyboard Message test For the Arduino Leonardo and Micro,
      Sends a text string when a button is pressed.
   The circuit:
   * pushbutton attached from pin 4 to +5V
   * 10-kilohm resistor attached from pin 4 to ground
*/

#include "Keyboard.h"
const int buttonPin = 4; // input pin for pushbutton
int previousButtonState = HIGH; // for checking the state of a pushButton
int counter = 0; // button push counter

void setup() {
   pinMode(buttonPin, INPUT); // make the pushButton pin an input:
   Keyboard.begin(); // initialize control over the keyboard:
}

void loop() {
   int buttonState = digitalRead(buttonPin); // read the pushbutton:
   if ((buttonState != previousButtonState)&& (buttonState == HIGH)) // and it's currently pressed: {
      // increment the button counter
      counter++;
      // type out a message
      Keyboard.print("You pressed the button ");
      Keyboard.print(counter);
      Keyboard.println(" times.");
   }
   // save the current button state for comparison next time:
   previousButtonState = buttonState;
}

참고할 코드

푸시 버튼의 한 단자를 Arduino의 핀 4에 연결합니다. 다른 핀을 5V에 연결하십시오. 저항을 풀다운으로 사용하고 핀 4에서 접지에 연결하여 접지에 대한 참조를 제공합니다.

보드를 프로그래밍했으면 USB 케이블을 분리하고 텍스트 편집기를 열고 텍스트 커서를 입력 영역에 놓습니다. 다시 USB를 통해 보드를 컴퓨터에 연결하고 버튼을 눌러 문서를 작성합니다.

결과

텍스트 편집기를 사용하면 Arduino를 통해 보낸 텍스트가 표시됩니다.

마우스 라이브러리를 사용하면 Arduino Leonardo, Micro 또는 Due로 컴퓨터의 화면 커서를 제어 할 수 있습니다.

이 특정 예에서는 5 개의 푸시 버튼을 사용하여 화면 커서를 이동합니다. 4 개의 버튼은 방향 (위, 아래, 왼쪽, 오른쪽)이고 하나는 왼쪽 마우스 클릭 용입니다. Arduino의 커서 이동은 항상 상대적입니다. 입력을 읽을 때마다 커서의 위치가 현재 위치를 기준으로 업데이트됩니다.

방향 버튼 중 하나를 누를 때마다 Arduino는 마우스를 움직여 HIGH 입력을 적절한 방향으로 5 범위로 매핑합니다.

다섯 번째 버튼은 마우스 왼쪽 클릭을 제어하기위한 것입니다. 버튼에서 손을 떼면 컴퓨터가 이벤트를 인식합니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Leonardo, Micro 또는 Due 보드
  • 5 × 10k 옴 저항
  • 5 × 순간 푸시 버튼

순서

회로도를 따르고 아래 이미지와 같이 브레드 보드의 구성 요소를 연결합니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

이 예에서는 Arduino IDE 1.6.7을 사용해야합니다.

Arduino 코드

/*
   Button Mouse Control
   For Leonardo and Due boards only .Controls the mouse from 
   five pushbuttons on an Arduino Leonardo, Micro or Due.
   Hardware:
   * 5 pushbuttons attached to D2, D3, D4, D5, D6
   The mouse movement is always relative. This sketch reads
   four pushbuttons, and uses them to set the movement of the mouse.
   WARNING: When you use the Mouse.move() command, the Arduino takes
   over your mouse! Make sure you have control before you use the mouse commands.
*/

#include "Mouse.h"
// set pin numbers for the five buttons:
const int upButton = 2;
const int downButton = 3;
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;
int range = 5; // output range of X or Y movement; affects movement speed
int responseDelay = 10; // response delay of the mouse, in ms

void setup() {
   // initialize the buttons' inputs:
   pinMode(upButton, INPUT);
   pinMode(downButton, INPUT);
   pinMode(leftButton, INPUT);
   pinMode(rightButton, INPUT);
   pinMode(mouseButton, INPUT);
   // initialize mouse control:
   Mouse.begin();
}

void loop() {
   // read the buttons:
   int upState = digitalRead(upButton);
   int downState = digitalRead(downButton);
   int rightState = digitalRead(rightButton);
   int leftState = digitalRead(leftButton);
   int clickState = digitalRead(mouseButton);
   // calculate the movement distance based on the button states:
   int xDistance = (leftState - rightState) * range;
   int yDistance = (upState - downState) * range;
   // if X or Y is non-zero, move:
   if ((xDistance != 0) || (yDistance != 0)) {
      Mouse.move(xDistance, yDistance, 0);
   }

   // if the mouse button is pressed:
   if (clickState == HIGH) {
      // if the mouse is not pressed, press it:
      if (!Mouse.isPressed(MOUSE_LEFT)) {
         Mouse.press(MOUSE_LEFT);
      }
   } else {                           // else the mouse button is not pressed:
      // if the mouse is pressed, release it:
      if (Mouse.isPressed(MOUSE_LEFT)) {
         Mouse.release(MOUSE_LEFT);
      }
   }
   // a delay so the mouse does not move too fast:
   delay(responseDelay);
}

참고할 코드

마이크로 USB 케이블을 사용하여 보드를 컴퓨터에 연결합니다. 버튼은 핀 2 ~ 6의 디지털 입력에 연결됩니다. 10k 풀다운 저항을 사용하는지 확인하십시오.

이 예제는 직렬 포트에서 오는 바이트를 수신합니다. 수신되면 보드는 키 입력을 컴퓨터로 다시 보냅니다. 전송 된 키 입력은 수신 된 키 입력보다 하나 더 높으므로 직렬 모니터에서 "a"를 보내면 컴퓨터에 연결된 보드에서 "b"를 받게됩니다. "1"은 "2"등을 반환합니다.

Warning − 사용시 Keyboard.print()명령, Leonardo, Micro 또는 Due 보드가 컴퓨터의 키보드를 대신합니다. 이 함수로 스케치를 실행하는 동안 컴퓨터를 제어 할 수 없도록하려면 Keyboard.print ()를 호출하기 전에 안정적인 제어 시스템을 설정하십시오. 이 스케치는 보드가 직렬 포트를 통해 바이트를 수신 한 후에 만 ​​키보드 명령을 전송하도록 설계되었습니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × Arduino Leonardo, Micro 또는 Due 보드

순서

USB 케이블을 사용하여 보드를 컴퓨터에 연결하기 만하면됩니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Notes− Arduino 라이브러리 파일에 키패드 라이브러리를 포함해야합니다. 노란색으로 강조 표시된 '라이브러리'라는 이름으로 파일 내에 키패드 라이브러리 파일을 복사하여 붙여 넣습니다.

Arduino 코드

/*
   Keyboard test
   For the Arduino Leonardo, Micro or Due Reads
      a byte from the serial port, sends a keystroke back. 
   The sent keystroke is one higher than what's received, e.g. if you send a, you get b, send
      A you get B, and so forth.
   The circuit:
   * none
*/

#include "Keyboard.h"

void setup() {
   // open the serial port:
   Serial.begin(9600);
   // initialize control over the keyboard:
   Keyboard.begin();
}

void loop() {
   // check for incoming serial data:
   if (Serial.available() > 0) {
      // read incoming serial data:
      char inChar = Serial.read();
      // Type the next ASCII value from what you received:
      Keyboard.write(inChar + 1);
   }
}

참고할 코드

프로그래밍이 끝나면 직렬 모니터를 열고 바이트를 보냅니다. 보드는 한 숫자 더 높은 키 입력으로 응답합니다.

결과

보드는 바이트를 보낼 때 Arduino IDE 직렬 모니터에서 한 숫자 더 높은 키 입력으로 응답합니다.

이 섹션에서는 Arduino 보드를 다른 센서와 인터페이스하는 방법을 배웁니다. 다음 센서에 대해 설명합니다.

  • 습도 센서 (DHT22)
  • 온도 센서 (LM35)
  • 물 감지기 센서 (Simple Water Trigger)
  • PIR 센서
  • 초음파 센서
  • GPS

습도 센서 (DHT22)

DHT-22 (AM2302라고도 함)는 디지털 출력, 상대 습도 및 온도 센서입니다. 용량 성 습도 센서와 서미스터를 사용하여 주변 공기를 측정하고 데이터 핀에 디지털 신호를 보냅니다.

이 예제에서는이 센서를 Arduino UNO와 함께 사용하는 방법을 배웁니다. 실내 온도 및 습도가 직렬 모니터에 인쇄됩니다.

DHT-22 센서

연결은 간단합니다. 왼쪽의 첫 번째 핀은 3-5V 전원, 두 번째 핀은 데이터 입력 핀, 맨 오른쪽 핀은 접지입니다.

기술적 세부 사항

  • Power − 3-5V

  • Max Current − 2.5mA

  • Humidity − 0-100 %, 2-5 % 정확도

  • Temperature − 40 ~ 80 ° C, ± 0.5 ° C 정확도

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × DHT22
  • 1 × 10K 옴 저항기

순서

회로도를 따르고 아래 이미지와 같이 브레드 보드의 구성 요소를 연결합니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

// Example testing sketch for various DHT humidity/temperature sensors

#include "DHT.h"
#define DHTPIN 2 // what digital pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
   Serial.begin(9600);
   Serial.println("DHTxx test!");
   dht.begin();
}

void loop() {
   delay(2000); // Wait a few seconds between measurements
   float h = dht.readHumidity();
   // Reading temperature or humidity takes about 250 milliseconds!
   float t = dht.readTemperature();
   // Read temperature as Celsius (the default)
   float f = dht.readTemperature(true);
   // Read temperature as Fahrenheit (isFahrenheit = true)
   // Check if any reads failed and exit early (to try again).
   if (isnan(h) || isnan(t) || isnan(f)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
   }
   
   // Compute heat index in Fahrenheit (the default)
   float hif = dht.computeHeatIndex(f, h);
   // Compute heat index in Celsius (isFahreheit = false)
   float hic = dht.computeHeatIndex(t, h, false);
   Serial.print ("Humidity: ");
   Serial.print (h);
   Serial.print (" %\t");
   Serial.print ("Temperature: ");
   Serial.print (t);
   Serial.print (" *C ");
   Serial.print (f);
   Serial.print (" *F\t");
   Serial.print ("Heat index: ");
   Serial.print (hic);
   Serial.print (" *C ");
   Serial.print (hif);
   Serial.println (" *F");
}

참고할 코드

DHT22 센서에는 4 개의 단자 (V cc , DATA, NC, GND)가 있으며 다음과 같이 보드에 연결됩니다.

  • Arduino 핀 번호 2에 대한 DATA 핀
  • Arduino 보드의 5V에 V cc
  • Arduino 보드의 접지에 대한 GND 핀
  • DATA와 V cc 핀 사이에 10k ohm 저항 (풀업 저항)을 연결해야합니다.

하드웨어 연결이 완료되면 앞서 설명한대로 DHT22 라이브러리를 Arduino 라이브러리 파일에 추가해야합니다.

결과

2 초마다 업데이트되는 직렬 포트 모니터에 온도 및 습도가 표시됩니다.

온도 센서 LM35 시리즈는 섭씨 온도에 선형 적으로 비례하는 출력 전압을 갖는 정밀 통합 회로 온도 장치입니다.

LM35 장치는 사용자가 편리한 섭씨 스케일링을 얻기 위해 출력에서 ​​큰 정전압을 뺄 필요가 없기 때문에 켈빈으로 보정 된 선형 온도 센서에 비해 이점이 있습니다. LM35 장치는 실온에서 ± ¼ ° C, 전체 -55 ° C ~ 150 ° C 온도 범위에서 ± ¾ ° C의 일반적인 정확도를 제공하기 위해 외부 보정이나 트리밍이 필요하지 않습니다.

기술 사양

  • 섭씨 (섭씨)에서 직접 보정
  • 선형 + 10mV / ° C 스케일 팩터
  • 0.5 ° C 정확도 보장 (25 ° C 기준)
  • 전체 −55 ° C ~ 150 ° C 범위 정격
  • 원격 애플리케이션에 적합

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × LM35 센서

순서

회로도를 따라 아래 그림과 같이 브레드 보드의 구성 요소를 연결합니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

float temp;
int tempPin = 0;

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

void loop() {
   temp = analogRead(tempPin);
   // read analog volt from sensor and save to variable temp
   temp = temp * 0.48828125;
   // convert the analog volt to its temperature equivalent
   Serial.print("TEMPERATURE = ");
   Serial.print(temp); // display temperature value
   Serial.print("*C");
   Serial.println();
   delay(1000); // update sensor reading each one second
}

참고할 코드

LM35 센서에는 V s , V out 및 GND 세 가지 단자가 있습니다. 다음과 같이 센서를 연결합니다.

  • + V s 를 Arduino 보드의 + 5v에 연결합니다 .
  • V out 을 Arduino 보드의 Analog0 또는 A0에 연결합니다 .
  • Arduino에서 GND와 GND를 연결합니다.

아날로그-디지털 변환기 (ADC)는 ADC 값 = 샘플 * 1024 / 기준 전압 (+ 5v) 공식을 기반으로 아날로그 값을 디지털 근사치로 변환합니다. 따라서 + 5V 레퍼런스를 사용하면 디지털 근사값은 입력 전압 * 205와 같습니다.

결과

매초 업데이트되는 직렬 포트 모니터에 온도 디스플레이가 표시됩니다.

물 센서 브릭은 물 감지 용으로 설계되어 강우, 수위 및 누수 감지에 널리 사용할 수 있습니다.

물 센서를 Arduino에 연결하는 것은 누수, 유출, 홍수, 비 등을 감지하는 좋은 방법입니다. 물의 존재, 수위, 부피 및 / 또는 부재를 감지하는 데 사용할 수 있습니다. 이것은 식물에 물을 주라는 것을 상기시키는 데 사용될 수 있지만 더 나은 Grove 센서가 있습니다. 센서에는 물이 감지되면 LOW로 표시되는 일련의 노출 된 트레이스가 있습니다.

이 장에서는 물 센서를 Arduino의 Digital Pin 8에 연결하고 물 센서가 물 공급원과 접촉하는시기를 식별하는 데 도움이되는 매우 편리한 LED를 사용합니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × 물 센서
  • 1 × LED
  • 1 × 330 ohm 저항

순서

회로도를 따라 아래 그림과 같이 브레드 보드의 구성 요소를 연결합니다.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

#define Grove_Water_Sensor 8 // Attach Water sensor to Arduino Digital Pin 8
#define LED 9 // Attach an LED to Digital Pin 9 (or use onboard LED)

void setup() {
   pinMode(Grove_Water_Sensor, INPUT); // The Water Sensor is an Input
   pinMode(LED, OUTPUT); // The LED is an Output
}

void loop() {
   /* The water sensor will switch LOW when water is detected.
   Get the Arduino to illuminate the LED and activate the buzzer
   when water is detected, and switch both off when no water is present */
   if( digitalRead(Grove_Water_Sensor) == LOW) {
      digitalWrite(LED,HIGH);
   }else {
      digitalWrite(LED,LOW);
   }
}

참고할 코드

물 센서에는 S, V 출력 (+) 및 GND (-)의 세 가지 단자가 있습니다. 다음과 같이 센서를 연결하십시오-

  • + V s 를 Arduino 보드의 + 5v에 연결합니다 .
  • Arduino 보드의 디지털 핀 번호 8에 S를 연결합니다.
  • Arduino에서 GND와 GND를 연결합니다.
  • Arduino 보드의 디지털 핀 번호 9에 LED를 연결합니다.

센서가 물을 감지하면 Arduino의 8 번 핀이 LOW가되고 Arduino의 LED가 켜집니다.

결과

센서가 물을 감지하면 표시 LED가 켜집니다.

PIR 센서를 사용하면 움직임을 감지 할 수 있습니다. 사람이 센서 범위 안팎으로 이동했는지 감지하는 데 사용됩니다. 그들은 일반적으로 가정 또는 기업에서 사용되는 가전 제품 및 장치에서 발견됩니다. 이들은 종종 PIR, "수동 적외선", "초 전기"또는 "IR 모션"센서라고합니다.

다음은 PIR 센서의 장점입니다.

  • 작은 크기
  • 넓은 렌즈 범위
  • 간편한 인터페이스
  • Inexpensive
  • Low-power
  • 사용하기 쉬운
  • 마모하지 마십시오

PIR은 적외선 방사 수준을 감지 할 수있는 중앙에 직사각형 크리스탈이있는 둥근 금속 캔인 초 전기 센서로 구성됩니다. 모든 것이 낮은 수준의 방사선을 방출하고, 더 뜨거운 것이있을수록 더 많은 방사선이 방출됩니다. 동작 감지기의 센서는 두 부분으로 나뉩니다. 이것은 평균 IR 레벨이 아니라 움직임 (변화)을 감지하기위한 것입니다. 두 반쪽이 연결되어 서로 상쇄됩니다. 절반이 다른 것보다 더 많거나 적은 IR 방사를 보는 경우 출력이 높거나 낮게 스윙합니다.

PIR에는 조정 가능한 설정이 있으며 3 핀 접지 / 출력 / 전원 패드에 헤더가 설치되어 있습니다.

사람이 그 지역을 떠나거나 들어 왔을 때 감지해야하는 많은 기본 프로젝트 또는 제품의 경우 PIR 센서가 좋습니다. PIR은 주변에있는 사람의 수나 센서에 대한 가까운 거리를 알려주지 않습니다. 렌즈는 종종 먼 거리에서 특정 스윕으로 고정되며 때로는 집에있는 애완 동물에 의해 설정됩니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × PIR 센서 (MQ3)

순서

회로도를 따라 아래 이미지와 같이 연결하십시오.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

#define pirPin 2
int calibrationTime = 30;
long unsigned int lowIn;
long unsigned int pause = 5000;
boolean lockLow = true;
boolean takeLowTime;
int PIRValue = 0;

void setup() {
   Serial.begin(9600);
   pinMode(pirPin, INPUT);
}

void loop() {
   PIRSensor();
}

void PIRSensor() {
   if(digitalRead(pirPin) == HIGH) {
      if(lockLow) {
         PIRValue = 1;
         lockLow = false;
         Serial.println("Motion detected.");
         delay(50);
      }
      takeLowTime = true;
   }
   if(digitalRead(pirPin) == LOW) {
      if(takeLowTime){
         lowIn = millis();takeLowTime = false;
      }
      if(!lockLow && millis() - lowIn > pause) {
         PIRValue = 0;
         lockLow = true;
         Serial.println("Motion ended.");
         delay(50);
      }
   }
}

참고할 코드

PIR 센서에는 V cc , OUT 및 GND의 세 가지 단자가 있습니다. 다음과 같이 센서를 연결하십시오-

  • + V cc 를 Arduino 보드의 + 5v에 연결합니다 .
  • Arduino 보드의 디지털 핀 2에 OUT을 연결합니다.
  • Arduino에서 GND와 GND를 연결합니다.

센서 보드 하단에있는 두 개의 가변 저항기를 통해 센서 감도와 지연 시간을 조정할 수 있습니다.

센서가 움직임을 감지하면 Arduino는 직렬 포트를 통해 움직임이 감지되었음을 알리는 메시지를 보냅니다. PIR 감지 동작은 새로운 동작이 있는지 확인하기 위해 일정 시간 동안 지연됩니다. 움직임이 감지되지 않으면 Arduino는 움직임이 끝났다는 새 메시지를 보냅니다.

결과

동작이 감지되면 직렬 포트에 메시지가 표시되고 동작이 중지되면 다른 메시지가 표시됩니다.

HC-SR04 초음파 센서는 박쥐처럼 물체의 거리를 측정하기 위해 SONAR를 사용합니다. 2cm ~ 400cm 또는 1 인치 ~ 13 피트의 사용하기 쉬운 패키지로 높은 정확도와 안정적인 판독 값으로 뛰어난 비접촉 범위 감지 기능을 제공합니다.

작동은 햇빛이나 검은 색 물질의 영향을받지 않지만 음향 적으로 천과 같은 부드러운 물질은 감지하기 어려울 수 있습니다. 그것은 초음파 송신기 및 수신기 모듈과 함께 제공됩니다.

기술 사양

  • 전원 공급 장치 − + 5V DC
  • 대기 전류-<2mA
  • 작동 전류-15mA
  • 유효 각도-<15 °
  • 범위 거리 − 2cm – 400cm / 1 ″ – 13ft
  • 해상도-0.3cm
  • 측정 각도 − 30도

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × 브레드 보드
  • 1 × Arduino Uno R3
  • 1 × ULTRASONIC 센서 (HC-SR04)

순서

회로도에 따라 아래 그림과 같이 연결하십시오.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

const int pingPin = 7; // Trigger Pin of Ultrasonic Sensor
const int echoPin = 6; // Echo Pin of Ultrasonic Sensor

void setup() {
   Serial.begin(9600); // Starting Serial Terminal
}

void loop() {
   long duration, inches, cm;
   pinMode(pingPin, OUTPUT);
   digitalWrite(pingPin, LOW);
   delayMicroseconds(2);
   digitalWrite(pingPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(pingPin, LOW);
   pinMode(echoPin, INPUT);
   duration = pulseIn(echoPin, HIGH);
   inches = microsecondsToInches(duration);
   cm = microsecondsToCentimeters(duration);
   Serial.print(inches);
   Serial.print("in, ");
   Serial.print(cm);
   Serial.print("cm");
   Serial.println();
   delay(100);
}

long microsecondsToInches(long microseconds) {
   return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds) {
   return microseconds / 29 / 2;
}

참고할 코드

초음파 센서에는 + 5V, Trigger, Echo 및 GND의 4 개 단자가 다음과 같이 연결되어 있습니다.

  • + 5V 핀을 Arduino 보드의 + 5v에 연결합니다.
  • 트리거를 Arduino 보드의 디지털 핀 7에 연결합니다.
  • Echo를 Arduino 보드의 디지털 핀 6에 연결합니다.
  • Arduino에서 GND와 GND를 연결합니다.

프로그램에서 센서가 측정 한 거리를 직렬 포트를 통해 인치와 cm로 표시했습니다.

결과

Arduino 직렬 모니터에서 센서로 측정 된 거리를 인치 및 cm 단위로 볼 수 있습니다.

푸시 버튼 또는 스위치는 회로에서 두 개의 개방 단자를 연결합니다. 이 예에서는 핀 8에 연결된 푸시 버튼 스위치를 누르면 핀 2의 LED가 켜집니다.

풀다운 저항

풀다운 저항은 외부 장치가 분리되거나 높은 임피던스에있는 경우 Arduino에 대한 입력이 예상되는 논리 수준으로 안정되도록 전자 논리 회로에 사용됩니다. 입력 핀에 아무것도 연결되어 있지 않기 때문에 이것이 논리적 제로라는 의미는 아닙니다. 풀다운 저항은 접지와 장치의 해당 핀 사이에 연결됩니다.

디지털 회로의 풀다운 저항의 예가 다음 그림에 나와 있습니다. 푸시 버튼 스위치는 공급 전압과 마이크로 컨트롤러 핀 사이에 연결됩니다. 이러한 회로에서 스위치가 닫히면 마이크로 컨트롤러 입력은 논리적으로 높은 값이지만 스위치가 열리면 풀다운 저항이 입력 전압을 접지 (논리적 제로 값)로 끌어내어 입력에서 정의되지 않은 상태.

풀다운 저항은 논리 회로의 임피던스보다 더 큰 저항을 가져야합니다. 그렇지 않으면 전압을 너무 많이 낮추고 핀의 입력 전압이 스위치 위치에 관계없이 일정한 논리적 낮은 값으로 유지됩니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × Arduino UNO 보드
  • 1 × 330 ohm 저항
  • 1 × 4.7K 옴 저항 (풀다운)
  • 1 × LED

순서

회로도에 따라 아래 그림과 같이 연결하십시오.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 8; // the number of the pushbutton pin
const int ledPin = 2; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
   // initialize the LED pin as an output:
   pinMode(ledPin, OUTPUT);
   // initialize the pushbutton pin as an input:
   pinMode(buttonPin, INPUT);
}

void loop() {
   // read the state of the pushbutton value:
   buttonState = digitalRead(buttonPin);
   // check if the pushbutton is pressed.
   // if it is, the buttonState is HIGH:
   if (buttonState == HIGH) {
      // turn LED on:
      digitalWrite(ledPin, HIGH);
   } else {
      // turn LED off:
      digitalWrite(ledPin, LOW);
   }
}

참고할 코드

스위치가 열리면 (푸시 버튼을 누르지 않음) 푸시 버튼의 두 단자 사이에 연결이 없으므로 핀이 풀다운 저항을 통해 접지에 연결되고 LOW를 읽습니다. 스위치가 닫히면 (푸시 버튼을 누름) 두 단자 사이를 연결하여 핀을 5V에 연결하여 HIGH를 읽습니다.

결과

누름 버튼을 누르면 LED가 켜지고 손을 떼면 꺼집니다.

이 장에서는 Arduino 보드 (UNO)와 다양한 유형의 모터를 인터페이스하고 모터를 연결하고 보드에서 구동하는 방법을 보여줍니다.

모터에는 세 가지 유형이 있습니다.

  • DC 모터
  • 서보 모터
  • 스테퍼 모터

DC 모터 (직류 모터)는 가장 일반적인 모터 유형입니다. DC 모터에는 일반적으로 두 개의 리드 (양극 하나와 음극 하나) 만 있습니다. 이 두 리드를 배터리에 직접 연결하면 모터가 회전합니다. 리드를 전환하면 모터가 반대 방향으로 회전합니다.

Warning− Arduino 보드 핀에서 직접 모터를 구동하지 마십시오. 보드가 손상 될 수 있습니다. 드라이버 회로 또는 IC를 사용하십시오.

이 장을 세 부분으로 나눌 것입니다.

  • 모터를 돌리십시오.
  • 모터 속도 제어
  • DC 모터의 회전 방향 제어

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1x Arduino UNO 보드
  • 1x PN2222 트랜지스터
  • 1x 소형 6V DC 모터
  • 1x 1N4001 다이오드
  • 1x 270 Ω 저항기

순서

회로도에 따라 아래 그림과 같이 연결하십시오.

지침

연결시 다음 사항에주의하십시오.

  • 먼저 트랜지스터가 올바른 방식으로 연결되어 있는지 확인하십시오. 트랜지스터의 평평한면은 배열에 표시된대로 Arduino 보드를 향해야합니다.

  • 둘째, 다이오드의 스트라이프 끝은 이미지에 표시된 배열에 따라 + 5V 전원 라인을 향해야합니다.

스핀 제어 Arduino 코드

int motorPin = 3;

void setup() {

}

void loop() {
   digitalWrite(motorPin, HIGH);
}

참고할 코드

트랜지스터는 스위치처럼 작동하여 모터의 전원을 제어합니다. Arduino 핀 3은 트랜지스터를 켜고 끄는 데 사용되며 스케치에서 'motorPin'이라는 이름이 지정됩니다.

결과

Arduino 핀 번호 3이 높아지면 모터가 최대 속도로 회전합니다.

모터 속도 제어

다음은 Arduino 보드에 연결된 DC 모터의 개략도입니다.

Arduino 코드

int motorPin = 9;

void setup() {
   pinMode(motorPin, OUTPUT);
   Serial.begin(9600);
   while (! Serial);
   Serial.println("Speed 0 to 255");
}

void loop() {
   if (Serial.available()) {
      int speed = Serial.parseInt();
      if (speed >= 0 && speed <= 255) {
         analogWrite(motorPin, speed);
      }
   }
}

참고할 코드

트랜지스터는 모터의 전력을 제어하는 ​​스위치처럼 작동합니다. Arduino 핀 3은 트랜지스터를 켜고 끄는 데 사용되며 스케치에서 'motorPin'이라는 이름이 지정됩니다.

프로그램이 시작되면 모터의 속도를 제어하는 ​​값을 입력하라는 메시지가 표시됩니다. 직렬 모니터에 0에서 255 사이의 값을 입력해야합니다.

'loop'기능에서 'Serial.parseInt'명령은 시리얼 모니터에 텍스트로 입력 된 숫자를 읽어 'int'로 변환하는 데 사용됩니다. 여기에 숫자를 입력 할 수 있습니다. 다음 줄의 'if'문은 숫자가 0에서 255 사이 인 경우이 숫자로 아날로그 쓰기를 수행합니다.

결과

DC 모터는 직렬 포트를 통해 수신 된 값 (0 ~ 250)에 따라 다른 속도로 회전합니다.

스핀 방향 제어

리드를 교환하지 않고 DC 모터의 회전 방향을 제어하려면 다음과 같은 회로를 사용할 수 있습니다. H-Bridge. H 브리지는 모터를 양방향으로 구동 할 수있는 전자 회로입니다. H- 브리지는 다양한 응용 분야에서 사용됩니다. 가장 일반적인 응용 분야 중 하나는 로봇의 모터를 제어하는 ​​것입니다. 회로도가 "H"처럼 보이는 방식으로 연결된 4 개의 트랜지스터를 사용하기 때문에 H- 브리지라고합니다.

여기서는 L298 H-Bridge IC를 사용합니다. L298은 DC 모터와 스테퍼 모터의 속도와 방향을 제어 할 수 있으며 두 개의 모터를 동시에 제어 할 수 있습니다. 전류 정격은 각 모터에 대해 2A입니다. 그러나 이러한 전류에서는 방열판을 사용해야합니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × L298 브리지 IC
  • 1 × DC 모터
  • 1 × Arduino UNO
  • 1 × 브레드 보드
  • 10 × 점퍼 와이어

순서

다음은 Arduino Uno 보드에 대한 DC 모터 인터페이스의 개략도입니다.

위의 다이어그램은 L298 IC를 연결하여 두 개의 모터를 제어하는 ​​방법을 보여줍니다. 각 모터에는 입력 1 (IN1), 입력 2 (IN2) 및 활성화 1 (EN1) (모터 1), 입력 3 (입력 3), 입력 4 (입력 4) 및 모터 2 (모터 2)의 세 가지 입력 핀이 있습니다.

이 예제에서는 하나의 모터 만 제어 할 것이므로 Arduino를 L298 IC의 IN1 (핀 5), IN2 (핀 7) 및 Enable1 (핀 6)에 연결합니다. 핀 5와 7은 디지털, 즉 ON 또는 OFF 입력이고, 핀 6은 모터 속도를 제어하기 위해 펄스 폭 변조 (PWM) 신호가 필요합니다.

다음 표는 IN1 및 IN2의 디지털 값을 기준으로 모터가 회전하는 방향을 보여줍니다.

IN1 IN2 모터 행동
브레이크
1 앞으로
1 뒤로
1 1 브레이크

IC L298의 IN1 핀은 Arduino의 8 번 핀에 연결되고 IN2는 9 번 핀에 연결됩니다. Arduino의이 두 디지털 핀은 모터의 방향을 제어합니다. IC의 EN A 핀은 Arduino의 PWM 핀 2에 연결됩니다. 이것은 모터의 속도를 제어합니다.

Arduino 핀 8과 9의 값을 설정하려면 digitalWrite () 함수를 사용했고, 핀 2의 값을 설정하려면 analogWrite () 함수를 사용해야합니다.

연결 단계

  • 5V와 IC의 접지를 각각 5V와 Arduino의 접지에 연결하십시오.
  • 모터를 IC의 핀 2와 3에 연결합니다.
  • IC의 IN1을 Arduino의 8 번 핀에 연결합니다.
  • IC의 IN2를 Arduino의 9 번 핀에 연결합니다.
  • IC의 EN1을 Arduino의 핀 2에 연결하십시오.
  • IC의 SENS A 핀을 접지에 연결합니다.
  • Arduino USB 케이블을 사용하여 Arduino를 연결하고 Arduino IDE 소프트웨어를 사용하여 Arduino에 프로그램을 업로드합니다.
  • 전원 공급 장치, 배터리 또는 USB 케이블을 사용하여 Arduino 보드에 전원을 공급하십시오.

Arduino 코드

const int pwm = 2 ; //initializing pin 2 as pwm
const int in_1 = 8 ;
const int in_2 = 9 ;
//For providing logic to L298 IC to choose the direction of the DC motor

void setup() {
   pinMode(pwm,OUTPUT) ; //we have to set PWM pin as output
   pinMode(in_1,OUTPUT) ; //Logic pins are also set as output
   pinMode(in_2,OUTPUT) ;
}

void loop() {
   //For Clock wise motion , in_1 = High , in_2 = Low
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,LOW) ;
   analogWrite(pwm,255) ;
   /* setting pwm of the motor to 255 we can change the speed of rotation
   by changing pwm input but we are only using arduino so we are using highest
   value to driver the motor */
   //Clockwise for 3 secs
   delay(3000) ;
   //For brake
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,HIGH) ;
   delay(1000) ;
   //For Anti Clock-wise motion - IN_1 = LOW , IN_2 = HIGH
   digitalWrite(in_1,LOW) ;
   digitalWrite(in_2,HIGH) ;
   delay(3000) ;
   //For brake
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,HIGH) ;
   delay(1000) ;
}

결과

모터는 먼저 시계 방향 (CW) 방향으로 3 초 동안 작동 한 다음 시계 반대 방향 (CCW)으로 3 초 동안 작동합니다.

서보 모터는 출력축이있는 작은 장치입니다. 이 샤프트는 서보에 코딩 된 신호를 전송하여 특정 각도 위치에 배치 할 수 있습니다. 코딩 된 신호가 입력 라인에 존재하는 한 서보는 샤프트의 각도 위치를 유지합니다. 코드화 된 신호가 변경되면 샤프트의 각도 위치가 변경됩니다. 실제로 서보는 무선 조종 비행기에서 엘리베이터 및 방향타와 같은 제어 표면을 배치하는 데 사용됩니다. 그들은 또한 무선 조종 자동차, 인형, 그리고 물론 로봇에도 사용됩니다.

서보는 로봇 공학에서 매우 유용합니다. 모터는 작고 제어 회로가 내장되어 있으며 크기에 비해 매우 강력합니다. Futaba S-148과 같은 표준 서보는 42oz / 인치의 토크를 가지며, 이는 크기에 비해 강합니다. 또한 기계적 부하에 비례하여 전력을 끌어옵니다. 따라서 부하가 적은 서보는 많은 에너지를 소비하지 않습니다.

서보 모터의 내장은 다음 그림과 같습니다. 제어 회로, 모터, 기어 세트 및 케이스를 볼 수 있습니다. 외부 세계와 연결되는 3 개의 전선도 볼 수 있습니다. 하나는 전원 (+5 볼트), 접지 용이고 흰색 와이어는 제어 와이어입니다.

서보 모터의 작동

서보 모터에는 출력 샤프트에 연결된 일부 제어 회로와 전위차계 (가변 저항, 일명 포트)가 있습니다. 위의 그림에서 냄비는 회로 기판의 오른쪽에서 볼 수 있습니다. 이 포트를 사용하면 제어 회로가 서보 모터의 현재 각도를 모니터링 할 수 있습니다.

샤프트가 올바른 각도에 있으면 모터가 차단됩니다. 회로가 각도가 정확하지 않다는 것을 발견하면 모터가 원하는 각도가 될 때까지 회전합니다. 서보의 출력축은 약 180도를 이동할 수 있습니다. 일반적으로 210도 범위에 있지만 제조업체에 따라 다릅니다. 일반 서보는 0 ~ 180 도의 각도 운동을 제어하는 ​​데 사용됩니다. 메인 출력 기어에 내장 된 기계적 정지로 인해 기계적으로 더 이상 회전 할 수 없습니다.

모터에 적용되는 전력은 이동해야하는 거리에 비례합니다. 따라서 샤프트가 먼 거리를 회전해야하는 경우 모터는 전속력으로 작동합니다. 조금만 돌리면 모터가 더 느린 속도로 작동합니다. 이것은 ... 불리운다proportional control.

서보가 회전해야하는 각도를 어떻게 전달합니까?

제어 와이어는 각도를 전달하는 데 사용됩니다. 각도는 제어 와이어에 적용되는 펄스의 지속 시간에 의해 결정됩니다. 이것은 ... 불리운다Pulse Coded Modulation. 서보는 20 밀리 초 (.02 초)마다 펄스를 볼 것으로 예상합니다. 펄스의 길이는 모터가 회전하는 거리를 결정합니다. 예를 들어 1.5 밀리 초 펄스는 모터를 90도 위치 (종종 중립 위치라고 함)로 회전시킵니다. 펄스가 1.5 밀리 초보다 짧으면 모터가 샤프트를 0도에 가깝게 돌립니다. 펄스가 1.5 밀리 초보다 길면 샤프트가 180도에 가까워집니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × Arduino UNO 보드
  • 1 × 서보 모터
  • 1 × ULN2003 구동 IC
  • 1 × 10 KΩ 저항기

순서

회로도에 따라 아래 그림과 같이 연결하십시오.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

/* Controlling a servo position using a potentiometer (variable resistor) */

#include <Servo.h>
   Servo myservo; // create servo object to control a servo
   int potpin = 0; // analog pin used to connect the potentiometer
   int val; // variable to read the value from the analog pin

void setup() {
   myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop() {
   val = analogRead(potpin);
   // reads the value of the potentiometer (value between 0 and 1023)
   val = map(val, 0, 1023, 0, 180);
   // scale it to use it with the servo (value between 0 and 180)
   myservo.write(val); // sets the servo position according to the scaled value
   delay(15);
}

참고할 코드

서보 모터에는 전원, 접지 및 신호의 세 가지 단자가 있습니다. 전원 선은 일반적으로 빨간색이며 Arduino의 5V 핀에 연결해야합니다. 접지선은 일반적으로 검정색 또는 갈색이며 ULN2003 IC (10-16)의 한 단자에 연결해야합니다. Arduino 보드가 손상되지 않도록 보호하려면 드라이버 IC가 필요합니다. 여기서는 ULN2003 IC를 사용하여 서보 모터를 구동했습니다. 신호 핀은 일반적으로 노란색 또는 주황색이며 Arduino 핀 번호 9에 연결해야합니다.

전위차계 연결

전압 분배기 / 전위 분배기는 적용된 입력 전압의 특정 비율로 출력 전압을 조정하는 직렬 회로의 저항입니다. 다음은 회로도입니다-

$$ V_ {out} = (V_ {in} \ times R_ {2}) / (R_ {1} + R_ {2}) $$

V out 은 직렬로 적용된 입력 전압 (V in )과 저항 (R 1 및 R 2 )에 따라 달라지는 출력 전위 입니다. 이는 R 1 을 통해 흐르는 전류 가 분할되지 않고 R 2 를 통해 흐를 것임을 의미합니다 . 위의 방정식에서 R 2 값이 변경되면 V out 은 입력 전압 V in 에 따라 그에 따라 스케일 됩니다 .

일반적으로 전위차계는 노브를 사용하여 조정되는 가변 저항의 값을 기반으로 회로의 출력 전압을 조정할 수있는 전위 분배기입니다. 아래 다이어그램과 같이 GND, Signal 및 + 5V의 세 개의 핀이 있습니다.

결과

냄비의 NOP 위치를 변경하면 서보 모터가 각도를 변경합니다.

스테퍼 모터 또는 스텝 모터는 브러시리스 동기 모터로, 전체 회전을 여러 단계로 나눕니다. 고정 된 DC 전압이 적용될 때 연속적으로 회전하는 브러시리스 DC 모터와 달리 스텝 모터는 개별 스텝 각도로 회전합니다.

따라서 스테퍼 모터는 12, 24, 72, 144, 180 및 200의 회 전당 단계로 제조되어 단계 당 30, 15, 5, 2.5, 2 및 1.8 도의 스테핑 각도가됩니다. 스테퍼 모터는 피드백을 포함하거나 포함하지 않고 제어 할 수 있습니다.

RC 비행기의 모터를 상상해보십시오. 모터는 한 방향 또는 다른 방향으로 매우 빠르게 회전합니다. 모터에 주어진 힘의 양에 따라 속도를 변경할 수 있지만 프로펠러에게 특정 위치에서 정지하라고 말할 수는 없습니다.

이제 프린터를 상상해보십시오. 프린터 내부에는 모터를 포함하여 움직이는 부품이 많이 있습니다. 이러한 모터 중 하나는 잉크가 인쇄 될 때 종이 조각을 이동시키는 회전 롤러 인 용지 공급기 역할을합니다. 이 모터는 텍스트의 다음 줄 또는 이미지의 다음 줄을 인쇄 할 수 있도록 용지를 정확한 거리로 이동할 수 있어야합니다.

프린트 헤드를 앞뒤로 움직이는 나사산 막대에 연결된 또 다른 모터가 있습니다. 다시 말하지만, 그 나사산 막대는 한 글자 씩 인쇄하려면 정확한 양만큼 움직여야합니다. 스테퍼 모터가 유용한 곳입니다.

스테퍼 모터는 어떻게 작동합니까?

일반 DC 모터는 방향 만 회전하는 반면 스테퍼 모터는 정밀한 증분으로 회전 할 수 있습니다.

스테퍼 모터는 원하는대로 정확한 각도 (또는 단계)를 돌릴 수 있습니다. 이를 통해 모터를 완전히 제어 할 수 있으므로 모터를 정확한 위치로 이동하고 해당 위치를 유지할 수 있습니다. 이는 매우 짧은 시간 동안 모터 내부의 코일에 전원을 공급함으로써 가능합니다. 단점은 원하는 위치에 유지하려면 항상 모터에 전원을 공급해야한다는 것입니다.

지금 당장 알아야 할 것은 스테퍼 모터를 움직이려면 한 방향 또는 다른 방향으로 특정 수의 단계를 이동하도록 지시하고 그 방향으로 단계 속도를 지시하는 것입니다. 스테퍼 모터에는 다양한 종류가 있습니다. 여기에 설명 된 방법을 사용하여이 자습서에서 언급하지 않은 다른 모터 및 드라이버를 사용하는 방법을 추론 할 수 있습니다. 그러나 항상 보유하고있는 모델에 맞는 모터 및 드라이버의 데이터 시트와 가이드를 참조하는 것이 좋습니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × Arduino UNO 보드
  • 아래 이미지와 같이 1 × 작은 바이폴라 스테퍼 ​​모터
  • 1 × LM298 구동 IC

순서

회로도에 따라 아래 그림과 같이 연결하십시오.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Arduino 코드

/* Stepper Motor Control */

#include <Stepper.h>
const int stepsPerRevolution = 90;
// change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
   // set the speed at 60 rpm:
   myStepper.setSpeed(5);
   // initialize the serial port:
   Serial.begin(9600);
}

void loop() {
   // step one revolution in one direction:
   Serial.println("clockwise");
   myStepper.step(stepsPerRevolution);
   delay(500);
   // step one revolution in the other direction:
   Serial.println("counterclockwise");
   myStepper.step(-stepsPerRevolution);
   delay(500);
}

참고할 코드

이 프로그램은 단극 또는 양극 스테퍼 모터를 구동합니다. 모터는 Arduino의 디지털 핀 8-11에 연결됩니다.

결과

모터는 한 방향으로 한 번 회전 한 다음 다른 방향으로 한 번 회전합니다.

이 장에서는 Arduino Tone Library를 사용합니다. Arduino 핀에서 지정된 주파수 (및 50 % 듀티 사이클)의 구형파를 생성하는 Arduino 라이브러리 일뿐입니다. 기간을 선택적으로 지정할 수 있습니다. 그렇지 않으면 stop () 함수가 호출 될 때까지 웨이브가 계속됩니다. 핀을 피에조 부저 또는 스피커에 연결하여 톤을 재생할 수 있습니다.

Warning− 핀을 오디오 입력에 직접 연결하지 마십시오. 전압은 표준 라인 레벨 전압보다 상당히 높으며 사운드 카드 입력 등을 손상시킬 수 있습니다. 전압 분배기를 사용하여 전압을 낮출 수 있습니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 8 옴 스피커 1 개
  • 1 × 1k 저항
  • 1 × Arduino UNO 보드

순서

회로도에 따라 아래 그림과 같이 연결하십시오.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

pitches.h 파일을 만들려면 직렬 모니터 아이콘 바로 아래의 단추를 클릭하고 "새 탭"을 선택하거나 Ctrl + Shift + N을 사용하십시오.

그런 다음 다음 코드를 붙여 넣으십시오-

/*************************************************
* Public Constants
*************************************************/

#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

위의 주어진 코드를 다음과 같이 저장하십시오. pitches.h

Arduino 코드

#include "pitches.h"
// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_GS3, NOTE_G3,0, NOTE_B3, NOTE_C4};
// note durations: 4 = quarter note, 8 = eighth note, etc.:

int noteDurations[] = {
   4, 8, 8, 4,4,4,4,4 
};

void setup() {
   // iterate over the notes of the melody:
   for (int thisNote = 0; thisNote < 8; thisNote++) {
      // to calculate the note duration, take one second
      // divided by the note type.
      //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
      int noteDuration = 1000/noteDurations[thisNote];
      tone(8, melody[thisNote],noteDuration);
      //pause for the note's duration plus 30 ms:
      delay(noteDuration +30);
   }
}

void loop() {
   // no need to repeat the melody.
}

참고할 코드

이 코드는 추가 파일 인 pitches.h를 사용합니다. 이 파일에는 일반적인 음표에 대한 모든 피치 값이 포함되어 있습니다. 예를 들어, NOTE_C4는 중간 C입니다. NOTE_FS4는 F 날카로운 등입니다. 이 노트 테이블은 원래 tone () 명령의 기반이 된 Brett Hagman이 작성했습니다. 음표를 만들고 싶을 때 유용 할 수 있습니다.

결과

음정에 저장된 음표를들을 수 있습니다 .h. 파일.

무선 송신기 및 수신기 모듈은 315Mhz에서 작동합니다. 브레드 보드에 쉽게 장착 할 수 있으며 마이크로 컨트롤러와 잘 작동하여 매우 간단한 무선 데이터 링크를 생성합니다. 한 쌍의 송신기와 수신기를 사용하면 모듈이 단방향 데이터 통신 만 작동하지만 송신기 / 수신기 쌍으로 작동하려면 두 쌍 (다른 주파수의)이 필요합니다.

Note− 이러한 모듈은 무차별 적이며 상당한 소음을받습니다. 송신기와 수신기는 모두 공통 주파수에서 작동하며 ID가 없습니다.

수신기 모듈 사양

  • 제품 모델-MX-05V
  • 작동 전압-DC5V
  • 무부하 전류-4mA
  • 수신 주파수-315Mhz
  • 수신기 감도--105DB
  • 크기-30 * 14 * 7mm

송신기 모듈 사양

  • 제품 모델-MX-FS-03V
  • 발사 거리-20 ~ 200 미터 (전압 차이, 결과 차이)
  • 작동 전압-3.5-12V
  • 치수-19 * 19mm
  • 작동 모드-AM
  • 전송 속도-4KB / S
  • 송신 전력-10mW
  • 전송 주파수-315Mhz
  • 외부 안테나-25cm 일반 다중 코어 또는 단일 코어 라인
  • 왼쪽 → 오른쪽에서 핀아웃-(DATA; V CC ; GND)

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 2 × Arduino UNO 보드
  • 1 × Rf 링크 송신기
  • 1 × Rf 링크 수신기

순서

회로도에 따라 아래 그림과 같이 연결하십시오.

스케치

컴퓨터에서 Arduino IDE 소프트웨어를 엽니 다. Arduino 언어로 코딩하면 회로가 제어됩니다. 새로 만들기를 클릭하여 새 스케치 파일을 엽니 다.

Note− Arduino 라이브러리 파일에 키패드 라이브러리를 포함해야합니다. 아래 스크린 샷에 강조 표시된대로 라이브러리 폴더에 VirtualWire.lib 파일을 복사하여 붙여 넣습니다.

송신기 용 Arduino 코드

//simple Tx on pin D12
#include <VirtualWire.h>
char *controller;

void setup() {
   pinMode(13,OUTPUT);
   vw_set_ptt_inverted(true);
   vw_set_tx_pin(12);
   vw_setup(4000);// speed of data transfer Kbps
}

void loop() {
   controller="1" ;
   vw_send((uint8_t *)controller, strlen(controller));
   vw_wait_tx(); // Wait until the whole message is gone
   digitalWrite(13,1);
   delay(2000);
   controller="0" ;
   vw_send((uint8_t *)controller, strlen(controller));
   vw_wait_tx(); // Wait until the whole message is gone
   digitalWrite(13,0);
   delay(2000);
}

참고할 코드

이것은 간단한 코드입니다. 먼저 문자 '1'을 보내고 2 초 후에 문자 '0'을 보냅니다.

수신기 용 Arduino 코드

//simple Rx on pin D12
#include <VirtualWire.h>

void setup() {
   vw_set_ptt_inverted(true); // Required for DR3100
   vw_set_rx_pin(12);
   vw_setup(4000); // Bits per sec
   pinMode(5, OUTPUT);
   vw_rx_start(); // Start the receiver PLL running
}

void loop() {
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;
   if (vw_get_message(buf, &buflen)) // Non-blocking {
      if(buf[0]=='1') {
         digitalWrite(5,1);
      }
      if(buf[0]=='0') {
         digitalWrite(5,0);
      }
   }
}

참고할 코드

Arduino 보드의 5 번 핀에 연결된 LED는 문자 '1'이 수신되면 켜지고 문자 '0'이 수신되면 꺼집니다.

Texas Instruments의 CC3000 WiFi 모듈은 작은 은색 패키지로, 마침내 Arduino 프로젝트에 사용하기 쉽고 저렴한 WiFi 기능을 제공합니다.

통신에 SPI를 사용하므로 (UART가 아닙니다!) 원하는만큼 빠르게 또는 원하는만큼 느리게 데이터를 푸시 할 수 있습니다. IRQ 핀이있는 적절한 인터럽트 시스템이 있으므로 비동기 연결이 가능합니다. 802.11b / g, 개방형 / WEP / WPA / WPA2 보안, TKIP 및 AES를 지원합니다. "BSD 소켓"인터페이스가있는 내장 TCP / IP 스택은 클라이언트 및 서버 모드 모두에서 TCP 및 UDP를 지원합니다.

필요한 구성 요소

다음 구성 요소가 필요합니다-

  • 1 × Arduino Uno
  • 1 × Adafruit CC3000 브레이크 아웃 보드
  • 1 × 5V 릴레이
  • 1 × 정류기 다이오드
  • 1 × LED
  • 1 × 220 Ohm 저항기
  • 1 × 브레드 보드 및 일부 점퍼 와이어

이 프로젝트에서는 일반적인 Arduino IDE, Adafruit의 CC3000 라이브러리 및 CC3000 MDNS 라이브러리 만 있으면됩니다. 또한 aREST 라이브러리를 사용하여 WiFi를 통해 릴레이에 명령을 보낼 것입니다.

순서

회로도에 따라 아래 그림과 같이 연결하십시오.

이 프로젝트의 하드웨어 구성은 매우 쉽습니다.

  • CC3000 보드의 IRQ 핀을 Arduino 보드의 3 번 핀에 연결합니다.
  • VBAT는 핀 5, CS는 핀 10입니다.
  • SPI 핀을 Arduino 보드에 연결합니다 : MOSI, MISO 및 CLK를 각각 핀 11, 12 및 13에 연결합니다.
  • V in 은 Arduino 5V에 연결되고 GND는 GND에 연결됩니다.

이제 릴레이를 연결하겠습니다.

브레드 보드에 릴레이를 배치 한 후 릴레이에서 중요한 두 부분을 식별 할 수 있습니다. 릴레이를 명령하는 코일 부분과 LED를 부착 할 스위치 부분입니다.

  • 먼저 Arduino 보드의 8 번 핀을 코일의 한 핀에 연결합니다.
  • 다른 핀을 Arduino 보드의 접지에 연결하십시오.

또한 릴레이가 스위칭 될 때 회로를 보호하기 위해 코일의 핀 위에 정류기 다이오드 (접지 핀에 연결된 양극)를 배치해야합니다.

  • Arduino 보드의 + 5V를 릴레이 스위치의 공통 핀에 연결합니다.

  • 마지막으로 스위치의 다른 핀 중 하나 (보통 릴레이가 꺼져있을 때 연결되지 않은 핀)를 220 Ohm 저항과 직렬로 LED에 연결하고 LED의 다른 쪽을 Arduino의 접지에 연결합니다. 판.

개별 구성 요소 테스트

다음 스케치로 릴레이를 테스트 할 수 있습니다.

const int relay_pin = 8; // Relay pin

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

void loop() {
   // Activate relay
   digitalWrite(relay_pin, HIGH);
   // Wait for 1 second
   delay(1000);
   // Deactivate relay
   digitalWrite(relay_pin, LOW);
   // Wait for 1 second
   delay(1000);
}

참고할 코드

코드는 자명합니다. 보드에 업로드하기 만하면 릴레이가 매초마다 상태를 전환하고 그에 따라 LED가 켜지고 꺼집니다.

WiFi 연결 추가

이제 CC3000 WiFi 칩을 사용하여 릴레이를 무선으로 제어하겠습니다. 이 프로젝트의 소프트웨어는 TCP 프로토콜을 기반으로합니다. 그러나이 프로젝트의 경우 Arduino 보드는 작은 웹 서버를 실행하므로 컴퓨터에서 오는 명령을 "수신"할 수 있습니다. 먼저 Arduino 스케치를 처리 한 다음 서버 측 코드를 작성하고 멋진 인터페이스를 만드는 방법을 살펴 보겠습니다.

먼저 Arduino 스케치입니다. 여기서 목표는 WiFi 네트워크에 연결하고, 웹 서버를 만들고, 들어오는 TCP 연결이 있는지 확인한 다음 그에 따라 릴레이 상태를 변경하는 것입니다.

코드의 중요한 부분

#include <Adafruit_CC3000.h>
#include <SPI.h>
#include <CC3000_MDNS.h>
#include <Ethernet.h>
#include <aREST.h>

코드 내에서 구성에 특정한 내용 (예 : Wi-Fi 이름 및 암호, TCP 통신용 포트)을 정의해야합니다 (여기서는 80을 사용했습니다).

// WiFi network (change with your settings!)
   #define WLAN_SSID "yourNetwork" // cannot be longer than 32 characters!
   #define WLAN_PASS "yourPassword"
   #define WLAN_SECURITY WLAN_SEC_WPA2 // This can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, 
   // WLAN_SEC_WPA or WLAN_SEC_WPA2

// The port to listen for incoming TCP connections
   #define LISTEN_PORT 80

그런 다음 CC3000 인스턴스, 서버 및 aREST 인스턴스를 만들 수 있습니다.

// Server instance
   Adafruit_CC3000_Server restServer(LISTEN_PORT); // DNS responder instance
   MDNSResponder mdns; // Create aREST instance
   aREST rest = aREST();

스케치의 setup () 부분에서 이제 CC3000 칩을 네트워크에 연결할 수 있습니다.

cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY);

컴퓨터가 데이터를 보낼 위치를 어떻게 알 수 있습니까? 한 가지 방법은 스케치를 한 번 실행 한 다음 CC3000 보드의 IP 주소를 가져 와서 서버 코드를 다시 수정하는 것입니다. 그러나 우리는 더 잘할 수 있으며 CC3000 MDNS 라이브러리가 작동합니다. 이 라이브러리를 사용하여 CC3000 보드에 고정 이름을 할당하므로이 이름을 서버 코드에 직접 기록 할 수 있습니다.

이것은 다음 코드 조각으로 수행됩니다.

if (!mdns.begin("arduino", cc3000)) {
   while(1);
}

들어오는 연결도 들어야합니다.

restServer.begin();

다음으로 계속 실행될 스케치의 loop () 함수를 코딩합니다. 먼저 mDNS 서버를 업데이트해야합니다.

mdns.update();

Arduino 보드에서 실행되는 서버는 들어오는 연결을 기다리고 요청을 처리합니다.

Adafruit_CC3000_ClientRef client = restServer.available();
rest.handle(client);

이제 WiFi를 통해 프로젝트를 테스트하는 것이 매우 쉽습니다. 자신의 WiFi 이름과 암호로 스케치를 업데이트했는지 확인하고 스케치를 Arduino 보드에 업로드하십시오. Arduino IDE 직렬 모니터를 열고 보드의 IP 주소를 찾으십시오.

나머지는 192.168.1.103과 같다고 가정하겠습니다.

그런 다음 좋아하는 웹 브라우저로 이동하여 다음을 입력하십시오.

192.168.1.103/ 디지털 / 8 / 1

릴레이가 자동으로 켜집니다.

릴레이 인터페이스 구축

이제 프로젝트의 인터페이스를 코딩합니다. 여기에는 인터페이스가 포함 된 HTML 파일과 인터페이스의 클릭을 처리하기위한 클라이언트 측 자바 스크립트 파일의 두 부분이 있습니다. 여기의 인터페이스는aREST.js 컴퓨터에서 WiFi 장치를 쉽게 제어하기 위해 만들어진 프로젝트입니다.

먼저 interface.html이라는 HTML 파일을 살펴 보겠습니다. 첫 번째 부분은 인터페이스에 필요한 모든 라이브러리를 가져 오는 것으로 구성됩니다.

<head>
   <meta charset = utf-8 />
   <title> Relay Control </title>
   <link rel = "stylesheet" type = "text/css" 
      href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
   <link rel="stylesheet" type = "text/css" href = "style.css">
   <script type = "text/javascript" 
      src = "https://code.jquery.com/jquery-2.1.4.min.js"></script>
   <script type = "text/javascript" 
      src = "https://cdn.rawgit.com/Foliotek/AjaxQ/master/ajaxq.js"></script>
   <script type = "text/javascript" 
      src = "https://cdn.rawgit.com/marcoschwartz/aREST.js/master/aREST.js"></script>
   <script type = "text/javascript" 
      src = "script.js"></script>
</head>

그런 다음 인터페이스 내부에 두 개의 버튼을 정의합니다. 하나는 릴레이를 켜고 다른 하나는 다시 끌 수 있습니다.

<div class = 'container'>
   <h1>Relay Control</h1>
   <div class = 'row'>
      <div class = "col-md-1">Relay</div>
      <div class = "col-md-2">
         <button id = 'on' class = 'btn btn-block btn-success'>On</button>
      </div>
      <div class = "col-md-2">
         <button id = 'off' class = 'btn btn-block btn-danger'>On</button>
      </div>
   </div>
</div>

이제 버튼 클릭을 처리하기위한 클라이언트 측 자바 스크립트 파일도 필요합니다. 또한 Arduino 장치의 mDNS 이름에 연결할 장치를 만듭니다. 아두 이노 코드에서 이것을 변경했다면 여기에서도 수정해야합니다.

// Create device
var device = new Device("arduino.local");
// Button

$('#on').click(function() {
   device.digitalWrite(8, 1);
});

$('#off').click(function() {
   device.digitalWrite(8, 0);
});

이 프로젝트의 전체 코드는 GitHub저장소. 인터페이스 폴더로 이동하여 선호하는 브라우저로 HTML 파일을 열기 만하면됩니다. 브라우저에서 비슷한 것을 볼 수 있습니다.

웹 인터페이스에서 버튼을 클릭 해보십시오. 릴레이 상태를 거의 즉시 변경해야합니다.

제대로 작동했다면 브라보! 방금 Wi-Fi 제어 전등 스위치를 만들었습니다. 물론이 프로젝트로 조명보다 훨씬 더 많은 것을 제어 할 수 있습니다. 릴레이가 제어하려는 장치에 필요한 전력을 지원하는지 확인하면됩니다.