Arduino - Hướng dẫn nhanh

Arduino là một nền tảng nguyên mẫu (mã nguồn mở) dựa trên phần cứng và phần mềm dễ sử dụng. Nó bao gồm một bảng mạch, có thể được lập trình (gọi tắt là vi điều khiển) và một phần mềm làm sẵn có tên là Arduino IDE (Môi trường phát triển tích hợp), được sử dụng để viết và tải mã máy tính lên bảng vật lý.

Các tính năng chính là -

  • Bo mạch Arduino có thể đọc tín hiệu đầu vào tương tự hoặc kỹ thuật số từ các cảm biến khác nhau và biến nó thành đầu ra như kích hoạt động cơ, bật / tắt đèn LED, kết nối với đám mây và nhiều hành động khác.

  • Bạn có thể kiểm soát các chức năng của bo mạch bằng cách gửi một tập hợp các hướng dẫn đến bộ vi điều khiển trên bo mạch thông qua Arduino IDE (được gọi là phần mềm tải lên).

  • Không giống như hầu hết các bảng mạch lập trình trước đây, Arduino không cần một phần cứng bổ sung (được gọi là bộ lập trình) để tải một mã mới lên bảng. Bạn chỉ cần sử dụng cáp USB.

  • Ngoài ra, Arduino IDE sử dụng phiên bản đơn giản của C ++, giúp việc học lập trình trở nên dễ dàng hơn.

  • Cuối cùng, Arduino cung cấp hệ số hình thức tiêu chuẩn giúp phá vỡ các chức năng của bộ điều khiển vi mô thành một gói dễ tiếp cận hơn.

Các loại bảng

Có nhiều loại bảng Arduino khác nhau tùy thuộc vào các bộ vi điều khiển khác nhau được sử dụng. Tuy nhiên, tất cả các bo mạch Arduino đều có một điểm chung: chúng được lập trình thông qua Arduino IDE.

Sự khác biệt dựa trên số lượng đầu vào và đầu ra (số lượng cảm biến, đèn LED và nút bạn có thể sử dụng trên một bo mạch), tốc độ, điện áp hoạt động, hệ số hình thức, v.v. Một số bo mạch được thiết kế để nhúng và không có lập trình giao diện (phần cứng) mà bạn cần mua riêng. Một số có thể chạy trực tiếp từ pin 3.7V, số khác cần ít nhất 5V.

Dưới đây là danh sách các bảng Arduino khác nhau có sẵn.

Arduino boards based on ATMEGA328 microcontroller

Bảng tên Vận hành Volt Tốc độ đồng hồ I / o kỹ thuật số Đầu vào analog PWM UART Giao diện lập trình
Arduino Uno R3 5V 16MHz 14 6 6 1 USB qua ATMega16U2
Arduino Uno R3 SMD 5V 16MHz 14 6 6 1 USB qua ATMega16U2
Bảng đỏ 5V 16MHz 14 6 6 1 USB qua FTDI
Arduino Pro 3.3v / 8 MHz 3,3V 8MHz 14 6 6 1 Tiêu đề tương thích FTDI
Arduino Pro 5V / 16MHz 5V 16MHz 14 6 6 1 Tiêu đề tương thích FTDI
Arduino mini 05 5V 16MHz 14 số 8 6 1 Tiêu đề tương thích FTDI
Arduino Pro mini 3.3v / 8mhz 3,3V 8MHz 14 số 8 6 1 Tiêu đề tương thích FTDI
Arduino Pro mini 5v / 16mhz 5V 16MHz 14 số 8 6 1 Tiêu đề tương thích FTDI
Arduino Ethernet 5V 16MHz 14 6 6 1 Tiêu đề tương thích FTDI
Arduino Fio 3,3V 8MHz 14 số 8 6 1 Tiêu đề tương thích FTDI
Bảng mạch chính LilyPad Arduino 328 3,3V 8MHz 14 6 6 1 Tiêu đề tương thích FTDI
Bảng mạch đơn giản LilyPad Arduino 3,3V 8MHz 9 4 5 0 Tiêu đề tương thích FTDI

Arduino boards based on ATMEGA32u4 microcontroller

Bảng tên Vận hành Volt Tốc độ đồng hồ I / o kỹ thuật số Đầu vào analog PWM UART Giao diện lập trình
Arduino Leonardo 5V 16MHz 20 12 7 1 USB gốc
Pro micro 5V / 16MHz 5V 16MHz 14 6 6 1 USB gốc
Pro micro 3.3V / 8MHz 5V 16MHz 14 6 6 1 USB gốc
LilyPad Arduino USB 3,3V 8MHz 14 6 6 1 USB gốc

Arduino boards based on ATMEGA2560 microcontroller

Bảng tên Vận hành Volt Tốc độ đồng hồ I / o kỹ thuật số Đầu vào analog PWM UART Giao diện lập trình
Arduino Mega 2560 R3 5V 16MHz 54 16 14 4 USB qua ATMega16U2B
Mega Pro 3.3V 3,3V 8MHz 54 16 14 4 Tiêu đề tương thích FTDI
Mega Pro 5V 5V 16MHz 54 16 14 4 Tiêu đề tương thích FTDI
Mega Pro Mini 3.3V 3,3V 8MHz 54 16 14 4 Tiêu đề tương thích FTDI

Arduino boards based on AT91SAM3X8E microcontroller

Bảng tên Vận hành Volt Tốc độ đồng hồ I / o kỹ thuật số Đầu vào analog PWM UART Giao diện lập trình
Arduino Mega 2560 R3 3,3V 84MHz 54 12 12 4 USB gốc

Trong chương này, chúng ta sẽ tìm hiểu về các thành phần khác nhau trên bảng Arduino. Chúng ta sẽ nghiên cứu về board Arduino UNO vì nó là board phổ biến nhất trong họ board Arduino. Ngoài ra, nó là bảng tốt nhất để bắt đầu với điện tử và mã hóa. Một số bảng trông hơi khác so với bảng dưới đây, nhưng hầu hết các Arduinos đều có phần lớn các thành phần này chung.

Power USB

Bảng Arduino có thể được cấp nguồn bằng cách sử dụng cáp USB từ máy tính của bạn. Tất cả những gì bạn cần làm là kết nối cáp USB với kết nối USB (1).

Power (Barrel Jack)

Bo mạch Arduino có thể được cấp nguồn trực tiếp từ nguồn điện chính AC bằng cách kết nối nó với Jack thùng (2).

Voltage Regulator

Chức năng của bộ điều chỉnh điện áp là kiểm soát điện áp cấp cho bảng Arduino và ổn định điện áp DC được sử dụng bởi bộ xử lý và các phần tử khác.

Crystal Oscillator

Bộ dao động tinh thể giúp Arduino giải quyết các vấn đề về thời gian. Arduino tính toán thời gian như thế nào? Câu trả lời là, bằng cách sử dụng bộ dao động tinh thể. Số được in trên tinh thể Arduino là 16.000H9H. Nó cho chúng ta biết rằng tần số là 16.000.000 Hertz hoặc 16 MHz.

Arduino Reset

Bạn có thể đặt lại bảng Arduino của mình, tức là khởi động chương trình của bạn từ đầu. Bạn có thể đặt lại bảng UNO theo hai cách. Đầu tiên, bằng cách sử dụng nút đặt lại (17) trên bảng. Thứ hai, bạn có thể kết nối nút đặt lại bên ngoài với chân Arduino có nhãn ĐẶT LẠI (5).

Pins (3.3, 5, GND, Vin)

  • 3.3V (6) - Cung cấp 3.3 volt đầu ra

  • 5V (7) - Cung cấp 5 volt đầu ra

  • Hầu hết các thành phần được sử dụng với bảng Arduino hoạt động tốt với 3,3 volt và 5 volt.

  • GND (8) (Ground) - Có một số chân GND trên Arduino, bất kỳ chân nào trong số đó có thể được sử dụng để nối đất cho mạch của bạn.

  • Vin (9) - Chân này cũng có thể được sử dụng để cấp nguồn cho bảng Arduino từ nguồn điện bên ngoài, giống như nguồn điện chính AC.

Analog pins

Bo mạch Arduino UNO có sáu chân đầu vào tương tự từ A0 đến A5. Các chân này có thể đọc tín hiệu từ một cảm biến tương tự như cảm biến độ ẩm hoặc cảm biến nhiệt độ và chuyển đổi nó thành một giá trị kỹ thuật số mà bộ vi xử lý có thể đọc được.

Main microcontroller

Mỗi bảng Arduino có bộ vi điều khiển riêng (11). Bạn có thể coi nó như bộ não của hội đồng quản trị của bạn. IC chính (mạch tích hợp) trên Arduino hơi khác so với bảng mạch. Các bộ vi điều khiển thường là của Công ty ATMEL. Bạn phải biết bo mạch của mình có IC gì trước khi tải lên một chương trình mới từ Arduino IDE. Thông tin này có sẵn trên đầu vi mạch. Để biết thêm chi tiết về cấu tạo và chức năng của IC, bạn có thể tham khảo bảng dữ liệu.

ICSP pin

Phần lớn, ICSP (12) là AVR, một tiêu đề lập trình nhỏ cho Arduino bao gồm MOSI, MISO, SCK, RESET, VCC và GND. Nó thường được gọi là SPI (Giao diện ngoại vi nối tiếp), có thể được coi là "sự mở rộng" của đầu ra. Trên thực tế, bạn đang gắn thiết bị đầu ra vào thiết bị chính của bus SPI.

Power LED indicator

Đèn LED này sẽ sáng lên khi bạn cắm Arduino vào nguồn điện để cho biết rằng bo mạch của bạn đã được cấp nguồn chính xác. Nếu đèn này không bật, thì có vấn đề gì đó với kết nối.

TX and RX LEDs

Trên bảng của bạn, bạn sẽ tìm thấy hai nhãn: TX (truyền) và RX (nhận). Chúng xuất hiện ở hai nơi trên bảng Arduino UNO. Đầu tiên, tại chân số 0 và 1, để chỉ ra các chân chịu trách nhiệm giao tiếp nối tiếp. Thứ hai, TX và RX dẫn đầu (13). Đèn LED TX nhấp nháy với tốc độ khác nhau trong khi gửi dữ liệu nối tiếp. Tốc độ nhấp nháy phụ thuộc vào tốc độ truyền được sử dụng bởi bảng. RX nhấp nháy trong quá trình nhận.

Digital I/O

Bo mạch Arduino UNO có 14 chân I / O kỹ thuật số (15) (trong đó 6 chân cung cấp đầu ra PWM (Điều chế độ rộng xung). Các chân này có thể được cấu hình để hoạt động như chân kỹ thuật số đầu vào để đọc các giá trị logic (0 hoặc 1) hoặc kỹ thuật số các chân đầu ra để điều khiển các mô-đun khác nhau như đèn LED, rơ le, v.v. Các chân có nhãn “~” có thể được sử dụng để tạo PWM.

AREF

AREF là viết tắt của Analog Reference. Đôi khi, nó được sử dụng để đặt điện áp tham chiếu bên ngoài (từ 0 đến 5 Vôn) làm giới hạn trên cho các chân đầu vào tương tự.

Sau khi tìm hiểu về các phần chính của bảng Arduino UNO, chúng ta đã sẵn sàng tìm hiểu cách thiết lập Arduino IDE. Khi chúng tôi biết được điều này, chúng tôi sẽ sẵn sàng tải lên chương trình của mình trên bảng Arduino.

Trong phần này, chúng ta sẽ tìm hiểu theo các bước đơn giản, cách thiết lập Arduino IDE trên máy tính và chuẩn bị bo mạch để nhận chương trình qua cáp USB.

Step 1- Đầu tiên bạn phải có bảng Arduino của mình (bạn có thể chọn bảng yêu thích của mình) và cáp USB. Trong trường hợp bạn sử dụng Arduino UNO, Arduino Duemilanove, Nano, Arduino Mega 2560 hoặc Diecimila, bạn sẽ cần cáp USB tiêu chuẩn (phích cắm A đến phích cắm B), loại bạn sẽ kết nối với máy in USB như trong hình sau.

Trong trường hợp bạn sử dụng Arduino Nano, bạn sẽ cần cáp A đến Mini-B thay thế như trong hình sau.

Step 2 − Download Arduino IDE Software.

Bạn có thể tải các phiên bản Arduino IDE khác nhau từ trang Tải xuống trên trang web Chính thức của Arduino. Bạn phải chọn phần mềm tương thích với hệ điều hành của bạn (Windows, IOS hoặc Linux). Sau khi tải tệp xuống xong, hãy giải nén tệp.

Step 3 − Power up your board.

Arduino Uno, Mega, Duemilanove và Arduino Nano tự động lấy điện từ một trong hai kết nối USB với máy tính hoặc nguồn điện bên ngoài. Nếu bạn đang sử dụng Arduino Diecimila, bạn phải đảm bảo rằng bo mạch được định cấu hình để lấy điện từ kết nối USB. Nguồn điện được chọn bằng một jumper, một miếng nhựa nhỏ vừa với hai trong ba chân giữa giắc cắm USB và giắc cắm nguồn. Kiểm tra xem nó có nằm trên hai chân gần nhất với cổng USB không.

Kết nối bảng Arduino với máy tính của bạn bằng cáp USB. Đèn LED nguồn màu xanh lá cây (có nhãn PWR) sẽ phát sáng.

Step 4 − Launch Arduino IDE.

Sau khi phần mềm Arduino IDE của bạn được tải xuống, bạn cần giải nén thư mục. Bên trong thư mục, bạn có thể tìm thấy biểu tượng ứng dụng có nhãn vô cực (application.exe). Bấm đúp vào biểu tượng để bắt đầu IDE.

Step 5 − Open your first project.

Khi phần mềm khởi động, bạn có hai tùy chọn -

  • Tạo một dự án mới.
  • Mở một ví dụ dự án hiện có.

Để tạo một dự án mới, hãy chọn Tệp → New.

Để mở một ví dụ dự án hiện có, chọn Tệp → Ví dụ → Cơ bản → Nháy mắt.

Ở đây, chúng tôi chỉ chọn một trong các ví dụ có tên Blink. Nó bật và tắt đèn LED với một thời gian trễ. Bạn có thể chọn bất kỳ ví dụ nào khác từ danh sách.

Step 6 − Select your Arduino board.

Để tránh bất kỳ lỗi nào khi tải chương trình của bạn lên bảng, bạn phải chọn đúng tên bảng Arduino, phù hợp với bảng được kết nối với máy tính của bạn.

Đi tới Công cụ → Bảng và chọn bảng của bạn.

Ở đây, chúng tôi đã chọn bảng Arduino Uno theo hướng dẫn của chúng tôi, nhưng bạn phải chọn tên phù hợp với bảng mà bạn đang sử dụng.

Step 7 − Select your serial port.

Chọn thiết bị nối tiếp của bảng Arduino. Đi đếnTools → Serial Portthực đơn. Đây có thể là COM3 hoặc cao hơn (COM1 và COM2 thường được dành riêng cho các cổng nối tiếp phần cứng). Để tìm hiểu, bạn có thể ngắt kết nối bảng Arduino của mình và mở lại menu, mục nhập biến mất phải là của bảng Arduino. Kết nối lại bo mạch và chọn cổng nối tiếp đó.

Step 8 − Upload the program to your board.

Trước khi giải thích cách chúng ta có thể tải chương trình của mình lên bảng, chúng ta phải chứng minh chức năng của từng biểu tượng xuất hiện trong thanh công cụ Arduino IDE.

A - Dùng để kiểm tra xem có lỗi biên dịch nào không.

B - Được sử dụng để tải một chương trình lên bảng Arduino.

C - Phím tắt được sử dụng để tạo một bản phác thảo mới.

D - Được sử dụng để mở trực tiếp một trong các bản phác thảo ví dụ.

E - Được sử dụng để lưu bản phác thảo của bạn.

F - Màn hình nối tiếp dùng để nhận dữ liệu nối tiếp từ bảng và gửi dữ liệu nối tiếp đến bảng.

Bây giờ, chỉ cần nhấp vào nút "Tải lên" trong môi trường. Chờ một vài giây; bạn sẽ thấy đèn LED RX và TX trên bảng, nhấp nháy. Nếu tải lên thành công, thông báo "Đã tải lên xong" sẽ xuất hiện trên thanh trạng thái.

Note - Nếu bạn có Arduino Mini, NG hoặc bảng khác, bạn cần nhấn nút đặt lại vật lý trên bảng, ngay trước khi nhấp vào nút tải lên trên Phần mềm Arduino.

Trong chương này, chúng ta sẽ đi sâu nghiên cứu, cấu trúc chương trình Arduino và chúng ta sẽ tìm hiểu thêm các thuật ngữ mới được sử dụng trong thế giới Arduino. Phần mềm Arduino là mã nguồn mở. Mã nguồn cho môi trường Java được phát hành theo GPL và các thư viện vi điều khiển C / C ++ theo LGPL.

Sketch - Thuật ngữ mới đầu tiên là chương trình Arduino được gọi là “sketch”.

Kết cấu

Các chương trình Arduino có thể được chia thành ba phần chính: Structure, Values (biến và hằng số), và Functions. Trong hướng dẫn này, chúng ta sẽ tìm hiểu về chương trình phần mềm Arduino, từng bước và cách chúng ta có thể viết chương trình mà không gặp bất kỳ lỗi cú pháp hoặc biên dịch nào.

Hãy để chúng tôi bắt đầu với Structure. Cấu trúc phần mềm bao gồm hai chức năng chính:

  • Hàm Setup ()
  • Hàm Loop ()
Void setup ( ) {

}
  • PURPOSE - Sự setup()hàm được gọi khi bắt đầu phác thảo. Sử dụng nó để khởi tạo các biến, chế độ ghim, bắt đầu sử dụng thư viện, v.v. Chức năng thiết lập sẽ chỉ chạy một lần, sau mỗi lần khởi động hoặc thiết lập lại bảng Arduino.

  • INPUT - -

  • OUTPUT - -

  • RETURN - -

Void Loop ( ) {

}
  • PURPOSE - Sau khi tạo một setup() hàm khởi tạo và đặt các giá trị ban đầu, loop()hàm thực hiện chính xác những gì tên của nó gợi ý và lặp lại liên tục, cho phép chương trình của bạn thay đổi và phản hồi. Sử dụng nó để chủ động điều khiển bảng Arduino.

  • INPUT - -

  • OUTPUT - -

  • RETURN - -

Kiểu dữ liệu trong C đề cập đến một hệ thống mở rộng được sử dụng để khai báo các biến hoặc hàm thuộc các kiểu khác nhau. Kiểu của một biến xác định bao nhiêu không gian mà nó chiếm trong bộ nhớ và cách diễn giải mẫu bit được lưu trữ.

Bảng sau cung cấp tất cả các kiểu dữ liệu mà bạn sẽ sử dụng trong quá trình lập trình Arduino.

vô hiệu Boolean char Ký tự không dấu byte int Int chưa ký lời nói
Dài Chưa ký lâu ngắn Phao nổi gấp đôi mảng Mảng chuỗi ký tự Đối tượng chuỗi

vô hiệu

Từ khóa void chỉ được sử dụng trong khai báo hàm. Nó chỉ ra rằng hàm được mong đợi sẽ không trả về thông tin nào cho hàm mà từ đó nó được gọi.

Thí dụ

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

Boolean

Boolean giữ một trong hai giá trị, đúng hoặc sai. Mỗi biến Boolean chiếm một byte bộ nhớ.

Thí dụ

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

Char

Một kiểu dữ liệu chiếm một byte bộ nhớ để lưu trữ một giá trị ký tự. Các ký tự ký tự được viết trong dấu ngoặc kép như sau: 'A' và đối với nhiều ký tự, chuỗi sử dụng dấu ngoặc kép: "ABC".

Tuy nhiên, các ký tự được lưu trữ dưới dạng số. Bạn có thể xem mã hóa cụ thể trong biểu đồ ASCII . Điều này có nghĩa là có thể thực hiện các phép tính số học trên các ký tự, trong đó giá trị ASCII của ký tự được sử dụng. Ví dụ: 'A' + 1 có giá trị 66, vì giá trị ASCII của chữ hoa A là 65.

Thí dụ

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

ký tự không dấu

Unsigned charlà kiểu dữ liệu không dấu chiếm một byte bộ nhớ. Kiểu dữ liệu char không dấu mã hóa các số từ 0 đến 255.

Thí dụ

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

byte

Một byte lưu trữ một số không dấu 8 bit, từ 0 đến 255.

Thí dụ

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

int

Số nguyên là kiểu dữ liệu chính để lưu trữ số. int lưu trữ giá trị 16 bit (2 byte). Điều này mang lại phạm vi từ -32,768 đến 32,767 (giá trị nhỏ nhất là -2 ^ 15 và giá trị lớn nhất là (2 ^ 15) - 1).

Các intkích thước khác nhau giữa các hội đồng quản trị. Trên Arduino Due, ví dụ, mộtintlưu trữ một giá trị 32-bit (4 byte). Điều này mang lại một phạm vi từ -2,147,483,648 đến 2,147,483,647 (giá trị nhỏ nhất là -2 ^ 31 và giá trị lớn nhất là (2 ^ 31) - 1).

Thí dụ

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

Int chưa ký

Các int không dấu (số nguyên không dấu) giống với int ở cách chúng lưu trữ giá trị 2 byte. Tuy nhiên, thay vì lưu trữ các số âm, chúng chỉ lưu trữ các giá trị dương, mang lại phạm vi hữu ích từ 0 đến 65,535 (2 ^ 16) - 1). Do lưu trữ giá trị 4 byte (32-bit), nằm trong khoảng từ 0 đến 4,294,967,295 (2 ^ 32 - 1).

Thí dụ

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

Word

Trên bảng mạch dựa trên Uno và ATMEGA khác, một từ lưu trữ một số 16 bit không dấu. Trên Due và Zero, nó lưu trữ một số 32-bit không dấu.

Thí dụ

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

Dài

Các biến dài là các biến kích thước mở rộng để lưu trữ số và lưu trữ 32 bit (4 byte), từ -2,147,483,648 đến 2,147,483,647.

Thí dụ

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

không ký lâu

Các biến dài không dấu là các biến kích thước mở rộng để lưu trữ số và lưu trữ 32 bit (4 byte). Không giống như các long chuẩn, các long không dấu sẽ không lưu trữ các số âm, làm cho phạm vi của chúng từ 0 đến 4,294,967,295 (2 ^ 32 - 1).

Thí dụ

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

ngắn

Ngắn gọn là kiểu dữ liệu 16 bit. Trên tất cả Arduinos (dựa trên ATMega và ARM), short lưu trữ giá trị 16 bit (2 byte). Điều này mang lại phạm vi từ -32,768 đến 32,767 (giá trị nhỏ nhất là -2 ^ 15 và giá trị lớn nhất là (2 ^ 15) - 1).

Thí dụ

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

Phao nổi

Kiểu dữ liệu cho số dấu phẩy động là một số có dấu thập phân. Số dấu phẩy động thường được sử dụng để tính gần đúng giá trị tương tự và giá trị liên tục vì chúng có độ phân giải lớn hơn số nguyên.

Số dấu phẩy động có thể lớn tới 3,4028235E + 38 và thấp nhất là -3,4028235E + 38. Chúng được lưu trữ dưới dạng 32 bit (4 byte) thông tin.

Thí dụ

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

gấp đôi

Trên Uno và các bo mạch dựa trên ATMEGA khác, số dấu phẩy động chính xác kép chiếm bốn byte. Nghĩa là, việc triển khai kép giống hệt như float, không tăng độ chính xác. Trên Arduino Due, các nhân đôi có độ chính xác 8 byte (64 bit).

Thí dụ

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

Trước khi chúng tôi bắt đầu giải thích các loại biến, một chủ đề rất quan trọng mà chúng tôi cần đảm bảo, bạn hiểu đầy đủ được gọi là variable scope.

Phạm vi biến là gì?

Các biến trong ngôn ngữ lập trình C, mà Arduino sử dụng, có một thuộc tính gọi là phạm vi. Phạm vi là một vùng của chương trình và có ba nơi mà các biến có thể được khai báo. Họ là -

  • Bên trong một hàm hoặc một khối, được gọi là local variables.
  • Trong định nghĩa của các tham số hàm, được gọi là formal parameters.
  • Bên ngoài tất cả các chức năng, được gọi là global variables.

Biến cục bộ

Các biến được khai báo bên trong một hàm hoặc khối là các biến cục bộ. Chúng chỉ có thể được sử dụng bởi các câu lệnh bên trong hàm hoặc khối mã đó. Các biến cục bộ không được biết là hoạt động bên ngoài của chúng. Sau đây là ví dụ sử dụng các biến cục bộ:

Void setup () {

}

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

Biến toàn cục

Các biến toàn cục được định nghĩa bên ngoài tất cả các hàm, thường nằm ở đầu chương trình. Các biến toàn cục sẽ giữ giá trị của chúng trong suốt thời gian tồn tại của chương trình của bạn.

Một biến toàn cục có thể được truy cập bởi bất kỳ hàm nào. Có nghĩa là, một biến toàn cục có sẵn để sử dụng trong toàn bộ chương trình của bạn sau khi khai báo.

Ví dụ sau sử dụng các biến cục bộ và toàn cục:

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;
}

Một toán tử là một ký hiệu yêu cầu trình biên dịch thực hiện các chức năng toán học hoặc logic cụ thể. Ngôn ngữ C có nhiều toán tử tích hợp sẵn và cung cấp các loại toán tử sau:

  • Toán tử số học
  • Toán tử so sánh
  • Toán tử Boolean
  • Toán tử Bitwise
  • Toán tử phức hợp

Toán tử số học

Giả sử biến A giữ 10 và biến B giữ 20 thì -

Hiển thị ví dụ

Tên người vận hành Nhà điều hành đơn giản Sự miêu tả Thí dụ
điều hành viên phân công = Lưu trữ giá trị ở bên phải của dấu bằng trong biến ở bên trái của dấu bằng. A = B
thêm vào + Thêm hai toán hạng A + B sẽ cho 30
phép trừ - Trừ toán hạng thứ hai với toán hạng đầu tiên A - B sẽ cho -10
phép nhân * Nhân cả hai toán hạng A * B sẽ cho 200
sự phân chia / Chia tử số cho mẫu số B / A sẽ cho 2
modulo % Toán tử mô đun và phần còn lại của sau một phép chia số nguyên B% A sẽ cho 0

Toán tử so sánh

Giả sử biến A giữ 10 và biến B giữ 20 thì -

Hiển thị ví dụ

Tên người vận hành Nhà điều hành đơn giản Sự miêu tả Thí dụ
tương đương với == Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu có thì điều kiện trở thành true. (A == B) không đúng
không bằng ! = Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu các giá trị không bằng nhau thì điều kiện trở thành true. (A! = B) là đúng
ít hơn < Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (A <B) là đúng
lớn hơn > Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (A> B) không đúng
ít hơn hoặc bằng <= Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (A <= B) là đúng
lớn hơn hoặc bằng > = Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true. (A> = B) không đúng

Toán tử Boolean

Giả sử biến A giữ 10 và biến B giữ 20 thì -

Hiển thị ví dụ

Tên người vận hành Nhà điều hành đơn giản Sự miêu tả Thí dụ
&& Được gọi là toán tử logic AND. Nếu cả hai toán hạng đều khác 0 thì điều kiện trở thành true. (A && B) là đúng
hoặc là || Được gọi là Toán tử logic HOẶC. Nếu bất kỳ toán hạng nào trong hai toán hạng khác 0 thì điều kiện trở thành true. (A || B) đúng
không phải ! Được gọi là Toán tử logic NOT. Sử dụng để đảo ngược trạng thái logic của toán hạng của nó. Nếu một điều kiện là đúng thì toán tử logic NOT sẽ sai. ! (A && B) là sai

Toán tử Bitwise

Giả sử biến A giữ 60 và biến B giữ 13 thì -

Hiển thị ví dụ

Tên người vận hành Nhà điều hành đơn giản Sự miêu tả Thí dụ
& Toán tử AND nhị phân sao chép một bit vào kết quả nếu nó tồn tại trong cả hai toán hạng. (A & B) sẽ cho kết quả 12 là 0000 1100
hoặc là | Toán tử Binary HOẶC sao chép một bit nếu nó tồn tại trong một trong hai toán hạng (A | B) sẽ cho 61 là 0011 1101
xor ^ Toán tử XOR nhị phân sao chép bit nếu nó được đặt trong một toán hạng nhưng không phải cả hai. (A ^ B) sẽ cho 49 là 0011 0001
không phải ~ Toán tử bổ sung số nhị phân là một ngôi và có tác dụng 'lật' các bit. (~ A) sẽ cho -60 là 1100 0011
Sang trái << Toán tử dịch chuyển trái nhị phân. Giá trị toán hạng bên trái được di chuyển sang trái bằng số bit được chỉ định bởi toán hạng bên phải. A << 2 sẽ cho 240 là 1111 0000
sang phải >> Toán tử Shift phải nhị phân. Giá trị của toán hạng bên trái được di chuyển sang phải bằng số bit được chỉ định bởi toán hạng bên phải. A >> 2 sẽ cho 15 là 0000 1111

Toán tử phức hợp

Giả sử biến A giữ 10 và biến B giữ 20 thì -

Hiển thị ví dụ

Tên người vận hành Nhà điều hành đơn giản Sự miêu tả Thí dụ
tăng ++ Toán tử tăng dần, tăng giá trị số nguyên lên một A ++ sẽ cho 11
giảm dần - Toán tử giảm dần, giảm giá trị số nguyên đi một A-- sẽ cho 9
bổ sung hợp chất + = Thêm toán tử gán AND. Nó thêm toán hạng bên phải vào toán hạng bên trái và gán kết quả cho toán hạng bên trái B + = A tương đương với B = B + A
phép trừ hợp chất - = Trừ toán tử gán AND. Nó trừ toán hạng bên phải khỏi toán hạng bên trái và gán kết quả cho toán hạng bên trái B - = A tương đương với B = B - A
phép nhân kép * = Nhân toán tử gán AND. Nó nhân toán hạng bên phải với toán hạng bên trái và gán kết quả cho toán hạng bên trái B * = A tương đương với B = B * A
phân chia hợp chất / = Toán tử gán AND. Nó chia toán hạng bên trái với toán hạng bên phải và gán kết quả cho toán hạng bên trái B / = A tương đương với B = B / A
mô đun hợp chất % = Toán tử gán môđun AND. Cần mô đun bằng cách sử dụng hai toán hạng và gán kết quả cho toán hạng bên trái B% = A tương đương với B = B% A
hợp chất bitwise hoặc | = bao gồm bitwise OR và toán tử gán A | = 2 tương tự như A = A | 2
hợp chất bitwise và & = Toán tử gán bitwise AND A & = 2 giống với A = A & 2

Cấu trúc ra quyết định yêu cầu người lập trình chỉ định một hoặc nhiều điều kiện để được đánh giá hoặc kiểm tra bởi chương trình. Nó phải cùng với một câu lệnh hoặc các câu lệnh được thực hiện nếu điều kiện được xác định là đúng và tùy ý, các câu lệnh khác sẽ được thực hiện nếu điều kiện được xác định là sai.

Sau đây là dạng chung của cấu trúc ra quyết định điển hình được tìm thấy trong hầu hết các ngôn ngữ lập trình:

Câu lệnh điều khiển là các phần tử trong Mã nguồn điều khiển luồng thực thi chương trình. Họ là -

S.NO. Tuyên bố & Mô tả Kiểm soát
1

Câu lệnh if

Nó nhận một biểu thức trong ngoặc đơn và một câu lệnh hoặc một khối câu lệnh. Nếu biểu thức là true thì câu lệnh hoặc khối câu lệnh sẽ được thực thi nếu không các câu lệnh này sẽ bị bỏ qua.

2

Câu lệnh if… else

An if có thể được theo sau bởi một câu lệnh else tùy chọn, thực thi khi biểu thức sai.

3

Câu lệnh if… else if… else

Các if câu lệnh có thể được theo sau bởi một tùy chọn else if...else , rất hữu ích để kiểm tra các điều kiện khác nhau bằng cách sử dụng câu lệnh if ... else if đơn.

4

chuyển đổi trường hợp tuyên bố

Tương tự như câu lệnh if, switch...case kiểm soát luồng chương trình bằng cách cho phép lập trình viên chỉ định các mã khác nhau cần được thực thi trong các điều kiện khác nhau.

5

Điều hành có điều kiện ? :

Toán tử điều kiện? : là toán tử bậc ba duy nhất trong C.

Các ngôn ngữ lập trình cung cấp các cấu trúc điều khiển khác nhau cho phép các đường dẫn thực thi phức tạp hơn.

Câu lệnh lặp cho phép chúng ta thực hiện một câu lệnh hoặc một nhóm câu lệnh nhiều lần và sau đây là dạng chung của câu lệnh lặp trong hầu hết các ngôn ngữ lập trình:

Ngôn ngữ lập trình C cung cấp các loại vòng lặp sau để xử lý các yêu cầu về lặp.

S.NO. Vòng lặp & mô tả
1

trong khi lặp lại

vòng lặp while sẽ lặp liên tục và vô hạn, cho đến khi biểu thức bên trong dấu ngoặc, () trở thành sai. Một cái gì đó phải thay đổi biến được kiểm tra, nếu không vòng lặp while sẽ không bao giờ thoát.

2

vòng lặp do… while

Các do…whilevòng lặp tương tự như vòng lặp while. Trong vòng lặp while, điều kiện tiếp tục của vòng lặp được kiểm tra ở đầu vòng lặp trước khi thực hiện phần thân của vòng lặp.

3

vòng lặp for

A for loopthực hiện các câu lệnh một số lần xác định trước. Biểu thức điều khiển cho vòng lặp được khởi tạo, kiểm tra và thao tác hoàn toàn trong dấu ngoặc đơn của vòng lặp for.

4

Vòng lặp lồng nhau

Ngôn ngữ C cho phép bạn sử dụng một vòng lặp bên trong một vòng lặp khác. Ví dụ sau minh họa khái niệm này.

5

Vòng lặp vô hạn

Đó là vòng lặp không có điều kiện kết thúc, vì vậy vòng lặp trở thành vô hạn.

Các hàm cho phép cấu trúc các chương trình trong các đoạn mã để thực hiện các tác vụ riêng lẻ. Trường hợp điển hình để tạo một hàm là khi một người cần thực hiện cùng một hành động nhiều lần trong một chương trình.

Chuẩn hóa các đoạn mã thành các hàm có một số ưu điểm:

  • Các hàm giúp lập trình viên luôn có tổ chức. Thông thường điều này giúp hình thành chương trình.

  • Các hàm mã hóa một hành động ở một nơi để hàm chỉ phải nghĩ đến và gỡ lỗi một lần.

  • Điều này cũng làm giảm nguy cơ xảy ra lỗi khi sửa đổi, nếu mã cần được thay đổi.

  • Các hàm làm cho toàn bộ bản phác thảo nhỏ hơn và gọn hơn vì các phần mã được sử dụng lại nhiều lần.

  • Chúng giúp việc sử dụng lại mã trong các chương trình khác dễ dàng hơn bằng cách làm cho nó trở thành mô-đun và sử dụng các hàm thường làm cho mã dễ đọc hơn.

Có hai hàm bắt buộc trong một bản phác thảo Arduino hoặc một chương trình tức là setup () và loop (). Các hàm khác phải được tạo bên ngoài dấu ngoặc của hai hàm này.

Cú pháp phổ biến nhất để xác định một hàm là:

Khai báo hàm

Một hàm được khai báo bên ngoài bất kỳ hàm nào khác, bên trên hoặc bên dưới hàm vòng lặp.

Chúng ta có thể khai báo hàm theo hai cách khác nhau:

Cách đầu tiên chỉ là viết một phần của hàm được gọi là a function prototype bên trên hàm vòng lặp, bao gồm:

  • Kiểu trả về hàm
  • Tên chức năng
  • Kiểu đối số của hàm, không cần viết tên đối số

Nguyên mẫu hàm phải được theo sau bởi dấu chấm phẩy (;).

Ví dụ sau đây cho thấy việc trình diễn khai báo hàm bằng phương pháp đầu tiên.

Thí dụ

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
}

Phần thứ hai, được gọi là định nghĩa hoặc khai báo hàm, phải được khai báo bên dưới hàm vòng lặp, bao gồm:

  • Kiểu trả về hàm
  • Tên chức năng
  • Loại đối số của hàm, ở đây bạn phải thêm tên đối số
  • Phần thân hàm (các câu lệnh bên trong hàm thực thi khi hàm được gọi)

Ví dụ sau minh họa việc khai báo hàm bằng phương thức thứ hai.

Thí dụ

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
}

Phương thức thứ hai chỉ khai báo hàm bên trên hàm vòng lặp.

Chuỗi được sử dụng để lưu trữ văn bản. Chúng có thể được sử dụng để hiển thị văn bản trên màn hình LCD hoặc trong cửa sổ Arduino IDE Serial Monitor. Các chuỗi cũng hữu ích để lưu trữ đầu vào của người dùng. Ví dụ: các ký tự mà người dùng nhập trên bàn phím được kết nối với Arduino.

Có hai loại chuỗi trong lập trình Arduino -

  • Mảng các ký tự, giống như các chuỗi được sử dụng trong lập trình C.
  • Chuỗi Arduino, cho phép chúng ta sử dụng một đối tượng chuỗi trong bản phác thảo.

Trong chương này, chúng ta sẽ tìm hiểu Chuỗi, đối tượng và việc sử dụng chuỗi trong các bản phác thảo Arduino. Đến cuối chương, bạn sẽ biết loại chuỗi nào nên sử dụng trong bản phác thảo.

Mảng ký tự chuỗi

Loại chuỗi đầu tiên mà chúng ta sẽ học là chuỗi là một chuỗi các ký tự thuộc loại char. Trong chương trước, chúng ta đã học mảng là gì; một chuỗi liên tiếp của cùng một loại biến được lưu trữ trong bộ nhớ. Chuỗi là một mảng các biến char.

Chuỗi là một mảng đặc biệt có thêm một phần tử ở cuối chuỗi, phần tử này luôn có giá trị 0 (không). Đây được gọi là "chuỗi kết thúc null".

Ví dụ về mảng ký tự chuỗi

Ví dụ này sẽ chỉ ra cách tạo một chuỗi và in nó ra cửa sổ giám sát nối tiếp.

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() { 

}

Ví dụ sau đây cho thấy chuỗi được tạo thành từ gì; một mảng ký tự với các ký tự có thể in được và 0 là phần tử cuối cùng của mảng để chỉ ra rằng đây là nơi chuỗi kết thúc. Chuỗi có thể được in ra cửa sổ Arduino IDE Serial Monitor bằng cách sử dụngSerial.println() và chuyển tên của chuỗi.

Ví dụ tương tự này có thể được viết theo cách thuận tiện hơn như hình dưới đây:

Example

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

void loop() {

}

Trong bản phác thảo này, trình biên dịch tính toán kích thước của mảng chuỗi và cũng tự động null kết thúc chuỗi bằng số không. Một mảng dài sáu phần tử và bao gồm năm ký tự theo sau là số 0 được tạo theo cách giống hệt như trong bản phác thảo trước.

Thao tác với Mảng chuỗi

Chúng ta có thể thay đổi một mảng chuỗi trong một bản phác thảo như thể hiện trong bản phác thảo sau.

Thí dụ

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() {

}

Kết quả

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

Bản phác thảo hoạt động theo cách sau.

Tạo và in chuỗi

Trong bản phác thảo ở trên, một chuỗi mới được tạo và sau đó được in ra để hiển thị trong cửa sổ Serial Monitor.

Rút ngắn chuỗi

Chuỗi được rút ngắn bằng cách thay thế ký tự thứ 14 trong chuỗi bằng ký tự rỗng kết thúc bằng không (2). Đây là phần tử số 13 trong mảng chuỗi đếm từ 0.

Khi chuỗi được in, tất cả các ký tự được in đến giá trị rỗng mới kết thúc bằng 0. Các ký tự khác không biến mất; chúng vẫn tồn tại trong bộ nhớ và mảng chuỗi vẫn có kích thước như cũ. Sự khác biệt duy nhất là bất kỳ hàm nào hoạt động với chuỗi sẽ chỉ thấy chuỗi có tới ký tự kết thúc null đầu tiên.

Thay đổi một từ trong chuỗi

Cuối cùng, bản phác thảo thay thế từ "bánh" bằng "trà" (3). Đầu tiên, nó phải thay thế dấu chấm dứt null tại như [13] bằng một khoảng trắng để chuỗi được khôi phục về định dạng được tạo ban đầu.

Các ký tự mới ghi đè "cak" của từ "cake" bằng từ "tea". Điều này được thực hiện bằng cách ghi đè các ký tự riêng lẻ. Chữ 'e' của "cake" được thay thế bằng một ký tự kết thúc bằng null mới. Kết quả là chuỗi thực sự được kết thúc bằng hai ký tự rỗng, ký tự gốc ở cuối chuỗi và ký tự mới thay thế 'e' trong "cake". Điều này không có gì khác biệt khi chuỗi mới được in bởi vì hàm in chuỗi ngừng in các ký tự chuỗi khi nó gặp dấu chấm cuối rỗng đầu tiên.

Các chức năng để thao tác với mảng chuỗi

Bản phác thảo trước đã thao tác chuỗi theo cách thủ công bằng cách truy cập các ký tự riêng lẻ trong chuỗi. Để thao tác với mảng chuỗi dễ dàng hơn, bạn có thể viết các hàm của riêng mình để làm như vậy hoặc sử dụng một số hàm chuỗi từC thư viện ngôn ngữ.

Không. Chức năng & Mô tả
1

String()

Lớp String, một phần cốt lõi của phiên bản 0019, cho phép bạn sử dụng và thao tác các chuỗi văn bản theo những cách phức tạp hơn so với mảng ký tự. Bạn có thể nối các Chuỗi, nối vào chúng, tìm kiếm và thay thế các chuỗi con, v.v. Nó chiếm nhiều bộ nhớ hơn một mảng ký tự đơn giản, nhưng nó cũng hữu ích hơn.

Để tham khảo, các mảng ký tự được gọi là chuỗi có chữ 's' nhỏ và các trường hợp của lớp String được gọi là Chuỗi với chữ S. Lưu ý rằng các chuỗi không đổi, được chỉ định trong "dấu ngoặc kép" được coi là mảng char, không phải phiên bản của lớp String

2

charAt()

Truy cập một ký tự cụ thể của Chuỗi.

3

compareTo()

So sánh hai Chuỗi, kiểm tra xem một chuỗi đến trước hay sau chuỗi kia, hoặc liệu chúng có bằng nhau hay không. Các chuỗi được so sánh từng ký tự, sử dụng các giá trị ASCII của các ký tự. Điều đó có nghĩa là, ví dụ, 'a' đứng trước 'b' nhưng sau 'A'. Các con số đứng trước các chữ cái.

4

concat()

Thêm tham số vào một chuỗi.

5

c_str()

Chuyển đổi nội dung của một chuỗi thành một chuỗi kiểu C, kết thúc bằng null. Lưu ý rằng điều này cho phép truy cập trực tiếp vào bộ đệm Chuỗi bên trong và cần được sử dụng cẩn thận. Đặc biệt, bạn không bao giờ được sửa đổi chuỗi thông qua con trỏ được trả về. Khi bạn sửa đổi đối tượng String hoặc khi nó bị phá hủy, bất kỳ con trỏ nào được trả về trước đó bởi c_str () sẽ trở nên không hợp lệ và không được sử dụng nữa.

6

endsWith()

Kiểm tra xem một Chuỗi có kết thúc bằng các ký tự của Chuỗi khác hay không.

7

equals()

So sánh hai chuỗi cho bằng nhau. So sánh có phân biệt chữ hoa chữ thường, nghĩa là Chuỗi "xin chào" không bằng Chuỗi "HELLO".

số 8

equalsIgnoreCase()

So sánh hai chuỗi cho bằng nhau. So sánh không phân biệt chữ hoa chữ thường, nghĩa là Chuỗi ("xin chào") bằng với Chuỗi ("HELLO").

9

getBytes()

Sao chép các ký tự của chuỗi vào bộ đệm được cung cấp.

10

indexOf()

Định vị một ký tự hoặc Chuỗi trong một Chuỗi khác. Theo mặc định, nó tìm kiếm từ đầu Chuỗi, nhưng cũng có thể bắt đầu từ một chỉ mục nhất định, cho phép định vị tất cả các phiên bản của ký tự hoặc Chuỗi.

11

lastIndexOf()

Định vị một ký tự hoặc Chuỗi trong một Chuỗi khác. Theo mặc định, nó tìm kiếm từ cuối Chuỗi, nhưng cũng có thể hoạt động ngược lại từ một chỉ mục nhất định, cho phép định vị tất cả các phiên bản của ký tự hoặc Chuỗi.

12

length()

Trả về độ dài của Chuỗi, tính bằng ký tự. (Lưu ý rằng điều này không bao gồm ký tự null ở cuối.)

13

remove()

Sửa đổi tại chỗ, một chuỗi loại bỏ các ký tự từ chỉ mục được cung cấp đến cuối chuỗi hoặc từ chỉ mục được cung cấp thành chỉ mục cộng với số lượng.

14

replace()

Hàm String Replace () cho phép bạn thay thế tất cả các trường hợp của một ký tự nhất định bằng một ký tự khác. Bạn cũng có thể sử dụng thay thế để thay thế các chuỗi con của một chuỗi bằng một chuỗi con khác.

15

reserve()

Hàm String Reserve () cho phép bạn cấp phát một bộ đệm trong bộ nhớ để thao tác với các chuỗi.

16

setCharAt()

Đặt một ký tự của chuỗi. Không ảnh hưởng đến các chỉ số bên ngoài độ dài hiện có của Chuỗi.

17

startsWith()

Kiểm tra xem một Chuỗi có bắt đầu bằng các ký tự của Chuỗi khác hay không.

18

toCharArray()

Sao chép các ký tự của chuỗi vào bộ đệm được cung cấp.

19

substring()

Nhận một chuỗi con của một Chuỗi. Chỉ mục bắt đầu là bao gồm (ký tự tương ứng được bao gồm trong chuỗi con), nhưng chỉ mục kết thúc tùy chọn là loại trừ (ký tự tương ứng không được bao gồm trong chuỗi con). Nếu chỉ mục kết thúc bị bỏ qua, chuỗi con tiếp tục đến cuối Chuỗi.

20

toInt()

Chuyển đổi một chuỗi hợp lệ thành một số nguyên. Chuỗi đầu vào phải bắt đầu bằng một số nguyên. Nếu chuỗi chứa các số không phải số nguyên, hàm sẽ ngừng thực hiện chuyển đổi.

21

toFloat()

Chuyển đổi một chuỗi hợp lệ thành một số thực. Chuỗi đầu vào phải bắt đầu bằng một chữ số. Nếu chuỗi chứa các ký tự không phải chữ số, hàm sẽ ngừng thực hiện chuyển đổi. Ví dụ: các chuỗi "123.45", "123" và "123fish" lần lượt được chuyển đổi thành 123,45, 123,00 và 123,00. Lưu ý rằng "123.456" là gần đúng với 123,46. Cũng lưu ý rằng float chỉ có độ chính xác 6-7 chữ số thập phân và các chuỗi dài hơn có thể bị cắt bớt.

22

toLowerCase()

Nhận phiên bản viết thường của Chuỗi. Kể từ phiên bản 1.0, toLowerCase () sửa đổi chuỗi tại chỗ thay vì trả về chuỗi mới.

23

toUpperCase()

Nhận phiên bản viết hoa của một Chuỗi. Kể từ phiên bản 1.0, toUpperCase () sửa đổi chuỗi tại chỗ thay vì trả về chuỗi mới.

24

trim()

Nhận phiên bản của Chuỗi với bất kỳ khoảng trắng đầu và cuối bị xóa. Kể từ 1.0, trim () sửa đổi chuỗi tại chỗ thay vì trả lại chuỗi mới.

Bản phác thảo tiếp theo sử dụng một số hàm chuỗi C.

Thí dụ

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() {

}

Kết quả

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

Bản phác thảo hoạt động theo cách sau.

In chuỗi

Chuỗi mới tạo được in ra cửa sổ Serial Monitor như được thực hiện trong các bản phác thảo trước đó.

Nhận độ dài của chuỗi

Hàm strlen () được dùng để lấy độ dài của chuỗi. Độ dài của chuỗi chỉ dành cho các ký tự có thể in được và không bao gồm dấu chấm dứt rỗng.

Chuỗi chứa 17 ký tự, vì vậy chúng ta thấy 17 được in trong cửa sổ Serial Monitor.

Nhận chiều dài của mảng

Toán tử sizeof () được sử dụng để lấy độ dài của mảng có chứa chuỗi. Độ dài bao gồm dấu chấm hết null, do đó độ dài lớn hơn độ dài của chuỗi một lần.

sizeof () trông giống như một hàm, nhưng về mặt kỹ thuật là một toán tử. Nó không phải là một phần của thư viện chuỗi C, nhưng được sử dụng trong bản phác thảo để chỉ ra sự khác biệt giữa kích thước của mảng và kích thước của chuỗi (hoặc độ dài chuỗi).

Sao chép một chuỗi

Hàm strcpy () được dùng để sao chép chuỗi str [] sang mảng out_num []. Hàm strcpy () sao chép chuỗi thứ hai được chuyển cho nó vào chuỗi đầu tiên. Một bản sao của chuỗi hiện tồn tại trong mảng out_num [], nhưng chỉ chiếm 18 phần tử của mảng, vì vậy chúng ta vẫn còn 22 phần tử char trống trong mảng. Các phần tử miễn phí này được tìm thấy sau chuỗi trong bộ nhớ.

Chuỗi đã được sao chép vào mảng để chúng ta có thêm một số khoảng trống trong mảng để sử dụng trong phần tiếp theo của bản phác thảo, tức là thêm một chuỗi vào cuối chuỗi.

Nối một chuỗi vào một chuỗi (Concatenate)

Phác thảo nối một chuỗi này với một chuỗi khác, được gọi là nối. Điều này được thực hiện bằng cách sử dụng hàm strcat (). Hàm strcat () đặt chuỗi thứ hai được chuyển cho nó vào cuối chuỗi đầu tiên được truyền cho nó.

Sau khi nối, độ dài của chuỗi được in ra để hiển thị độ dài chuỗi mới. Độ dài của mảng sau đó được in ra để cho thấy rằng chúng ta có một chuỗi dài 25 ký tự trong một mảng dài 40 phần tử.

Hãy nhớ rằng chuỗi dài 25 ký tự thực sự chiếm 26 ký tự của mảng vì giá trị null kết thúc bằng không.

Array Bounds

Khi làm việc với chuỗi và mảng, điều rất quan trọng là phải làm việc trong giới hạn của chuỗi hoặc mảng. Trong bản phác thảo ví dụ, một mảng đã được tạo, dài 40 ký tự, để cấp phát bộ nhớ có thể được sử dụng để thao tác các chuỗi.

Nếu mảng được tạo quá nhỏ và chúng tôi cố gắng sao chép một chuỗi lớn hơn mảng vào nó, chuỗi đó sẽ được sao chép qua phần cuối của mảng. Bộ nhớ ngoài phần cuối của mảng có thể chứa dữ liệu quan trọng khác được sử dụng trong bản phác thảo, sau đó sẽ bị ghi đè bởi chuỗi của chúng ta. Nếu bộ nhớ vượt quá cuối chuỗi bị chạy quá mức, nó có thể làm hỏng bản phác thảo hoặc gây ra hành vi không mong muốn.

Loại chuỗi thứ hai được sử dụng trong lập trình Arduino là Đối tượng chuỗi.

Đối tượng là gì?

Một đối tượng là một cấu trúc chứa cả dữ liệu và hàm. Một đối tượng String có thể được tạo giống như một biến và được gán một giá trị hoặc chuỗi. Đối tượng String chứa các hàm (được gọi là "phương thức" trong lập trình hướng đối tượng (OOP)) hoạt động trên dữ liệu chuỗi có trong đối tượng String.

Bản phác thảo và giải thích sau đây sẽ làm rõ đối tượng là gì và đối tượng String được sử dụng như thế nào.

Thí dụ

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() { 

}

Kết quả

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

Một đối tượng chuỗi được tạo và gán một giá trị (hoặc chuỗi) ở trên cùng của bản phác thảo.

String my_str = "This is my string." ;

Điều này tạo ra một đối tượng Chuỗi với tên my_str và cung cấp cho nó một giá trị là "Đây là chuỗi của tôi.".

Điều này có thể được so sánh với việc tạo một biến và gán giá trị cho nó, chẳng hạn như một số nguyên -

int my_var = 102;

Bản phác thảo hoạt động theo cách sau.

In chuỗi

Chuỗi có thể được in ra cửa sổ Serial Monitor giống như chuỗi mảng ký tự.

Chuyển đổi chuỗi thành chữ hoa

Đối tượng chuỗi my_str đã được tạo, có một số hàm hoặc phương thức có thể hoạt động trên nó. Các phương thức này được gọi bằng cách sử dụng tên đối tượng theo sau là toán tử dấu chấm (.) Và sau đó là tên của hàm cần sử dụng.

my_str.toUpperCase();

Các toUpperCase() hàm hoạt động trên chuỗi chứa trong my_strđối tượng có kiểu Chuỗi và chuyển đổi dữ liệu chuỗi (hoặc văn bản) mà đối tượng chứa thành các ký tự viết hoa. Có thể tìm thấy danh sách các hàm mà lớp String chứa trong tham chiếu Chuỗi Arduino. Về mặt kỹ thuật, String được gọi là một lớp và được sử dụng để tạo các đối tượng String.

Ghi đè một chuỗi

Toán tử gán được sử dụng để gán một chuỗi mới cho my_str đối tượng thay thế chuỗi cũ

my_str = "My new string." ;

Toán tử gán không thể được sử dụng trên chuỗi mảng ký tự, nhưng chỉ hoạt động trên các đối tượng Chuỗi.

Thay thế một từ trong chuỗi

Hàm Replace () được sử dụng để thay thế chuỗi đầu tiên được chuyển cho nó bằng chuỗi thứ hai được chuyển cho nó. Replace () là một hàm khác được tích hợp trong lớp String và do đó có sẵn để sử dụng trên đối tượng String my_str.

Nhận độ dài của chuỗi

Việc lấy độ dài của chuỗi có thể dễ dàng thực hiện bằng cách sử dụng length (). Trong bản phác thảo ví dụ, kết quả trả về bởi length () được chuyển trực tiếp đến Serial.println () mà không sử dụng một biến trung gian.

Khi nào sử dụng một đối tượng chuỗi

Đối tượng chuỗi dễ sử dụng hơn nhiều so với mảng ký tự chuỗi. Đối tượng có các hàm tích hợp có thể thực hiện một số thao tác trên chuỗi.

Nhược điểm chính của việc sử dụng đối tượng String là nó sử dụng nhiều bộ nhớ và có thể nhanh chóng sử dụng hết bộ nhớ RAM của Arduinos, điều này có thể khiến Arduino bị treo, bị treo hoặc hoạt động không mong muốn. Nếu một bản phác thảo trên Arduino nhỏ và hạn chế việc sử dụng các đối tượng thì sẽ không có vấn đề gì.

Chuỗi mảng ký tự khó sử dụng hơn và bạn có thể cần phải viết các hàm của riêng mình để hoạt động trên các loại chuỗi này. Ưu điểm là bạn có quyền kiểm soát kích thước của các mảng chuỗi mà bạn tạo, vì vậy bạn có thể giữ các mảng nhỏ để tiết kiệm bộ nhớ.

Bạn cần đảm bảo rằng bạn không viết vượt quá giới hạn cuối của mảng với mảng chuỗi. Đối tượng String không gặp vấn đề này và sẽ chăm sóc các giới hạn của chuỗi cho bạn, miễn là có đủ bộ nhớ để nó hoạt động. Đối tượng String có thể cố gắng ghi vào bộ nhớ không tồn tại khi nó hết bộ nhớ, nhưng sẽ không bao giờ ghi qua phần cuối của chuỗi mà nó đang hoạt động.

Nơi các chuỗi được sử dụng

Trong chương này, chúng ta đã nghiên cứu về các chuỗi, cách chúng hoạt động trong bộ nhớ và hoạt động của chúng.

Các ứng dụng thực tế của chuỗi sẽ được đề cập trong phần tiếp theo của khóa học này khi chúng ta nghiên cứu cách lấy đầu vào của người dùng từ cửa sổ Serial Monitor và lưu dữ liệu đầu vào trong một chuỗi.

Arduino cung cấp bốn chức năng thao tác thời gian khác nhau. Họ là -

Không. Mô tả chức năng
1

hàm delay ()

Con đường delay()chức năng hoạt động khá đơn giản. Nó chấp nhận một đối số số nguyên (hoặc số). Con số này đại diện cho thời gian (được đo bằng mili giây).

2

Hàm delayMicroseconds ()

Các delayMicroseconds()hàm chấp nhận một đối số số nguyên (hoặc số). Có một nghìn micro giây trong một mili giây và một triệu micro giây trong một giây.

3

hàm millis ()

Hàm này dùng để trả về số mili giây tại thời điểm board Arduino bắt đầu chạy chương trình hiện tại.

4

hàm micros ()

Hàm micros () trả về số micro giây kể từ thời điểm, bảng Arduino bắt đầu chạy chương trình hiện tại. Con số này tràn tức là trở về 0 sau khoảng 70 phút.

Mảng là một nhóm liên tiếp các vị trí bộ nhớ có cùng kiểu. Để tham chiếu đến một vị trí hoặc phần tử cụ thể trong mảng, chúng ta chỉ định tên của mảng và số vị trí của phần tử cụ thể trong mảng.

Hình minh họa dưới đây cho thấy một mảng số nguyên được gọi là C chứa 11 phần tử. Bạn tham chiếu đến bất kỳ phần tử nào trong số các phần tử này bằng cách đặt tên mảng theo sau là số vị trí của phần tử cụ thể trong dấu ngoặc vuông ([]). Số vị trí được gọi chính thức hơn là chỉ số con hoặc chỉ số (số này chỉ định số phần tử từ đầu mảng). Phần tử đầu tiên có chỉ số phụ 0 (không) và đôi khi được gọi là phần tử số không.

Do đó, các phần tử của mảng C là C [0] (phát âm là “C phụ 0”), C [1], C [2], v.v. Chỉ số con cao nhất trong mảng C là 10, nhỏ hơn 1 so với số phần tử trong mảng (11). Tên mảng tuân theo các quy ước giống như các tên biến khác.

Chỉ số con phải là một số nguyên hoặc biểu thức số nguyên (sử dụng bất kỳ kiểu tích phân nào). Nếu một chương trình sử dụng một biểu thức làm chỉ số con, thì chương trình sẽ đánh giá biểu thức để xác định chỉ số con. Ví dụ, nếu chúng ta giả sử rằng biến a bằng 5 và biến b bằng 6, thì câu lệnh thêm 2 vào phần tử mảng C [11].

Tên mảng được chỉ định con là một giá trị, nó có thể được sử dụng ở bên trái của một phép gán, giống như các tên biến không phải mảng có thể.

Chúng ta hãy kiểm tra mảng C trong hình đã cho, kỹ hơn. Tên của toàn bộ mảng là C. 11 phần tử của nó được gọi là C [0] đến C [10]. Giá trị của C [0] là -45, giá trị của C [1] là 6, giá trị của C [2] là 0, giá trị của C [7] là 62 và giá trị của C [10] là 78.

Để in tổng các giá trị có trong ba phần tử đầu tiên của mảng C, chúng ta sẽ viết:

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

Để chia giá trị của C [6] cho 2 và gán kết quả cho biến x, chúng ta sẽ viết:

x = C[ 6 ] / 2;

Khai báo Mảng

Mảng chiếm không gian trong bộ nhớ. Để chỉ định kiểu của các phần tử và số phần tử theo yêu cầu của một mảng, hãy sử dụng một khai báo có dạng:

type arrayName [ arraySize ] ;

Trình biên dịch dự trữ lượng bộ nhớ thích hợp. (Nhớ lại rằng một khai báo, dự trữ bộ nhớ được gọi đúng hơn là một định nghĩa). Kích thước mảng phải là một hằng số nguyên lớn hơn 0. Ví dụ, để yêu cầu trình biên dịch dành 11 phần tử cho mảng số nguyên C, hãy sử dụng khai báo:

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

Mảng có thể được khai báo để chứa các giá trị của bất kỳ kiểu dữ liệu không tham chiếu nào. Ví dụ, một mảng kiểu chuỗi có thể được sử dụng để lưu trữ các chuỗi ký tự.

Ví dụ về sử dụng mảng

Phần này đưa ra nhiều ví dụ minh họa cách khai báo, khởi tạo và thao tác với mảng.

Ví dụ 1: Khai báo một mảng và sử dụng một vòng lặp để khởi tạo các phần tử của mảng

Chương trình khai báo một mảng số nguyên 10 phần tử n. Các dòng a – b sử dụng aForcâu lệnh để khởi tạo các phần tử mảng thành số không. Giống như các biến tự động khác, mảng tự động không được khởi tạo hoàn toàn bằng 0. Câu lệnh đầu ra đầu tiên (dòng c) hiển thị tiêu đề cột cho các cột được in trong câu lệnh for tiếp theo (dòng d – e), câu lệnh này sẽ in mảng ở định dạng bảng.

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 - Nó sẽ tạo ra kết quả sau -

Element Value

0

1

2

3

4

5

6

7

8

9

0

0

0

0

0

0

0

0

0

0

Ví dụ 2: Khởi tạo một mảng trong một khai báo với một danh sách bộ khởi tạo

Các phần tử của một mảng cũng có thể được khởi tạo trong khai báo mảng bằng cách theo sau tên mảng với dấu bằng và danh sách bộ khởi tạo được phân tách bằng dấu phẩy được phân tách bằng dấu ngoặc nhọn. Chương trình sử dụng danh sách bộ khởi tạo để khởi tạo một mảng số nguyên có 10 giá trị (dòng a) và in mảng ở định dạng bảng (dòng 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 - Nó sẽ tạo ra kết quả sau -

Element Value

0

1

2

3

4

5

6

7

8

9

32

27

64

18

95

14

90

70

60

37

Ví dụ 3: Tính tổng các phần tử của một mảng

Thông thường, các phần tử của một mảng đại diện cho một loạt các giá trị được sử dụng trong một phép tính. Ví dụ: nếu các phần tử của một mảng đại diện cho điểm kỳ thi, giáo sư có thể muốn tính tổng các phần tử của mảng và sử dụng tổng đó để tính điểm trung bình của lớp cho kỳ thi. Chương trình tính tổng các giá trị có trong mảng số nguyên 10 phần tử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 - Nó sẽ tạo ra kết quả sau -

Total of array elements: 849

Mảng rất quan trọng đối với Arduino và cần được chú ý nhiều hơn. Các khái niệm quan trọng sau đây liên quan đến mảng phải rõ ràng đối với Arduino:

S.NO. Khái niệm & Mô tả
1 Chuyển Mảng đến Hàm

Để chuyển đối số mảng cho một hàm, hãy chỉ định tên của mảng mà không có bất kỳ dấu ngoặc nào.

2 Mảng đa chiều

Mảng có hai thứ nguyên (tức là chỉ số con) thường đại diện cho bảng giá trị bao gồm thông tin được sắp xếp theo hàng và cột.

Các chân trên bảng Arduino có thể được cấu hình làm đầu vào hoặc đầu ra. Chúng tôi sẽ giải thích chức năng của các chân trong các chế độ đó. Điều quan trọng cần lưu ý là phần lớn các chân tương tự Arduino, có thể được cấu hình và sử dụng, giống hệt như các chân kỹ thuật số.

Các chân được định cấu hình là INPUT

Các chân Arduino theo mặc định được định cấu hình làm đầu vào, vì vậy chúng không cần được khai báo rõ ràng làm đầu vào với pinMode()khi bạn đang sử dụng chúng làm đầu vào. Các chân được cấu hình theo cách này được cho là ở trạng thái trở kháng cao. Các chân đầu vào tạo ra các yêu cầu cực kỳ nhỏ đối với mạch mà chúng đang lấy mẫu, tương đương với một điện trở nối tiếp 100 megaohm phía trước chân cắm.

Điều này có nghĩa là cần rất ít dòng điện để chuyển chân đầu vào từ trạng thái này sang trạng thái khác. Điều này làm cho các chân trở nên hữu ích cho các tác vụ như triển khai cảm biến cảm ứng điện dung hoặc đọc đèn LED như một diode quang.

Các chân được định cấu hình là pinMode (pin, INPUT) mà không có gì kết nối với chúng hoặc với các dây được kết nối với chúng không được kết nối với các mạch khác, báo cáo các thay đổi dường như ngẫu nhiên trong trạng thái chân, nhận nhiễu điện từ môi trường hoặc trạng thái ghép nối của một ghim gần đó.

Điện trở kéo lên

Điện trở kéo lên thường hữu ích để hướng một chân đầu vào đến trạng thái đã biết nếu không có đầu vào nào. Điều này có thể được thực hiện bằng cách thêm một điện trở kéo lên (đến + 5V) hoặc một điện trở kéo xuống (điện trở nối đất) trên đầu vào. Một điện trở 10K là một giá trị tốt cho một điện trở kéo lên hoặc kéo xuống.

Sử dụng điện trở kéo lên tích hợp với chân được định cấu hình làm đầu vào

Có 20.000 điện trở kéo lên được tích hợp trong chip Atmega có thể được truy cập từ phần mềm. Các điện trở kéo lên tích hợp này được truy cập bằng cách thiết lậppinMode()dưới dạng INPUT_PULLUP. Điều này đảo ngược hiệu quả hoạt động của chế độ INPUT, trong đó CAO nghĩa là cảm biến TẮT và THẤP nghĩa là cảm biến BẬT. Giá trị của phần kéo lên này phụ thuộc vào bộ vi điều khiển được sử dụng. Trên hầu hết các bo mạch dựa trên AVR, giá trị được đảm bảo nằm trong khoảng từ 20kΩ đến 50kΩ. Trên Arduino Due, nó nằm trong khoảng từ 50kΩ đến 150kΩ. Để biết giá trị chính xác, hãy tham khảo biểu dữ liệu của bộ vi điều khiển trên bo mạch của bạn.

Khi kết nối cảm biến với chân được định cấu hình bằng INPUT_PULLUP, đầu kia phải được kết nối với đất. Trong trường hợp một công tắc đơn giản, điều này làm cho chân ghi giá trị CAO khi công tắc mở và THẤP khi công tắc được nhấn. Các điện trở kéo lên cung cấp đủ dòng điện để thắp sáng đèn LED được kết nối mờ với chân được cấu hình làm đầu vào. Nếu đèn LED trong một dự án dường như đang hoạt động, nhưng rất mờ, đây có thể là điều đang xảy ra.

Các thanh ghi tương tự (vị trí bộ nhớ chip bên trong) kiểm soát xem một chân là CAO hay THẤP kiểm soát các điện trở kéo lên. Do đó, một chân được cấu hình để bật điện trở kéo lên khi chân ở chế độ INPUTmode, chân sẽ được cấu hình là CAO nếu sau đó chân được chuyển sang chế độ OUTPUT với pinMode (). Điều này cũng hoạt động theo hướng khác và chân đầu ra được để ở trạng thái CAO sẽ có bộ điện trở kéo lên nếu được chuyển sang đầu vào có 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

Các chân được định cấu hình là OUTPUT

Các chân được cấu hình là OUTPUT với pinMode () được cho là ở trạng thái trở kháng thấp. Điều này có nghĩa là chúng có thể cung cấp một lượng dòng điện đáng kể cho các mạch khác. Các chân Atmega có thể cấp nguồn (cung cấp dòng điện dương) hoặc chìm (cung cấp dòng điện âm) lên đến 40 mA (miliampe) dòng điện tới các thiết bị / mạch khác. Đây là dòng điện đủ để làm sáng đèn LED (đừng quên điện trở nối tiếp), hoặc chạy nhiều cảm biến nhưng không đủ dòng điện để chạy rơ le, solenoit hoặc động cơ.

Cố gắng chạy các thiết bị có dòng điện cao từ các chân đầu ra, có thể làm hỏng hoặc phá hủy các bóng bán dẫn đầu ra trong chân, hoặc làm hỏng toàn bộ chip Atmega. Thông thường, điều này dẫn đến một chân "chết" trong bộ vi điều khiển nhưng các chip còn lại vẫn hoạt động tốt. Vì lý do này, bạn nên kết nối các chân OUTPUT với các thiết bị khác thông qua điện trở 470Ω hoặc 1k, trừ khi dòng điện tối đa rút ra từ các chân được yêu cầu cho một ứng dụng cụ thể.

hàm pinMode ()

Hàm pinMode () được sử dụng để định cấu hình một chân cụ thể hoạt động như một đầu vào hoặc đầu ra. Có thể kích hoạt các điện trở kéo lên bên trong với chế độ INPUT_PULLUP. Ngoài ra, chế độ INPUT vô hiệu hóa rõ ràng các pull-up bên trong.

Cú pháp hàm pinMode ()

Void setup () {
   pinMode (pin , mode);
}
  • pin - số pin có chế độ bạn muốn đặt

  • mode - INPUT, OUTPUT hoặc 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
   }
}

Hàm digitalWrite ()

Các digitalWrite()hàm được sử dụng để ghi giá trị CAO hoặc THẤP vào chân số. Nếu chân đã được cấu hình như một OUTPUT với pinMode () , điện áp của nó sẽ được đặt thành giá trị tương ứng: 5V (hoặc 3,3V trên bảng 3.3V) cho CAO, 0V (đất) cho THẤP. Nếu chân được định cấu hình là ĐẦU VÀO, digitalWrite () sẽ bật (CAO) hoặc tắt (THẤP) kéo lên bên trong trên chân đầu vào. Bạn nên đặt pinMode () thành INPUT_PULLUP để kích hoạt điện trở kéo lên bên trong.

Nếu bạn không đặt pinMode () thành OUTPUT và kết nối đèn LED với chân cắm, khi gọi digitalWrite (HIGH), đèn LED có thể bị mờ. Nếu không thiết lập rõ ràng pinMode (), digitalWrite () sẽ kích hoạt điện trở kéo lên bên trong, hoạt động giống như một điện trở hạn chế dòng điện lớn.

Cú pháp hàm digitalWrite ()

Void loop() {
   digitalWrite (pin ,value);
}
  • pin - số pin có chế độ bạn muốn đặt

  • value - CAO hoặc THẤP.

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
}

hàm analogRead ()

Arduino có thể phát hiện xem có điện áp đặt vào một trong các chân của nó hay không và báo cáo nó thông qua hàm digitalRead (). Có sự khác biệt giữa cảm biến bật / tắt (phát hiện sự hiện diện của vật thể) và cảm biến tương tự, có giá trị liên tục thay đổi. Để đọc loại cảm biến này, chúng ta cần một loại chân cắm khác.

Ở phần dưới bên phải của bảng Arduino, bạn sẽ thấy sáu chân được đánh dấu “Analog In”. Các chân đặc biệt này không chỉ cho biết có điện áp đặt vào chúng hay không mà còn cho biết giá trị của nó. Bằng cách sử dụnganalogRead() , chúng ta có thể đọc điện áp được áp dụng cho một trong các chân.

Hàm này trả về một số từ 0 đến 1023, đại diện cho điện áp từ 0 đến 5 vôn. Ví dụ: nếu có một điện áp 2,5 V được áp dụng cho chân số 0, analogRead (0) trả về 512.

Cú pháp hàm analogRead ()

analogRead(pin);
  • pin - số lượng chân đầu vào tương tự để đọc (0 đến 5 trên hầu hết các bo mạch, 0 đến 7 trên Mini và Nano, 0 đến 15 trên Mega)

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
}

Trong chương này, chúng ta sẽ tìm hiểu một số Hàm đầu vào và đầu ra nâng cao.

Hàm analogReference ()

Định cấu hình điện áp tham chiếu được sử dụng cho đầu vào tương tự (tức là giá trị được sử dụng làm đỉnh của dải đầu vào). Các tùy chọn là -

  • DEFAULT - Tham chiếu tương tự mặc định là 5 vôn (trên bảng Arduino 5V) hoặc 3,3 vôn (trên bảng Arduino 3,3V)

  • INTERNAL - Tham chiếu tích hợp sẵn, bằng 1,1 vôn trên ATmega168 hoặc ATmega328 và 2,56 vôn trên ATmega8 (không khả dụng trên Arduino Mega)

  • INTERNAL1V1 - Tham chiếu 1.1V tích hợp sẵn (chỉ Arduino Mega)

  • INTERNAL2V56 - Tham chiếu 2,56V tích hợp (chỉ Arduino Mega)

  • EXTERNAL - Điện áp được áp dụng cho chân AREF (chỉ 0 đến 5V) được sử dụng làm tham chiếu

Cú pháp hàm analogReference ()

analogReference (type);

type - có thể sử dụng bất kỳ loại theo dõi nào (DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL)

Không sử dụng bất kỳ thứ gì nhỏ hơn 0V hoặc hơn 5V cho điện áp tham chiếu bên ngoài trên chân AREF. Nếu bạn đang sử dụng tham chiếu bên ngoài trên chân AREF, bạn phải đặt tham chiếu tương tự thành EXTERNAL trước khi gọianalogRead()chức năng. Nếu không, bạn sẽ làm ngắn điện áp tham chiếu hoạt động (được tạo bên trong) và chân AREF, có thể làm hỏng bộ vi điều khiển trên bảng Arduino của bạn.

Ngoài ra, bạn có thể kết nối điện áp tham chiếu bên ngoài với chân AREF thông qua điện trở 5K, cho phép bạn chuyển đổi giữa điện áp tham chiếu bên ngoài và bên trong.

Lưu ý rằng điện trở sẽ thay đổi điện áp được sử dụng làm tham chiếu vì có một điện trở 32K bên trong trên chân AREF. Hai hoạt động như một bộ phân áp. Ví dụ, 2,5V đặt qua điện trở sẽ mang lại 2,5 * 32 / (32 + 5) = ~ 2,2V tại chân AREF.

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
}

Tất cả dữ liệu được nhập vào máy tính dưới dạng ký tự, bao gồm các chữ cái, chữ số và các ký hiệu đặc biệt khác nhau. Trong phần này, chúng ta thảo luận về các khả năng của C ++ để kiểm tra và thao tác các ký tự riêng lẻ.

Thư viện xử lý ký tự bao gồm một số hàm thực hiện các kiểm tra và thao tác hữu ích với dữ liệu ký tự. Mỗi hàm nhận một ký tự, được biểu diễn dưới dạng int hoặc EOF dưới dạng đối số. Các ký tự thường được thao tác dưới dạng số nguyên.

Hãy nhớ rằng EOF thường có giá trị –1 và một số kiến ​​trúc phần cứng không cho phép các giá trị âm được lưu trữ trong các biến char. Do đó, các hàm xử lý ký tự thao tác các ký tự dưới dạng số nguyên.

Bảng sau đây tóm tắt các chức năng của thư viện xử lý ký tự. Khi sử dụng các hàm từ thư viện xử lý ký tự, hãy bao gồm<cctype> đầu trang.

Không. Nguyên mẫu & Mô tả
1

int isdigit( int c )

Trả về 1 nếu c là một chữ số và 0 nếu ngược lại.

2

int isalpha( int c )

Trả về 1 nếu c là một chữ cái và 0 nếu ngược lại.

3

int isalnum( int c )

Trả về 1 nếu c là một chữ số hoặc một chữ cái và 0 nếu ngược lại.

4

int isxdigit( int c )

Trả về 1 nếu c là ký tự chữ số thập lục phân và 0 nếu ngược lại.

(Xem Phụ lục D, Hệ thống số, để có giải thích chi tiết về các số nhị phân, bát phân, thập phân và thập lục phân.)

5

int islower( int c )

Trả về 1 nếu c là chữ thường và 0 nếu ngược lại.

6

int isupper( int c )

Trả về 1 nếu c là một chữ cái viết hoa; 0 nếu không.

7

int isspace( int c )

Trả về 1 nếu c là ký tự khoảng trắng — dòng mới ('\ n'), dấu cách

(''), nguồn cấp dữ liệu biểu mẫu ('\ f'), dấu xuống dòng ('\ r'), tab ngang ('\ t') hoặc tab dọc ('\ v') - và 0 nếu không.

số 8

int iscntrl( int c )

Trả về 1 nếu c là ký tự điều khiển, chẳng hạn như dòng mới ('\ n'), nguồn cấp dữ liệu biểu mẫu ('\ f'), dấu xuống dòng ('\ r'), tab ngang ('\ t'), tab dọc (' \ v '), alert (' \ a ') hoặc backspace (' \ b ') - và 0 nếu không.

9

int ispunct( int c )

Trả về 1 nếu c là ký tự in khác với khoảng trắng, chữ số hoặc chữ cái và 0 nếu ngược lại.

10

int isprint( int c )

Trả về 1 nếu c là ký tự in bao gồm khoảng trắng ('') và 0 nếu không.

11

int isgraph( int c )

Trả về 1 nếu c là ký tự in khác với khoảng trắng ('') và 0 nếu không.

Ví dụ

Ví dụ sau minh họa việc sử dụng các hàm isdigit, isalpha, isalnumisxdigit. Chức năngisdigitxác định xem đối số của nó có phải là một chữ số (0-9) hay không. Chức năngisalphaxác định xem đối số của nó là chữ hoa (AZ) hay chữ thường (a – z). Chức năngisalnumxác định xem đối số của nó là chữ hoa, chữ thường hay chữ số. Chức năngisxdigit xác định xem đối số của nó có phải là chữ số thập lục phân hay không (A – F, a – f, 0–9).

ví dụ 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 () {

}

Kết quả

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

Chúng tôi sử dụng toán tử điều kiện (?:)với mỗi hàm để xác định xem chuỗi "là a" hay chuỗi "không phải là" nên được in trong đầu ra cho mỗi ký tự được kiểm tra. Ví dụ, dònga chỉ ra rằng nếu '8' là một chữ số — tức là, nếu isdigittrả về giá trị true (nonzero) — chuỗi "8 là a" được in. Nếu '8' không phải là một chữ số (tức là, nếuisdigit trả về 0), chuỗi "8 không phải là a" được in.

Ví dụ 2

Ví dụ sau minh họa việc sử dụng các hàm islowerisupper. Chức năngislowerxác định xem đối số của nó có phải là một chữ cái thường (a – z) hay không. Chức năngisupper xác định xem đối số của nó có phải là một chữ cái viết hoa hay không (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 () {

}

Kết quả

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

Ví dụ 3

Ví dụ sau minh họa việc sử dụng các hàm isspace, iscntrl, ispunct, isprintisgraph.

  • Chức năng isspace xác định xem đối số của nó có phải là ký tự khoảng trắng hay không, chẳng hạn như dấu cách (''), nguồn cấp dữ liệu biểu mẫu ('\ f'), dòng mới ('\ n'), ký tự xuống dòng ('\ r'), tab ngang ('\ t ') hoặc tab dọc (' \ v ').

  • Chức năng iscntrl xác định xem đối số của nó có phải là ký tự điều khiển hay không, chẳng hạn như tab ngang ('\ t'), tab dọc ('\ v'), nguồn cấp dữ liệu biểu mẫu ('\ f'), alert ('\ a'), backspace ('\ b '), ký tự xuống dòng (' \ r ') hoặc dòng mới (' \ n ').

  • Chức năng ispunct xác định xem đối số của nó có phải là ký tự in không phải là khoảng trắng, chữ số hoặc chữ cái, chẳng hạn như $, #, (,), [,], {,},;,: hoặc%.

  • Chức năng isprint xác định xem đối số của nó có phải là một ký tự có thể được hiển thị trên màn hình hay không (bao gồm cả ký tự khoảng trắng).

  • Chức năng isgraph kiểm tra các ký tự giống như isprint, nhưng ký tự khoảng trắng không được bao gồm.

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 () {

}

Kết quả

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

Thư viện Arduino Math (math.h) bao gồm một số hàm toán học hữu ích để thao tác với các số dấu phẩy động.

Macro thư viện

Sau đây là các macro được định nghĩa trong tiêu đề math.h:

Macro Giá trị Sự miêu tả
TÔI 2.7182818284590452354 Hằng số e.
M_LOG2E

1.4426950408889634074

/ * log_2 e * /

Lôgarit của e với cơ số 2
M_1_PI

0,31830988618379067154

/ * 1 / pi * /

Hằng số 1 / pi
M_2_PI

0,63661977236758134308

/ * 2 / pi * /

Hằng số 2 / pi
M_2_SQRTPI

1.12837916709551257390

/ * 2 / sqrt (pi) * /

Hằng số 2 / sqrt (pi)
M_LN10

2.30258509299404568402

/ * log_e 10 * /

Lôgarit tự nhiên của 10
M_LN2

0,69314718055994530942

/ * log_e 2 * /

Lôgarit tự nhiên của 2
M_LOG10E

0,43429448190325182765

/ * log_10 e * /

Lôgarit của e với cơ số 10
M_PI

3,14159265358979323846

/* số Pi */

Hằng số pi
M_PI_2

3.3V1.57079632679489661923

/ * pi / 2 * /

Hằng số pi / 2
M_PI_4

0,78539816339744830962

/ * pi / 4 * /

Hằng số pi / 4
M_SQRT1_2

0,70710678118654752440

/ * 1 / sqrt (2) * /

Hằng số 1 / sqrt (2)
M_SQRT2

1.41421356237309504880

/ * sqrt (2) * /

Căn bậc hai của 2
acosf - Bí danh cho hàm acos ()
asinf - Bí danh cho hàm asin ()
atan2f - Bí danh cho hàm atan2 ()
cbrtf - Bí danh cho hàm cbrt ()
ceilf - Bí danh cho hàm ceil ()
copysignf - Bí danh cho hàm copysign ()
coshf - Bí danh cho hàm cosh ()
expf - Bí danh cho hàm exp ()
fabsf - Bí danh cho hàm fabs ()
fdimf - Bí danh cho hàm fdim ()
sàn nhà - Bí danh cho hàm floor ()
fmaxf - Bí danh cho hàm fmax ()
fminf - Bí danh cho hàm fmin ()
fmodf - Bí danh cho hàm fmod ()
frexpf - Bí danh cho hàm frexp ()
giả thuyết - Bí danh cho hàm hyp ()
VÔ CỰC - Hằng số INFINITY
isfinitef - Bí danh cho hàm isfinite ()
isinff - Bí danh cho hàm isinf ()
isnanf - Bí danh cho hàm isnan ()
ldexpf - Bí danh cho hàm ldexp ()
log10f - Bí danh cho hàm log10 ()
logf - Bí danh cho hàm log ()
lrintf - Bí danh cho hàm lrint ()
lroundf - Bí danh cho hàm lround ()

Chức năng Thư viện

Các chức năng sau được định nghĩa trong tiêu đề math.h -

Không. Chức năng & Mô tả Thư viện
1

double acos (double __x)

Hàm acos () tính giá trị chính của cosin cung của __x. Giá trị trả về nằm trong khoảng [0, pi] radian. Lỗi miền xảy ra đối với các đối số không thuộc phạm vi [-1, +1].

2

double asin (double __x)

Hàm asin () tính giá trị chính của cung sin của __x. Giá trị trả về nằm trong khoảng [-pi / 2, pi / 2] radian. Lỗi miền xảy ra đối với các đối số không thuộc phạm vi [-1, +1].

3

double atan (double __x)

Hàm atan () tính giá trị chính của tiếp tuyến cung của __x. Giá trị trả về nằm trong khoảng [-pi / 2, pi / 2] radian.

4

double atan2 (double __y, double __x)

Hàm atan2 () tính toán giá trị chính của tiếp tuyến cung của __y / __x, sử dụng các dấu hiệu của cả hai đối số để xác định góc phần tư của giá trị trả về. Giá trị trả về nằm trong khoảng [-pi, + pi] radian.

5

double cbrt (double __x)

Hàm cbrt () trả về gốc khối lập phương của __x.

6

double ceil (double __x)

Hàm ceil () trả về giá trị tích phân nhỏ nhất lớn hơn hoặc bằng __x, được biểu thị dưới dạng số dấu phẩy động.

7

static double copysign (double __x, double __y)

Hàm copysign () trả về __x nhưng có dấu __y. Chúng hoạt động ngay cả khi __x hoặc __y là NaN hoặc không.

số 8

double cos(double __x)

Hàm cos () trả về cosin của __x, được đo bằng radian.

9

double cosh (double __x)

Hàm cosh () trả về cosin hyperbol của __x.

10

double exp (double __x)

Hàm exp () trả về giá trị hàm mũ của __x.

11

double fabs (double __x)

Hàm fabs () tính giá trị tuyệt đối của một số dấu phẩy động __x.

12

double fdim (double __x, double __y)

Hàm fdim () trả về max (__ x - __y, 0). Nếu __x hoặc __y hoặc cả hai là NaN, NaN được trả về.

13

double floor (double __x)

Hàm floor () trả về giá trị tích phân lớn nhất nhỏ hơn hoặc bằng __x, được biểu thị dưới dạng số dấu phẩy động.

14

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

Hàm fma () thực hiện phép nhân-cộng dấu phẩy động. Đây là phép toán (__x * __y) + __z, nhưng kết quả trung gian không được làm tròn thành kiểu đích. Điều này đôi khi có thể cải thiện độ chính xác của một phép tính.

15

double fmax (double __x, double __y)

Hàm fmax () trả về giá trị lớn hơn trong hai giá trị __x và __y. Nếu một đối số là NaN, đối số kia được trả về. Nếu cả hai đối số là NaN, NaN được trả về.

16

double fmin (double __x, double __y)

Hàm fmin () trả về giá trị nhỏ hơn trong hai giá trị __x và __y. Nếu một đối số là NaN, đối số kia được trả về. Nếu cả hai đối số là NaN, NaN được trả về.

17

double fmod (double __x, double__y)

Hàm fmod () trả về phần dư dấu phẩy động của __x / __y.

18

double frexp (double __x, int * __pexp)

Hàm frexp () ngắt một số dấu phẩy động thành một phân số chuẩn hóa và tích phân là 2. Nó lưu trữ số nguyên trong đối tượng int được __pexp trỏ tới. Nếu __x là một số dấu phẩy động bình thường, thì hàm frexp () trả về giá trị v, sao cho v có độ lớn trong khoảng [1/2, 1) hoặc 0, và __x bằng v lần 2 được nâng lên lũy thừa __pexp. Nếu __x bằng không, cả hai phần của kết quả đều bằng không. Nếu __x không phải là một số hữu hạn, frexp () trả về __x như cũ và lưu trữ 0 bởi __pexp.

Note - Việc triển khai này cho phép con trỏ 0 như một chỉ thị để bỏ qua việc lưu trữ số mũ.

19

double hypot (double __x, double__y)

Hàm obs () trả về sqrt (__ x * __ x + __y * __ y). Đây là độ dài cạnh huyền của tam giác vuông với độ dài các cạnh là __x và __y, hoặc khoảng cách của điểm (__x, __y) từ gốc tọa độ. Sử dụng hàm này thay vì công thức trực tiếp là điều khôn ngoan, vì lỗi nhỏ hơn nhiều. Không có dòng chảy dưới với __x và __y nhỏ. Không bị tràn nếu kết quả nằm trong phạm vi.

20

static int isfinite (double __x)

Hàm isfinite () trả về một giá trị khác không nếu __x là hữu hạn: không cộng hoặc trừ vô cùng và không NaN.

21

int isinf (double __x)

Hàm isinf () trả về 1 nếu đối số __x là dương vô cùng, -1 nếu __x là âm vô cùng và ngược lại là 0.

Note - GCC 4.3 có thể thay thế hàm này bằng mã nội tuyến trả về giá trị 1 cho cả hai số nguyên (lỗi gcc # 35509).

22

int isnan (double __x)

Hàm isnan () trả về 1 nếu đối số __x đại diện cho "not-a-number" (NaN) đối tượng, nếu không thì 0.

23

double ldexp (double __x, int __exp )

Hàm ldexp () nhân một số dấu phẩy động với lũy thừa 2. Nó trả về giá trị của __x lần 2 được nâng lên lũy thừa __exp.

24

double log (double __x)

Hàm log () trả về logarit tự nhiên của đối số __x.

25

double log10(double __x)

Hàm log10 () trả về logarit của đối số __x cho cơ số 10.

26

long lrint (double __x)

Hàm lrint () làm tròn __x đến số nguyên gần nhất, làm tròn nửa trường hợp về hướng số nguyên chẵn. (Nghĩa là cả giá trị 1,5 và 2,5 đều được làm tròn thành 2). Hàm này tương tự như hàm rint (), nhưng nó khác về kiểu giá trị trả về và có thể xảy ra tràn.

Returns

Giá trị số nguyên dài được làm tròn. Nếu __x không phải là một số hữu hạn hoặc một số tràn, việc thực hiện này trả về giá trị LONG_MIN (0x80000000).

27

long lround (double __x)

Hàm lround () làm tròn __x đến số nguyên gần nhất, nhưng làm tròn nửa các trường hợp từ 0 (thay vì đến số nguyên chẵn gần nhất). Hàm này tương tự như hàm round (), nhưng nó khác về kiểu giá trị trả về và có thể xảy ra tràn.

Returns

Giá trị số nguyên dài được làm tròn. Nếu __x không phải là một số hữu hạn hoặc là một số tràn, quá trình thực hiện này trả về giá trị LONG_MIN (0x80000000).

28

double modf (double __x, double * __iptr )

Hàm modf () chia đối số __x thành các phần tích phân và phân số, mỗi phần có cùng dấu với đối số. Nó lưu trữ phần tích phân dưới dạng kép trong đối tượng được trỏ tới bởi __iptr.

Hàm modf () trả về phần phân số có dấu của __x.

Note- Việc triển khai này bỏ qua việc ghi bằng con trỏ không. Tuy nhiên, GCC 4.3 có thể thay thế chức năng này bằng mã nội tuyến không cho phép sử dụng địa chỉ NULL để tránh lưu trữ.

29

float modff (float __x, float * __iptr)

Bí danh cho modf ().

30

double pow (double __x, double __y)

Hàm pow () trả về giá trị của __x thành số mũ __y.

31

double round (double __x)

Hàm round () làm tròn __x đến số nguyên gần nhất, nhưng làm tròn nửa các trường hợp từ 0 (thay vì đến số nguyên chẵn gần nhất). Tràn là không thể.

Returns

Giá trị được làm tròn. Nếu __x là một tích phân hoặc vô hạn, __x chính nó được trả về. Nếu __x làNaN, sau đó NaN Được trả lại.

32

int signbit (double __x)

Hàm signbit () trả về một giá trị khác không nếu giá trị của __x có bộ bit dấu của nó. Điều này không giống với `__x <0.0 ', vì dấu chấm động IEEE 754 cho phép số không được ký. So sánh `-0.0 <0.0 'là sai, nhưng` signbit (-0.0)' sẽ trả về giá trị khác không.

33

double sin (double __x)

Hàm sin () trả về sin của __x, được đo bằng radian.

34

double sinh (double __x)

Hàm sinh () trả về sin hyperbol của __x.

35

double sqrt (double __x)

Hàm sqrt () trả về căn bậc hai không âm của __x.

36

double square (double __x)

Hàm square () trả về __x * __x.

Note - Hàm này không thuộc định nghĩa chuẩn C.

37

double tan (double __x)

Hàm tan () trả về tiếp tuyến của __x, được đo bằng radian.

38

double tanh ( double __x)

Hàm tanh () trả về tiếp tuyến hyperbol của __x.

39

double trunc (double __x)

Hàm trunc () làm tròn __x đến số nguyên gần nhất không lớn hơn về giá trị tuyệt đối.

Thí dụ

Ví dụ sau cho thấy cách sử dụng các hàm thư viện math.h phổ biến nhất:

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() {

}

Kết quả

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

Bạn cần sử dụng Lượng giác một cách thực tế như tính toán khoảng cách cho vật thể chuyển động hoặc tốc độ góc. Arduino cung cấp các hàm lượng giác truyền thống (sin, cos, tan, asin, acos, atan) có thể được tóm tắt bằng cách viết các nguyên mẫu của chúng. Math.h chứa nguyên mẫu của hàm lượng giác.

Cú pháp chính xác lượng giác

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

Thí dụ

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

Arduino Due là một bo mạch vi điều khiển dựa trên CPU Atmel SAM3X8E ARM Cortex-M3. Đây là bo mạch Arduino đầu tiên dựa trên vi điều khiển lõi ARM 32-bit.

Các tính năng quan trọng -

  • Nó có 54 chân đầu vào / đầu ra kỹ thuật số (trong đó 12 chân có thể được sử dụng làm đầu ra PWM)
  • 12 đầu vào tương tự
  • 4 UART (cổng nối tiếp phần cứng)
  • Xung nhịp 84 MHz, kết nối USB OTG có khả năng
  • 2 DAC (kỹ thuật số sang tương tự), 2 TWI, giắc cắm nguồn, đầu cắm SPI, đầu cắm JTAG
  • Nút đặt lại và nút xóa

Đặc điểm của Arduino Due Board

Vôn hoạt động Tốc độ CPU Analog in / out IO / PWM kỹ thuật số EEPROM [KB] SRAM [KB] Flash [KB] USB UART
3,3 Volt 84 Mhz 12/2 54/12 - 96 512 2 vi 4

Giao tiếp

  • 4 UART phần cứng
  • 2 I2C
  • 1 Giao diện CAN (Giao thức liên lạc ô tô)
  • 1 SPI
  • 1 Giao diện JTAG (10 pin)
  • 1 Máy chủ USB (như Leonardo)
  • 1 cổng lập trình

Không giống như hầu hết các bảng Arduino, bảng Arduino Due chạy ở 3.3V. Điện áp tối đa mà các chân I / O có thể chịu được là 3,3V. Áp dụng điện áp cao hơn 3,3V cho bất kỳ chân I / O nào có thể làm hỏng bo mạch.

Bo mạch chứa mọi thứ cần thiết để hỗ trợ vi điều khiển. Bạn có thể chỉ cần kết nối nó với máy tính bằng cáp micro-USB hoặc cấp nguồn bằng bộ chuyển đổi AC-to-DC hoặc pin để bắt đầu. Do tương thích với tất cả các lá chắn Arduino hoạt động ở 3.3V.

Arduino Zero

Zero là một phần mở rộng 32-bit đơn giản và mạnh mẽ của nền tảng được thiết lập bởi UNO. Bảng điều khiển Zero mở rộng phạm vi gia đình bằng cách cung cấp hiệu suất cao hơn, cho phép nhiều cơ hội dự án cho các thiết bị và hoạt động như một công cụ giáo dục tuyệt vời để học về phát triển ứng dụng 32-bit.

Các tính năng quan trọng là -

  • Các ứng dụng Zero trải dài từ các thiết bị IoT thông minh, công nghệ có thể đeo được, tự động hóa công nghệ cao cho đến robot điên cuồng.

  • Bo mạch được cung cấp bởi SAMD21 MCU của Atmel, có lõi ARM Cortex® M0 + 32-bit.

  • Một trong những tính năng quan trọng nhất của nó là Atmel's Embedded Debugger (EDBG), cung cấp giao diện gỡ lỗi đầy đủ mà không cần phần cứng bổ sung, làm tăng đáng kể tính dễ sử dụng cho việc gỡ lỗi phần mềm.

  • EDBG cũng hỗ trợ một cổng COM ảo có thể được sử dụng để lập trình thiết bị và bộ nạp khởi động.

Đặc điểm của bảng Arduino Zero

Vôn hoạt động Tốc độ CPU Analog in / out IO / PWM kỹ thuật số EEPROM [KB] SRAM [KB] Flash [KB] USB UART
3,3 Volt 48 Mhz 6/1 14/10 - 32 256 2 vi 2

Không giống như hầu hết các bảng Arduino và Genuino, Zero chạy ở 3.3V. Điện áp tối đa mà các chân I / O có thể chịu được là 3,3V. Áp dụng điện áp cao hơn 3,3V cho bất kỳ chân I / O nào có thể làm hỏng bo mạch.

Bo mạch chứa mọi thứ cần thiết để hỗ trợ vi điều khiển. Bạn có thể chỉ cần kết nối nó với máy tính bằng cáp micro-USB hoặc cấp nguồn cho nó bằng bộ chuyển đổi AC-to-DC hoặc pin để bắt đầu. Zero tương thích với tất cả các tấm chắn hoạt động ở 3.3V.

Điều chế độ rộng xung hoặc PWM là một kỹ thuật phổ biến được sử dụng để thay đổi độ rộng của các xung trong một hệ thống xung. PWM có nhiều ứng dụng như điều khiển các servo và bộ điều khiển tốc độ, hạn chế công suất hiệu quả của động cơ và đèn LED.

Nguyên tắc cơ bản của PWM

Điều chế độ rộng xung về cơ bản là một sóng vuông với thời gian cao thấp khác nhau. Một tín hiệu PWM cơ bản được hiển thị trong hình sau.

Có nhiều thuật ngữ khác nhau liên quan đến PWM -

  • On-Time - Thời lượng của tín hiệu thời gian cao.

  • Off-Time - Khoảng thời gian của tín hiệu thời gian thấp.

  • Period - Nó được biểu diễn dưới dạng tổng thời gian và thời gian tắt của tín hiệu PWM.

  • Duty Cycle - Nó được biểu thị bằng phần trăm tín hiệu thời gian vẫn bật trong khoảng thời gian của tín hiệu PWM.

Giai đoạn = Stage

Như trong hình, T on biểu thị thời gian đúng giờ và T off biểu thị thời gian tắt của tín hiệu. Khoảng thời gian là tổng của cả thời gian bật và tắt và được tính như thể hiện trong phương trình sau:

Chu kỳ nhiệm vụ

Chu kỳ nhiệm vụ được tính là thời gian đúng của khoảng thời gian. Sử dụng khoảng thời gian được tính ở trên, chu kỳ nhiệm vụ được tính là -

Hàm analogWrite ()

Các analogWrite()hàm ghi một giá trị tương tự (sóng PWM) vào một chân. Nó có thể được sử dụng để thắp sáng đèn LED ở các độ sáng khác nhau hoặc điều khiển động cơ ở nhiều tốc độ khác nhau. Sau một lệnh gọi của hàm analogWrite (), chân sẽ tạo ra một sóng vuông ổn định của chu kỳ nhiệm vụ được chỉ định cho đến lần gọi tiếp theo tới analogWrite () hoặc một lệnh gọi tới digitalRead () hoặc digitalWrite () trên cùng một chân. Tần số của tín hiệu PWM trên hầu hết các chân là khoảng 490 Hz. Trên Uno và các bảng tương tự, chân 5 và 6 có tần số xấp xỉ 980 Hz. Chân 3 và 11 trên Leonardo cũng chạy ở tần số 980 Hz.

Trên hầu hết các bảng Arduino (những bảng có ATmega168 hoặc ATmega328), chức năng này hoạt động trên các chân 3, 5, 6, 9, 10 và 11. Trên Arduino Mega, nó hoạt động trên các chân 2 - 13 và 44 - 46. Arduino cũ hơn bo mạch chỉ hỗ trợ ATmega8 analogWrite() trên các chân 9, 10 và 11.

Arduino Due hỗ trợ analogWrite()trên chân 2 đến chân 13 và chân DAC0 và DAC1. Không giống như các chân PWM, DAC0 và DAC1 là bộ chuyển đổi Digital sang Analog và hoạt động như các đầu ra tương tự thực sự.

Bạn không cần gọi pinMode () để đặt chân làm đầu ra trước khi gọi analogWrite ().

Cú pháp hàm analogWrite ()

analogWrite ( pin , value ) ;

value - chu kỳ nhiệm vụ: từ 0 (luôn tắt) đến 255 (luôn bật).

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
}

Để tạo số ngẫu nhiên, bạn có thể sử dụng các hàm số ngẫu nhiên của Arduino. Chúng tôi có hai chức năng -

  • randomSeed(seed)
  • random()

randomSeed (hạt giống)

Hàm randomSeed (hạt giống) đặt lại bộ tạo số giả ngẫu nhiên của Arduino. Mặc dù sự phân bố của các số được trả về bởi random () về cơ bản là ngẫu nhiên, trình tự có thể dự đoán được. Bạn nên đặt lại trình tạo thành một số giá trị ngẫu nhiên. Nếu bạn có một chân analog chưa được kết nối, nó có thể nhận nhiễu ngẫu nhiên từ môi trường xung quanh. Đó có thể là sóng vô tuyến, tia vũ trụ, nhiễu điện từ từ điện thoại di động, đèn huỳnh quang, v.v.

Thí dụ

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

ngẫu nhiên ()

Hàm ngẫu nhiên tạo ra các số giả ngẫu nhiên. Sau đây là cú pháp.

Cú pháp câu lệnh random ()

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

Thí dụ

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);
}

Bây giờ chúng ta hãy làm mới kiến ​​thức của mình về một số khái niệm cơ bản như bit và byte.

Chút ít

Một bit chỉ là một chữ số nhị phân.

  • Hệ thống nhị phân sử dụng hai chữ số, 0 và 1.

  • Tương tự như hệ thống số thập phân, trong đó các chữ số của một số không có cùng giá trị, 'ý nghĩa' của một bit phụ thuộc vào vị trí của nó trong số nhị phân. Ví dụ, các chữ số trong số thập phân 666 giống nhau, nhưng có giá trị khác nhau.

Byte

Một byte bao gồm tám bit.

  • Nếu một bit là một chữ số, thì hợp lý là các byte đại diện cho các số.

  • Tất cả các phép toán có thể được thực hiện dựa trên chúng.

  • Các chữ số trong một byte cũng không có cùng ý nghĩa.

  • Bit ngoài cùng bên trái có giá trị lớn nhất được gọi là Bit quan trọng nhất (MSB).

  • Bit ngoài cùng bên phải có giá trị nhỏ nhất và do đó, được gọi là Bit ít quan trọng nhất (LSB).

  • Vì tám số không và các số không của một byte có thể được kết hợp theo 256 cách khác nhau, nên số thập phân lớn nhất có thể được biểu thị bằng một byte là 255 (một kết hợp biểu thị số 0).

Các ngắt dừng công việc hiện tại của Arduino để một số công việc khác có thể được thực hiện.

Giả sử bạn đang ngồi ở nhà, trò chuyện với ai đó. Đột nhiên điện thoại đổ chuông. Bạn ngừng trò chuyện và nhấc điện thoại để nói chuyện với người gọi. Khi bạn kết thúc cuộc trò chuyện qua điện thoại, bạn quay lại trò chuyện với người đó trước khi điện thoại đổ chuông.

Tương tự, bạn có thể nghĩ về thói quen chính là trò chuyện với ai đó, chuông điện thoại khiến bạn ngừng trò chuyện. Quy trình dịch vụ gián đoạn là quy trình nói chuyện qua điện thoại. Khi cuộc trò chuyện qua điện thoại kết thúc, bạn quay trở lại thói quen trò chuyện chính của mình. Ví dụ này giải thích chính xác cách một ngắt khiến bộ xử lý hoạt động.

Chương trình chính đang chạy và thực hiện một số chức năng trong mạch. Tuy nhiên, khi một ngắt xảy ra, chương trình chính sẽ tạm dừng trong khi một quy trình khác được thực hiện. Khi quy trình này kết thúc, bộ xử lý sẽ quay lại quy trình chính một lần nữa.

Những đặc điểm quan trọng

Dưới đây là một số tính năng quan trọng về ngắt -

  • Ngắt có thể đến từ nhiều nguồn khác nhau. Trong trường hợp này, chúng tôi đang sử dụng ngắt phần cứng được kích hoạt bởi sự thay đổi trạng thái trên một trong các chân kỹ thuật số.

  • Hầu hết các thiết kế Arduino đều có hai ngắt phần cứng (được gọi là "ngắt0" và "ngắt1") được nối với các chân I / O kỹ thuật số 2 và 3 tương ứng.

  • Arduino Mega có sáu ngắt phần cứng bao gồm các ngắt bổ sung ("ngắt 2" đến "ngắt 5") trên các chân 21, 20, 19 và 18.

  • Bạn có thể xác định một quy trình bằng cách sử dụng một chức năng đặc biệt được gọi là “Quy trình Dịch vụ Ngắt” (thường được gọi là ISR).

  • Bạn có thể xác định quy trình và chỉ định các điều kiện ở cạnh tăng, cạnh xuống hoặc cả hai. Tại các điều kiện cụ thể này, ngắt sẽ được bảo dưỡng.

  • Có thể có chức năng đó được thực thi tự động, mỗi khi một sự kiện xảy ra trên một chân đầu vào.

Các loại ngắt

Có hai loại ngắt -

  • Hardware Interrupts - Chúng xảy ra để phản ứng với một sự kiện bên ngoài, chẳng hạn như một chân ngắt bên ngoài đang ở mức cao hoặc thấp.

  • Software Interrupts- Chúng xảy ra để đáp ứng với một lệnh được gửi trong phần mềm. Loại ngắt duy nhất mà “ngôn ngữ Arduino” hỗ trợ là hàm AttachInterrupt ().

Sử dụng ngắt trong Arduino

Ngắt rất hữu ích trong các chương trình Arduino vì nó giúp giải quyết các vấn đề về thời gian. Một ứng dụng tốt của ngắt là đọc bộ mã hóa quay hoặc quan sát đầu vào của người dùng. Nói chung, ISR phải càng ngắn và nhanh càng tốt. Nếu bản phác thảo của bạn sử dụng nhiều ISR, chỉ một ISR có thể chạy tại một thời điểm. Các ngắt khác sẽ được thực hiện sau khi ngắt hiện tại kết thúc theo thứ tự phụ thuộc vào mức độ ưu tiên mà chúng có.

Thông thường, các biến toàn cục được sử dụng để truyền dữ liệu giữa ISR và chương trình chính. Để đảm bảo các biến được chia sẻ giữa ISR và chương trình chính được cập nhật chính xác, hãy khai báo chúng là biến động.

Cú pháp câu lệnh đính kèm

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.

Ba hằng số sau được xác định trước là giá trị hợp lệ:

  • LOW để kích hoạt ngắt bất cứ khi nào chân ở mức thấp.

  • CHANGE để kích hoạt ngắt bất cứ khi nào chân thay đổi giá trị.

  • FALLING bất cứ khi nào ghim đi từ cao xuống thấp.

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
}

Hàng trăm giao thức truyền thông đã được xác định để đạt được sự trao đổi dữ liệu này. Mỗi giao thức có thể được phân loại thành một trong hai loại: song song hoặc nối tiếp.

Giao tiếp song song

Kết nối song song giữa Arduino và thiết bị ngoại vi thông qua các cổng đầu vào / đầu ra là giải pháp lý tưởng cho khoảng cách ngắn hơn lên đến vài mét. Tuy nhiên, trong các trường hợp khác khi cần thiết lập giao tiếp giữa hai thiết bị với khoảng cách xa hơn thì không thể sử dụng kết nối song song. Các giao diện song song truyền nhiều bit cùng một lúc. Chúng thường yêu cầu các bus dữ liệu - truyền qua tám, mười sáu hoặc nhiều dây hơn. Dữ liệu được truyền theo làn sóng lớn, đột ngột của 1 và 0.

Ưu điểm và nhược điểm của giao tiếp song song

Giao tiếp song song chắc chắn có lợi thế của nó. Nó nhanh hơn nối tiếp, đơn giản và tương đối dễ thực hiện. Tuy nhiên, nó yêu cầu nhiều cổng và đường truyền vào / ra (I / O). Nếu bạn đã từng phải chuyển một dự án từ Arduino Uno cơ bản sang Mega, bạn biết rằng các dòng I / O trên bộ vi xử lý có thể rất quý và rất ít. Do đó, chúng tôi thích giao tiếp nối tiếp hơn, hy sinh tốc độ tiềm năng cho bất động sản pin.

Mô-đun giao tiếp nối tiếp

Ngày nay, hầu hết các bảng Arduino được xây dựng với một số hệ thống khác nhau để giao tiếp nối tiếp như một thiết bị tiêu chuẩn.

Hệ thống nào trong số những hệ thống này được sử dụng phụ thuộc vào các yếu tố sau:

  • Bộ vi điều khiển có bao nhiêu thiết bị để trao đổi dữ liệu?
  • Việc trao đổi dữ liệu phải nhanh như thế nào?
  • Khoảng cách giữa các thiết bị này là bao nhiêu?
  • Có cần thiết phải gửi và nhận dữ liệu đồng thời không?

Một trong những điều quan trọng nhất liên quan đến giao tiếp nối tiếp là Protocol, cần được tuân thủ nghiêm ngặt. Đó là một tập hợp các quy tắc, phải được áp dụng để các thiết bị có thể diễn giải chính xác dữ liệu mà chúng trao đổi lẫn nhau. May mắn thay, Arduino tự động xử lý điều này, do đó công việc của lập trình viên / người dùng được giảm xuống đơn giản là ghi (dữ liệu được gửi) và đọc (dữ liệu nhận được).

Các loại truyền thông nối tiếp

Giao tiếp nối tiếp có thể được phân loại thêm là -

  • Synchronous - Các thiết bị được đồng bộ hóa sử dụng cùng một đồng hồ và thời gian của chúng được đồng bộ hóa với nhau.

  • Asynchronous - Các thiết bị không đồng bộ có đồng hồ riêng và được kích hoạt bởi đầu ra của trạng thái trước đó.

Rất dễ dàng để tìm ra một thiết bị có đồng bộ hay không. Nếu đồng hồ giống nhau được cấp cho tất cả các thiết bị được kết nối, thì chúng là đồng bộ. Nếu không có dòng đồng hồ, nó là không đồng bộ.

Ví dụ, mô-đun UART (Máy phát nhận không đồng bộ chung) là không đồng bộ.

Giao thức nối tiếp không đồng bộ có một số quy tắc tích hợp sẵn. Những quy tắc này không là gì ngoài các cơ chế giúp đảm bảo truyền dữ liệu mạnh mẽ và không có lỗi. Các cơ chế này, chúng tôi nhận được để tránh tín hiệu đồng hồ bên ngoài, là -

  • Đồng bộ hóa bit
  • Các bit dữ liệu
  • Bit chẵn lẻ
  • Tốc độ truyền

Đồng bộ hóa bit

Các bit đồng bộ hóa là hai hoặc ba bit đặc biệt được truyền với mỗi gói dữ liệu. Chúng là bit bắt đầu và (các) bit dừng. Đúng như tên gọi, các bit này lần lượt đánh dấu phần đầu và phần cuối của gói tin.

Luôn chỉ có một bit bắt đầu, nhưng số lượng bit dừng có thể định cấu hình thành một hoặc hai (mặc dù nó thường được để ở một).

Bit bắt đầu luôn được biểu thị bằng một dòng dữ liệu nhàn rỗi đi từ 1 đến 0, trong khi (các) bit dừng sẽ chuyển trở lại trạng thái không tải bằng cách giữ dòng ở mức 1.

Bits dữ liệu

Lượng dữ liệu trong mỗi gói có thể được đặt thành bất kỳ kích thước nào từ 5 đến 9 bit. Chắc chắn, kích thước dữ liệu tiêu chuẩn là byte 8 bit cơ bản của bạn, nhưng các kích thước khác có công dụng của chúng. Một gói dữ liệu 7-bit có thể hiệu quả hơn 8, đặc biệt nếu bạn chỉ chuyển các ký tự ASCII 7-bit.

Bit chẵn lẻ

Người dùng có thể chọn xem có nên có một bit chẵn lẻ hay không và nếu có, liệu chẵn lẻ phải là lẻ hay chẵn. Bit chẵn lẻ là 0 nếu số của 1 trong số các bit dữ liệu là chẵn. Chẵn lẻ kỳ quặc thì ngược lại.

Tốc độ truyền

Thuật ngữ tốc độ baud được sử dụng để biểu thị số lượng bit được truyền mỗi giây [bps]. Lưu ý rằng nó đề cập đến bit, không phải byte. Giao thức thường yêu cầu mỗi byte được chuyển cùng với một số bit điều khiển. Nó có nghĩa là một byte trong luồng dữ liệu nối tiếp có thể bao gồm 11 bit. Ví dụ: nếu tốc độ truyền là 300 bps thì tối đa 37 byte và tối thiểu 27 byte có thể được truyền mỗi giây.

Arduino UART

Đoạn mã sau sẽ làm cho Arduino gửi hello world khi nó khởi động.

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

void loop() {

}

Sau khi bản phác thảo Arduino đã được tải lên Arduino, hãy mở màn hình nối tiếp

ở phần trên cùng bên phải của Arduino IDE.

Nhập bất kỳ thứ gì vào hộp trên cùng của Serial Monitor và nhấn gửi hoặc nhập trên bàn phím của bạn. Thao tác này sẽ gửi một loạt byte tới Arduino.

Đoạn mã sau trả về bất cứ thứ gì nó nhận được làm đầu vào.

Đoạn mã sau sẽ làm cho Arduino cung cấp đầu ra tùy thuộc vào đầu vào được cung cấp.

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
   }
}

Thông báo rằng Serial.printSerial.println sẽ gửi lại mã ASCII thực, trong khi Serial.writesẽ gửi lại văn bản thực tế. Xem mã ASCII để biết thêm thông tin.

Mạch tích hợp liên (I2C) là hệ thống trao đổi dữ liệu nối tiếp giữa vi điều khiển và mạch tích hợp chuyên dụng thế hệ mới. Nó được sử dụng khi khoảng cách giữa chúng ngắn (máy thu và máy phát thường nằm trên cùng một bảng in). Kết nối được thiết lập thông qua hai dây dẫn. Một được sử dụng để truyền dữ liệu và một được sử dụng để đồng bộ hóa (tín hiệu đồng hồ).

Như được thấy trong hình sau, một thiết bị luôn là thiết bị chính. Nó thực hiện định địa chỉ của một chip phụ trước khi bắt đầu giao tiếp. Bằng cách này, một vi điều khiển có thể giao tiếp với 112 thiết bị khác nhau. Tốc độ truyền thường là 100 Kb / giây (chế độ tiêu chuẩn) hoặc 10 Kb / giây (chế độ tốc độ truyền chậm). Các hệ thống có tốc độ truyền 3,4 Mb / giây đã xuất hiện gần đây. Khoảng cách giữa các thiết bị giao tiếp qua bus I2C được giới hạn trong vài mét.

Bảng I2C Pins

Bus I2C bao gồm hai tín hiệu - SCL và SDA. SCL là tín hiệu đồng hồ, và SDA là tín hiệu dữ liệu. Bus chính hiện tại luôn tạo ra tín hiệu đồng hồ. Một số thiết bị phụ có thể buộc đồng hồ ở mức thấp để trì hoãn thiết bị chính gửi thêm dữ liệu (hoặc yêu cầu thêm thời gian để chuẩn bị dữ liệu trước khi thiết bị chính cố gắng xử lý nó). Điều này được gọi là "đồng hồ kéo dài".

Sau đây là các chân cho các bảng Arduino khác nhau:

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

Arduino I2C

Chúng tôi có hai chế độ - mã chủ và mã phụ - để kết nối hai bảng Arduino bằng I2C. Họ là -

  • Máy phát chính / Máy thu nô lệ
  • Bộ thu chính / Bộ phát nô lệ

Máy phát chính / Máy thu nô lệ

Bây giờ chúng ta hãy xem bộ phát chính và bộ thu phụ là gì.

Máy phát chính

Các chức năng sau được sử dụng để khởi tạo thư viện Wire và tham gia bus I2C với tư cách là master hoặc slave. Điều này thường chỉ được gọi một lần.

  • Wire.begin(address) - Địa chỉ là địa chỉ nô lệ 7-bit trong trường hợp của chúng ta vì cái chính không được chỉ định và nó sẽ tham gia bus với tư cách là cái chính.

  • Wire.beginTransmission(address) - Bắt đầu truyền đến thiết bị tớ I2C với địa chỉ đã cho.

  • Wire.write(value) - Xếp hàng các byte để truyền từ thiết bị chủ đến thiết bị phụ (ở giữa các cuộc gọi đến beginTransmission () và endTransmission ()).

  • Wire.endTransmission() - Kết thúc quá trình truyền đến thiết bị phụ đã được bắt đầu bởi beginTransmission () và truyền các byte đã được xếp hàng bởi 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); 
}

Người nhận nô lệ

Các chức năng sau được sử dụng:

  • Wire.begin(address) - Địa chỉ là địa chỉ nô lệ 7 bit.

  • Wire.onReceive(received data handler) - Hàm được gọi khi thiết bị tớ nhận dữ liệu từ thiết bị chủ.

  • Wire.available() - Trả về số byte có sẵn để truy xuất với Wire.read (). Điều này sẽ được gọi bên trong trình xử lý 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
   }
}

Bộ thu chính / Bộ phát nô lệ

Bây giờ chúng ta hãy xem bộ thu chính và bộ phát phụ là gì.

Bộ thu chính

Master, được lập trình để yêu cầu, và sau đó đọc các byte dữ liệu được gửi từ Slave Arduino có địa chỉ duy nhất.

Hàm sau được sử dụng:

Wire.requestFrom(address,number of bytes)- Được sử dụng bởi master để yêu cầu byte từ thiết bị phụ. Sau đó, các byte có thể được truy xuất bằng các hàm wire.available () và 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); 
}

Máy phát nô lệ

Chức năng sau được sử dụng.

Wire.onRequest(handler) - Một chức năng được gọi khi một chủ yêu cầu dữ liệu từ thiết bị phụ này.

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++; 
}

Bus Giao diện Ngoại vi Nối tiếp (SPI) là một hệ thống dành cho giao tiếp nối tiếp, sử dụng tối đa bốn dây dẫn, thường là ba. Một dây dẫn được sử dụng để nhận dữ liệu, một dây để gửi dữ liệu, một dây để đồng bộ hóa và một dây dẫn khác để chọn thiết bị để giao tiếp. Đó là kết nối song công, có nghĩa là dữ liệu được gửi và nhận đồng thời. Tốc độ truyền tối đa cao hơn tốc độ truyền trong hệ thống truyền thông I2C.

Bảng SPI Pins

SPI sử dụng bốn dây sau:

  • SCK - Đây là đồng hồ nối tiếp do chủ nhân điều khiển.

  • MOSI - Đây là đầu ra chính / đầu vào phụ do chủ điều khiển.

  • MISO - Đây là đầu vào chính / đầu ra phụ do chủ điều khiển.

  • SS - Đây là dây chọn nô lệ.

Các chức năng sau được sử dụng. Bạn phải bao gồm SPI.h.

  • SPI.begin() - Khởi tạo bus SPI bằng cách đặt SCK, MOSI và SS thành đầu ra, kéo SCK và MOSI xuống thấp, và SS cao.

  • SPI.setClockDivider(divider)- Đặt bộ chia đồng hồ SPI so với đồng hồ hệ thống. Trên bo mạch dựa trên AVR, các bộ chia có sẵn là 2, 4, 8, 16, 32, 64 hoặc 128. Cài đặt mặc định là SPI_CLOCK_DIV4, đặt đồng hồ SPI thành một phần tư tần số của đồng hồ hệ thống (5 Mhz cho bo mạch ở 20 MHz).

  • Divider - Có thể là (SPI_CLOCK_DIV2, SPI_CLOCK_DIV4, SPI_CLOCK_DIV8, SPI_CLOCK_DIV16, SPI_CLOCK_DIV32, SPI_CLOCK_DIV64, SPI_CLOCK_DIV128).

  • SPI.transfer(val) - Truyền SPI dựa trên việc gửi và nhận đồng thời: dữ liệu nhận được sẽ được trả lại trong acceptVal.

  • SPI.beginTransaction(SPISettings(speedMaximum, dataOrder, dataMode)) - speedMaximum là đồng hồ, dataOrder (MSBFIRST hoặc LSBFIRST), dataMode (SPI_MODE0, SPI_MODE1, SPI_MODE2 hoặc SPI_MODE3).

Chúng tôi có bốn chế độ hoạt động trong SPI như sau:

  • Mode 0 (the default) - Đồng hồ thường ở mức thấp (CPOL = 0), và dữ liệu được lấy mẫu khi chuyển đổi từ thấp lên cao (cạnh trước) (CPHA = 0).

  • Mode 1 - Đồng hồ thường ở mức thấp (CPOL = 0) và dữ liệu được lấy mẫu khi chuyển đổi từ cao xuống thấp (cạnh sau) (CPHA = 1).

  • Mode 2 - Đồng hồ thường ở mức cao (CPOL = 1), và dữ liệu được lấy mẫu khi chuyển đổi từ mức cao xuống mức thấp (cạnh trước) (CPHA = 0).

  • Mode 3 - Đồng hồ thường ở mức cao (CPOL = 1), và dữ liệu được lấy mẫu khi chuyển đổi từ thấp lên cao (cạnh sau) (CPHA = 1).

  • SPI.attachInterrupt(handler) - Hàm được gọi khi thiết bị tớ nhận dữ liệu từ thiết bị chủ.

Bây giờ, chúng ta sẽ kết nối hai bảng Arduino UNO với nhau; một người là chủ và người kia là nô lệ.

  • (SS): chân 10
  • (MOSI): chân 11
  • (MISO): chân 12
  • (SCK): chân 13

Mặt bằng là chung. Sau đây là biểu diễn sơ đồ của kết nối giữa cả hai bảng -

Chúng ta hãy xem các ví dụ về SPI là Master và SPI là Slave.

SPI là MASTER

Thí dụ

#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);
}

SPI dưới dạng SLAVE

Thí dụ

#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
   }
}

Đèn LED là loại đèn chiếu sáng nhỏ, mạnh được sử dụng trong nhiều ứng dụng khác nhau. Để bắt đầu, chúng ta sẽ làm việc với đèn LED nhấp nháy, Hello World của vi điều khiển. Nó đơn giản như bật và tắt đèn. Việc thiết lập đường cơ sở quan trọng này sẽ cung cấp cho bạn một nền tảng vững chắc khi chúng tôi hướng tới các thử nghiệm phức tạp hơn.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × LED
  • Điện trở 1 × 330Ω
  • 2 × Jumper

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình bên dưới.

Note- Để tìm ra cực của đèn LED, hãy quan sát nó thật kỹ. Hai chân càng ngắn về phía mép phẳng của bóng đèn cho biết cực âm.

Các thành phần như điện trở cần phải được uốn cong các thiết bị đầu cuối thành các góc 90 ° để khớp với ổ cắm của bảng mạch chính. Bạn cũng có thể cắt ngắn các thiết bị đầu cuối.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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
}

Mã cần lưu ý

pinMode(2, OUTPUT)- Trước khi có thể sử dụng một trong các chân của Arduino, bạn cần cho Arduino Uno R3 biết đó là ĐẦU VÀO hay ĐẦU RA. Chúng tôi sử dụng một “hàm” tích hợp được gọi là pinMode () để thực hiện việc này.

digitalWrite(2, HIGH) - Khi bạn đang sử dụng một chân như một OUTPUT, bạn có thể ra lệnh cho nó là HIGH (đầu ra 5 volt) hoặc LOW (đầu ra 0 volt).

Kết quả

Bạn sẽ thấy đèn LED bật và tắt. Nếu đầu ra cần thiết không được nhìn thấy, hãy đảm bảo rằng bạn đã lắp ráp mạch chính xác, đồng thời xác minh và tải mã lên bảng của bạn.

Ví dụ này minh họa việc sử dụng hàm analogWrite () trong việc tắt đèn LED. AnalogWrite sử dụng điều chế độ rộng xung (PWM), bật và tắt chân kỹ thuật số rất nhanh với các tỷ lệ khác nhau giữa bật và tắt, để tạo ra hiệu ứng mờ dần.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × LED
  • Điện trở 1 × 330Ω
  • 2 × Jumper

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình bên dưới.

Note- Để tìm ra cực của đèn LED, hãy quan sát nó thật kỹ. Hai chân càng ngắn về phía mép phẳng của bóng đèn cho biết cực âm.

Các thành phần như điện trở cần phải được uốn cong các thiết bị đầu cuối thành các góc 90 ° để khớp với ổ cắm của bảng mạch chính. Bạn cũng có thể cắt ngắn các thiết bị đầu cuối.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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);
}

Mã cần lưu ý

Sau khi khai báo chân 9 là chân LED của bạn, bạn không cần phải làm gì trong hàm setup () của mã. Hàm analogWrite () mà bạn sẽ sử dụng trong vòng lặp chính của mã của mình yêu cầu hai đối số: Một, cho hàm biết chân nào sẽ ghi vào và hàm kia cho biết giá trị PWM cần ghi.

Để tắt và bật đèn LED, hãy tăng dần các giá trị PWM từ 0 (tất cả các cách tắt) đến 255 (tất cả các cách bật), và sau đó trở lại 0, để hoàn thành chu kỳ. Trong bản phác thảo ở trên, giá trị PWM được đặt bằng cách sử dụng một biến gọi là độ sáng. Mỗi lần qua vòng lặp, nó tăng theo giá trị của biếnfadeAmount.

Nếu độ sáng ở một trong hai cực trị của nó (0 hoặc 255), thì fadeAmount được thay đổi thành âm. Nói cách khác, nếu fadeAmount là 5, thì nó được đặt thành -5. Nếu nó là -5, thì nó được đặt thành 5. Lần tiếp theo trong vòng lặp, sự thay đổi này khiến độ sáng cũng thay đổi theo hướng.

analogWrite()có thể thay đổi giá trị PWM rất nhanh, vì vậy độ trễ ở cuối bản phác thảo sẽ kiểm soát tốc độ mờ dần. Hãy thử thay đổi giá trị của độ trễ và xem cách nó thay đổi hiệu ứng mờ dần.

Kết quả

Bạn sẽ thấy độ sáng của đèn LED thay đổi dần dần.

Ví dụ này sẽ chỉ cho bạn cách đọc đầu vào tương tự trên chân tương tự 0. Đầu vào được chuyển đổi từ analogRead () thành điện áp và được in ra màn hình nối tiếp của Phần mềm Arduino (IDE).

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • Biến trở 1 × 5K (chiết áp)
  • 2 × Jumper

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình bên dưới.

Chiết áp

Chiết áp (hoặc nồi) là một bộ chuyển đổi cơ điện đơn giản. Nó chuyển đổi chuyển động quay hoặc chuyển động thẳng từ người điều khiển đầu vào thành sự thay đổi của điện trở. Thay đổi này (hoặc có thể) được sử dụng để kiểm soát mọi thứ từ âm lượng của hệ thống hi-fi đến hướng của một con tàu container khổng lồ.

Cái nồi như chúng ta biết ban đầu được biết đến như một bộ biến trở (về cơ bản là một biến trở quấn dây). Sự đa dạng của các loại chậu có sẵn hiện nay khá đáng kinh ngạc và có thể rất khó khăn cho người mới bắt đầu (đặc biệt) để tìm ra loại nào phù hợp cho một nhiệm vụ nhất định. Một vài loại nồi khác nhau, tất cả đều có thể được sử dụng cho cùng một nhiệm vụ khiến công việc trở nên khó khăn hơn.

Hình ảnh bên trái cho thấy biểu tượng sơ đồ tiêu chuẩn của một cái chậu. Hình ảnh bên phải là chiết áp.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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);
}

Mã cần lưu ý

Trong chương trình hoặc bản phác thảo dưới đây, điều đầu tiên bạn làm trong chức năng thiết lập là bắt đầu giao tiếp nối tiếp, với tốc độ 9600 bit mỗi giây, giữa bo mạch và máy tính của bạn bằng đường dây -

Serial.begin(9600);

Trong vòng lặp chính của mã của bạn, bạn cần thiết lập một biến để lưu trữ giá trị điện trở (sẽ nằm trong khoảng từ 0 đến 1023, hoàn hảo cho kiểu dữ liệu int) đến từ chiết áp của bạn -

int sensorValue = analogRead(A0);

Để thay đổi các giá trị từ 0-1023 thành một phạm vi tương ứng với điện áp, chân đang đọc, bạn cần tạo một biến khác, một float và thực hiện một phép tính nhỏ. Để chia tỷ lệ các số từ 0,0 đến 5,0, hãy chia 5,0 cho 1023,0 và nhân nó với sensorValue -

float voltage= sensorValue * (5.0 / 1023.0);

Cuối cùng, bạn cần in thông tin này vào cửa sổ nối tiếp của mình. Bạn có thể thực hiện việc này bằng lệnh Serial.println () trong dòng mã cuối cùng của bạn -

Serial.println(voltage)

Bây giờ, mở Serial Monitor trong Arduino IDE bằng cách nhấp vào biểu tượng ở phía bên phải của thanh màu xanh lá cây trên cùng hoặc nhấn Ctrl + Shift + M.

Kết quả

Bạn sẽ thấy một dòng số ổn định trong khoảng từ 0,0 - 5,0. Khi bạn xoay nồi, các giá trị sẽ thay đổi, tương ứng với điện áp tại chân A0.

Ví dụ này cho bạn thấy cách đọc đầu vào tương tự tại chân 0 tương tự, chuyển đổi các giá trị từ analogRead () thành điện áp và in nó ra màn hình nối tiếp của Phần mềm Arduino (IDE).

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × 5k ohm biến trở (chiết áp)
  • 2 × Jumper
  • 8 × LED hoặc bạn có thể sử dụng (hiển thị đồ thị thanh LED như trong hình ảnh bên dưới)

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình bên dưới.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Đồ thị thanh LED 10 đoạn

Đèn LED biểu đồ thanh 10 đoạn này có rất nhiều công dụng. Với kích thước nhỏ gọn, móc treo đơn giản, chúng dễ dàng cho các sản phẩm nguyên mẫu hoặc thành phẩm. Về cơ bản, chúng là 10 đèn LED xanh lam riêng lẻ được đặt cùng nhau, mỗi đèn có kết nối cực dương và cực âm riêng.

Chúng cũng có các màu vàng, đỏ và xanh lá cây.

Note- Giá trị ghim trên các biểu đồ thanh này có thể khác với những gì được liệt kê trên biểu dữ liệu. Xoay thiết bị 180 độ sẽ sửa thay đổi, làm cho chân 11 trở thành chân đầu tiên thẳng hàng.

Mã 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);
      }
   }
}

Mã cần lưu ý

Bản phác thảo hoạt động như thế này: đầu tiên, bạn đọc đầu vào. Bạn ánh xạ giá trị đầu vào cho phạm vi đầu ra, trong trường hợp này là mười đèn LED. Sau đó, bạn thiết lập mộtfor-loopđể lặp lại các kết quả đầu ra. Nếu số của đầu ra trong chuỗi thấp hơn phạm vi đầu vào được ánh xạ, bạn bật nó lên. Nếu không, bạn tắt nó đi.

Kết quả

Bạn sẽ thấy đèn LED BẬT từng cái một khi giá trị của số đọc tương tự tăng lên và TẮT từng cái một trong khi số đọc đang giảm.

Ví dụ này sử dụng thư viện Bàn phím để đăng xuất bạn khỏi phiên người dùng trên máy tính của bạn khi chân 2 trên ARDUINO UNO được kéo xuống đất. Bản phác thảo mô phỏng việc nhấn phím theo trình tự của hai hoặc ba phím cùng lúc và sau một khoảng thời gian ngắn, nó sẽ nhả chúng ra.

Warning - Khi bạn sử dụng Keyboard.print()lệnh, Arduino tiếp quản bàn phím máy tính của bạn. Để đảm bảo bạn không mất quyền kiểm soát máy tính của mình trong khi chạy bản phác thảo với chức năng này, hãy thiết lập một hệ thống điều khiển đáng tin cậy trước khi bạn gọi Keyboard.print (). Bản phác thảo này được thiết kế để chỉ gửi lệnh Bàn phím sau khi ghim đã được kéo xuống đất.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Leonardo, Micro hoặc bảng Do
  • 1 × nút bấm
  • 1 × Jumper

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Đối với ví dụ này, bạn cần sử dụng Arduino IDE 1.6.7

Note- Bạn phải đưa thư viện bàn phím vào tệp thư viện Arduino của mình. Sao chép và dán tệp thư viện bàn phím vào bên trong tệp với các thư viện tên (được đánh dấu) như được hiển thị trong ảnh chụp màn hình sau.

Mã 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);
}

Mã cần lưu ý

Trước khi bạn tải chương trình lên bảng của mình, hãy đảm bảo rằng bạn chỉ định đúng hệ điều hành mà bạn hiện đang sử dụng cho biến nền tảng.

Trong khi bản phác thảo đang chạy, nhấn nút sẽ kết nối chân 2 với mặt đất và bo mạch sẽ gửi trình tự đăng xuất đến PC được kết nối USB.

Kết quả

Khi bạn kết nối chân 2 với đất, nó sẽ thực hiện thao tác đăng xuất.

Nó sử dụng các tổ hợp bàn phím sau để đăng xuất:

  • Trên Windows, CTRL-ALT-DEL theo sau là ALT-l

  • Trên Ubuntu, CTRL-ALT-DEL và ENTER

  • Trên OSX, CMD-SHIFT-q

Trong ví dụ này, khi nút được nhấn, một chuỗi văn bản sẽ được gửi đến máy tính dưới dạng đầu vào bàn phím. Chuỗi báo cáo số lần nút được nhấn. Khi bạn đã lập trình và kết nối Leonardo, hãy mở trình soạn thảo văn bản yêu thích của bạn để xem kết quả.

Warning - Khi bạn sử dụng Keyboard.print()lệnh, Arduino tiếp quản bàn phím máy tính của bạn. Để đảm bảo bạn không mất quyền kiểm soát máy tính của mình trong khi chạy bản phác thảo với chức năng này, hãy thiết lập hệ thống điều khiển đáng tin cậy trước khi bạn gọiKeyboard.print(). Bản phác thảo này bao gồm một nút ấn để bật tắt bàn phím, để bàn phím chỉ chạy sau khi nhấn nút.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Leonardo, Micro hoặc bảng Do
  • 1 × nút bấm tạm thời
  • Điện trở 1 × 10k ohm

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình bên dưới.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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;
}

Mã cần lưu ý

Gắn một đầu cuối của nút bấm vào chân 4 trên Arduino. Gắn chân kia vào 5V. Sử dụng điện trở như một bộ kéo xuống, cung cấp tham chiếu đến đất bằng cách gắn nó từ chân 4 xuống đất.

Khi bạn đã lập trình bảng của mình, hãy rút cáp USB, mở trình soạn thảo văn bản và đặt con trỏ văn bản vào vùng nhập. Kết nối lại bảng với máy tính của bạn thông qua USB và nhấn nút để ghi vào tài liệu.

Kết quả

Bằng cách sử dụng bất kỳ trình soạn thảo văn bản nào, nó sẽ hiển thị văn bản được gửi qua Arduino.

Sử dụng thư viện Chuột, bạn có thể điều khiển con trỏ trên màn hình của máy tính bằng Arduino Leonardo, Micro hoặc Due.

Ví dụ cụ thể này sử dụng năm nút bấm để di chuyển con trỏ trên màn hình. Bốn trong số các nút là hướng (lên, xuống, trái, phải) và một là để nhấp chuột trái. Chuyển động con trỏ từ Arduino luôn là tương đối. Mỗi khi một đầu vào được đọc, vị trí của con trỏ sẽ được cập nhật so với vị trí hiện tại của nó.

Bất cứ khi nào một trong các nút định hướng được nhấn, Arduino sẽ di chuyển chuột, ánh xạ đầu vào CAO tới phạm vi 5 theo hướng thích hợp.

Nút thứ năm là để điều khiển một cú nhấp chuột trái từ chuột. Khi nút được nhả ra, máy tính sẽ nhận ra sự kiện.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Leonardo, bảng Micro hoặc bảng do
  • Điện trở 5 × 10k ohm
  • 5 × nút bấm tạm thời

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Đối với ví dụ này, bạn cần sử dụng Arduino IDE 1.6.7

Mã 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);
}

Mã cần lưu ý

Kết nối bo mạch của bạn với máy tính bằng cáp micro-USB. Các nút được kết nối với đầu vào kỹ thuật số từ chân 2 đến chân 6. Đảm bảo bạn sử dụng điện trở kéo xuống 10k.

Ví dụ này lắng nghe một byte đến từ cổng nối tiếp. Khi nhận được, bo mạch sẽ gửi lại một tổ hợp phím cho máy tính. Tổ hợp phím đã gửi cao hơn một phím so với tổ hợp phím nhận được, vì vậy nếu bạn gửi "a" từ màn hình nối tiếp, bạn sẽ nhận được "b" từ bảng kết nối với máy tính. "1" sẽ trả về "2", v.v.

Warning - Khi bạn sử dụng Keyboard.print()lệnh, bảng Leonardo, Micro hoặc Due tiếp quản bàn phím máy tính của bạn. Để đảm bảo bạn không mất quyền kiểm soát máy tính của mình trong khi chạy bản phác thảo với chức năng này, hãy thiết lập một hệ thống điều khiển đáng tin cậy trước khi bạn gọi Keyboard.print (). Bản phác thảo này được thiết kế để chỉ gửi lệnh Bàn phím sau khi bảng đã nhận được một byte qua cổng nối tiếp.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Arduino Leonardo, Micro hoặc bảng Do

Thủ tục

Chỉ cần kết nối bo mạch của bạn với máy tính bằng cáp USB.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Notes- Bạn phải đưa thư viện bàn phím vào tệp thư viện Arduino của mình. Sao chép và dán tệp thư viện bàn phím vào bên trong tệp có tên 'thư viện' được đánh dấu bằng màu vàng.

Mã 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);
   }
}

Mã cần lưu ý

Sau khi được lập trình, hãy mở màn hình nối tiếp của bạn và gửi một byte. Bảng sẽ trả lời bằng một tổ hợp phím, tức là cao hơn một số.

Kết quả

Bo mạch sẽ trả lời bằng một tổ hợp phím cao hơn một số trên màn hình nối tiếp Arduino IDE khi bạn gửi một byte.

Trong phần này, chúng ta sẽ tìm hiểu cách giao diện bảng Arduino của chúng ta với các cảm biến khác nhau. Chúng ta sẽ thảo luận về các cảm biến sau:

  • Cảm biến độ ẩm (DHT22)
  • Cảm biến nhiệt độ (LM35)
  • Cảm biến phát hiện nước (Kích hoạt nước đơn giản)
  • CẢM BIẾN PIR
  • THIẾT BỊ CẢM BIẾN SÓNG SIÊU ÂM
  • GPS

Cảm biến độ ẩm (DHT22)

DHT-22 (còn được đặt tên là AM2302) là cảm biến đầu ra kỹ thuật số, độ ẩm tương đối và nhiệt độ. Nó sử dụng cảm biến độ ẩm điện dung và một điện trở nhiệt để đo không khí xung quanh, và gửi tín hiệu kỹ thuật số trên chân dữ liệu.

Trong ví dụ này, bạn sẽ học cách sử dụng cảm biến này với Arduino UNO. Nhiệt độ và độ ẩm trong phòng sẽ được in ra màn hình nối tiếp.

Cảm biến DHT-22

Các kết nối rất đơn giản. Chân đầu tiên bên trái vào nguồn 3-5V, chân thứ hai vào chân đầu vào dữ liệu và chân ngoài cùng bên phải nối đất.

Chi tiết kỹ thuật

  • Power - 3-5V

  • Max Current - 2,5mA

  • Humidity - 0-100%, độ chính xác 2-5%

  • Temperature - Độ chính xác từ 40 đến 80 ° C, ± 0,5 ° C

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × DHT22
  • Điện trở 1 × 10K ohm

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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");
}

Mã cần lưu ý

Cảm biến DHT22 có bốn đầu cuối (V cc , DATA, NC, GND), được kết nối với bo mạch như sau:

  • Chân DATA đến chân Arduino số 2
  • Chân V cc đến 5 volt của bảng Arduino
  • Ghim GND vào mặt đất của bảng Arduino
  • Chúng ta cần phải kết nối 10k ohm resistor (pull up resistor) giữa DATA và V cc pin

Sau khi kết nối phần cứng hoàn tất, bạn cần thêm thư viện DHT22 vào tệp thư viện Arduino của mình như đã mô tả trước đó.

Kết quả

Bạn sẽ thấy màn hình hiển thị nhiệt độ và độ ẩm trên màn hình cổng nối tiếp được cập nhật sau mỗi 2 giây.

Dòng cảm biến nhiệt độ LM35 là thiết bị nhiệt độ tích hợp mạch chính xác với điện áp đầu ra tỷ lệ tuyến tính với nhiệt độ Centigrade.

Thiết bị LM35 có lợi thế hơn so với cảm biến nhiệt độ tuyến tính được hiệu chuẩn ở Kelvin, vì người dùng không cần phải trừ điện áp không đổi lớn từ đầu ra để có được tỷ lệ Centigrade thuận tiện. Thiết bị LM35 không yêu cầu bất kỳ hiệu chuẩn hoặc cắt tỉa bên ngoài nào để cung cấp độ chính xác điển hình là ± ¼ ° C ở nhiệt độ phòng và ± ¾ ° C trong phạm vi nhiệt độ từ −55 ° C đến 150 ° C đầy đủ.

Thông số kỹ thuật

  • Được hiệu chuẩn trực tiếp bằng độ C (độ C)
  • Hệ số thang đo tuyến tính + 10 mV / ° C
  • 0,5 ° C đảm bảo độ chính xác (ở 25 ° C)
  • Được đánh giá cho phạm vi từ -55 ° C đến 150 ° C đầy đủ
  • Thích hợp cho các ứng dụng từ xa

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × cảm biến LM35

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình bên dưới.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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
}

Mã cần lưu ý

Cảm biến LM35 có ba đầu cuối - V s , V out và GND. Chúng tôi sẽ kết nối cảm biến như sau:

  • Kết nối + V s đến + 5V trên tàu Arduino của bạn.
  • Kết nối V ra Analog0 hoặc A0 trên bảng Arduino.
  • Kết nối GND với GND trên Arduino.

Bộ chuyển đổi tương tự sang kỹ thuật số (ADC) chuyển đổi các giá trị tương tự thành giá trị gần đúng kỹ thuật số dựa trên công thức Giá trị ADC = mẫu * 1024 / điện áp tham chiếu (+ 5v). Vì vậy, với tham chiếu +5 volt, giá trị xấp xỉ kỹ thuật số sẽ bằng điện áp đầu vào * 205.

Kết quả

Bạn sẽ thấy màn hình hiển thị nhiệt độ trên màn hình cổng nối tiếp được cập nhật mỗi giây.

Gạch cảm biến nước được thiết kế để phát hiện nước, có thể được sử dụng rộng rãi trong việc cảm biến lượng mưa, mực nước và thậm chí rò rỉ chất lỏng.

Kết nối cảm biến nước với Arduino là một cách tuyệt vời để phát hiện rò rỉ, tràn, lũ lụt, mưa, v.v. Nó có thể được sử dụng để phát hiện sự hiện diện, mức độ, khối lượng và / hoặc không có nước. Mặc dù điều này có thể được sử dụng để nhắc bạn tưới cây, nhưng có một cảm biến Grove tốt hơn cho điều đó. Cảm biến có một loạt các dấu vết tiếp xúc, có giá trị THẤP khi phát hiện có nước.

Trong chương này, chúng tôi sẽ kết nối cảm biến nước với Chân số 8 trên Arduino và sẽ sử dụng đèn LED rất tiện dụng để giúp xác định khi nào cảm biến nước tiếp xúc với nguồn nước.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × Cảm biến nước
  • 1 × dẫn
  • Điện trở 1 × 330 ohm

Thủ tục

Làm theo sơ đồ mạch và nối các thành phần trên breadboard như trong hình bên dưới.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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);
   }
}

Mã cần lưu ý

Cảm biến nước có ba cực - S, V out (+) và GND (-). Kết nối cảm biến như sau:

  • Kết nối + V s đến + 5V trên tàu Arduino của bạn.
  • Kết nối S với chân số 8 trên bảng Arduino.
  • Kết nối GND với GND trên Arduino.
  • Kết nối đèn LED với chân số 9 trong bảng Arduino.

Khi cảm biến phát hiện nước, chân 8 trên Arduino trở nên THẤP và sau đó đèn LED trên Arduino được BẬT.

Kết quả

Bạn sẽ thấy đèn LED chỉ báo BẬT khi cảm biến phát hiện nước.

Cảm biến PIR cho phép bạn cảm nhận chuyển động. Chúng được sử dụng để phát hiện xem một người đã di chuyển vào hoặc ra khỏi phạm vi của cảm biến. Chúng thường được tìm thấy trong các thiết bị và tiện ích được sử dụng tại nhà hoặc cho các doanh nghiệp. Chúng thường được gọi là cảm biến PIR, "Hồng ngoại thụ động", "Nhiệt điện" hoặc "Chuyển động hồng ngoại".

Sau đây là những ưu điểm của Cảm biến PIR -

  • Kích cỡ nhỏ
  • Dải ống kính rộng
  • Giao diện dễ dàng
  • Inexpensive
  • Low-power
  • Dễ sử dụng
  • Không mòn

PIR được làm bằng cảm biến nhiệt điện, một lon kim loại tròn với tinh thể hình chữ nhật ở trung tâm, có thể phát hiện mức bức xạ hồng ngoại. Mọi thứ đều phát ra bức xạ ở mức độ thấp, và cái gì càng nóng thì bức xạ càng nhiều. Cảm biến trong máy dò chuyển động được chia làm hai nửa. Điều này là để phát hiện chuyển động (thay đổi) chứ không phải mức IR trung bình. Hai nửa được kết nối để chúng triệt tiêu lẫn nhau. Nếu một nửa nhìn thấy bức xạ IR nhiều hơn hoặc ít hơn bên kia, đầu ra sẽ tăng hoặc thấp.

PIR có các cài đặt có thể điều chỉnh và có một đầu cắm được lắp vào miếng đệm nối đất / ra / nguồn 3 chân.

Đối với nhiều dự án hoặc sản phẩm cơ bản cần phát hiện khi một người đã rời khỏi hoặc đi vào khu vực, cảm biến PIR là rất tốt. Lưu ý rằng PIR không cho bạn biết số người xung quanh hoặc mức độ gần gũi của họ với cảm biến. Ống kính thường được gắn cố định vào một khoảng quét nhất định ở một khoảng cách xa và chúng đôi khi bị vật nuôi trong nhà đặt ra.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × Cảm biến PIR (MQ3)

Thủ tục

Làm theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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);
      }
   }
}

Mã cần lưu ý

Cảm biến PIR có ba cực - V cc , OUT và GND. Kết nối cảm biến như sau:

  • Kết nối cc + V với + 5v trên bảng Arduino.
  • Kết nối OUT với chân số 2 trên bảng Arduino.
  • Kết nối GND với GND trên Arduino.

Bạn có thể điều chỉnh độ nhạy của cảm biến và thời gian trễ thông qua hai biến trở nằm ở dưới cùng của bảng cảm biến.

Khi cảm biến phát hiện bất kỳ chuyển động nào, Arduino sẽ gửi một thông báo qua cổng nối tiếp để nói rằng chuyển động được phát hiện. Cảm giác chuyển động PIR sẽ trì hoãn trong một thời gian nhất định để kiểm tra xem có chuyển động mới hay không. Nếu không có chuyển động nào được phát hiện, Arduino sẽ gửi một thông báo mới nói rằng chuyển động đã kết thúc.

Kết quả

Bạn sẽ thấy một thông báo trên cổng nối tiếp của mình nếu một chuyển động được phát hiện và một thông báo khác khi chuyển động dừng lại.

Cảm biến siêu âm HC-SR04 sử dụng SONAR để xác định khoảng cách của một vật thể giống như loài dơi. Nó cung cấp khả năng phát hiện phạm vi không tiếp xúc tuyệt vời với độ chính xác cao và số đọc ổn định trong một gói dễ sử dụng từ 2 cm đến 400 cm hoặc 1 ”đến 13 feet.

Hoạt động không bị ảnh hưởng bởi ánh sáng mặt trời hoặc vật liệu đen, mặc dù về mặt âm học, các vật liệu mềm như vải có thể khó phát hiện. Nó hoàn chỉnh với máy phát và mô-đun thu sóng siêu âm.

Thông số kỹ thuật

  • Nguồn cung cấp - + 5V DC
  • Dòng tĩnh lặng - <2mA
  • Làm việc hiện tại - 15mA
  • Góc hiệu dụng - <15 °
  • Khoảng cách - 2cm - 400 cm / 1 ″ - 13ft
  • Độ phân giải - 0,3 cm
  • Góc đo - 30 độ

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × Cảm biến ULTRASONIC (HC-SR04)

Thủ tục

Thực hiện theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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;
}

Mã cần lưu ý

Cảm biến siêu âm có bốn đầu nối - + 5V, Trigger, Echo và GND được kết nối như sau -

  • Kết nối chân + 5V với + 5v trên bảng Arduino của bạn.
  • Kết nối Trigger với chân số 7 trên bảng Arduino của bạn.
  • Kết nối Echo với chân số 6 trên bảng Arduino của bạn.
  • Kết nối GND với GND trên Arduino.

Trong chương trình của chúng tôi, chúng tôi đã hiển thị khoảng cách được cảm biến đo bằng inch và cm thông qua cổng nối tiếp.

Kết quả

Bạn sẽ thấy khoảng cách được cảm biến đo bằng inch và cm trên màn hình nối tiếp Arduino.

Các nút bấm hoặc công tắc kết nối hai thiết bị đầu cuối đang mở trong mạch. Ví dụ này bật đèn LED trên chân 2 khi bạn nhấn công tắc nút bấm được kết nối với chân 8.

Điện trở kéo xuống

Điện trở kéo xuống được sử dụng trong các mạch logic điện tử để đảm bảo rằng các đầu vào của Arduino ổn định ở mức logic dự kiến ​​nếu các thiết bị bên ngoài bị ngắt kết nối hoặc ở mức trở kháng cao. Vì không có gì được kết nối với chân đầu vào, điều đó không có nghĩa là nó là số 0 logic. Điện trở kéo xuống được kết nối giữa mặt đất và chân cắm thích hợp trên thiết bị.

Một ví dụ về điện trở kéo xuống trong mạch kỹ thuật số được thể hiện trong hình sau. Một công tắc nút bấm được kết nối giữa điện áp nguồn và một chân vi điều khiển. Trong mạch như vậy, khi công tắc đóng, đầu vào của bộ điều khiển vi mô ở giá trị cao hợp lý, nhưng khi công tắc mở, điện trở kéo xuống kéo điện áp đầu vào xuống đất (giá trị 0 lôgic), ngăn trạng thái không xác định ở đầu vào.

Điện trở kéo xuống phải có điện trở lớn hơn trở kháng của mạch logic, nếu không nó có thể kéo điện áp xuống quá nhiều và điện áp đầu vào tại chân sẽ duy trì ở giá trị logic thấp không đổi, bất kể vị trí công tắc.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × bảng Arduino UNO
  • Điện trở 1 × 330 ohm
  • Điện trở 1 × 4,7K ohm (kéo xuống)
  • 1 × LED

Thủ tục

Thực hiện theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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);
   }
}

Mã cần lưu ý

Khi công tắc mở, (nút nhấn không được nhấn), không có kết nối giữa hai đầu cuối của nút nhấn, do đó chân cắm được nối với đất (thông qua điện trở kéo xuống) và chúng tôi đọc là LOW. Khi công tắc đóng (nhấn nút bấm), nó tạo kết nối giữa hai đầu cực của nó, kết nối chân cắm với 5 volt, để chúng ta đọc mức CAO.

Kết quả

Đèn LED BẬT khi nhấn nút và TẮT khi nhả nút.

Trong chương này, chúng tôi sẽ giao diện các loại động cơ khác nhau với bảng Arduino (UNO) và hướng dẫn bạn cách kết nối động cơ và điều khiển nó từ bảng của bạn.

Có ba loại động cơ khác nhau -

  • Động cơ DC
  • Động cơ servo
  • Động cơ bước

Động cơ DC (Động cơ dòng điện một chiều) là loại động cơ phổ biến nhất. Động cơ điện một chiều thường chỉ có hai dây dẫn, một dây dẫn dương và một dây dẫn cực âm. Nếu bạn kết nối trực tiếp hai dây dẫn này với pin, động cơ sẽ quay. Nếu bạn chuyển các dây dẫn, động cơ sẽ quay theo hướng ngược lại.

Warning- Không điều khiển động cơ trực tiếp từ các chân bảng Arduino. Điều này có thể làm hỏng bảng. Sử dụng Mạch trình điều khiển hoặc IC.

Chúng tôi sẽ chia chương này thành ba phần -

  • Chỉ cần làm cho động cơ của bạn quay
  • Kiểm soát tốc độ động cơ
  • Điều khiển hướng quay của động cơ DC

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1x bảng Arduino UNO
  • 1x bóng bán dẫn PN2222
  • 1x Động cơ DC 6V nhỏ
  • 1x 1N4001 diode
  • Điện trở 1x 270 Ω

Thủ tục

Thực hiện theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Các biện pháp phòng ngừa

Thực hiện các biện pháp phòng ngừa sau đây khi thực hiện kết nối.

  • Đầu tiên, hãy đảm bảo rằng bóng bán dẫn được kết nối đúng cách. Mặt phẳng của bóng bán dẫn phải đối diện với bảng Arduino như trong hình.

  • Thứ hai, đầu sọc của diode phải hướng về đường nguồn + 5V theo cách sắp xếp như trong hình.

Spin ControlArduino Code

int motorPin = 3;

void setup() {

}

void loop() {
   digitalWrite(motorPin, HIGH);
}

Mã cần lưu ý

Transistor hoạt động giống như một công tắc, điều khiển nguồn điện cho động cơ. Chân 3 của Arduino được sử dụng để bật và tắt bóng bán dẫn và được đặt tên là 'motorPin' trong bản phác thảo.

Kết quả

Động cơ sẽ quay hết tốc độ khi chân Arduino số 3 lên cao.

Kiểm soát tốc độ động cơ

Sau đây là sơ đồ của động cơ DC, được kết nối với bảng Arduino.

Mã 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);
      }
   }
}

Mã cần lưu ý

Transistor hoạt động giống như một công tắc, điều khiển công suất của động cơ. Chân 3 của Arduino được sử dụng để bật và tắt bóng bán dẫn và được đặt tên là 'motorPin' trong bản phác thảo.

Khi chương trình bắt đầu, nó sẽ nhắc bạn cung cấp các giá trị để điều khiển tốc độ của động cơ. Bạn cần nhập giá trị từ 0 đến 255 trong Serial Monitor.

Trong hàm 'loop', lệnh 'Serial.parseInt' được sử dụng để đọc số được nhập dưới dạng văn bản trong Serial Monitor và chuyển nó thành 'int'. Bạn có thể gõ bất kỳ số nào ở đây. Câu lệnh 'if' trong dòng tiếp theo chỉ đơn giản là ghi một số tương tự với số này, nếu số nằm trong khoảng từ 0 đến 255.

Kết quả

Động cơ DC sẽ quay với các tốc độ khác nhau tùy theo giá trị (0 đến 250) nhận được qua cổng nối tiếp.

Kiểm soát hướng quay

Để điều khiển hướng quay của động cơ DC mà không cần hoán đổi các dây dẫn, bạn có thể sử dụng một mạch được gọi là H-Bridge. Cầu H là một mạch điện tử có thể điều khiển động cơ theo cả hai chiều. Cầu H được sử dụng trong nhiều ứng dụng khác nhau. Một trong những ứng dụng phổ biến nhất là điều khiển động cơ trong robot. Nó được gọi là cầu H vì nó sử dụng bốn bóng bán dẫn được kết nối theo cách mà sơ đồ có dạng chữ "H."

Chúng tôi sẽ sử dụng IC L298 H-Bridge ở đây. L298 có thể điều khiển tốc độ và hướng của động cơ DC và động cơ bước, đồng thời có thể điều khiển hai động cơ đồng thời. Đánh giá hiện tại của nó là 2A cho mỗi động cơ. Tuy nhiên, ở những dòng điện này, bạn sẽ cần sử dụng tản nhiệt.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • IC cầu 1 × L298
  • 1 × động cơ DC
  • 1 × Arduino UNO
  • 1 × breadboard
  • 10 × dây jumper

Thủ tục

Sau đây là sơ đồ của giao diện động cơ DC với bảng Arduino Uno.

Sơ đồ trên cho thấy cách kết nối IC L298 để điều khiển hai động cơ. Có ba chân đầu vào cho mỗi động cơ, Input1 (IN1), Input2 (IN2) và Enable1 (EN1) cho Motor1 và Input3, Input4 và Enable2 cho Motor2.

Vì chúng ta sẽ chỉ điều khiển một động cơ trong ví dụ này, chúng ta sẽ kết nối Arduino với IN1 (chân 5), IN2 (chân 7) và Enable1 (chân 6) của IC L298. Chân 5 và 7 là đầu vào kỹ thuật số, tức là đầu vào BẬT hoặc TẮT, trong khi chân 6 cần tín hiệu điều chế độ rộng xung (PWM) để điều khiển tốc độ động cơ.

Bảng sau đây cho biết hướng động cơ sẽ quay dựa trên các giá trị kỹ thuật số của IN1 và IN2.

TRONG 1 TRONG 2 Hành vi động cơ
PHANH
1 Ở ĐẰNG TRƯỚC
1 PHÍA SAU
1 1 PHANH

Chân IN1 của IC L298 được kết nối với chân 8 của Arduino trong khi IN2 được kết nối với chân 9. Hai chân kỹ thuật số này của Arduino điều khiển hướng của động cơ. Chân A của IC được kết nối với chân PWM 2 của Arduino. Điều này sẽ kiểm soát tốc độ của động cơ.

Để đặt giá trị của các chân 8 và 9 của Arduino, chúng ta đã sử dụng hàm digitalWrite (), và để đặt giá trị của chân 2, chúng ta phải sử dụng hàm analogWrite ().

Các bước kết nối

  • Kết nối 5V và nối đất của IC với 5V và nối đất của Arduino, tương ứng.
  • Kết nối động cơ với chân 2 và 3 của IC.
  • Kết nối IN1 của IC với chân 8 của Arduino.
  • Kết nối IN2 của IC với chân 9 của Arduino.
  • Kết nối EN1 của IC với chân 2 của Arduino.
  • Kết nối SENS Một chân của IC với đất.
  • Kết nối Arduino bằng cáp USB Arduino và tải chương trình lên Arduino bằng phần mềm Arduino IDE.
  • Cung cấp nguồn cho bảng Arduino bằng nguồn điện, pin hoặc cáp USB.

Mã 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) ;
}

Kết quả

Đầu tiên động cơ sẽ chạy theo chiều kim đồng hồ (CW) trong 3 giây và sau đó chạy ngược chiều kim đồng hồ (CCW) trong 3 giây.

Động cơ Servo là một thiết bị nhỏ có trục đầu ra. Trục này có thể được định vị đến các vị trí góc cụ thể bằng cách gửi cho servo một tín hiệu được mã hóa. Miễn là tín hiệu được mã hóa tồn tại trên đường đầu vào, servo sẽ duy trì vị trí góc của trục. Nếu tín hiệu mã hóa thay đổi, vị trí góc của trục thay đổi. Trong thực tế, các servo được sử dụng trong máy bay điều khiển bằng sóng vô tuyến để định vị các bề mặt điều khiển như thang máy và bánh lái. Chúng cũng được sử dụng trong ô tô điều khiển bằng sóng radio, con rối, và tất nhiên, cả robot.

Servos cực kỳ hữu ích trong chế tạo robot. Các động cơ nhỏ, có mạch điều khiển tích hợp và cực kỳ mạnh mẽ so với kích thước của chúng. Một servo tiêu chuẩn như Futaba S-148 có mô-men xoắn 42 oz / inch, rất mạnh so với kích thước của nó. Nó cũng lấy công suất tỷ lệ với tải cơ học. Do đó, một servo được tải nhẹ không tiêu tốn nhiều năng lượng.

Ruột của động cơ servo được hiển thị trong hình sau. Bạn có thể thấy mạch điều khiển, động cơ, một bộ bánh răng và vỏ máy. Bạn cũng có thể thấy 3 sợi dây kết nối với thế giới bên ngoài. Một dành cho nguồn (+ 5volts), nối đất, và dây màu trắng là dây điều khiển.

Làm việc của một động cơ Servo

Động cơ servo có một số mạch điều khiển và một chiết áp (một biến trở, còn gọi là nồi) được kết nối với trục đầu ra. Trong hình trên, có thể thấy chiếc nồi nằm ở phía bên phải của bảng mạch. Nồi này cho phép mạch điều khiển theo dõi góc hiện tại của động cơ servo.

Nếu trục ở đúng góc, thì động cơ sẽ tắt. Nếu mạch nhận thấy rằng góc không đúng, nó sẽ quay động cơ cho đến khi nó ở một góc mong muốn. Trục đầu ra của servo có thể di chuyển đến một nơi nào đó xung quanh 180 độ. Thông thường, nó nằm ở đâu đó trong phạm vi 210 độ, tuy nhiên, nó thay đổi tùy thuộc vào nhà sản xuất. Một servo bình thường được sử dụng để điều khiển chuyển động góc từ 0 đến 180 độ. Về mặt cơ học, nó không có khả năng quay xa hơn do có một bộ dừng cơ khí được tích hợp trên bánh răng đầu ra chính.

Công suất cấp cho động cơ tỷ lệ với quãng đường mà nó cần đi được. Vì vậy, nếu trục cần quay một quãng đường lớn, động cơ sẽ chạy hết tốc lực. Nếu nó chỉ cần quay một lượng nhỏ, động cơ sẽ chạy với tốc độ chậm hơn. Đây được gọi làproportional control.

Làm thế nào để bạn giao tiếp với góc mà Servo nên quay?

Dây điều khiển được sử dụng để giao tiếp góc. Góc được xác định bởi khoảng thời gian của một xung được áp dụng cho dây điều khiển. Đây được gọi làPulse Coded Modulation. Servo dự kiến ​​sẽ thấy một xung sau mỗi 20 mili giây (0,02 giây). Độ dài của xung sẽ xác định động cơ quay được bao xa. Ví dụ, một xung 1,5 mili giây sẽ làm cho động cơ quay sang vị trí 90 độ (thường được gọi là vị trí trung tính). Nếu xung ngắn hơn 1,5 mili giây, thì động cơ sẽ quay trục về gần 0 độ. Nếu xung dài hơn 1,5 mili giây, trục quay gần 180 độ.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × bảng Arduino UNO
  • 1 × Động cơ Servo
  • 1 × IC điều khiển ULN2003
  • Điện trở 1 × 10 KΩ

Thủ tục

Thực hiện theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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);
}

Mã cần lưu ý

Động cơ servo có ba đầu cuối - nguồn, mặt đất và tín hiệu. Dây nguồn thường có màu đỏ và phải được kết nối với chân 5V trên Arduino. Dây nối đất thường có màu đen hoặc nâu và phải được kết nối với một đầu cuối của IC ULN2003 (10 -16). Để bảo vệ bo mạch Arduino của bạn khỏi bị hư hỏng, bạn sẽ cần một số IC điều khiển để làm điều đó. Ở đây chúng tôi đã sử dụng IC ULN2003 để điều khiển động cơ servo. Chân tín hiệu thường có màu vàng hoặc cam và phải được kết nối với chân số 9 của Arduino.

Kết nối chiết áp

Bộ chia điện áp / bộ chia điện thế là các điện trở trong một mạch nối tiếp có quy mô điện áp đầu ra theo tỷ lệ cụ thể của điện áp đầu vào được áp dụng. Sau đây là sơ đồ mạch -

$$ V_ {out} = (V_ {in} \ times R_ {2}) / (R_ {1} + R_ {2}) $$

V out là điện thế đầu ra, phụ thuộc vào điện áp đầu vào được đặt vào (V in ) và điện trở (R 1 và R 2 ) trong chuỗi. Có nghĩa là dòng điện chạy qua R 1 cũng sẽ chạy qua R 2 mà không bị phân chia. Trong phương trình trên, khi giá trị của R 2 thay đổi, V ra sẽ thay đổi tương ứng với điện áp đầu vào, V trong .

Thông thường, một chiết áp là một bộ chia điện thế, có thể chia tỷ lệ điện áp đầu ra của mạch dựa trên giá trị của biến trở, được chia tỷ lệ bằng cách sử dụng núm vặn. Nó có ba chân: GND, Tín hiệu và + 5V như trong sơ đồ bên dưới -

Kết quả

Bằng cách thay đổi vị trí NOP của nồi, động cơ servo sẽ thay đổi góc của nó.

Động cơ bước hoặc động cơ bước là một động cơ đồng bộ, không chổi than, chia một vòng quay đầy đủ thành một số bước. Không giống như động cơ DC không chổi than, quay liên tục khi đặt điện áp DC cố định vào nó, động cơ bước quay theo các góc bước rời rạc.

Do đó, Động cơ bước được sản xuất với các bước trên mỗi vòng quay là 12, 24, 72, 144, 180 và 200, dẫn đến các góc bước là 30, 15, 5, 2,5, 2 và 1,8 độ trên mỗi bước. Động cơ bước có thể được điều khiển có hoặc không có phản hồi.

Hãy tưởng tượng một động cơ trên một chiếc máy bay RC. Động cơ quay rất nhanh theo hướng này hay hướng khác. Bạn có thể thay đổi tốc độ với mức công suất cung cấp cho động cơ, nhưng bạn không thể yêu cầu cánh quạt dừng lại ở một vị trí cụ thể.

Bây giờ hãy tưởng tượng một máy in. Có rất nhiều bộ phận chuyển động bên trong máy in, bao gồm cả động cơ. Một động cơ như vậy hoạt động như bộ nạp giấy, các con lăn quay để di chuyển mảnh giấy khi mực đang được in trên đó. Động cơ này cần có khả năng di chuyển giấy một khoảng cách chính xác để có thể in dòng văn bản tiếp theo hoặc dòng tiếp theo của hình ảnh.

Có một động cơ khác được gắn vào một thanh ren để di chuyển đầu in qua lại. Một lần nữa, thanh ren đó cần được di chuyển một lượng chính xác để in hết chữ cái này đến chữ cái khác. Đây là nơi mà động cơ bước có ích.

Động cơ bước hoạt động như thế nào?

Động cơ DC thông thường chỉ quay theo một hướng trong khi động cơ Bước có thể quay theo từng bước chính xác.

Động cơ bước có thể quay một lượng độ (hoặc bước) chính xác như mong muốn. Điều này cho phép bạn kiểm soát toàn bộ động cơ, cho phép bạn di chuyển nó đến một vị trí chính xác và giữ vị trí đó. Nó làm như vậy bằng cách cấp nguồn cho các cuộn dây bên trong động cơ trong một khoảng thời gian rất ngắn. Điểm bất lợi là bạn phải cung cấp năng lượng cho động cơ mọi lúc để giữ nó ở vị trí mà bạn mong muốn.

Tất cả những gì bạn cần biết lúc này là, để di chuyển một động cơ bước, bạn yêu cầu nó di chuyển một số bước nhất định theo hướng này hay hướng khác và cho nó biết tốc độ để bước theo hướng đó. Có rất nhiều loại động cơ bước. Các phương pháp được mô tả ở đây có thể được sử dụng để suy ra cách sử dụng các động cơ và trình điều khiển khác không được đề cập trong hướng dẫn này. Tuy nhiên, bạn nên tham khảo bảng dữ liệu và hướng dẫn của động cơ và trình điều khiển cụ thể cho các kiểu máy bạn có.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × bảng Arduino UNO
  • 1 × Động cơ bước lưỡng cực nhỏ như trong hình dưới đây
  • IC điều khiển 1 × LM298

Thủ tục

Thực hiện theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Mã 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);
}

Mã cần lưu ý

Chương trình này điều khiển động cơ bước đơn cực hoặc lưỡng cực. Động cơ được gắn vào chân số 8 - 11 của Arduino.

Kết quả

Động cơ sẽ thực hiện một vòng quay theo một hướng, sau đó một vòng quay theo hướng khác.

Trong chương này, chúng ta sẽ sử dụng Thư viện âm điệu Arduino. Nó không là gì ngoài Thư viện Arduino, tạo ra sóng vuông có tần số xác định (và chu kỳ nhiệm vụ 50%) trên bất kỳ chân Arduino nào. Có thể tùy chọn chỉ định khoảng thời gian, nếu không thì sóng tiếp tục cho đến khi hàm stop () được gọi. Có thể kết nối chân cắm với bộ rung piezo hoặc loa để phát âm báo.

Warning- Không kết nối chân cắm trực tiếp với bất kỳ đầu vào âm thanh nào. Điện áp cao hơn đáng kể so với điện áp mức đường dây tiêu chuẩn và có thể làm hỏng đầu vào của card âm thanh, v.v. Bạn có thể sử dụng bộ chia điện áp để giảm điện áp.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • Loa 1 × 8 ohm
  • Điện trở 1 × 1k
  • 1 × bảng Arduino UNO

Thủ tục

Thực hiện theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Để tạo tệp pitchhes.h, hãy nhấp vào nút ngay bên dưới biểu tượng màn hình nối tiếp và chọn "Tab mới" hoặc sử dụng Ctrl + Shift + N.

Sau đó dán đoạn mã sau:

/*************************************************
* 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

Lưu mã đã cho ở trên dưới dạng pitches.h

Mã 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.
}

Mã cần lưu ý

Mã sử ​​dụng một tệp bổ sung, pitch.h. Tệp này chứa tất cả các giá trị cao độ cho các ghi chú điển hình. Ví dụ: NOTE_C4 là giữa C. NOTE_FS4 là F sắc nét, v.v. Bảng ghi chú này ban đầu được viết bởi Brett Hagman, dựa trên công việc của lệnh tone (). Bạn có thể thấy nó hữu ích bất cứ khi nào bạn muốn tạo các nốt nhạc.

Kết quả

Bạn sẽ nghe thấy các nốt nhạc được lưu trong cao độ. H. tập tin.

Mô-đun bộ thu và phát không dây hoạt động ở tần số 315 Mhz. Chúng có thể dễ dàng phù hợp với một breadboard và hoạt động tốt với các bộ vi điều khiển để tạo ra một liên kết dữ liệu không dây rất đơn giản. Với một cặp máy phát và máy thu, các mô-đun sẽ chỉ hoạt động truyền dữ liệu một chiều, tuy nhiên, bạn sẽ cần hai cặp (có tần số khác nhau) để hoạt động như một cặp máy phát / máy thu.

Note- Các mô-đun này là bừa bãi và nhận được một lượng lớn tiếng ồn. Cả máy phát và máy thu đều hoạt động ở tần số chung và không có ID.

Thông số kỹ thuật mô-đun máy thu

  • Mẫu sản phẩm - MX-05V
  • Điện áp hoạt động - DC5V
  • Dòng tĩnh lặng - 4mA
  • Tần số nhận - 315Mhz
  • Độ nhạy máy thu - -105DB
  • Kích thước - 30 * 14 * 7mm

Thông số kỹ thuật mô-đun máy phát

  • Mẫu sản phẩm - MX-FS-03V
  • Khoảng cách khởi động - 20-200 mét (điện áp khác nhau, kết quả khác nhau)
  • Điện áp hoạt động - 3,5-12V
  • Kích thước - 19 * 19mm
  • Chế độ hoạt động - AM
  • Tốc độ truyền - 4KB / S
  • Công suất truyền - 10mW
  • Tần số truyền - 315Mhz
  • Ăng ten ngoài - dòng đa lõi hoặc đơn lõi thông thường 25cm
  • Sơ đồ chân từ trái → phải - (DATA; V CC ; GND)

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 2 × bảng Arduino UNO
  • Máy phát liên kết 1 × Rf
  • Bộ thu liên kết 1 × Rf

Thủ tục

Thực hiện theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Phác thảo

Mở phần mềm Arduino IDE trên máy tính của bạn. Mã hóa bằng ngôn ngữ Arduino sẽ điều khiển mạch của bạn. Mở một tệp phác thảo mới bằng cách nhấp vào Mới.

Note- Bạn phải đưa thư viện bàn phím vào tệp thư viện Arduino của mình. Sao chép và dán tệp VirtualWire.lib vào thư mục thư viện như được đánh dấu trong ảnh chụp màn hình bên dưới.

Mã Arduino cho máy phát

//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);
}

Mã cần lưu ý

Đây là một mã đơn giản. Đầu tiên, nó sẽ gửi ký tự "1" và sau hai giây, nó sẽ gửi ký tự "0", v.v.

Mã Arduino cho bộ thu

//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);
      }
   }
}

Mã cần lưu ý

Đèn LED kết nối với chân số 5 trên bảng Arduino được BẬT khi nhận ký tự '1' và TẮT khi nhận ký tự '0'.

Mô-đun WiFi CC3000 của Texas Instruments là một gói nhỏ màu bạc, cuối cùng mang lại chức năng WiFi dễ sử dụng, giá cả phải chăng cho các dự án Arduino của bạn.

Nó sử dụng SPI để giao tiếp (không phải UART!) Để bạn có thể đẩy dữ liệu nhanh như bạn muốn hoặc chậm như bạn muốn. Nó có một hệ thống ngắt thích hợp với chân IRQ để bạn có thể có các kết nối không đồng bộ. Nó hỗ trợ bảo mật 802.11b / g, open / WEP / WPA / WPA2, TKIP & AES. Ngăn xếp TCP / IP tích hợp với giao diện "BSD socket" hỗ trợ TCP và UDP ở cả chế độ máy khách và máy chủ.

Thành phần bắt buộc

Bạn sẽ cần các thành phần sau:

  • 1 × Arduino Uno
  • 1 × Bảng đột phá Adafruit CC3000
  • 1 × 5V rơ le
  • 1 × Diode chỉnh lưu
  • 1 × LED
  • Điện trở 1 × 220 Ohm
  • 1 × Breadboard và một số dây jumper

Đối với dự án này, bạn chỉ cần Arduino IDE thông thường, thư viện CC3000 của Adafruit và thư viện CC3000 MDNS. Chúng tôi cũng sẽ sử dụng thư viện aREST để gửi lệnh tới relay qua WiFi.

Thủ tục

Thực hiện theo sơ đồ mạch và thực hiện các kết nối như trong hình dưới đây.

Cấu hình phần cứng cho dự án này rất dễ dàng.

  • Kết nối chân IRQ của bảng CC3000 với chân số 3 của bảng Arduino.
  • VBAT vào pin 5 và CS vào pin 10.
  • Kết nối các chân SPI với bảng Arduino: MOSI, MISO và CLK với các chân 11, 12 và 13 tương ứng.
  • V in được kết nối với Arduino 5V và GND với GND.

Bây giờ chúng ta hãy kết nối rơ le.

Sau khi đặt rơ le trên bảng mạch, bạn có thể bắt đầu xác định hai phần quan trọng trên rơ le của mình: phần cuộn dây ra lệnh cho rơ le và phần công tắc nơi chúng ta sẽ gắn đèn LED.

  • Đầu tiên, kết nối chân số 8 của bảng Arduino với một chân của cuộn dây.
  • Kết nối chân còn lại với mặt đất của bảng Arduino.

Bạn cũng phải đặt điốt chỉnh lưu (cực dương nối với chân nối đất) trên các chân của cuộn dây để bảo vệ mạch của bạn khi rơle chuyển mạch.

  • Kết nối + 5V của bảng Arduino với chân chung của công tắc rơ le.

  • Cuối cùng, kết nối một trong các chân khác của công tắc (thường là chân không được kết nối khi rơ le tắt) với đèn LED mắc nối tiếp với điện trở 220 Ohm và kết nối phía bên kia của đèn LED với mặt đất của Arduino bảng.

Kiểm tra các thành phần riêng lẻ

Bạn có thể kiểm tra rơ le bằng bản phác thảo sau:

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);
}

Mã cần lưu ý

Mã này tự giải thích. Bạn chỉ cần tải nó lên bảng và rơ le sẽ chuyển trạng thái mỗi giây, và đèn LED sẽ BẬT và TẮT tương ứng.

Thêm kết nối WiFi

Bây giờ chúng ta hãy điều khiển rơle không dây bằng chip WiFi CC3000. Phần mềm cho dự án này dựa trên giao thức TCP. Tuy nhiên, đối với dự án này, bo mạch Arduino sẽ chạy một máy chủ web nhỏ, vì vậy chúng ta có thể “lắng nghe” các lệnh đến từ máy tính. Đầu tiên chúng ta sẽ quan tâm đến bản phác thảo Arduino, sau đó chúng ta sẽ xem cách viết mã phía máy chủ và tạo một giao diện đẹp.

Đầu tiên, bản phác thảo Arduino. Mục tiêu ở đây là kết nối với mạng WiFi của bạn, tạo máy chủ web, kiểm tra xem có các kết nối TCP đến hay không, sau đó thay đổi trạng thái của rơle cho phù hợp.

Các phần quan trọng của mã

#include <Adafruit_CC3000.h>
#include <SPI.h>
#include <CC3000_MDNS.h>
#include <Ethernet.h>
#include <aREST.h>

Bạn cần xác định bên trong mã những gì cụ thể cho cấu hình của bạn, tức là tên và mật khẩu Wi-Fi và cổng cho giao tiếp TCP (chúng tôi đã sử dụng 80 ở đây).

// 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

Sau đó, chúng tôi có thể tạo phiên bản CC3000, máy chủ và phiên bản aREST -

// Server instance
   Adafruit_CC3000_Server restServer(LISTEN_PORT); // DNS responder instance
   MDNSResponder mdns; // Create aREST instance
   aREST rest = aREST();

Trong phần setup () của bản phác thảo, bây giờ chúng ta có thể kết nối chip CC3000 với mạng -

cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY);

Làm thế nào máy tính sẽ biết nơi để gửi dữ liệu? Một cách là chạy bản phác thảo một lần, sau đó lấy địa chỉ IP của bo mạch CC3000 và sửa đổi lại mã máy chủ. Tuy nhiên, chúng tôi có thể làm tốt hơn, và đó là lúc thư viện MDNS CC3000 phát huy tác dụng. Chúng tôi sẽ gán một tên cố định cho bảng CC3000 của chúng tôi với thư viện này, vì vậy chúng tôi có thể viết trực tiếp tên này vào mã máy chủ.

Điều này được thực hiện với đoạn mã sau:

if (!mdns.begin("arduino", cc3000)) {
   while(1);
}

Chúng tôi cũng cần lắng nghe các kết nối đến.

restServer.begin();

Tiếp theo, chúng ta sẽ mã hóa hàm loop () của sketch sẽ được thực thi liên tục. Trước tiên, chúng tôi phải cập nhật máy chủ mDNS.

mdns.update();

Máy chủ chạy trên bảng Arduino sẽ đợi các kết nối đến và xử lý các yêu cầu.

Adafruit_CC3000_ClientRef client = restServer.available();
rest.handle(client);

Bây giờ khá dễ dàng để kiểm tra các dự án qua WiFi. Đảm bảo rằng bạn đã cập nhật bản phác thảo bằng tên và mật khẩu WiFi của riêng mình, đồng thời tải bản phác thảo lên bảng Arduino của bạn. Mở màn hình nối tiếp Arduino IDE của bạn và tìm địa chỉ IP của bo mạch của bạn.

Chúng ta hãy giả sử phần còn lại ở đây rằng nó giống như 192.168.1.103.

Sau đó, chỉ cần truy cập trình duyệt web yêu thích của bạn và nhập -

192.168.1.103/digital/8/1

Bạn sẽ thấy rằng rơle của bạn tự động BẬT.

Xây dựng giao diện chuyển tiếp

Bây giờ chúng ta sẽ viết mã giao diện của dự án. Ở đây sẽ có hai phần: tệp HTML chứa giao diện và tệp Javascript phía máy khách để xử lý các nhấp chuột trên giao diện. Giao diện ở đây dựa trênaREST.js dự án này được tạo ra để dễ dàng điều khiển các thiết bị WiFi từ máy tính của bạn.

Đầu tiên chúng ta hãy xem tệp HTML, có tên là interface.html. Phần đầu tiên bao gồm nhập tất cả các thư viện bắt buộc cho giao diện -

<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>

Sau đó, chúng tôi xác định hai nút bên trong giao diện, một để bật rơ le và nút kia để tắt lại.

<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>

Bây giờ, chúng ta cũng cần một tệp Javascript phía máy khách để xử lý các nhấp chuột vào các nút. Chúng tôi cũng sẽ tạo một thiết bị mà chúng tôi sẽ liên kết với tên mDNS của thiết bị Arduino của chúng tôi. Nếu bạn đã thay đổi điều này trong mã Arduino, bạn cũng cần phải sửa đổi nó ở đây.

// Create device
var device = new Device("arduino.local");
// Button

$('#on').click(function() {
   device.digitalWrite(8, 1);
});

$('#off').click(function() {
   device.digitalWrite(8, 0);
});

Mã hoàn chỉnh cho dự án này có thể được tìm thấy trên GitHubkho. Vào thư mục giao diện và chỉ cần mở tệp HTML bằng trình duyệt yêu thích của bạn. Bạn sẽ thấy thứ gì đó tương tự bên trong trình duyệt của mình -

Cố gắng nhấp vào một nút trên giao diện web; nó sẽ thay đổi trạng thái của rơle gần như ngay lập tức.

Nếu bạn quản lý để làm cho nó hoạt động, hãy hoan nghênh! Bạn vừa tạo một công tắc đèn điều khiển bằng Wi-Fi. Tất nhiên, bạn có thể kiểm soát nhiều hơn ánh sáng với dự án này. Chỉ cần đảm bảo rằng rơ le của bạn hỗ trợ nguồn điện cần thiết cho thiết bị bạn muốn điều khiển và bạn đã sẵn sàng.