Lưu đồ và giải thuật

Một phần của tài liệu ĐỀ TÀI THU THẬP DỮ LIỆU DÙNG RASPBERRY PI THÔNG QUA MẠNG INTERNET (Trang 58)

2. Nội dung thực hiện:

4.2. Lưu đồ và giải thuật

4.2.1 Lưu đồ và giải thuật của chương trình trên PIC 16F887

Chương trình trên vi điều khiển PIC 16F887 được viết bằng ngôn ngữ C, và sử dụng các thư viện từ phần mềm mikroC Pro for Pic cho các chức năng LCD 4 đường dữ liệu, chuyển đổi tín hiệu tương tự sang tín hiệu số ADC_init() đọc dữ liệu từ kênh thứ 0 bằng lệnh ADC_get_sample(0), UART_init(9600) cho truyền dữ liệu nối tiếp tốc độ 9600kbps.

4.2.1.1 Chương trình con ngắt định thời timer2

Ngắt timer2 xảy ra khi thanh ghi TMR2 8 bit đếm tràn, xung đếm với tốc độ 1MHz được chia từ nguồn dao động nội. Giá trị thanh ghi TMR2 được đặt trước là 155, và khi thanh ghi TMR2 đếm được 100 xung thì xảy ra tràn bit TMR2IF_bit=1 ngắt xảy ra. Mỗi lần sự kiện ngắt diễn ra biến “bdn” tăng lên 1 giá trị, thanh ghi TMR2 được set lại giá trị 155, cờ tràn bit TMR2IF_bit được xóa về 0. Đồng thời trong chuơng trình ngắt cũng xữ lý việc đọc xung ngoại độ ẩm, từ thanh ghi TMR0 của timer0 lưu vào biến “xungda” mỗi khi giá trị của “bdn” chia hết cho 100 rồi xóa giá trị TMR0 về 0.

Begin

Cấu hình LCD và hiển thị các dòng text : “Toc do:”, “ND:”, “DA:”

Đồ án tốt nghiệp

Hình 4.15: Lưu đồ chương trình con ngắt định thời timer2

4.2.1.2 Chương trình con cấu hình LCD (cauhinh_LCD())

Chương trình thực hiện chức năng cài đặt cấu hình LCD 4 đường dữ liệu bằng lệnh lcd_init(), và bắt đầu thực hiện việc xóa màn hình với lệnh lcd_cmd(_lcd_clear), và con trỏ màn hình hoạt động chế độ tắt bằng lệnh lcd_cmd(_lcd_cursor_off). Đồng thời chương trình cũng xữ lý việc ghi dòng text1[]=”Toc do:” tại vị trí dòng 1 cột 1 bằng lệnh lcd_out(1,1,text1), dòng text2[]=”ND:” tại vị trí dòng 2 cột 1 với lệnh lcd_out(2,1,text2), dòng 2 cột 9 là vị trí hiển thị text3[]=”DA:” thông qua lệnh lcd_out(2,9,text3).

Begin

Cấu hình truyền UART 9600, khung truyền 9 bit.

End

Begin

Hiển thị dữ liệu lên LCD

Đồ án tốt nghiệp

Hình 4.16: Lưu đồ chương trình cấu hình LCD (cauhinh_LCD())

4.2.1.3 Chương trình con cấu hình truyền dữ liệu UART (cauhinh_UART)

Hình 4.17: Lưu đồ chương trình cấu hình truyền dữ liệu UART (cauhinh_UART)

Chương trình sử dụng thư viện hổ trợ từ chương trình mikroC Pro for Pic với lệnh UART1_init(9600) để định cấu hình truyền dữ liệu UART tốc độ 9600kbps. Và các lệnh thiết lập chế độ truyền nhận, RX9_bit=1 cho phép nhận dữ liệu với khung 9 bit, TX9_bit=1 truyền đi khung dữ liệu 9 bit, không sử dụng chức năng kiểm tra địa chỉ dữ liệu thông qua lệnh ADDEN_bit=0.

4.2.1.4 Chương trình con hiển thị giá trị lên LCD (hienthi())

Việc ghi giá trị nhiệt độ, độ ẩm và tốc độ quay động cơ ra hiển thị LCD được thực hiện thông qua các lệnh sau : giá trị dạng ACSII của tốc độ quay lưu trong biến “txttdq”, sẽ được đưa ra hiển thị tại vị trí dòng 1 cột 11 qua lệnh lcd_out (1,11,txttdq). Tương tự cho các giá trị nhiệt độ và độ ẩm.

Begin

Cấu hình timer2 định thời xung nội theo ngắt, timer0 và timer1 đếm xung ngoại. cho phép ngắt cờ tràn timer2

Đồ án tốt nghiệp

Hình 4.18: Lưu đồ chương trình con hiển thị LCD ( hienthi())

4.2.1.5 Chương trình con cấu hình timer-counter (cauhinh_timer_counter())

Timer2 được cấu hình hoạt động chế độ ngắt định thời xung nội qua lệnh INTCON=0XD0, bit TMR2ON_bit=1 cho phép timer2 đếm xung, khi giá trị đếm tại thanh ghi 8 bit TMR2 tràn thì cờ tràn TMR2IF_bit=1, ban đầu bit này được set về 0. Các bit TOUTPS0_BIT=1, TOUTPS3_BIT=0, TOUTPS1_BIT=0, TOUTPS2_BIT=0 tạo tỉ lệ chia 1:2 với nguồn xung vào timer0.

Timer1 được cấu hình hoạt động ở chế độ đếm xung ngoại từ chân RC0/T1CKI (chân số 15 vđk pic16f887) qua các lệnh sau : TMR1CS_BIT=1 cấu hình timer1 ở chế độ đếm xung ngoại, cho phép timer1 đếm bằng lệnh TMR1ON_BIT=1, T1CKPS0_BIT=0, T1CKPS1_BIT=0 là hai bit phục vụ việc chia giá trị xung đếm tỉ lệ 1/1. Giá trị đếm của timer1 sẽ lưu vào hai thanh ghi TMR1L và TMR1H với số xung tối đa là 65535.

Timer0 cũng được cấu hình hoạt động chế độ đếm xung ngoại từ chân RA4/T)CKI (chân số 6 của vđk pic16f887) qua việc cài đặt giá trị thanh ghi 8 bit OPTION_REG =0x20. Giá tri đếm sẽ được lưu trong thanh ghi 8 bit TMR0.

Byte địa chỉ Byte dữ liệu

Begin

Truyền dữ liệu nhiệt độ, đổ ẩm, tốc độ quay động cơ

End

dem>=3

tdqtong=tdqtong/3; ndtong=ndtong/3; xungdat=xungdat/3; giá trị nhiệt độ, độ ẩm, tốc độ quay được tính toán theo công thức. Begin

Cấu hình timer/counter; Cấu hình ADC kênh thứ 0; Cấu hình LCD; Cấu hình UART;

Bdn>=10000

Chuyển dữ liệu nd, da, tdq thành dạng mã ASCII để hiển thị LCD

bdn=bdn-1000; dem=dem+1; tdqt=xungtdq; xungdat=xungdat+xungda; ndt=adc_get_sample(0); tdqtong=tdqtong+tdqt; ndtong=ndtong+ndt; TMR1H=TMR1L=0; xungda=0;

Hiển thị LCD

xungtdq=0; xungda=0; xungdat=0; xungdatong=0; xungtdqtong=0; dem=0; TMR0=0; TMR1L=0; TMR1H=0, TMR2=155; xungtdq=(TMR1H<<8) + TMR1L;

dem=0; tdqtong=0; ndtong=0; xungdatong=0; Truyền dữ liệu UART

Đồ án tốt nghiệp

Hình 4.19: Lưu đồ chương trình con cấu hình timer-counter (cauhinh_timer_counter())

4.2.1.6 Chương trình con truyền dữ liệu UART (truyendulieu_UART())

Dữ liệu nhiệt độ, độ ẩm và tốc độ quay động cơ sẽ được truyền đến kit Raspberry pi thông qua lệnh truyền uart1_write(nd); uart1_write(da); uart1_write(tdq). Các dữ liệu sẽ được truyền liên tục và cách nhau bởi một byte địa chỉ, giúp xác phân biệt các dữ liệu tại Raspberry Pi khi nhận về.

Hình 4.20: Lưu đồ chương trình con truyền dữ liệu UART (truyendulieu_UART())

Đồ án tốt nghiệp

Hình 4.21: Lưu đồ chương trình chính trên vi điều khiển PIC 16F887

Bắt đầu chương trình là việc gọi các chương trình con cấu hình cauhinh_timer_counter(), cauhinh_LCD(), và các lệnh cấu hình ADC kênh thứ 0, cauhinh_UART() và các lệnh đặt giá trị ban đầu cho các biến.

Đồ án tốt nghiệp

Tiếp theo là lệnh gán giá trị biến xungtdq=(TMR1H<<8) + TMR1L để đưa giá trị hai thanh ghi vào biến “xungtdq” và thực hiện các lệnh chuyển đổi giá trị nhiệt độ “nd” độ ẩm “da” tốc độ quay “tdq” thành giá trị mã ACSII để có thể hiển thị lcd.

Kiểm tra giá trị của biến “bdn” nếu giá trị thỏa bdn>=10000 thì thực hiện các công việc sau: bdn=bdn-10000, tăng biến “dem” lên 1 đơn vị, lưu xung tốc độ quay vào biến “tdqt”, nhiệt độ đo cũng được gán vào biến “ndt”. Sau đó thực hiện cộng dồn giá trị của biến “tdqt” vào biến “tdqtong”, giá trị biến “ndt” cộng dồn vào biến “ndtong” xung độ ẩm được cộng dồn vào biến “xungdat”. Rồi xóa biến “xungda” về 0, hai thanh ghi TMR1L và TMR1H cũng được đặt về 0.

Nếu giá trị của biến “bdn” không thỏa điều kiện bdn>=10000 thì gọi chương trình con hienthi(), kết thúc chương trình.

Kiểm tra giá trị biến “dem” nếu thỏa dem>=3 thi thực hiện các lệnh sau : chia giá trị các biến “tdqtong”, “ndtong”, “xungdat” cho 3, rồi thực hiện tính toán cho ra giá trị nhiệt độ, độ ẩm và tốc độ quay theo các công thức nêu ở mục 4.1. rồi thực hiện gọi chương trình con truyền dữ liệu truyendulieu_UART() để gữi dữ liệu đến Raspberry pi, và xóa các biến “xungdatong”, “tdqtong”, “ndtong” về giá trị 0 rồi trở lại vòng lập tiếp theo tiếp tục chuyển dữ liệu nd, da, tdq đo được thành mã ASCII và thực hiện các lệnh tiếp sau đó. Nếu giá trị biến “dem” không thỏa dem>=3 thì quay trở lại bước trước đó.

4.2.2 Lưu đồ và giải thuật của chương trình trên Raspberry Pi

Trong đồ án này ngôn ngữ được sử dụng để lập trình trên Raspberry là Python. Sau đây là các chương trình được viết để nhận và xử lý dữ liệu từ PIC 16F887

4.2.2.1 Chương trình nhận dữ liệu UART:

Do PIC 16F887 truyền với tốc độ baud là 9600 baud nên chương trình trên Raspberry cũng phải cấu hình UART với tốc độ tương ứng là 9600 baud. Lệnh cấu hình như sau: serial = Serial (“ttyAMA0”, 9600).

Trước đó đầu chương trình phải khai báo sử dụng thư viện webiopi: import webiopi Dữ liệu được Raspberry nhận liên tục, các dữ liệu nhận được phân biệt bằng 1 byte địa chỉ nhận trước đó, thứ tự nhận dữ liệu như sau:

Byte địa chỉ

tocdo=serial.readByte() Begin serial.available()>0 tt = serial.readByte() tt == 1 tt == 2 tt == 3 Đ S S S Đ Đ Đ

serial.available() >0 serial.available() >0 serial.available() >0

nhietdo=serial.readByte() doam=serial.readByte() Đ Đ Đ S S S End Đồ án tốt nghiệp

Hàm serial.available() để kiểm tra có dữ liệu nhận vào không, hàm serial.readByte()

để đọc dữ liệu vào.

Hình 4.22: Lưu đồ chương trình con nhận dữ liệu trên Raspberry

Ban đầu chương trình kiểm tra có dữ liệu vào không bằng lệnh so sánh serial.available > 0, nếu đúng thì gán biến dulieu bằng giá trị nhận được, sau đó kiểm tra biến dulieu nếu bằng 1 thì tiếp tục kiểm tra lấy dữ liệu kế tiếp và gán vào biến nhietdo; nếu biến dulieu bằng 2 thì kiểm tra lấy dữ liệu tiếp theo và gán giá trị vào biến doam; nếu biến dulieu bằng 3 thì tiếp tục lấy dữ liệu kế tiếp gán vào biến tocdo.

Begin

n < 10 S

Đ A[n] = nhietdo;

T[n] = datetime.datetime.now(); TBA = TBA + A[n];

n = n + 1;

n == 10

S

Đ

Ghi mảng A và T ra file nhietdo.txt; TBA=TBA/10; Ghi giá trị T[9] và TBA ra dulieuthuthap.txt;

n = 0; TBA = 0;

End

Đồ án tốt nghiệp

4.2.2.2 Chương trình ghi dữ liệu nhiệt độ ra file text để cập nhật lên trang web

Khi xây dựng trang web có sử dụng lệnh đọc dữ liệu nhiệt độ, độ ẩm, tốc độ từ các file text nên phải lập trình ghi các dữ liệu ra file text.

Hình 4.23: Lưu đồ chương trình ghi dữ liệu nhiệt độ ra file text

Hàm datetime.datetime.now() để đọc thời gian hệ thống.

Chương trình kiểm tra điều kiện n < 10, sai thì bỏ qua, đúng thì gán phần tử mảng A[n] = nhietdo và gán thời gian hệ thống vào phần tử mảng T[n]; cộng biến TBA (trung bình nhiệt) với A[n]; tăng n thêm 1. Tiếp tục kiểm tra nếu n = 10 thì thi

Chương trình ghi nhiệt độ, độ ẩm, tốc độ tt = 0; n = 0; m = 0; k = 0; TBA = 0; TBB = 0; TBC = 0; Begin

Khai báo thư viện webiopi, datetime; Khởi tạo UART;

Chương trình đọc dữ liệu UART

End

Đồ án tốt nghiệp

hành lệnh ghi giá trị mảng A và T ra file nhietdo.txt; đồng thời ghi giá trị TBA/10 và T[9] ra file dulieuthuthap.txt.

Tương tự các chương trình đọc và ghi dữ liệu độ ẩm vào file doam.txt, dữ liệu tốc độ vào file tocdo.txt cũng thực hiện tương tự như chương trình đọc ghi nhiệt độ.

4.2.2.3 Chương trình chính trên Raspberry Pi

Hình 4.24: Lưu đồ chương trình chính trên Raspberry Pi

Chương trình thực hiện khởi tạo UART, gán các biến tt, n, m, k (m, k tương ứng là biến đếm trong chương trình ghi độ ẩm và tốc độ), TBA, TBB (trung bình độ ẩm), TBC (trung bình tốc độ) bằng 0. Sau đó chạy vòng lặp đọc dữ liệu UART và ghi các dữ liệu nhiệt độ, độ ẩm, tốc độ ra file text. Như vậy dữ liệu sẽ được Raspberry nhận liên tục từ vi điều khiển PIC 16F887 và ghi ra file text để web server cập nhật liên tục.

Đồ án tốt nghiệp

Chương 5

KẾT QUẢ NGHIÊN CỨU 5.1 Kết quả xây dựng web server

Hình 5.1: Hình ảnh thực tế giao diện trang web thu thập dữ liệu

Nhận xét:

- Trang web đơn giản, dễ quan sát.

Đồ án tốt nghiệp

- Tự động tải lại sau mỗi 30 giây giúp cho việc theo dõi dữ liệu liên tục và tiện lợi.

- Trang web được xây dựng theo tỉ lệ 5:6 nên việc quan sát trên màn hình máy tính có tỉ lệ 16:9 không bao quát hết toàn bộ trang web, tuy nhiên với màn hình vuông có tỉ lệ 4:3 thì việc quan sát gần như bao quát toàn bộ trang web.

5.2 Kết quả phần cứng

Hình 5.2: Hình ảnh thực tế phần cứng hệ thống thu thập dữ liệu

Từ hình ảnh có thể thấy là phía ngoài cùng bên trái là mạch động cơ tích hợp encoder với 2 công tắc để bật tắt động cơ và encoder, động cơ hoạt động với nguồn riêng từ 5V đến 31V có thể điều chỉnh điện áp để thay đổi tốc độ, encoder dùng nguồn chung với mạch vi điều và cảm biển (ở giữa), ngoài cùng bên phải là kit Raspberry với 2 chân UART được nối tới 2 jack cắm UART trên mạch vi điều khiển để lấy dữ liệu, dây cáp mạng được nối vào Raspberry để kết nối internet. Sau khi cấp nguồn cho các

Đồ án tốt nghiệp

mạch, bật 2 công tắc để động cơ hoạt động, LCD hiển thị các giá trị nhiệt độ, độ ẩm và tốc độ đo được (như trên hình là Tốc độ 111 vòng/phút, nhiệt độ 28oC, độ ẩm 70%) đồng thời vi điều khiển truyền dữ liệu qua 2 jack cắm UART tới Raspberry để đưa dữ liệu lên web server.

5.3 Kết quả tổng quát hệ thống thu thập dữ liệu

Hình 5.3: Chương trình nhận dữ liệu trên Raspberry

Đồ án tốt nghiệp

Hình 5.4: File text dữ liệu tải về từ web server

Nhận xét:

- Biểu đồ rõ ràng dễ theo dõi.

- File text có dung lượng nhẹ, định dạng dễ quan sát theo từng mốc thời gian. Tốc độ tải file nhanh.

Đồ án tốt nghiệp

Chương 6

KẾT LUẬN, HƯỚNG PHÁT TRIỂN 6.1 Kết luận

Sau khi nghiên cứu và thực hiện đề tài “Thu thập dữ liệu dùng Raspberry Pi qua

mạng Internet”, sinh viên đã thực hiện được những yêu cầu ở đề tài này như sau: • Tìm hiểu về máy tính Raspberry.

• Làm quen với hệ điều hành linux (Raspbian).

• Kỹ năng lập trình ngôn ngữ lập trình mới như Python, Javascript, HTML ngoài ngôn ngữ được học ở trường là C.

• Có được kiến thức cơ bản về máy chủ webserver. • Thiết lập webserver trên máy tính Raspberry. • Thiết kế giao diện web đơn giản.

• Lấy được dữ liệu thu thập về máy tính người sử dụng • Lắp đặt và thiết kế mô hình sản phẩm.

• Thực hiện truyền nhận dữ liệu bằng UART. • Sản phẩm hoạt động ổn định, tiết kiệm điện năng

Trong thời gian cho phép đề tài đã thực hiện xong các yêu cầu đặt ra. Hệ thống hoạt động nhịp nhàng ổn định. Người dùng có thể truy cập từ nhiều thiết bị có kết nối internet như máy tính bàn, laptop, máy tính bảng, điện thoại thông minh…vv. Đa số các thiết bị trên cho khả năng hiển thị dữ liệu tốt.

6.2 Hướng phát triển

Ngoài những kết quả đã đạt được trong đề tài này, sinh viên nghiên cứu hướng phát triển trong tương lai nhằm khắc phục những thiếu sót, cải tiến sản phẩm dựa trên sự hỗ trợ vô cùng lớn từ máy tính nhỏ Raspberry và cộng đồng phát triển. Hướng phát triển trong tương lai:

• Lập trình cho động cơ hoạt động theo mức nhiệt độ và độ ẩm, tắt động cơ khi nhiệt độ quá cao.

• Giá trị đo đạt độ chính xác cao hơn.

• Dựa vào dữ liệu thu thập phân tích hoạt động của động cơ để bảo trì kịp thời, đúng lúc.

• Lập trình đưa ra dữ liệu thu thập dưới dạng file Excel để dễ quan sát và tính toán.

Đồ án tốt nghiệp

• Mở rộng điều khiển các thiết bị từ xa qua web như đèn, quạt, thiết bị làm mát và điều chỉnh độ ẩm cho thích hợp trong môi trường sản xuất…

Đồ án tốt nghiệp

PHỤ LỤC

Tài liệu tham khảo

1. Nguyễn Đình Phú, Giáo trình vi xử lý 2, Đại học Sư Phạm Kỹ Thuật TP.HCM, 2012.

2. Nguyễn Đình Phú – Trương Thị Bích Ngà, Điện tử cơ bản 2, Đại học Sư Phạm Kỹ Thuật TP.HCM, 2007.

3. Giáo trình lập trình C căn bản, Đại học Sư Phạm Kỹ Thuật TP.HCM, 2010. 4. Đậu Trọng Hiển, Giáo trình Lập trình nhúng, Đại học Sư Phạm Kỹ Thuật

TP.HCM, 2013.

5. Nguyễn Việt Hùng – Nguyễn Ngô Lâm – Nguyễn Văn Phúc, Giáo trình kỹ thuật truyền số liệu, Đại học Sư Phạm Kỹ Thuật TP.HCM, 2012.

Một số Website:

- Kit FriendlyARM ARM11 Tiny6410:

http://www.friendlyarm.net/products/tiny6410 - Raspberry Pi https://code.google.com/p/webiopi/wiki/Tutorial_Serial https://code.google.com/p/webiopi/wiki/INSTALL https://www.raspberrypi.org http://www.wikihow.com/Make-a-Raspberry-Pi-Web-Server - Lập trình ngôn ngữ Python https://www.vithon.org https://www.python.org https://docs.python.org/2/tutorial/inputoutput.html - Lập trình web https://www.quantrimang.com.vn https://www.w3schools.com - PIC 16F887 https://www.picvietnam.com

- Datasheet các linh kiện điện tử

https://www.alldatasheet.com

Nội dung đính kèm (DVD)

1. Nội dung:

• Trình bày.

• Tài liệu tham khảo (bao gồm datasheet):  Datasheet PIC16F887.

Đồ án tốt nghiệp  Datasheet LM35.  Datasheet HS1101.  Datasheet IRF540N  Datasheet NE555  Datasheet 1N4728A

• Video kết quả thực hiện đề tài.

2. Mã nguồn:

• Chương trình ứng dụng trên Raspberry và PIC 16F887. • Phần Mềm mikroC (bao gồm các phần mềm hỗ trợ).

3. Sơ đồ mạch:

• Sơ đồ nguyên lý KIT PIC16F887.

Một phần của tài liệu ĐỀ TÀI THU THẬP DỮ LIỆU DÙNG RASPBERRY PI THÔNG QUA MẠNG INTERNET (Trang 58)

w