Digital io là gì

Lập trình IoT với ESP8266 Arduino

---

Chúng ta sẽ thực hiện việc chớp tắt đèn LED của board IoT WiFi Uno mỗi giây, được nối tới pin GPIO16.

Xem video hướng dẫn và kết quả:

Nút nhấn và LED board IoT WiFi Uno được khoanh tròn như trong hình

Digital io là gì

Với cách chớp tắt này sẽ làm CPU bị dừng tại thời điểm delay và không thực thi được code nào khác

int ledPin = 16; // LED connected to digital pin 16 void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output } void loop() { digitalWrite(ledPin, HIGH); // sets the LED on delay(1000); // waits for a second digitalWrite(ledPin, LOW); // sets the LED off delay(1000); // waits for a second }

int ledPin = 16; // LED connected to digital pin 16 int ledState = LOW; unsigned long previousMillis = 0; const long interval = 1000; void setup() { pinMode(ledPin, OUTPUT); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if (ledState == LOW) ledState = HIGH; // Note that this switches the LED *off* else ledState = LOW; // Note that this switches the LED *on* digitalWrite(ledPin, ledState); } }

Tên chân trong Arduino (Pin number) giống với thứ tự chân của ESP8266. pinMode, digitalRead, và digitalWrite đều sử dụng Pin Number như nhau, ví dụ như đọc GPIO2, gọi hàm digitalRead(2).

Chân GPIO0..15 có thể là INPUT, OUTPUT, hay INPUT_PULLUP. Chân GPIO16 có thể là INPUT, OUTPUT hay INPUT_PULLDOWN_16. Khi khởi động, tất cả các chân sẽ được cấu hình là INPUT.

Mỗi chân có thể phục vụ cho một tính năng nào đó, ví dụ Serial, I2C, SPI. Và tính năng đó sẽ được cấu hình đúng khi sử dụng thư viện. Hình bên dưới thẻ hiện sơ đồ chân đối với module ESP-12 phổ biến.

GPIO6 và GPIO11 không được thể hiện bởi vì nó được sử dụng cho việc kết nối với Flash. Việc sử dụng 2 chân này có thể gây lỗi chương trình.

Ghi chú

Một số board và module khác (ví dụ ESP-12ED, NodeMCU 1.0) không có GPIO9 và GPIO11, họ sử dụng với chế độ DIO cho Flash, trong khi ESP12 chúng ta nói bên trên sử dụng chế độ QIO

Ngắt GPIO hỗ trợ thông qua các hàm attachInterrupt, detachInterrupt Ngắt GPIO có thể gán cho bất kỳ GPIO nào, ngoại trừ GPIO16. Đều hỗ trợ các ngắt tiêu chuẩn của Arduino như: CHANGE, RISING, FALLING.

© Copyright 2017, TuanPM.

Built with Sphinx using a theme provided by Read the Docs.

Ngược lại với chế độ digital output là digital input. Bạn sẽ dùng digital input khi pin digital nối với các module trả về trạng thái là 0 hoặc 1. Trong bài này chúng ta tìm hiểu các sử dụng nút nhấn (button) và đọc tín hiệu nút nhấn để phát hiện mỗi khi nút được nhấn và bật đèn led. Ngược lại, chúng ta sẽ tắt đèn led khi nút nhấn được thả ra.

Thiết bị cần chuẩn bị

Bạn cần chuẩn bị các thiết bị sau:

1 x Node Wifi.

1 x Module nút nhấn.

Kết nối phần cứng

Bạn cắm module nút nhấn vào cổng Digital 0 (hoặc bất kỳ cổng digital 1 hay 2 tùy ý).

Digital io là gì

Nút nhấn là những nút các bạn thường thấy trong cuộc sống, từ bàn phím, công tắc điện, quạt… và làm việc với chúng trong Arduino rất đơn giản.

Arduino đọc tín hiệu đầu vào digital input cho các pin là 1 khi điện áp đo được là 3.3V (một số board khác có thể sử dụng 5V) và 0 khi điện áp là 0V. Để button có thể xuất ra các giá trị điện thế này thì module Button được thiết kế theo sơ đồ sau:

Digital io là gì

Theo sơ đồ mạch của module Button ở trên, thì một bên chân của button được nối xuống Ground (0V, mức 0) thông qua 1 con trở giá trị 10K và một bên chân còn lại nối với VCC (3.3V, mức 1). Bên chân nối với trở được nối vào chân tín hiệu của ESP8266.

Như vậy khi bình thường nút không được nhấn thì chân tín hiệu nối với 0V và sẽ đọc được giá trị 0. Khi nút được nhấn thì 2 bên chân của nút nhấn được tiếp xúc với nhau và chân tín hiệu sẽ được nối với 3.3V (do đường 0V có qua điện trở 10K) và đọc được giá trị là 1.

Bạn upload đoạn code mẫu như bên dưới.

// lưu số pin nối với nút nhấn và led const int buttonPin = 14; const int ledPin = 15; int buttonState = 0; // lưu trạng thái của nút nhấn void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { // lấy trạng thái của nút nhấn buttonState = digitalRead(buttonPin); // kiểm tra xem nút có được nhấn hay không, nếu có thì đọc được giá trị là HIGH if (buttonState == HIGH) { // bật đèn LED digitalWrite(ledPin, HIGH); } else { // tắt đèn LED digitalWrite(ledPin, LOW); } }

Phần đầu đoạn code ta khai báo 2 hằng số cho 2 chân nối với led và button. Vì 2 giá trị này là không đổi nên có thể dùng hằng (constant) thay vì dùng biến thường để tối ưu hóa chương trình. Ngoài ra ta cũng khai báo 1 biến kiểu int để lưu trạng thái của button.

Hằng (constant) là gì? Với một từ khóa “const” nằm trước một khai báo biến, bạn sẽ làm cho biến này thành một biến chỉ có thể đọc “read-only”, sử dụng cho những giá trị không thay đổi trong suốt chương trình. Trình biên dịch sẽ thay thế các hằng số này bằng giá trị khai báo trước mà không cần tính toán và để dành bộ nhớ, từ đó tối ưu và tăng tốc độ của chương trình.

Ta sử dụng led onboard nối với pin 15. Cổng digital 0 sử dụng 2 pin là 14 và 13. Vì nút nhấn chỉ sử dụng 1 pin nên sẽ được nối với pin chính là 14. Vì vậy ta khai báo trong code số pin tương ứng cho led và nút nhấn là 15 và 14.

Trong phần setup, ta khai báo chân nối với button sử dụng chế độ digital input bằng câu lệnh pinMode(buttonPin, INPUT).

Trong hàm loop, ta liên tục kiểm tra giá trị đầu vào của chân nối với button bằng lệnh digitalRead(buttonPin) và bật tắt đèn led tương ứng giá trị đo được dùng cấu trúc if else.

Bạn chọn board và port trong Arduino rồi upload code và quan sát đèn led sẽ được bật mỗi khi nhấn nút và tắt khi thả ra.

Bài tập mở rộng

Bạn hãy thử viết lại chương trình trên để mỗi khi nhấn nút thì ta sẽ đảo trạng thái của đèn led. Ví dụ, khi ta nhấn 1 lần thì đèn led sẽ bật. Nếu ta nhấn thêm 1 lần nữa thì đèn led sẽ tắt và cứ tiếp tục như thế.