Thiết kế phần mềm vi điều khiển

Một phần của tài liệu HỆ THỐNG MÔ PHỎNG VÀ CHẨN ĐOÁN MẠCH CÒI XE THÔNG QUA ĐIỆN THOẠI THÔNG MINH (Trang 77 - 89)

6.4 Thiết kế phần mềm

6.4.2 Thiết kế phần mềm vi điều khiển

Lưu đồ khối vi điều khiển

Lập trình khối xử lý tín hiệu (board Arduino MEGA)

Lập trình hiển thị giá trị khởi tạo lên LCD

Sau khi các giá trị được đo kiểm thì LCD sẽ có nhiệm vụ đọc các giá trị lên màn hình. Do màn hình LCD 16x02 chỉ hiển thị được 2 dòng nên ở đây ưu tiên hiển thị mảng thời gian và hiển thị về giá trị điện áp

Code kết nối chân và hiển thị giá trị trên LCD:

#include <LiquidCrystal.h> // Thêm thư viện LiquidCrystal

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// Khởi tạo các chân LCD 12,11,5,4,3,2

Lập trình khai báo biến

Lập trình khai báo biến là khởi tạo các giá trị cần thiết cho chương trình. Giá trị a và olda là giá trị trạng thái tín hiệu mới và cũ của chân đỏ. Hai giá trị này sẽ được so sánh với nhau, nếu chúng giống nhau có nghĩa là thao tác đo kiểm của sinh viên khơng có gì thay đổi nên nó sẽ khơng xuất giá trị, ngược lại nếu chúng khác nhau sẽ xuất ra giá trị trạng thái cho que đo đỏ. Giá trị b và oldb cũng tương tự.

int a, b, olda, oldb, dienap, t;

Khai báo các mảng tương ứng với các trạng thái của mơ hình: trạng thái bình thường chưa có lỗi, trạng thái được tạo lỗi, trạng thái tháo các linh kiện trong mạch ra đo kiểm.

int BT[] = {0, 12, 12, 12, 12, 0, 0, 0, 12, 12, 12, 12}; // Chế độ hoạt động bình thường khi nhấn cịi

int PAN1[] = {0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0}; // Chế độ đứt dây 7-8 int PAN2[] = {0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Đứt cầu chì 3-4 int PAN3[] = {0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0}; // Đứt rơ le 5-6

int PAN4[] = {0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0}; // Đứt dây 10-11 khi khơng nhấn cịi

int PAN41[] = {0, 12, 12, 12, 12, 0, 0, 0, 12, 12, 0, 0}; // Đứt dây 10-11 khi nhấn còi

int BTT[] = {0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0}; // Chế độ hoạt động khi không nhấn nút

Khởi tạo biến M, S để thiết lập thời gian làm bài. Thiết lập trong trường hợp này là 10 phút

int M = 10; // phút int S = 00; // giây

Khởi tạo time1 và time2 để tạo độ trễ cho 2 sự kiện liên tiếp. unsigned long time2 = 0;

unsigned long time1 = 0;

Khởi tạo biến giatri để xác định chế độ hoạt động của mạch còi. Nếu giatri thay đổi sẽ thay đổi chế độ hoạt động

byte giatri = 0; // Chế độ hoạt động bình thường  Lập trình chương trình thiết lập

Ở phần void setup() ta thiết lập các điểm quét ở chế độ Input_Pullup, khởi tạo LCD và khai báo các chân cơng tắc, nút nhấn

Code lập trình chương trình thiết lập: void setup() {

lcd.begin(16, 2); //Thơng báo đây là LCD 1602 for (int i = 1; i < 13; i++)

{

pinMode(i + 41, INPUT_PULLUP); // Thiết lập chân ở chế độ Pullup }

Serial.begin(9600);

pinMode(22, INPUT); // Thiết lập chân công tắc mở acquy pinMode(23, INPUT); // Thiết lập chân cơng tắc mở cầu chì pinMode(24, INPUT); // Thiết lập chân công tắc mở rơle

digitalWrite( 10, HIGH); // Thiết lập chân 10 ở giá trị HIGH pinMode(8, INPUT); // Thiết lập chân cơng tắc cịi

pinMode(7, OUTPUT); // Thiết lập chân tín hiệu cịi pinMode(9, INPUT); // Thiết lập chân công tắc Start lcd.setCursor(1, 0); lcd.print ("Time: "); lcd.setCursor(7, 0); lcd.print("0"); lcd.setCursor(8, 0); lcd.print(M); lcd.setCursor(9, 0); lcd.print(":"); lcd.setCursor(10, 0); lcd.print("0"); lcd.setCursor(11, 0); lcd.print(S); lcd.setCursor(0, 1); lcd.print("Volt:"); }  Lập trình chương trình qt phím

- Q trình quét dùng để xác định 2 que đo đang ở vị trí nào trên mơ hình mạch cịi xe. Việc quét thực hiện lần lượt từ chân chân đỏ (tương ứng với D40) tới chân đen (tương ứng với D41).

+ Nếu chân đỏ đang ở điểm đo nào trên mơ hình thì giá trị a (giá trị khi chân đỏ được quét) bằng vị trí điểm đo. Trong mơ hình mạch cịi xe thì có 12 điểm tương ứng với 12 vị trí đo cần xác định. Nếu chân đỏ khơng đo điểm nào trên mơ hình thì giá trị a bằng 0.

+ Chân đen tương tự chân đỏ nhưng giá trị chân đen sẽ là giá trị b. - Code lập trình chế độ chương trình qt phím:

void quetphim() {

pinMode(40, OUTPUT); // Chế độ Output của chân đỏ pinMode(41, INPUT); // Chế độ Input của chân đen for (int i = 1; i < 13; i++) { // 12 điểm đo if (digitalRead(i + 41) == 1) { a = 0; } if (digitalRead(i + 41) == 0) { a = i ; // Chân đỏ đang ở vị trí i break; } }

pinMode(40, INPUT); // Chế độ Input của chân đỏ pinMode(41, OUTPUT); // Chế độ Output của chân đen for (int k = 1; k < 13; k++) { if (digitalRead(k + 41) == 1) { b = 0; } if (digitalRead(k + 41) == 0) {

b = k; // Chân đen đang ở vị trí i

break;}}

Lập trình chương trình chế độ cịi

Khi 1 hệ thống cịi xe hoạt động bình thường thì phải đảm bảo cịi xe phải kêu khi nhấn nút còi. Việc này được thực hiện bằng cách đọc giá trị của chân nút nhấn (chân D8). Nếu chân tín hiệu đang ở chế độ HIGH tương ứng với việc đang thực hiện nhấn cịi, lúc đó cịi sẽ kêu. Nếu chân tín hiệu đang ở chế độ LOW thì cịi sẽ khơng kêu.

Hình 6. 27: Sơ đồ dây giữa nút nhấn cịi và Arduino

Code lập trình chế độ cịi: void HORN()

{

if (digitalRead(8) == HIGH){// Đọc tín hiệu chân số 8 ở chế độ HIGH digitalWrite(7,1); // Còi kêu

}

else digitalWrite(7,0); // Cịi khơng kêu }

Lập trình chương trình reset

Reset được thực hiện khi sinh viên muốn bắt đầu thực hiện một bài làm mới. Chức năng Reset sẽ khơi phục tồn bộ giá trị trở lại giá trị ban đầu. Từ đó, sinh viên có thể hồn thành tốt bài làm của mình mà khơng ảnh hưởng tới bài làm của người khác. Việc Reset được thực hiện qua việc nhấn nút. Khi nhấn nút Reset trên board Arduino thì tương ứng với việc bạn nối trực tiếp chân Reset trên board vào chân GND thơng qua điện trở. Vì vậy, nếu muốn reset board bằng nút nhấn thì bạn có thể nối chân Reset vào 1 chân tín hiệu và biến chân tín hiệu đó thành GND.

Code lập trình chương trình RESET: void Reset()

{

digitalWrite(10, LOW); // Biến chân 10 thành chân GND }

Hình 6. 28: Sơ đồ dây giữa nút nhấn RESET và Arduino

Khi sinh viên muốn bắt đầu thực hiện bài làm, thì bắt buộc sinh viên đó phải nhấn nút START để chương trình bắt đầu hoạt động. Việc này được thực hiện bằng cách đọc giá trị của chân nút nhấn (chân D9). Nếu chân tín hiệu đang ở chế độ HIGH tương ứng với việc đang thực hiện nhấn nút, giá trị t=1 (khởi tạo giá trị t=0). Khi t=1 thì chương trình được thực hiện, cịn t=0 thì chương trình chính khơng thực hiện.

Code lập trình chương trình RESET: void START() { if (digitalRead(9)==HIGH){ t=1; } }

Hình 6. 29: Sơ đồ dây giữa nút nhấn START và Arduino

Lập trình chương trình ở các chế độ hoạt động

Trong hệ thống mơ phỏng mạch cịi xe có tất cả là 5 chế độ hoạt động: Bình thường, Pan 1, Pan 2, Pan 3, Pan4.

Ở chế độ hoạt động bình thường, giá trị điện áp ở mỗi vị trí được tạo ra từ 2 mảng một chiều từ đó xác định giá trị điện áp của mỗi vị trí

+ Khi nhấn cịi: int BT[] = { 0, 12, 12, 12, 12, 0, 0, 0, 12, 12, 12, 12}; + Khi khơng nhấn cịi int int BTT[] = { 0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0};

Khi vị trí chân đo hiện tại khác vị trí trước đó (a != olda, b != oldb) thì vị trí các chân đo và điện áp sẽ được gửi đi thông qua cổng Serial

Ngồi ra, ở mỗi chế độ có các cơng tắc tháo/lắp. Việc đóng/mở cơng tắc được xác định bằng cách đọc giá trị từ các chân tín hiệu (chân D22, D23, D24). Nếu nếu chân tín hiệu đang ở chế độ LOW thì cơng tắc được bật. Các lệnh trong cơng tắc được thực hiện.

Ở các chế độ còn lại, cách thức hoạt động cũng tương tự với chế độ hoạt động bình thường, chỉ thay đổi các giá trị điện áp.

Code lập trình chế độ hoạt động bình thường: void Binhthuong()

{

if (digitalRead(22) == 0) BATT(); // Công tắc acquy được bật if (digitalRead(23) == 0) FUSE();// Cơng tắc cầu chì được bật if (digitalRead(24) ==0) RELAY(); // Cơng tắc rơ le được bật

if ((digitalRead(22) == 1)&& (digitalRead(23) == 1) && (digitalRead(24) == 1) && (digitalRead(8)==1)) // Khi còi được nhấn

{

digitalWrite(7,1);

HORNBT(); // Còi kêu khi đang ở chế độ bình thường

}

else digitalWrite(7,0);

if (( a != olda) or ( b != oldb)) {

Serial.print(",");

Serial.print(a); // Xuất vị trí chân đỏ ra Serial Serial.print(",");

Serial.print(b); // Xuất vị trí chân đen ra Serial Serial.print(",");

olda = a; oldb = b;

if ((a != 0) && (b != 0)){

dienap = (BTT[a - 1] - BTT[b - 1]);

Serial.print(dienap); // Xuất giá trị điện áp ra Serial

} else { dienap=0; Serial.print(dienap); } Serial.print(","); Serial.print("*"); }  Lập trình chương trình ở chế độ tháo lắp

Ở chế độ tháo/lắp có các cơng tắc: tháo/lắp acquy, tháo/lắp cầu chì, tháo lắp rơle. Cách thức hoạt động cũng tương tự như các chế độ hoạt động nêu ở trên.

Code lập trình chế độ tháo/lắp cầu chì: void FUSE(){

if (( a != olda) or ( b != oldb)) { VITRI();

Serial.print(a); // Xuất giá trị chân đỏ ra Serial Serial.print(",");

Serial.print(b); // Xuất giá trị chân đen ra Serial Serial.print(",");

olda = a; oldb = b;

if ((a != 0) && (b != 0)){

dienap = (PAN2[a - 1] - PAN2[b - 1]);

Serial.print(dienap); // Xuất giá trị điện áp ra Serial

} else { dienap=0; Serial.print(dienap); } Serial.print(","); Serial.print("*"); }}  Lập trình chương trình chính

Các chương trình con ở trên được tập hợp lại thành 1 chương trình chính. Khi sinh viên nhấn bắt đầu khởi tạo chương trình. Arduino sẽ nhận tín hiệu gửi từ điện thoại các số 0, 1, 2, 3, 4 từ đó sẽ khởi tạo các chương trình con tương ứng Binhthuong(), PanLoi1(), PanLoi2(), PanLoi3(), PanLoi4(). Các giá trị điện áp và các chân sinh viên tiến hành đo sẽ được hiển thị lên LCD. Đồng thời khi đó thời gian đếm ngược bắt đầu đếm ngược và hiển thị trên LCD cho sinh viên canh giờ.

void loop() {

START(); // Chương trình Start

if ((unsigned long) (millis() - time1) > 200 ) { quetphim(); if ( Serial.available() > 0 ) { giatri = Serial.read() - 48; Serial.println(giatri); }

if ( giatri == 0) Binhthuong(); // Chế độ bình thường if ( giatri == 1) PanLoi1(); // Chế độ lỗi 1

if ( giatri == 3) PanLoi3(); // Chế độ lỗi 2 if ( giatri == 2) PanLoi2(); // Chế độ lỗi 3 if ( giatri == 4) PanLoi4(); // Chế độ lỗi 4

if (dienap == 12) {

lcd.setCursor(5, 1); // Thiết lập vị trí hiển thị trên LCD

lcd.print(dienap); } else if (dienap == 0) { lcd.setCursor(6, 1); lcd.print(dienap); lcd.setCursor(5, 1); lcd.print(" "); } lcd.setCursor(7, 1); lcd.print("V"); time1 = millis();

dongho();

}

Reset();}} // Chương trình Reset

Một phần của tài liệu HỆ THỐNG MÔ PHỎNG VÀ CHẨN ĐOÁN MẠCH CÒI XE THÔNG QUA ĐIỆN THOẠI THÔNG MINH (Trang 77 - 89)

Tải bản đầy đủ (DOCX)

(97 trang)
w