Giúp người dùng:
Tín hiệu số là gì?
Tín hiệu số (Digital) là một tín hiệu điện, chỉ có 2 mức điện áp: là mức cao (có giá trị 5V) và mức thấp (có giá trị 0V).
Chúng được quy định:
+) mức cao là số 1 (HIGH).
+) mức thấp là số 0 (LOW).
Hình ảnh biểu diễn về dạng tín hiệu số:
Ứng dụng trong đầu vào số
Những dạng tín hiệu đó giúp ta biết được trạng thái của nút nhấn, công tắc hay các loại cảm biến như: cảm biến ánh sáng, cảm biến độ ẩm đất, cảm biến âm thanh… được xuất ra 2 mức điện áp và ta có thể dựa vào đó để sử dụng làm trong các ứng dụng bật / tắt bóng đèn, quạt tự động… chẳng hạn.
Trong tài nguyên mạch C88 được tích hợp sẵn các nút nhấn (loại nhấn / nhả) và led báo trạng thái, khi không nhấn tín hiệu ở mức cao (điện áp 5V) led tắt và khi được nhấn tín hiệu sẽ ở mức thấp 0 (điện áp 0V) led sáng.
2.1.2. Địa chỉ phần cứng đầu vào số mạch C88
Mạch được tích hợp 8 đầu vào số:
Cung cấp thông tin thêm:
2.1.3. Một số câu lệnh sử dụng trong bài
/* Lưu ý cho người mới tiếp cận với lập trình: ngôn ngữ lập trình cho mạch C88 là C/C++ nên chúng ta cần lưu ý phân biệt chữ hoa chữ thường và các dấu chấm, dấu phẩy, dấu chấm phẩy... */
a. Hàm #define
Cấu trúc: #define [đặt tên hằng số] [giá trị của hằng số]
Ý nghĩa: Cho phép bạn đặt tên cho một hằng số nguyên hoặc hằng số thực.
Ứng dụng: Gán tên cho chân mong muốn.
Ví dụ: Khai báo tên P0 địa chỉ chân số 5
b. Lệnh if / else
Cấu trúc: if (x) { // Khối lệnh 1 }
else { // Khối lệnh 2 }
Trong đó: x là điều kiện để thực thi [khối lệnh 1].
Tham khảo các điều kiện:
Ngược lại nếu điều kiện sai nó sẽ thực hiện [khối lệnh 2].
Ý nghĩa: Kiểm tra điều kiện để thực thi 1 nhiệm vụ mong muốn.
Ứng dụng: Kiểm tra trạng thái nút nhấn, cảm biến….
Ví dụ: Nếu nút nhấn I0 (D14) được nhấn thì rơ le R0 (D4) bật, ngược lại tắt
c. Hàm digitalRead ()
Cấu trúc: digitalRead (chân);
Trong đó: chân là địa chỉ chân mà bạn muốn đọc tín hiệu.
Có 2 mức là HIGH (5V) và LOW (0V).
Ý nghĩa: Dựa vào tín hiệu để làm điều kiện, thực thi một khối lệnh nào đó.
Ứng dụng: Đọc trạng thái nút nhấn, công tắc, cảm biến…
Ví dụ: Đọc trạng thái nút nhấn I0 (5) hiển thị lên Serial Monitor
Lưu ý: Khi đọc được giá trị 0 tương ứng với nút được nhấn, ngược lại với giá trị 1 tương ứng với nút chưa được nhấn.
d. Hàm digitalWrite ()
Cấu trúc: digitalWrite (chân, mức xuất tín hiệu);
Trong đó:
+) chân: Địa chỉ chân mà bạn muốn thiết lập.
+) mức xuất tín hiệu: có 2 mức là HIGH (5V) hoặc LOW (0V).
Ý nghĩa: Xuất tín hiệu ra các chân để điều khiển, có 2 giá trị là HIGH hoặc LOW.
Ứng dụng: Xuất tín hiệu điều khiển bật/tắt quạt, đèn…
Ví dụ:
1) Bật đầu ra rơ le R1 (D3)
2) Tắt đầu ra rơ le R1 (D3)
Lưu ý:
+) Khi xuất tín hiệu mức HIGH (tương ứng với 5V) rơ le được bật và ngược lại khi xuất tín hiệu mức LOW (tương ứng với 0V) rơ le tắt.
e. Hàm delay()
Cấu trúc: delay(ms);
Trong đó: ms là thời gian (Sử dụng ở đây là mili giây).
Ý nghĩa: Dừng chương trình trong 1 khoảng thời gian (1000 mili giây = 1 giây).
Ứng dụng: Tạo trễ.
Ví dụ: Tạo trễ 5 giây
Bài 1.
Thiết kế, chế tạo hệ thống đọc trạng thái nhấn / nhả của các nút nhấn (được tích hợp sẵn trên mạch) và hiển thị lên Serial Monitor.
a. Mã lệnh
// Định nghĩa địa chỉ các chân với 1 cái tên
#define I0 14
#define I1 7
#define I2 8
#define I3 9
#define I4 10
#define I5 11
#define I6 12
#define I7 13
void setup() {
Serial.begin(9600); // Khởi tạo bật cổng Serial Monitor với tốc độ 9600
// Cấu hình tất cả các nút nhấn có chiều vào input
pinMode(I0, INPUT);
pinMode(I1, INPUT);
pinMode(I2, INPUT);
pinMode(I3, INPUT);
pinMode(I4, INPUT);
pinMode(I5, INPUT);
pinMode(I6, INPUT);
pinMode(I7, INPUT);
}
void loop() {
Serial.print("Trang thai I0:"); // Tạo tiêu đề cho I0
Serial.println(digitalRead(I0)); // Hiển thị trạng thái nút nhấn I0
Serial.print("Trang thai I1:"); // Tạo tiêu đề cho I1
Serial.println(digitalRead(I1)); // Hiển thị trạng thái nút nhấn I1
Serial.print("Trang thai I2:"); // Tạo tiêu đề cho I2
Serial.println(digitalRead(I2)); // Hiển thị trạng thái nút nhấn I2
Serial.print("Trang thai I3:"); // Tạo tiêu đề cho I3
Serial.println(digitalRead(I3)); // Hiển thị trạng thái nút nhấn I3
Serial.print("Trang thai I4:"); // Tạo tiêu đề cho I4
Serial.println(digitalRead(I4)); // Hiển thị trạng thái nút nhấn I4
Serial.print("Trang thai I5:"); // Tạo tiêu đề cho I5
Serial.println(digitalRead(I5)); // Hiển thị trạng thái nút nhấn I5
Serial.print("Trang thai I6:"); // Tạo tiêu đề cho I6
Serial.println(digitalRead(I6)); // Hiển thị trạng thái nút nhấn I6
Serial.print("Trang thai I7:"); // Tạo tiêu đề cho I7
Serial.println(digitalRead(I7)); // Hiển thị trạng thái nút nhấn I7
delay(800); // tạo trễ 800 mili giây
Serial.println(); // xuống dòng
}
b. Giải thích chương trình (Ý nghĩa đoạn lệnh)
+) Sử dụng câu lệnh đọc trạng thái nút nhấn và hiển thị lên Serial Monitor:
Serial.println(digitalRead(I0));
+) Tạo ra một tiêu đề cho mỗi nút nhấn qua lệnh:
Serial.print("Trang thai I0:");
+) Qua đoạn lệnh trên ta có thể quan sát trạng thái của các nút nhấn.
c. Kết quả (Mạch hoạt động thế nào)
Trạng thái của 7 nút nhấn được hiển thị trên màn hình Serial Monitor. Khi nhấn nút I0 sẽ hiển thị như hình dưới.
Bài 2.
Thiết kế, chế tạo hệ thống sử dụng nút nhấn I0 (D14) (được tích hợp sẵn trên mạch) để điều khiển bật / tắt rơ le R0 (D4) khi tác động nhấn / nhả một lần.
a. Mã lệnh
// Định nghĩa địa chỉ các chân với 1 cái tên
#define I0 14
#define R0 4
void setup() {
pinMode(I0, INPUT); // Thiết lập I0 có chiều vào
pinMode(R0, OUTPUT); // Thiết lập R0 có chiều ra
}
void loop() {
int nut_nhan = digitalRead(I0); // gắn biến đọc nút nhấn
if (nut_nhan == LOW) // nếu được nhấn, tín hiệu mức LOW
{
int tin_hieu = !digitalRead(R0); // gắn biến tín hiệu, đảo trạng thái “!”
delay(500); // trễ 0,5 giây
digitalWrite(R0, tin_hieu); // kích mức tín hiệu đã đảo để điều khiển rơ le R0
while (digitalRead(I0) == LOW); // nếu vẫn giữ nút nhấn, sẽ không thực hiện gì
}
}
b. Giải thích chương trình (Ý nghĩa đoạn lệnh)
+) Để đảo trạng thái rơ le sau mỗi lần ta (nhấn / nhả), sử dụng lệnh:
int tin_hieu = !digitalRead(R0); // gắn biến để đọc
+) Kiểm tra nút nhấn đã thực hiện 1 lần (nhấn / nhả) chưa, sử dụng lệnh:
while (digitalRead(I0) == LOW);
c. Kết quả (Mạch hoạt động thế nào)
Khi được (nhấn / nhả) 1 lần, rơ le sẽ đảo trạng thái từ bật sang tắt hoặc ngược lại.
Bài 1.
Thiết kế, chế tạo hệ thống bật đèn tự động khi có người trong phòng.
a. Chuẩn bị
+) Mạch C88.
+) Cảm biến thân nhiệt, chuyển động PIR HC-SR501.
+) Bóng đèn 220VAC.
b. Sơ đồ lắp ráp
c. Mã lệnh
// Định nghĩa địa chỉ các chân với 1 cái tên
#define I0 14
#define R0 4
void setup() {
pinMode(I0, INPUT); // Thiết lập I0 có chiều vào
pinMode(R0, OUTPUT); // Thiết lập R0 có chiều ra
}
void loop() {
int cam_bien = digitalRead(I0); // gắn biến đọc trạng thái cảm biến
if (cam_bien == LOW) // nếu cảm biến ở mức LOW
{
digitalWrite(R0, LOW); // kích mức LOW, tắt rơ le
}
else // ngược lại
{
digitalWrite(R0, HIGH); // kích mức HIGH, rơ le được bật
delay(1000); // tạo trễ 1 giây
}
delay(2000); // tạo trễ 2 giây
}
d. Kết quả (Mạch hoạt động thế nào)
Khi cảm biến phát hiện thấy người, đèn sẽ được bật.
Link video:https: https://youtu.be/snDzwrq96Yo