-
Thông tin
-
Quiz
Chương trình được xây dựng xoay quanh 5 tác vụ chính - Tài liệu tham khảo | Đại học Hoa Sen
Chương trình được xây dựng xoay quanh 5 tác vụ chính - Tài liệu tham khảo | Đại học Hoa Sen và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng, ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả
Đại học Hoa Sen 4.8 K tài liệu
Chương trình được xây dựng xoay quanh 5 tác vụ chính - Tài liệu tham khảo | Đại học Hoa Sen
Chương trình được xây dựng xoay quanh 5 tác vụ chính - Tài liệu tham khảo | Đại học Hoa Sen và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng, ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả
Môn: Tin học ứng dụng khối ngành Kinh tế (MIS 215DV01) 22 tài liệu
Trường: Đại học Hoa Sen 4.8 K tài liệu
Thông tin:
Tác giả:
Tài liệu khác của Đại học Hoa Sen
Preview text:
Chương trình được xây dựng xoay quanh 5 tác vụ chính là:
HandleButtonTask: Tác vụ này xử lí khi nhấn nút trên app blynk giúp
người dùng có thể thực hiện mở cửa từ xa.
DisplayLCDTask: Tác vụ này cơ bản xử lí khi cần cập nhật lại thông tin
trên màn hình LCD. Nó sẽ xóa thông tin cũ trên màn hình LCD và hiển thị nội dung mới.
InputKeyTask: Tác vụ này sẽ liên tục quét bàn phím và nhận dữ liệu đầu
vào nhận được từ bàn phím keypad, sau đó sẽ gửi các dữ liệu đầu vào vào hàng đợi
StartProgramTask: Tác vụ này có vai trò trung tâm, nó sẽ nhận các lệnh
nhận được từ bàn phím qua hàng đợi và dựa vào đó để thực hiện các thao
tác được lập trình sẵn
ScanRFIDTask: Tác vụ này đơn giản xử lí việc quét và xác thực thẻ RFID void setup(){ Serial.begin(9600);
SPI.begin(); // Khai báo SPI cho RFID
rfid.PCD_Init(); // Khai báo rfid
lcd.init(); lcd.backlight(); lcd.setCursor(0, 0);
lcd.print(" Choose Options");
pinMode(BUZZER, OUTPUT); // Không quan tâm
pinMode(BUTTON, INPUT_PULLUP); // Không quan tâm
myServo.attach(SERVO_PIN); // Gắ<
n servo vào chân SERVO_PIN với các giá
trị giới hạn 1000 µs và 2000 µs
if(!EEPROM.begin(EEPROM_SIZE)) {// Khở Fi tạo EEPROM, nế< u không khở
Fi tạo được thì thoát chưởng trình
Serial.println("Failed to initialize EEPROM..."); return; }
Serial.println("EEPROM initialised successfully!");
uint32_t TestCard; // Thực hiện load the
F được lưu dưới EEPROM vếQ ma Fng danh sách the F ID_CARD_PASS
if(!LoadRFIDFromEEPROM(TestCard, 0)) // Nế< u k có the F thì lâ< y the F trắ< ng làm the F mặc định {
Serial.println("Initializing default RFID card...");
SaveRFIDToEEPROM(initCard, 0);
ID_CARD_PASS[0] = initCard; } // Ta Fi tâ< t ca F các mã the F từ EEPROM vào ma Fng ID_CARD_PASS
for(int i = 0;i < TotalCardStored;i++) // Còn không thì Load the F lến {
LoadRFIDFromEEPROM(ID_CARD_PASS[i], i); } // KiếF m tra xem có mật khâF u trong EEPROM không
int lengthPasswordStored = EEPROM.read(PASSWORD_LENGTH_ADDR);
if(lengthPasswordStored > 0) readPasswordFromEEPROM(); // Có lưu mật khâF
u dưới EEPROM ta thực hiện đọc password từ EEPROM vào Password đếF sưF dụng
commandQueue = xQueueCreate(1, sizeof(char));
xSemaphoreStartProgram = xSemaphoreCreateMutex();
xTaskCreate(HandleButtonTask, "HandleButtonTask", 1280, NULL, 1, NULL);
xTaskCreate(DisplayLCDTask, , "DisplayLCDTask" 1280 * 2, NULL, 1, NULL);
xTaskCreate(InputKeypadTask, "InputKeypadTask", 1280, NULL, 1, NULL);
xTaskCreate(StartProgramTask, "StartProgramTask", 1280 * 8, NULL, 1, NULL);
xTaskCreate(ScanRFIDTask, "ScanRFIDTask", 1280 * 4, NULL, 1, NULL);
int total = GetCurrentTotalCardStored();
Blynk.begin(auth, ssid, pass); // Thực hiện kế< t nô< i blynk
Blynk.virtualWrite(PASSWORD_ON_APP_PIN, password); // Gán pass trến blynk app
Blynk.virtualWrite(TOTAL_CARD_ON_APP_PIN, total); // Gán tôF ng sô< the F lến blynk app }
void DisplayLCDTask(void *pvParameters) { while(1) {
if(xSemaphoreTake(xSemaphoreStartProgram, portMAX_DELAY) == pdTRUE) { if(UpdateLCD) { lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Choose Options");
UpdateLCD = false; }
xSemaphoreGive(xSemaphoreStartProgram); // Gia Fi phóng Semaphore sau khi sưF dụng xong }
vTaskDelay(pdMS_TO_TICKS(200)); } }
Tác vụ này sẽ liên tục quét cho đến khi có sự thay đổi về biến trạng thái
UpdateLCD, nếu UpdateLCD = true ta thực hiện thay đổi màn hình hiện tại sang
màn hình chính, gán UpdateLCD = false để thực hiện cho các lần tiếp theo.
void InputKeypadTask(void *pvParameters) { while(1) {
char key = keypad.getKey(); if(key != NO_KEY) {
if(xSemaphoreTake(xSemaphoreStartProgram, portMAX_DELAY) == pdTRUE) {
Serial.println(key);
xQueueSend(commandQueue, &key, portMAX_DELAY);
xSemaphoreGive(xSemaphoreStartProgram); } }
vTaskDelay(pdMS_TO_TICKS( 100 )); } }
Tác vụ này sẽ liên tục quét bàn phím và nhận dữ liệu đầu vào từ việc nhấn phím,
sau đó sẽ ném dữ liệu đó vào hàng đợi để cho việc xử lí sau đó
void StartProgramTask(void *pvParameters) { while(1) { char key;
if(xQueueReceive(commandQueue, &key, portMAX_DELAY) == pdTRUE) {
if(ChangePassMode || EnterPassMode || HandleCardMode) {
if(ChangePassMode) handleChangePassWord(key);
else if(EnterPassMode) handleEnterPassword(key);
else if(HandleCardMode) handleCard(key); }
else if(key == '5') {
UpdateLCD = false;
Serial.println("Trạng thái xóa the F RFID");
ChangeCardMode = true;
HandleCardMode = true; lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Enter Password");
passwordIndex = 0; }
else if(key == '4') {
UpdateLCD = false;
Serial.println("Trạng thái xóa the F RFID");
RemoveCardMode = true;
HandleCardMode = true; lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Enter Password");
passwordIndex = 0; }
else if(key == '3') {
UpdateLCD = false;
Serial.println("Trạng thái thếm the F RFID");
InsertCardMode = true;
HandleCardMode = true; lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Enter Password");
passwordIndex = 0; }
else if(key == '2') {
UpdateLCD = false;
Serial.println("Trạng thái đôF i mật khâF u");
ChangePassMode = true; lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Enter Old Pass");
passwordIndex = 0; }
else if(key == '1') {
UpdateLCD = false;
Serial.println("Trạng thái nhập mật khâF u"); lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Enter Password");
EnterPassMode = true;
passwordIndex = 0; }
else if(key == '*') {
ClearAllCardsInEEPROM();
SaveRFIDToEEPROM(initCard, 0);
ID_CARD_PASS[0] = initCard; } }
vTaskDelay(pdMS_TO_TICKS(10)); } }
Tác vụ này sẽ liên tục quét hàng đợi cho đến khi nhận được dữ liệu đầu vào từ sự
kiện nhấn phím và dựa vào dữ liệu nhận qua hàng đợi mà thực hiện các thao tác đã
được lập trình. Việc so sánh các trạng thái ở ngay đầu đóng vai trò chốt chặn tránh
cho việc khi nhấn các nút nhấn trên bàn phím chạy vào các hàm xử lí bên dưới.