Viết ra LCD

Một phần của tài liệu đề tài module ethernet trên vi điều khiển pic18f67j60 và ứng dụng trong đo lường, điều khiển ( phần mềm trên mplab ) (Trang 56 - 66)

CHƯƠNG 5 TCP/IP STACK

5.5. DEMO MODULE

5.5.2. Viết ra LCD

- Gõ đường link trên trình duyệt http:/192.168.1.2/forms.htm. - Viết 1 chuỗi kí tự vào ơ trống rồi bấm nút Save.

- Kiểm tra màn hình LCD trên board xem có hiển thị được đúng chuỗi mà ta yêu cầu hay không.

Code trong file forms.htm:

Hình 29: Code phần LCD trong file forms.htm. 5.5.2.1. HTTPExecutePost

Hàm HTTPExecutePost sẽ thực hiện một số nhiệm vụ:

- Đầu tiên, lấy tên của trang web truy cập hiện tại được lưu trong biến curHTTP.file và gán cho biến filename bằng cách sử dụng hàm MPFSGetFilename.

- Kiểm tra nếu trang web truy cập hiện tại đúng là forms.htm thì sẽ thực hiện hàm con HTTPPostLCD().

- Thực hiện hàm con HTTPPostLCD.

Code:

HTTP_IO_RESULT HTTPExecutePost(void) {

// Resolve which function to use and pass along BYTE filename[20];

// Load the file name

// Make sure BYTE filename[] above is large enough for your longest name

MPFSGetFilename(curHTTP.file, filename, sizeof(filename)); #if defined(USE_LCD) if(!memcmppgm2ram(filename, "forms.htm", 9)) return HTTPPostLCD(); #endif return HTTP_IO_DONE; }

5.5.2.2. Hàm HTTPPostLCD

- Xác định thông số của LCD và sử dụng nó để cập nhật các dịng văn bản lên màn hình LCD trên mạch.

- Hàm này có 4 trạng thái. Đầu tiên là đọc tên từ chuỗi dữ liệu được trả lại từ phương pháp POST. Nếu tên khơng được tìm thấy thì nó sẽ tiếp tục hỏi nhiều dữ liệu hơn. Hay nói cách khác, nếu tên được mong đợi nó sẽ đọc các giá trị liên quan và ghi lên màn hình LCD. Nếu tên không được mong đợi, các giá trị liên quan được loại bỏ và các thông số tên tiếp theo được đọc.

- Trong trường hợp, chuỗi mong đợi khơng được tìm thấy thì hàm này sẽ trả lại HTTP_IO_NEED_DATA khi khơng cịn dữ liệu. Trong trường hợp này, HTTP2 server sẽ bắt các lỗi và và phát ra Internal Server Error đến trình duyệt.

- Các giá trị trả lại:

• HTTP_IO_DONE : Nếu tham số được tìm thấy và lưu.

• HTTP_IO_WAITING : Hàm này bị dừng lại và sẽ tiếp tục sau đó. • HTTP_IO_NEED_DATA : Dữ liệu mà hàm này cần chưa có.

Code:

static HTTP_IO_RESULT HTTPPostLCD(void) {

BYTE* cDest;

#define SM_POST_LCD_READ_NAME (0u)

#define SM_POST_LCD_READ_VALUE (1u)

switch(curHTTP.smPost) {

// Find the name

case SM_POST_LCD_READ_NAME: // Read a name

if(HTTPReadPostName(curHTTP.data, HTTP_MAX_DATA_LEN) == HTTP_READ_INCOMPLETE)

return HTTP_IO_NEED_DATA;

curHTTP.smPost = SM_POST_LCD_READ_VALUE; // No break...continue reading value

// Found the value, so store the LCD and return case SM_POST_LCD_READ_VALUE:

// If value is expected, read it to data buffer, // otherwise ignore it (by reading to NULL)

if(!strcmppgm2ram((char*)curHTTP.data, (ROM char*)"lcd")) cDest = curHTTP.data;

else

cDest = NULL; // Read a value string

if(HTTPReadPostValue(cDest,HTTP_MAX_DATA_LEN)== HTTP_READ_INCOMPLETE)

return HTTP_IO_NEED_DATA;

// If this was an unexpected value, look for a new name if(!cDest)

{

curHTTP.smPost = SM_POST_LCD_READ_NAME; break;

}

// Copy up to 32 characters to the LCD if(strlen((char*)cDest) < 32u)

{

memset(LCDText, ' ', 32);

} else {

memcpy(LCDText, (void *)cDest, 32); }

LCDUpdate();

// This is the only expected value, so callback is done strcpypgm2ram((char*)curHTTP.data, "/forms.htm"); curHTTP.httpStatus = HTTP_REDIRECT;

return HTTP_IO_DONE; }

// Default assumes that we're returning for state machine convenience. // Function will be called again later.

return HTTP_IO_WAITING; } #endif Hàm con HTTPReadPostName: - Cú pháp: HTTP_READ_STATUS HTTPReadPostName ( BYTE* cData, WORD wLen );

• cData: để lưu trữ tên khi nó được đọc • wLen: độ dài của biến cData

- Giá trị trả lại:

• HTTP_READ_OK : Tên được đọc thành cơng.

• HTTP_READ_TRUNCTATED : Toàn bộ tên không phù hợp trong bộ đệm, vì thế giá trị đã bị cắt ngắn và dữ liệu bị mất.

• HTTP_READ_INCOMPLETE : Tên chưa được lưu vào bộ đệm, vì thế hàm sẽ được gọi lại sau đó.

Đọc tên từ một chuỗi URL được mã hóa. Hàm này được gọi từ hàm callback HTTPExecutePost, nó làm cho việc phân tích dữ liệu gửi đến một cách dễ dàng. Hàm này ngăn chặn việc tràn bộ đệm bằng cách buộc người lập trình xác định rõ cần bao nhiêu byte.

Hàm này sẽ đọc cho đến khi gặp kí tự “=” tiếp theo ( kí tự “=” để đánh kết thúc của tham số tên).

Hàm con HTTPReadPostValue:

- Cú pháp: HTTP_READ_STATUS HTTPReadPostValue(

BYTE* cData,

WORD wLen );

• cData: để lưu trữ giá trị khi nó được đọc. • wLen: độ dài của biến cData.

- Giá trị trả lại:

• HTTP_READ_OK : Giá trị được đọc thành cơng.

• HTTP_READ_TRUNCTATED : Tồn bộ giá trị khơng phù hợp trong bộ đệm, vì thế giá trị đã bị cắt ngắn và dữ liệu bị mất.

• HTTP_READ_INCOMPLETE : Toàn bộ giá trị chưa được lưu vào bộ đệm, vì thế hàm sẽ được gọi lại sau đó.

Đọc giá trị từ một chuỗi URL được mã hóa. Hàm này được gọi từ hàm callback HTTPExecutePost, nó làm cho việc phân tích dữ liệu gửi đến một cách dễ dàng. Hàm này ngăn chặn việc tràn bộ đệm bằng cách buộc người lập trình xác định rõ cần bao nhiêu byte.

Hàm này sẽ đọc cho đến khi gặp kí tự “&” tiếp theo ( kí tự “&” để đánh kết thúc của tham số giá trị).

5.5.3. Đo nhiệt độ

- Gõ đường link trên trình duyệt http:/192.168.1.2/ dynvars.htm. - Theo dõi nhiệt độ đo được.

Hình 30: Hiển thị giá trị nhiệt độ trên web.

Để đo được giá trị nhiệt độ em sử dụng IC LM35 để biến thông số nhiệt độ thành điện áp và đưa vào bộ biến đổi A/D 10 bit (AN4). Giá trị điện áp sẽ được biến đổi thành giá trị số tương ứng. Giá trị số này sẽ được tính tốn theo cơng thức chuẩn để trở thành giá trị nhiệt độ thực tế.

Tham số nhiệt độ là một biến động nên sử dụng hàm gọi lại HTTPPrint_pot để thực hiện việc hiển thị tham số nhiệt độ này.

5.5.3.1. Hàm HTTPPrint_pot

void HTTPPrint_pot(void) {

BYTE AN0String[8]; WORD ADval;

#if defined(__18CXX)

// Wait until A/D conversion is done

ADCON0bits.GO = 1; //A/D conversion status bit while(ADCON0bits.GO);

// Convert 10-bit value into ASCII string ADval = (WORD)ADRES; ADval *= (WORD)330; ADval /= (WORD)1024; uitoa(ADval, AN0String); #else ADval = (WORD)ADC1BUF0; //ADval *= (WORD)10; //ADval /= (WORD)102; uitoa(ADval, (BYTE*)AN0String); #endif TCPPutString(sktHTTP, AN0String); }

Trong khi ADCON0bits.GO=1 tức là bộ biến đổi A/D vẫn đang hoạt động ta gán giá trị đã được biến đổi trên thanh ghi chứa kết quả ADRES cho biến Adval. Sau đó áp dụng cơng thức chuyển đổi từ giá trị số sau phép biến đổi A/D thành giá trị nhiệt độ như sau: Adval= ((Adval*3.3)/1024)*100 ( trong đó giá trị 3.3 là giá trị của VREF). Tiếp theo là ép kiểu biến Adval thành kiểu byte và lưu vào biến AN0String. Cuối cùng là sử dụng hàm TCPPutString để lưu giá trị của biến AN0String vào socket của TCP.

5.5.3.2. Code trong file dynvars.htm

Hình 31: Code trong file dynvars.htm

Do tham số nhiệt độ là một biến động thay đổi theo thời gian vì thế phải sử dụng một câu lệnh javascript để cập nhật giá trị của nhiệt độ theo thời gian. Đó là sử dụng hàm setTimeout để cập nhật biến nhiệt độ.

KẾT LUẬN

Việc thiết kế Module Ethernet trên vi điều khiển PIC18F67J60 nhằm ứng dụng đo lường và điều khiển có ý nghĩa rất lớn, có thể ứng dụng trong nhiều lĩnh vực của đời sống xã hội và trong cơng nghiệp. Ngồi ra, module Ethernet trên vi điều khiển PIC18F67J60 cũng phục vụ tốt cho việc học tập và nghiên cứu của sinh viên. Việc xây dựng module này liên quan đến nhiều mảng kiến thức, từ những kiến thức lý thuyết cho đến những kiến thức thực tiễn.

Những kết quả chính thực hiện được

- Tìm hiểu ngun lý chung chuẩn truyền thơng Ethernet do IEEE 802.3 quy định, tìm hiểu kiến thức về họ giao thức TCP/IP.

- Kết nối thành cơng mạch mạch demo với máy tính thơng qua chuẩn truyền thơng Ethernet.

- Lập trình cho mạch demo bằng phần mềm MPLAB C18, sử dụng thư viện TCP/IP Stack của hãng Microchip để thực hiện điều khiển các ứng dụng cơ bản như bật tắt đèn LED, viết lên LCD một chuỗi kí tự và đo tham số nhiệt độ qua web giao diện.

- Lập trình web giao diện để đo lường, điều khiển của mạch demo trên máy tính.

Đánh giá những kết quả đã đạt được

- Điều khiển chính xác các đèn LED và viết chính xác các chuỗi kí tự mà ta mong muốn lên LCD, kết quả đo nhiệt độ là khá chính xác với sai số nằm trong phạm vi cho phép. Mạch hoạt động ổn định.

- Tuy nhiên, một số mặt hạn chế đó là đề tài mới chỉ là thực hiện kết nối trực tiếp giữa mạch demo với máy tính thơng qua chuẩn truyền thơng Ethernet mà chưa thực hiện được kết nối mạch với switch.

- Với kết quả bước đầu là kết nối thành cơng mạch demo với máy tính thơng qua chuẩn truyền thơng Ethernet và thực hiện đo lường và điều khiển một số ứng dụng cơ bản đã khẳng định khả năng phát triển của đề tài.

Hướng phát triển tiếp theo của đề tài:

Trong thời gian tới, em sẽ tiếp tục nghiên cứu phát triển đề tài theo một số hướng sau đây:

- Kết nối mạch với switch.

- Thực hiện các ứng dụng điều khiển và đo lường phức tạp hơn để phục vụ cho cuộc sống như điều khiển nhà thông minh qua internet và phục vụ trong công nghiệp, thay thế các chuẩn truyền thông cũ như RS485, RS232…

Một phần của tài liệu đề tài module ethernet trên vi điều khiển pic18f67j60 và ứng dụng trong đo lường, điều khiển ( phần mềm trên mplab ) (Trang 56 - 66)

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

(66 trang)
w