Nội dung bài học:
- Lập trình ngõ vào ra tín hiệu số (Digital Input/Output) điều khiển LED đơn.
- Lập trình với đèn LED RGB.
- Bật tắt đèn với phím bấm.
- Bài tập nâng cao.
1. Lập trình ngõ vào ra tín hiệu số (Digital Input/Output) điều khiển LED đơn.
Nội dung: Tương tự khi chúng ta lập trình trên Arduino. Lập trình ESP32 điều khiển đèn LED chúng ta cần thiết lập chân tín hiệu của ESP32 ở dạng ngõ ra nhằm bật tắt LED với một tần số xác định.
Chuẩn bị: Trên bo mạch ESP32 có sẵn một đèn LED màu xanh và được nối với chân D2 nên ta sẽ sử dụng chính đèn LED này để thực hành lập trình hoặc bạn có thể sử dụng đèn LED ngoài như trong hình cũng được.

Hình 1: Đấu nối mạch ESP32 với đèn LED
Thực hành:
– Một chương đơn giản bao gồm 3 phần:
+ Phần khai báo: Chung ta đặt tên cho các chân tín hiệu đầu ra (const int LED_Pin = 2) và các biến thời gian Time_ON và Time_OFF
+ Void setup(): Dùng kể khởi tạo những thiết lập ban đầu ( pinMode(LED_Pin , OUTPUP) ), chú ý hàm này chỉ chạy 1 lập duy nhất ngay khi vi điều khiển được bật nguồn hoặc nhấn nút Reset.
+ Void loop(): Dùng để viết chương trình chính. Hàm này sẽ chạy từ trên xuống dưỡi và lặp đi lặp lại trong suốt quá trình hoạt động của ESP32. Nên chúng ta sẽ viết đoạn code điều khiển đèn LED ở đây.
Ví dụ thực hiện nháy đèn LED.

Hình 2: Chương trình bật/tắt LED đơn
– Do đây là chương trình đầu tiên nên chúng ta sẽ làm nó thật đơn giản. Ở đây ta cần khai báo chân D2 là chân nối với cực dương của đèn LED và khai báo thêm thời gian bật, tắt. Sau đó, trong chương trình chính ở vòng lặp loop, ta chỉ cần cho chân này ở mức cao, thấp tương ứng với thời gian bật, tắt. Khi nạp code vào mạch ESP32 ta sẽ thấy đèn LED màu xanh sáng, tối tương ứng.
– Chú ý: Bên cạnh các lệnh lập trình, chúng ta sử dụng ký hiệu // để giải thích lệnh cho người đọc chương trình dễ hiểu. Các chú thích phía sau ký hiệu này sẽ được trình biên dịch bỏ qua vì nó chỉ có ý nghĩa với người đọc chứ không tác động gì lên hoạt động của vi điều khiển. Để làm nhiều dòng lệnh trở thành chú thích cùng một lúc ta có thể lựa chọn bôi đen các dòng đó và ấn tổ hợp phím tắt Ctrl+/.
– Lưu ý: Đèn led chân 2 này cũng dùng để báo hiệu việc truyền dữ liệu qua các giao thức,… Nếu sử dụng thì thỉnh thoảng nó sẽ gây ra lỗi không upload được code. Từ đó bạn nên hạn chế dùng chân này nếu còn các chân khác.
2. Lập trình với đèn LED RGB
Nội dung
– Bài học này sẽ nâng cấp hơn một chút so với LED đơn do LED RGB là led có 3 màu cơ bản đỏ (Red), xanh lá cây (Green) và xanh da trời (Blue) và đặc biệt là việc tổ hợp trộn lẫn 3 màu này với các cường độ sáng khác nhau có thể tạo ra mọi màu mà chúng ta thấy. Ở đây chúng ta sẽ lập trình tạo thay đổi màu sắc của đèn.
Chuẩn bị
– Phần cứng: Bo mạch ESP32 và mô đun đèn LED RGB đã tích hợp sẵn điện trở

Hình 3: Mạch đèn RGB
Thực hành
Ở ví dụ này, ta muốn lập trình mô phỏng lại tín hiệu đèn giao thông. Trong đó màu vàng được tạo ra từ việc trộn lẫn đồng thời màu đỏ với màu xanh lá cây. Ở đây ta sử dụng LED RGB chân âm chung và để tiện quan sát, giả sử đèn xanh sáng trong 3s, đèn vàng sáng 1 giây còn đèn đỏ là 2 giây và cứ như vậy lặp lại. Ta mắc mạch như trên hình 2.5, với chú ý là chân âm chung của LED RGB sẽ được nối với chân GND (0V) của ESP32, 3 chân còn lại của LED sẽ nối tương ứng với 3 chân D25, D26, D27 của ESP32. Do mô đun RGB đã có sẵn các điện trở hạn chế dòng điện nên ta không cần mắc thêm trở. Toàn bộ chương trình được cho như trên hình 2.6. Lệnh const để khai báo một hằng số cố định, không thay đổi và truy cập vào mọi lệnh khi được gọi. Lệnh delay sẽ giữ trạng thái của vi điều khiển không đổi trong khoảng thời gian gọi lệnh này. Như vậy khi ta ghi một chân ngõ ra ở mức cao và sử dụng delay để giữ mức cao đó cố định sẽ bật LED sáng tương ứng.
const int LED_RED = 25; // Khai báo đèn màu đỏ là chân D25
const int LED_GREEN = 26; // Khai báo đèn màu xanh lá cây là chân D26
const int LED_BLUE = 27; // Khai báo đèn màu xanh da trời là chăn D27
const unsigned int Time_GREEN = 3000; // Khai báo thời gian đèn xanh là 3000 ms
const unsigned int Time_YELLOW = 1000; // Khai báo thời gian đèn vàng là 1000 ms
const unsigned int Time_RED = 2000; // Khai báo thời gian đèn vàng là 2000 ms
void setup()
{
pinMode (LED_RED,OUTPUT); // Khai báo chân D25, D26, D27 là ngõ ra
pinMode (LED_GREEN, OUTPUT);
pinMode (LED_BLUE, OUTPUT);
}
void loop()
{
digitalWrite(LED_GREEN, HIGH); // Bật LED xanh
delay (Time_GREEN);
digitalWrite(LED_GREEN, LOW); // Tắt LED xanh
digitalWrite(LED_RED, HIGH); // Bật LED đỏ và LED xanh
digitalWrite(LED_GREEN, HIGH); // cùng lúc để tạo ra màu vàng
delay (Time_YELLOW); // trong 2 giây
digitalWrite(LED_RED, LOW); // tắt
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_RED, HIGH); // Bật LED đỏ
delay (Time_RED);
digitalWrite (LED_RED, LOW); // Tắt LED đỏ
// Sau đó chương trình sẽ chạy lặp lại vòng loop
3. Bật tắt đèn với phím bấm
Nội dung
Ở 2 bài trước, chúng ta đã làm quen với việc lập trình chân tín hiệu là ngõ ra. Bài này sẽ học về cách thiết lập ngõ vào. Ý tưởng cơ bản là ta sẽ đọc tín hiệu từ nút nhấn (ngõ vào) để bật tắt đèn LED tương ứng.
Chuẩn bị
– Một nút nhấn không giữ trạng thái (Pushbutton), tức là khi nhấn xuống thì đóng kín mạch thông dây dẫn, khi nhả tay ra thì lò xo tự đẩy lên và mạch hở.
– Ta sử dụng luôn LED xanh có trên bo mạch để thực hiện việc bật/tắt với nó
Thực hành
Ta mắc mạch như trên hình 5. Cần chú ý rằng ta cần sử dụng thêm điện trở 10k Ohm để bảo vệ ESP32 bởi vì khi ấn nút nhấn, điện áp cao (3V3) sẽ được nối đất (0V) nên cần điện trở này hạn chế dòng điện để tránh bị ngắn mạch. Trên mô đun phím bấm đã được tích hợp sẵn điện trở nên rất thuận tiện sử dụng. Một chân của nút bấm sẽ nối vào VCC và chân còn lại sẽ nối vào âm, đây là nút ấn thường đóng nên ở trạng thái ban đầu thì nó đang ở mức HIGH nhưng khi ấn xuống thì nó sẽ chuyển từ HIGH sang LOW và từ đây chúng ta biết được nút bấm đã được ấn và xử lý chương trình.

Hình 5: Mạch nút nhấn
Chương trình cho trên hình 2.8. PinMode để khai báo cấu hình của các chân, ở đây ta tạm thời sử dụng 2 dạng đơn giản nhất là ngõ vào/ra (INPUT/OUTPUT); digitalRead/digitalWrite để đọc/ghi trạng thái cao/thấp (HIGH/LOW) hay mức 1/0. Mức 0 tương ứng với tín hiệu 0V còn mức 1 tương ứng với điện áp 3.3V. Khi nút nhấn được ấn, chân
const int Button = 12;//đặt chân 12 là chân của bút ấn
const int Led = 13;//đặt chân 13 là chân của led
int buttonState = 14; // khai báo biến ở chân 14
void setup()
{
pinMode(Led, OUTPUT); // khởi tạo chân led là xuất tín hiệu(OUTPUT)
pinMode(Button, INPUT);// khởi tạo chân nút ấn là nhận tín hiệu (INPUT)
}
void loop()
{
buttonState = digitalRead(Button);//đọc giá trị từ chân nút ấn
if (buttonState == HIGH)
{//nếu nút ấn đã được ấn thì sẽ bật led
digitalWrite(Led, HIGH); // bật led
}
else
{// nếu không ấn nút thì tắt led
digitalWrite(Led, LOW); // tắt led
}
}
Chương trình trên hoạt động theo kiểu khi ấn giữ nút bấm thì đèn sáng và thả tay ra thì đèn tắt. Nút nhấn thì thường có 2 loại là thường đóng và thường mở, có nghĩa là khi ko tác động vào thì trạng thái nút ấn của thường đóng là HIGH còn thường mở sẽ là LOW. Ở trên ví dụ đang dùng nút ấn thường mở.
Trong chương trình thì 2 dòng đầu tiên là khai báo biến, kiểu khai báo này sẽ giúp chương trình dễ hiểu và sửa lỗi hơn. Bạn hoàn toàn có thể dùng số 12 thay cho biến “button” hay số 13 cho biến “led” mà chương trình vẫn chạy bình thường nhưng lâu lâu bạn xem lại thì thực sự rất khó để nhớ được 12 và 13 nó dùng để làm gì (12 ở đây là chân D12 và 13 là chân D13). Tiếp theo là biến còn được sử dụng như kiểu rổ chứa dữ liệu, như trong chương trình trên thì biến “buttonState” sẽ có tác dụng lưu giá trị nhận đường từ chân 12 (chân nối vào nút ấn ) từ đó ta sẽ dùng biến “buttonState” để đem đi kiểm tra xem nó ở mức cao hay mức thấp.
4. Bài tập nâng cao
Nội dung
Ở các ví dụ trên chúng ta đã biết cách bật tắt 1 đèn đơn giản, nhưng bây giờ nếu ta làm 1 cái đèn led nhấp nháy nhiều lần trong khoảng thời gian dài thì cứ viết tuần tự bật/tắt đèn led từ trên xuống sao cho đến khi đạt đủ thời gian mong muốn à?, nếu viết như thế thì khi muốn nhấp nháy đèn led 30s sau đó sáng đèn led 5s rồi tắt led thì cực kì mệt. Vì thế chúng ta sẽ sử dụng hàm For( [thứ tự bắt đầu], [điều kiện kết thúc], [bước nhảy] ) để lặp lại 1 thao tác sáng led thay vì cứ phải viết từ led số 0 đến led 100.
void setup()
{
Serial.begin(9600);
}
void loop()
{
for(int i=0; i<5; i++)
{
Serial.println(i);
delay(1000);
}
delay(3000); }

Hình 2.7. chương trình và sơ đồ thuật toán của vòng lặp for

Hình 2.8. Kết quả in ra màn hình của vòng lặp for
Trong lần lặp đầu tiên của hàm loop() thì vòng lặp for sẽ bắt đầu từ giá trị 0 và sau đó thực hiện công việc bên. Trong dấu “{}” của nó, đó là in giá trị i lên màn hình Serial (mở màn hình Serial bằng cách ấn tổ hợp phím ctrl + shift + M hoặc ấn vào biểu tượng kính lúp phía góc trên bên phải của giao diện arduino IDE). Sau 1 giây nó sẽ tăng giá trị của i lên một đơn vị vì bước nhảy ở đây là i++ (i++ có thể hiểu là i + 1). Cứ lặp đi lặp lại in giá trị của i sau mỗi giây (từ lần thứ 0 đến lần thứ 4) đến lần thứ 5 thì điều kiện i < 5 không còn đúng nữa nên nó sẽ thoát vòng lặp for và tiếp tục thực hiện lệnh delay(3000) ở bên dưới.
+ Lưu ý:
– Chữ “i” ở đây chỉ là tên biến vì vậy bạn có thể thay đổi thành bất kì tên nào bạn muốn như : a, b, c hay count,…
– Khi mở cổng serial, bạn phải chọn đúng tốc độ truyền giống lúc bạn khai báo. Trong ví dụ, bạn đang khai báo trong code là 9600 nên khi bật màn hình Serial cũng phải là 9600
– Nếu bạn muốn tăng bước nhảy mỗi lần lặp trong hàm “for” bạn có thể viết là i+2 , i+3, i+4…. Tùy vào số bước nhảy mà bạn muốn. Tương tự với giảm là i–, i-2, i-3,….
Thực hành
Đề bài: Cho đèn led sáng nhấp nháy với chu kì là 1hz trong 20 giây , sau đó cho đèn led sáng 5s, cuối cùng là tắt 3 giây
By: Lương Hưu Nhật Minh
http://wish-club.ru/forums/index.php?autocom=gallery&req=si&img=5240
https://myteana.ru/forums/index.php?autocom=gallery&req=si&img=6658
https://hrv-club.ru/forums/index.php?autocom=gallery&req=si&img=6932
Awesome https://shorturl.at/2breu
Awesome https://is.gd/N1ikS2
Cool partnership https://shorturl.fm/FIJkD
https://shorturl.fm/j3kEj
https://shorturl.fm/FIJkD
https://shorturl.fm/YvSxU
https://shorturl.fm/5JO3e
Apply now and unlock exclusive affiliate rewards! https://shorturl.fm/Mi0cg
Get paid for every referral—sign up for our affiliate program now! https://shorturl.fm/rAqjl
Boost your income effortlessly—join our affiliate network now! https://shorturl.fm/jZdza
Partner with us for high-paying affiliate deals—join now! https://shorturl.fm/Gb7lD
https://shorturl.fm/zleKH
https://shorturl.fm/3JZA2
https://shorturl.fm/9lVkM
https://shorturl.fm/bEXCN
https://shorturl.fm/5i8Mn
https://shorturl.fm/PGrl8
https://shorturl.fm/NSeCa
https://shorturl.fm/PxBD6