Mạng gồm có các nút cảm nhận được gắng với các đầu đo nhiệt
độ. Máy tính dùng đểnhận dữliệu
Các nút mạng thì gồm có nút cảm nhận, nút trung gian, nút nhận.
Các nút cảm nhận thì đo nhiệt độchuyển vềnút nut trung gian, các nút trung
gian nhận dữliệu từcác nút cảm nhận gửi vềrồi gửi vềnút nhận. Nút nhận
được kết nối trực tiếp với máy tính qua cổng com.
Kiến trúc mạng được sửdụng là kiến trúc hình cây là do số
lượng các nút mạng trong qua trình thực nghiệm là nhỏ( cảnước ta hiện có 7
nút mạng thì trường Đại học Quốc gia giữ3 nút đểphục vụgiảng dậy, chúng
em chi được thực nghiệm trên 4 nút ) dẫn dến việc sửdụng các kiến trúc khác
là khó khăn Vd nhưkiến trúc bó
67 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2427 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Tìm hiểu và tổng quan được những nét lớn, cơ bản của mạng cảm nhận không dây, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ÂY TRÊN THẾ GIỚI
2.1. Cấu trúc của mạng wsn
Mạng cảm nhận không dây bao gồm các thành phần cơ bản sau:
1. Cảm biến ( sensor ) : Là thiết bị vật lý để đo các thông số của môi
trường được truyền thông qua sóng vô tuyến. Nó gồm 5 thành phần: Phần
cứng cảm nhận, bộ nhớ, nguồn pin, vi sử lý được lập trình nhúng, thiết bị thu.
2. Người dùng: Là người cuối cùng nhận được thông tin của mạng cảm
nhận gửi lại, Người dùng là người yêu cầu mạng thu thập thông tin gì và nhận
đựơc kết quả của những thông tin đó. Trong một mạng cảm nhận thì có thể có
nhiều nguời dùng cuối.
2.2. Một số ứng dụng mạng cảm nhận không dây ở nứớc ngoài.
Trong các ứng dụng sau đây chúng ta sẽ sử dụng những cảm biến thông
minh. Chúng không phải là những cảm biến bình thường mà là nhữn cảm biến
rất nhỏ ( Được chế tạo bàng công nghê nano ) được kết hợp với các mạnh
điện. Được sử dụng trong ứng dụng đo lượng gluco và để khôi phục hình
võng mạc. Những thiết bị yêu cầu trong các ứng dụng này là : Máy tính được
dùng để nhận dữ liệu qua mạn không dây. Và các cảm biến thông minh.
2.2.1. Võng mạc nhân tạo
Trong phần này chúng tôi muốn nói đến các ứng dụng của mạn cảm
nhận không dây cũng như các cảm biến thông minh dùng trong lĩnh vực y tế
đó là võng mạc nhân tạo. Trong các cảm biến này cần phải có các đầu cảm
nhận ánh sáng. Trong đây chúng tôi sử dụng các cảm biến thông minh được
đặt trong võng mạc và những dự án vimo của trường đại học Wayne và viện
mắt Kresge . Mục đích của ứng dụng này để tạo ra các võng mạc nhân tạo
18
giúp nhữn người mất khả năng quan sát hay những người khiếm thị có thể
nhìn thấy với một mức độ cho phép.
Trong dây sử dụng các cảm biến thông minh được đặt vào mắt 100
cảm biến rất nhỏ. Chún tôi đã xây dựng được một hệ thồn bên ngoài để
thử võng mạc ( Hình 2.1 đã miêu tả được cấu tạo cơ bản của một mảng )
Cảm biến thông minh gồm có 2 thành phần: Một mạc tổ hợp
và một mảng các cảm biến. Mạch tổ hợp bao gồm một bộ chíp đa hợp.
với nhiều đường truyền thông tin giữa các chíp, dòn kện, dữ liệu được
truyền giữa nhau trên tầm số 40 KHz, với những sữ chuyển đổi và những
mạch chíp để hỗ trợ 10x10 lưới liên kết. Mạch có 2 khă năng truyền và
nhận dữ liệu. Mạch được chế tạo bằng nhôm trên bề mặt được gắn các
cảm biến. Ở đây đã sử dụng song một kỹ thuật gọi là kỹ thuật liên kết
dính, đặt một chất dính lên chíp cho phép những cảm biến được gắn chặt
với chíp. Với mỗi cảm biến dược định vị trên một bề mặt đầu dò. Bên trên
bề mặt trừ nhữn vùng đầu dõ được phủ lên một chất hoat tính sinh học.
Các cảm biến tạo lên 10x10 mảng điện cực. Khoảng các giữa các cảm
biến là 70 micrômet. Các cảm biến một đầu là hình chữ nhật và một đầu
là hình thoi với kết thúc là một điểm để cho phép sự tiếp súc giữa mạng
cảm biến và võng mã không xẩy ra được việ bị dục võng mạc.
19
Hình 2.1: sự Minh họa (của) Mảng cảm biến thông minh
Các cảm biến và các mạch được đặt trong mắt như Hình 2. Không
giống một số hệ thống khác mà đã được đề xướng, những cảm biến khôn
khéo này được đặt ở trên võng mạc và đủ nhỏ và đủ nhẹ để được giữ đúng
chỗ với một cách tương đối lực nhỏ. Những cảm biến này sản xuất những
tín hiệu điện mà được chuyển đổi bởi màng mỏng nằm bên dưới và bên
trong một sự đáp lại hóa học, tương tự nhữn hành vi vận dụng bình
thường võng mạc từ những kích thích nhẹ. Sự đáp lại số thực chất sản
xuất truyền thông tuần tự số học. Một thiết kế tương tự là hiện thân được
dùng một mô cấy vỏ não. Mặc dù để cách giữa hai khoảng cách lớn hơn
để phù hợp với để cách đang gia tăng giữa hạch trong vỏ trực quan. Như
khi đưa vào Hình 2.2, chính diện của võng mạc trong sự tiếp xúc với
mảng cảm biến nhỏ. Cạnh sau của võng mạc bị kích thích điện (qua một
phục hình võng mạc nhân tạo) bởi những cảm biến trên chíp cảm biến
thông minh. Những tín hiệu điện này được chuyển đổi vào trong hóa chất
20
những tín hiệu bởi hạch và khác nằm ở dưới những cấu trúc vải mỏng và
sự đáp lại được mang qua thần kinh thị giác tới não.
Sự truyền Tín hiệu từ những cảm biến thông minh ghi khắc trong
mắt những hình ảnh đồng dạng với hướng ngược. Kết quả thần kinh nhận
những tín hiệu từ những kích thích được nhặt lên bởi cảm biến ,tín hiệu và
cường độ tương đối có thể được truyền ra khỏi cảm biến thông minh. Dần
dần. mảng cảm biến sẽ được sử dụng cho cả sự tiếp nhận lẫn sự truyền ở
một sự phản hồi hệ thống và kinh niên cấy bên trong mắt. Dù mảng cảm
biến và điện tử có liên hệ đã được phát triển, thách thức tại điểm này là
kết nối mạng không dây của cảm biến này với một bộ phận xử lý ngoài để
xử lý những tín hiệu phức tạp để gửi tới mảng.
Từ những lý do để cho thông tin phát ra khỏi võng mạc có lẽ ít hiển
nhiên hơn. Mục đích của điều đảo ngược luồng dữ liệu sẽ xác định ánh xạ
giữa những ảnh đầu vào và tín hiệu thần kinh kết quả mà cho phép chúng
ta nhìn thấy hình. Hiện thời, ánh xạ thực tế từ đầu vào ảnh đến não thì
chưa được hiểu cẩn thận.
Hình 2.2: Định vị của Cảm biến thông minh bên trong Mắt
21
Những cảm biến với một hệ thống xử lý ngoài là một khía cạnh cơ sở
của việc thực thi tiềm năng của một võng mạc nhân tạo. Trong chẩn đoán và
những thao tác cứu chữa cũng sẽ yêu cầu sự truyền của dữ liệu từ mảng cảm
biến đến một máy tính chủ đặt bên ngoài. Những yêu cầu này ngoài chức
năng bình thường (ủa thiết bị, mà truyền thông không dây sử dụng từ một
camêra nhúng trong một kính đeo mắt vào trong cảm biến thông minh.
Hình 3.3 miêu tả những bước xử lý từ sự tiếp nhận ảnh ngoài đến sự truyền
tới võng mạc. Một camêra được lên trên Một khung kính đeo mắt đã có thể
định hướng sự gửi ra tới một thời gian thực làm cho sự giảm dữ liệu và xử lý
nó ( Chẳng hạn., Sự nhận dạng cạnh ). Camêra được kết hợp với một con trỏ
laze tự động lập mã ảnh kết quả vào trong một khuôn dạng gọn rồi truyền
theo sóng vô tuyến vào trong để giải mã bởi những chíp. Cài đặt trong Hình
3 cho thấy một thiết bị thu phát không dây mà bên trong thân thể, nhưng
không phải bên trong võng mạc. Ngoài mục đích nghiên cứu cuối cùng sẽ
hỗ trợ một mảng 1600 chíp cảm biến thông minh, từng cái với một 25 x 25
lưới điện cực. Theo chức năng, những mảng điện cực bên trong trung tâm
của điểm võng mạc sẽ phải khuyến khích võng mạc khác nhau so với ngoại
biên được đặt những mảng điện cực, mỗi cảm biến thông minh được sẽ có
được kết hợp với những cảm biến thông minh khác dựa vào một giải thuật
xử lý ảnh được thiết kế để kiểm soát một sự chết của cảm biên thông minh
những mảng, mỗi bản in rời gửi đầu vào cho những vùng võng mạc theo
chức năng khác nhau.Tại màn hình sử dụng thị giác ngoại vi, từ đó võng
mạc ngoại vi có quyết định thời gian tốt hơn hơn.
2.2.1.1. Mạng và xử lý những yêu cầu cảu mạng
Trong mục này, những yêu cầu chức năng của hệ thống được mô tả
cùng với một số tùy chọn thiết kế. Đề xuất những giải pháp được thúc đẩy
bởi những yêu cầu này. Trong mệnh lệnh để đạt được khi hình dung chức
năng, thông tin hai chiều sẽ được cần giữa một máy tính ngoài và xác định
22
phải chăng ảnh mong muốn được " nhìn thấy " bằng cách cấy vào nhữn cảm
biến trong vỏ não xẽ cho chúng ta thấy được bệnh nhân đã thấy nhữ gì.
'Chúng tôi cũng cần thông tin hai chiều với mô cấy thuộc võng mạc sao cho
Chúng tôi có thể xác định mà những cảm biến trong võng mạc là sự vận dụng
như được chờ đợi. Không kể đầu vào từ camêra, chúng tôi cũng cần khả năng
cung cấp đầu vào trực tiếp tới mô cấy võng mạc để xác định nếu bệnh nhân
nhìn thấy cái gì được chờ đợi từ mẫu đầu vào đó. Kế hoạch sẽ dùng tới một
mảng 25 x 25 cảm biến khôn khéo trên một chíp đơn cho sự cấy ghép võng
mạc con người. Như sự khảo sát tiến triển, nhiều những chíp này sẽ được
chèn cho một hệ thống cuối cùng 1000 x 1000 mảng cảm biến ( 40 x 40
mảng của những chíp, nơi mỗi chíp có một 25 x 25 mảng cảm biến).Tạo
một đoạn xấp xỉ 200 250 ms. Bởi vậy, sự xử lý sẽ được thực hiện định kỳ
xử lý vào một vòng là 200- 250 ms. Từ đây, dữ liệu sẽ đưựơc truyền bốn
hay năm lần trên giây.
Hinh 2.3: những bước xử lý dự án phục hình võng mạc
Sau khi xem xét tất cả các nhân tố , thì ứng dụng của chúng tôi có thể
được triển khai trong thực tế, bằng việc dùng những cảm biến đủ nhỏ với việc
truyền nhận bằng sóng vô tuyến để không gây ảnh hưởng đến con người.
2.2.2. Theo dõi mức Glucoza
23
Học viện Quốc gia (NIH) của Viện Sức khỏe Quốc gia Mỹ về Bệnh
đái đường và những bệnh về Tiêu hóa và nhữn báo cáo về các bệnh về
thận 15.7 triệu người – 5.9% dân cư Mỹ mắc bệnh đái đường vào 1999 .
Những sự phức tạp mà xuất hiện từ bệnh đái đường bao gồm bệnh tim,
đột quỵ, cao huyết áp, bệnh về thận… Nhữn căn bệnh này là một trong 7
nguyên nhân hàng đầu gây tử vong ở mỹ, rõ ràng rằng đây là một bệnh mà
cần sự chú ý nghiêm túc . Sự điều trị bệnh đái đường bao gồm một chế độ
sinh hoạt chính xác : sự ăn kiêng, bài tập, và theo dõi nồng độ đường
trong máu mọi lúc mọi nơi. Khi đó mạng cảm nhận không dây dùng nhữn
cảm biến thông có thể chu cấp một cách có hiệu quả hơn tới việc theo dõi
bệnh đái đường i, bằng việc cung cấp một phương pháp chắc chắn, chính
xác, và ít ảnh hưởng tới con nguời hơn để theo dõi những mức Glucoza.
Hiện thời, theo dõi những mức Glucoza máu, người ta sẽ phải dùng các
thử máu bằng cách lấy máu trên các đầu ngón tay mà trong khi đó việc
theo dõi này cần được thực hiện liên tục khi đó nó sẽ ngây ảnh hưởng tới
bệnh nhân. Mạng cảm nhận không dây sẽ có thể khắc phục được điều này
cùng với việc sử dụng các cảm biến thông minh. Cảm biến theo dõi những
mức Glucoza và truyền những kết quả tới một màn hình hiển thị.Các cảm
biến được làm rất nhỏ rùi đưa vào mạch máu của con người nó sẽ đo được
nồng độ Glucoza chính sác hơn và đểu đặn hơn.
2.2.3 Dò tìm ung thư
Ung thư là một trong nhữ nguyên nhân dẫn đến cái chết trong Chúng
ta, với 563,100 người tử vong do ung thư được báo cáo vào 1999. Hiện thời
9 triệu người đã chẩn đoán có thể ung thư, với 1, 221, 800 trường hợp mới
được chẩn đoán vào 1999. Mà hiện tại việc chữa trị bệnh ung thư khi đã tái
phát là rất khó mà gần như là không thể. Chính vì vậy việc phát hiện sớm
là chìa khóa để cứu sống những người bị ung. Những cảm biến thông minh
Không dây có thể đóng góp một vai trò chìa khóa trong sự dò tìm sớm đó.
24
Những sự nghiên cứu đã hiện ra mà những tế bào ung thư có ảnh hưởng
đến luồng máu trong vùng bị bao vây một khối u . Một cảm biến với khả
năng để phát hiện ra những sự thay đổi này trong luồng máu có thể được
đặt trong những vị trí khả nghi. Cách này là một cách đặc biệt hữu ích cho
những người người mà có một lịch sử gia đình có nhiều ngừoi bị ung thư,
tiềm ẩn ung thư cao. Nghiên cứu đang cũng được chỉ đạo trên việc đặt
những cảm biến trên một cái kim, Khi đó công việc của nhữ thầy thuốc khi
chữa bệnh sẽ đơn giản hơn và khả năng cứu chữa cao hơn. Những cảm biến
được dùng trong thiết bị này có khả năng để phân biệt giữa nhữn tế bào
bình thường và những tế bào bị ung thư.
2.2.4. Theo dõi sức khỏe toàn diện
Mạng cảm nhận không dây với những cảm biến thông minh đã được
sử dụng để theo dõi sức khỏe của con nguời bằng cách đưa vào trong cơ thể
qua đuờng tiêu hóa. Các nhân viên của NASA làm việc ngoài không gian
với những điều kiện khác hẳn trên trái đất khi đó mạng cảm nhận không
dây sẽ được dùng để theo dõi sức khỏe của họ trong điều kiện ngoài không
gian để gửi về trung tâm sử lý trên mặt đất . Nuốt một viên chứa một cảm
biến thông minh có thể gửi cho chúng ta thông tin về độ axit đường ruột, sức
ép, hay những sự làm giảm bớt của)cơ trơn cho phép những bác sỹ tốt hơn
hơn chẩn đoán những bệnh dạ dày-ruột non trong một thái độ không tiếp cận
được với những người đó.
CHƯƠNG 3
25
NHỮNG ỨNG DỤNG CỦA MẠNG CẢM NHẬN
KHÔNG DÂY CÓ THỂ ỨNG DỤNG Ở NƯỚC TA
Do những điều kiện về nền kinh tế, kỹ thuật mà việc ứng dụng mạng
cảm nhận không dây trong lỹ vực y tế ở nước ta rất khó triển khai. Dưới
đây là một số ứng dụng của mạng cảm nhận không dây có thể ứng dụng
được ở nước ta
3.1. Trong nông nghiệp
Do nước ta là nước đang phát triển với nền nông nghiệp lớn. Số lượng
các trang trại của nước ta nhiều do đó việc theo dõi là rất tốn nhân công.
Trong khi đó việc đầu tư để phát triển một mạng cảm nhận không dây không
phải là cao. Mạng có thể được dùng để đo dộ ảm ở từng khu vực trong trang
trại, hay lượng mưa ở những khu vực khác nhau
Hình 3.1 : Ứng dụng của mạng cảm nhận không dây sử dụng trong nông
nghiệp
Các nút mạng được bố trí tại các cánh đồng khác nhau để thu thập các
thông tin về môi trường sau đó chuyển dữ liệu về co người sử dụng. Người sử
dụng khi có các thông tin về môi trường ở từng khu vực khác nhau sẽ đưa ra
26
các phương hướng chăm sóc khác nhau đối với từng khu vực để chăm sóc cho
tốt.
3.2. Trong việc dự báo cháy rừng
Tài nguyên thiên nhiên rừng ở Việt Nam rất phong phú. Trữ lượng gỗ
lớn. Có các cánh rừng nguyễn sinh như: Cát Bà, Cúc Phương, …. Mang lại rất
nhiều nguồn lợi cho nước ta. Chính vì vậy việc giữ gìn và bảo tồn chúng là rất
khó khăn. Trong đó việc cháy rừng do hạn hán, kho hanh thường xuyên sẩy ra
do diện tích một khu rừng là rất lớn việc do độ ẩm của khu rừng trong từng
khu vực là khó khăn.
Hình 3.2: Ứng dụng của mạng cảm nhận không day trong cảnh bảo cháy rừng
Mạng cảm nhận không dây sẽ giúp cho chúng ta được điều này bằng
cách mỗi nút mạng sẽ gắn một cảm biến đo nhiệt độ, độ ẩm của không khí…
gửi về cho con người sẽ giúp cho chúng ta biết cách quản sử lý tình trạng
cháy rừng ro thiên tai gây ra.
3.3. Trong việc cảnh báo lũ
Các nút mạng cảm nhận không dây có thể được gắn ở hai bên bờ sông
trên thượng nguồn khi đó nó có thể thông báo cho chúng ta biết lượng lước
trên thượng nguồn nhất là khi mùa mưa đến để đưa ra những thông báo về lũ
chính xác nhất.
3.4. Trong nuôi trồng thuỷ sản
27
Ở nước ta số hộ sông ở ven biến thì việc nuôi trồng thủy sản đem lại
nguồn lợi kinh tế rất lớn. Với một quy mô lớn với nhiều đầm nuôi thủy sản
Trong khi đó nước chính là môi trường sống của các loài thủy sản việc môi
trường sồng này bị ô nhiễm hay bị thiếu ô xy sẽ ảnh hưởng tới đời sống hay
năng suất của nguồn thủy sản này. Trong khi đó việc theo dõi nguồn nuớc
(các thông số của nguồn nước như nồng độ oxy độ PH trong nước) đề phải
tiến hành trong phong thín nghiệm và việc đo đạc lại hết sức khó khăn do mỗi
hồ nuôi tròng thủy sản thì nguông nước lại khac nhau. Chính vì vậy mạng
cảm nhận không dây có thể ứng dụng được rất tốt ở đây.
Mạng cảm nhận không dây có thể được dùng để đo nồng độ ôxy độ PH
trong các hồ nuôi trồng hải sản khi đó có thể điều khiển tự động các quạt đạp
nước cung cấp ôxy cho đầm nầy và thông báo cho người chăn nuôi biết được
tình hình về nguồn nước hiện tại trong các hồ nước này.
Hồ nuôi
Quạt đạp
nước
28
Hình 3.4 : Sơ đồ ứng dụng của mạng cảm nhận không dây trong nuôi trồng
thủy sản
Nút mạng có lắp Sensor đo ôxy hoặc CO2 được thả xuống đầm để đo
lượng Ôxy gửi dữ liệu qua cac nút trung gian về máy tính, máy tính được kết
nối và lập trình điều khiển bật tắt các quạt đạp nước trong một khoảng thời
gian nhất định phụ thuộc vào nồng độ Ôxy đo được tại đầm tại các thời điểm
khác nhau. Toàn bộ hệ thống được tiến hành tự động.
CHƯƠNG 4
29
THỰC NGHIỆM CỦA MẠNG CẢM NHẬN KHÔNG
DÂY
4.1 Bài toán
Xây dựng mạng cảm nhận để đo nhiệt độ ở các diểm khác nhau. Đưa ra
thông bao khi có nhiệt độ tại một nut lớn hơn mức cho phép
4.2 Mô hình của mạng cảm nhận
Hình 3.1: Mô hình của mạng cảm nhận
4.3 Mục đích của bài toán gốc
Đo nồng độ ôxy trong các hồ nuôi tôm kết nối với thiết bị điều khiển
quạt nước.
Do mạng cảm nhận không dây ở nước ta mới trong quá trình nghiên
cứu do vây điều kiên vật chất để em thực nghiệm là chưa có. Cụ thể là không
có đầu đo nồng độ ôxy chính vì vậy mà việc đo nồng độ oxy xẽ được thay
bằng đo nhiệt độ, Việc điều khiển quạt nước được thay bằng hiền thị thông
báo trên màn hình PC.
4.4 Phân tích bài toán
4.4.1. yêu cầu cảu bài toán
….
Nút 1
Nút 2
Nút n ( <=16)
Nút trung gian Nút gốc
30
Đo nhiệt độ ở môi trường trong các khu vực khác nhau sau đó
giửi dữ liệu về máy tính thông qua mạng cảm nhận không dây. Máy tính
nhận các dữ liệu do mạng cảm nhận không dây gửi về xử lý các dữ liệu đó rồi
đưa ra thông báo cho người dùng nếu có nhiệt độ tại khu vực nào đó vượt qua
ngưỡng cho phép.
4.4.2. Thiết kế mạng
Mạng gồm có các nút cảm nhận được gắng với các đầu đo nhiệt
độ. Máy tính dùng để nhận dữ liệu
Các nút mạng thì gồm có nút cảm nhận, nút trung gian, nút nhận.
Các nút cảm nhận thì đo nhiệt độ chuyển về nút nut trung gian, các nút trung
gian nhận dữ liệu từ các nút cảm nhận gửi về rồi gửi về nút nhận. Nút nhận
được kết nối trực tiếp với máy tính qua cổng com.
Kiến trúc mạng được sử dụng là kiến trúc hình cây là do số
lượng các nút mạng trong qua trình thực nghiệm là nhỏ ( cả nước ta hiện có 7
nút mạng thì trường Đại học Quốc gia giữ 3 nút để phục vụ giảng dậy, chúng
em chi được thực nghiệm trên 4 nút ) dẫn dến việc sử dụng các kiến trúc khác
là khó khăn Vd như kiến trúc bó…
4.4.3. Thuật toán
B1: Nhiệt độ được đo tại các nút cảm nhận
B2: Dữ liệu nhiệt độ đo được tại các nút cảm nhận được gửi về
nút trung gian.
B3: Nút trung gian sau khi nhận dữ liệu từ các nút cảm nhận gửi
về thì gửi lại về nút nhận
B4: Nút nhận nhận dữ liệu từ nút trung gian sau đó chuyển về
máy tính qua cổng com.
B5: Máy tính nhận được dữ liệu qua công com thì đọc dữ liệu đó
và xử lý.
4.4.4. Sơ đồ khối
31
Hình 3.3: Sơ đồ khối của bài toán
Mô tả sơ đồ: Dữ liệu về nhiệt độ được đo tại các nút cảm nhận sau đó
được gửi về nút trung gian. Nút trung gian sau khi nhận được dữ liệu từ các
nút cảm nhận gửi về thì gửi lại các thông tin đó về nút nhận. Nút nhận được
kết nối với máy tính thông qua cổng Com khi đó dữ liệu sẽ được gửi từ nút
Nút cảm nhận
( Đo nhiệt độ )
Nút trung gian
Nút nhận
Cổng Com
(của máy tính )
Đọc
cổng
Com
Hiển thị ra màn hình
Có dữ liệu
Đ
S
Không Có dữ liệu
Begin
32
nhận vào máy tính thông qua cổng Com. Chương trình trên máy tính sẽ có
nhiệm vụ đọc dữ liệu từ cổng Com nếu có dữ liệu thì sử lý dữ liệu đó ( So
sánh nhiệt độ nhậ dược với ngưỡng nhiệt độ cho phép, nếu vượt qua ngưỡng
cho phép thì dưa ra cảnh báo )sau đó lại quay lại đọc cổng Com để cập nhật
nhiệt độ tại thởi điểm hỉện thời. Nếu không có dữ liệu thì việc đọc dữ liệu từ
cổng Com luôn luôn được thực hiện. Việc sau khi nhận được dữ liệu tự cổng
Com sau đó bao lâu thì cập nhật dữ liệu mới là do người dùng.
4.4.5. Lập trình
A. Lập trình để nghi lên chip CC1010
* Chương trình dùng để lập trình
+ Keil uVision3 của hãng Keil Elektronik GmbF
* Tac dụng của chương trình : Dùng để dịch trương trình từ ngôn
ngữ lập trình thành mã máy dưới dạng tệp tin *.hex tệp tin này sẽ được nạp
vào chip thông qua chương trình CHIPCON CC1010 Flash programmer có
trong bộ CC1010 Developement Kit để lạp trực tiếp vào chip
* Giao diện lập trình :
33
* Ngôn ngữ lập trình
Sử dụng ngôn ngũ lập trình C với các thư viện hỗ trợ của
CC1010 một số thư viện hỗ trợ cần chú ý là
Hardware Definition Files (HDF)
Hardware Abstraction Library (HAL)
Chipcon Utility Library (CUL)
Application examples
Trong đó:
+ Hardware Definition Files (HDF) chứa địa chỉ của các thanh ghi,
bản đồ véc tơ ngắt, và một số hằng số phần cứng khác được xác định trước.
Nó bao gồm c
+ Hardware Abstraction Library (HAL): Thư viện này bao gồm rất
nhiều các macro và các hàm nhằm làm đơn giản hoá việc truy cập vào phần
34
cứng của CC1010.Thông qua việc gọi các macro và hàm này người sử dụng
có thể truy cập vào các thành phần vi điều khiển một cách dễ dàng mà không
cần phải tìm hiểu một cách chi tiết về phần cứng.
+ Chipcon Utility Library (CUL): Ngoài ra, modul HAL trong
CC1010IDE cũng cung cấp một thư viện gồm các khối sẵn có để xây dựng
việc truyền thông RF được đặt trong Chipcon Utility Library (CUL). Thư viện
này cung cấp đầy đủ các hỗ trợ cho các ứng dụng RF đặc trưng và nó còn
cung cấp một giao thức RF đầy đủ .
* Các hàm và các thư viện cơ bản
Do việc thiết kế mạng của bài toán mà phần lập trình có 3 phần cơ
bản đó là lập trình cho chip dể đo nhiệt độ và truyền về nút trung gian, lập
trình cho nút chung gian, lập trình cho nút được nối trực tiếp với máy tính.
+ Lập trình cho nút dùng để đo nhiệt độ
- Hàm main
void main (void) {
byte xdata n;
byte xdata m;
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0xA3, 0x2F, 0x15, // Modem 0, 1 and 2
0x75, 0xA0, 0x00, // Freq A
0x58, 0x32, 0x8D, // Freq B
0x01, 0xAB, // FSEP 1 and 0
0x40, // PLL_RX
0x30, // PLL_TX
0x6C, // CURRENT_RX
0xF3, // CURRENT_TX
0x32, // FREND
0xFF, // PA_POW
35
0x00, // MATCH
0x00, // PRESCALER
};
// Định dạng kích cỡ dữ liệu
RF_RXTXPAIR_CALDATA xdata RF_CALDATA;
// Khởi tạo các thiết bị ngoại vi
WDT_ENABLE(FALSE);
RLED_OE(TRUE);
YLED_OE(TRUE);
GLED_OE(TRUE);
BLED_OE(TRUE);
// Khởi động các chế dộ ưu tiên và tiêu thụ điện năng
MEM_NO_WAIT_STATES();
FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_R
EADS);
//
halRandomNumberGen(&n, 1);
halRandomNumberGen(&m, 1);
srand((n << 8) + m);
waitMultiplier = 1;
// Hàm dùng để cấu hình ADC
halConfigADC(ADC_MODE_SINGLE |
ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0);
ADC_SELECT_INPUT(ADC_INPUT_AD1);
ADC_POWER(TRUE);
36
// Thiết lập các tuyến nhận
sppSetupRF(&RF_SETTINGS, &RF_CALDATA, TRUE);
sppSettings.myAddress = TBC_MY_SPP_ADDRESS;
sppSettings.rxTimeout = TBC_RX_INTERVAL;
sppSettings.txAckTimeout = TBC_PREAMBLE_COUNT;
sppSettings.txPreambleByteCount = TBC_PREAMBLE_COUNT;
RXI.maxDataLen = TBC_DATA_LEN;
RXI.pDataBuffer = rxDataBuffer;
TXI.destination = SPP_BROADCAST;
TXI.flags = 0x00;
TXI.pDataBuffer = txDataBuffer;
TXI.dataLen = TBC_DATA_LEN;
// Khởi đông thiết bị bấm giờ
sppStartTimer(CC1010EB_CLKFREQ);
SPP_INIT_TIMEOUTS();
// Khởi tạo lại các nút mạng
for (n = 0; n < TBC_MAX_NODE_COUNT; n++) {
nodeIDs[n] = TBC_UNUSED_NODE_ID;
}
// Đặt lại tên cho nút mạng
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
nodeNames[0][n] = 0x00;
}
// Cài đặt các thiế bị vào ra
UART0_SETUP(57600,CC1010EB_CLKFREQ,
UART_NO_PARITY | UART_RX_TX | UART_POLLED);
// Xuất ra tên
VT100_CLEAR_SCREEN();
37
VT100_GO_TOP_LEFT()
// Nạp tên từ bộ nhớ flash
memcpy(&nodeNames[0][0],flashUnitName,TBC_NODE_NAME_LENG
TH);
nodeIDs[0] = TBC_MY_SPP_ADDRESS;
txDataBuffer[0] = (nodeIDs[0] >> 8) & 0xFF;
txDataBuffer[1] = nodeIDs[0] & 0xFF;
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
txDataBuffer[n + TBC_NODE_ID_LENGTH] =
nodeNames[0][n];
}
+ Lập trình cho nút dùng trung gian
- Hàm sinh số ngẫu nhiên
halRandomNumberGen(&n, 1);
halRandomNumberGen(&m, 1);
srand((n << 8) + m);
waitMultiplier = 1;
- Nhận các gói tin gồm có tên nhiệt dộ và địa chỉ, chuyền các gói tin
vừa nhậ được
txDataBuffer[0] = (nodeIDs[0] >> 8) & 0xFF;
txDataBuffer[1] = nodeIDs[0] & 0xFF;
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
txDataBuffer[n + TBC_NODE_ID_LENGTH] = nodeNames[0][n];
}
while (TRUE) {
tbcReceive();
38
// Tien hanh truyen goi tin nhan duoc
tbcTransmit();
tbcWaitRandom();
}
+ Nút nối trực tiếp với máy tính
- Đặt p2 ở chế độ out dữ liệu
P2DIR = 0X00;
- Nhận các dữ liệu và in ra các thông tin cần thiết rồi gửi về máy tính
while (TRUE) {
delay(2000);
tbcReceive();
for (n = 0; n <= TBC_MAX_NODE_COUNT; n++)
{
if (nodeIDs[n] == TBC_UNUSED_NODE_ID)
{
continue;
}
// Node name:
for (m = 0; m < TBC_NODE_NAME_LENGTH; m++) {
UART0_WAIT_AND_SEND(nodeNames[n][m]);
}
if(nodeIDs[n]==2){
// Temperature:
fTemp = nodeTemps[n];
fTemp -= 492;
fTemp /= 8.192;
sprintf(so,"%2.3f",fTemp);
39
// Chia ra các tình huống:
if(fTemp<70){
printf("Nhiet tai nut 1: %2.3f\n",fTemp);
printf("Tinh trang nut 1: An toan\n");
delayy(10000);
}
else{
printf("Nhiet tai nut 1: %2.3f\n",fTemp);
printf("Tinh trang nut 1: Bao dong\n");
delayy(10000);
}
}
else{
printf("Hien tai chua co du lieu\n");
}
}
B Lập trình chương trình sử lý trên máy tính
Chương trình sử lý trên máy tính có chức năng nhận những dữ liệu do
mạng cảm nhận không dây gửi về đọc thông tin gửi về đó và phân ra các dữ
liệu cần thiết : nhiệt độ hiện thời, địa chỉ nút. Sau đó so sánh nhiệt độ nhận
được với nhiệt độ ở ngưỡng cho phép. Nếu nhiệt độ đó vượt qua ngưỡng thì
mở tệp tin âm thanh đồng thời hiện lên dòng thông báo
* Ngôn ngũ lập trình
Ngôn ngũ lập trình được sử dụng là Visual Basic có trong bộ
Visual Studio . Sử dụng ngôn ngữ lập trình này là do trong đó có hỗ trợ lập
trình đa phương tiệm như : Đọc dữ liệu từ cổng Com, Lập trình âm thanh….
* Giao diện của chương trình sử lý trên máy tính
40
Khi nhiệt độ chuyền về chưa vượt qua ngưỡng cho phép :
Khi nhiệt độ chuyền về vượt qua ngưỡng cho phép ( Thực hiện cảnh báo ) :
41
*Các hàm chính của chương trình
Hàm dùng để thiết lập các giá trị tại cổng Com
Dim str As String
cmdngung.Enabled = True
Timer1.Enabled = True
cmdok.Enabled = False
If Check1.Value = 0 Or cbport.Text = "None" Or cbtime.Text =
"None" Then
MsgBox "Chua thiet lap du thong tin", vbRetryCancel, "Thong
bao loi"
Else
42
If cbport.Text = "COM1" Then
port = 1
End If
If cbport.Text = "COM2" Then
port = 2
End If
Timer1.Interval = CInt(cbtime.Text)
Label2.Caption = "§ang kÕt nèi víi m¹ng c¶m nhËn "
MSComm1.CommPort = port ' mo cong COM
MSComm1.Handshaking = 2 - comRTS
MSComm1.RThreshold = 1
MSComm1.RTSEnable = True
str = ""
str = str & 57600 & ",n," & 8 & "," & 1
MSComm1.Settings = str
MSComm1.SThreshold = 1
End If
End Sub
Dọan mã lấy đọc dữ liệu gửi về từ cổng Com sử lý và đua ra cảnh báo tại điều
khiển timer
Private Sub Timer1_Timer()
Label1.Caption = Time
'===========lay thong tin nhiet do==============
Dim n As Integer, nhietdo As String, h As Integer
Dim diachi As String
Dim kt As String * 1
Dim nd As String * 7
Dim kt1 As String * 1
43
Dim tg As String * 10
If List1.List(0) = "" Or List1.List(1) = "" Then
List1.List(0) = "Danh sach nhiet do :"
List1.List(1) = "0. (0x9438) thunghem- TEMP: 25.5 - AGE (msecs): 20"
'End If
Else
'==========bat dau qua trinh ghi du lieu ============
Dim tenfile, sofile, temmp As Integer
Dim nguong, datnguong As Double
tenfile = App.Path
If Right(tenfile, 1) "\" Then tenfile = tenfile & "\"
tenfile = tenfile & "dulieu1.txt" ' Xuat ra ngoai file danhsach.txt
Const ForReading = 1, ForWriting = 2
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(tenfile, ForWriting, True)
f.Write Text1.Text
Set f = fso.OpenTextFile(tenfile, ForReading)
Do Until (f.AtEndOfStream)
writetofile = f.ReadLine
List1.List(1) = writetofile
Loop
m = Len(Trim(List1.List(1)))
h = 0
nhietdo = " "
For j = 1 To m
kt = Mid(List1.List(1), j, 1)
If kt = ":" Then
44
nd = Mid(List1.List(1), j + 1, 6)
nhietdo = nhietdo & nd
txtnhietdo.Text = Trim(nhietdo)
Exit For
End If
Next j
tg = " "
Dim state As String
state = 0
diachi = " "
For j = 1 To m
kt = Mid(Trim(List1.List(1)), j, 1)
If kt = ":" And state = 0 Then
state = 1
kt = Mid(Trim(List1.List(1)), j + 1, 1)
End If
If kt = "(" Then
tg = Mid(List1.List(1), j + 1, 6)
diachi = diachi & tg
txtdiachi.Text = Trim(diachi)
Exit For
End If
Next j
End If
nguong = CDbl(txtnhietdo.Text)
datnguong = CDbl(txtdatnguong.Text)
If nguong > datnguong Then
frmbaodong.Show
45
frmbaodong.WindowsMediaPlayer1.Controls.play
End If
If nguong < datnguong Then
frmbaodong.WindowsMediaPlayer1.Controls.stop
Unload frmbaodong
End If
'=====================
Text1.Text = ""
'==================Ket thuc==========================
End Sub
4.4.6. Kết quả của chương trình
Chương trình thu nhận thông tin nhiệt độ của môi trường ở các địa
điểm khác nhau sau đó gửi về máy tính thông qua cổng Com. Chương trình
trên máy tính sau khi nhận được dữ liệu từ mạng cảm nhận gửi về sẽ lấy
thông của nhiệt độ của các nút mạng gửi về và đưa ra thông báo đồng phát
một tệp tin âm thanh để cảnh báo cho người dùng.
4.4.7. Nhận xét và đánh giá chương trình
* Chương trình đã lập trình giúp các nút trong mạng có thể truyền dữ
liệu cho nhau ( các nút cảm nhận gửi dữ liệu đến nút trung gian, nút trung
gian nhận được dữ liệu và truyền đến nút nhận ). Nhận dữ liệu từ mạng cảm
nhận không dây và đưa vào máy tính. Máy tính sử lý dữ liệu nhận đựơc. Và
đưa ra cảnh báo.
* Giới hạn của trương trình: Do điều kiện thực tế số lượng các nút có
hạn chính vì vậy mà việc thực nghiệm của em mới được tiến hành trên 3 nút
trong đó một nút cảm nhận nhiệt độ, một nút trung gian và một nút nhận.
4.4.8. Phương hướng phát triển đề tài
46
Nếu số lượng nút mạng có đủ và có đầu đo nồng độ oxy cũng như độ
PH trong nước và các nút có thể họa động được trong môi trường nước thì sẽ
tiến hành làm ứng dụng trong nuôi trồng thủy sản. Khi đó hệ thống sẽ có ý
nghĩa rất lớn trong thực tiễn để nâng cao năng suất trong việc nuôi trồng thủy
sản.
Các Tài liệu liên quan
Tiếng việt
[1] Thiết kế chế tạo, vận hành và đo thử nghiệm mạng cảm nhận không dây-
Nguyễn Thế Sơn.
[2]. Hòa Quang Dự , Phần mềm nhúng cho vi điều khiển CC1010 và phưong
thức giải quyết vấn đề truyền dữ liệu không dây trên khoảng cách xa đến nơi
nhận, Luận văn Cao học, Trường ĐHDL Hải Phòng.
47
[3]. Vương Đạo Vy, Trần Thanh Hải, Phạm Đình Tuấn, Trần Anh Tuấn, Hòa
Quang Dự, Phùng Công Phi Khanh, Mạng cảm nhận không dây thu thập dữ
liệu môi trường sử dụng vi điều khiển Chipcon CC1010, Khoa Điện tử - Viễn
thông, Trường Đại học Công nghệ, ĐHQGHN
Tiếng anh
[4] wireless sensor networks: a survey I.F. Akyildiz, W. Su*, Y.
Sankarasubramaniam, E. Cayirci
[5] Broadband and Wireless Networking Laboratory, School of Electrical and
Computer Engineering, Georgia Institute of Technology,
Atlanta, GA 30332, USA.
[6]. Sensor Network Protocols – Deborah
[7] Guoliang Xing, Xiaorui Wang, Yuanfang Zhang, Chenyang Lu, Robert
Pless, and Christopher D. Gill.
Integrated coverage and connectivity configuration for energy
conservation in sensor networks.
ACM Transactions on Sensor Networks, 1(1), 2005.
[8]. Chipcon, CC1010IDE Manual (2003), www.Chipcon.com
[9].
PHỤ LỤC
Mã nguồn chương trình nạp vàp chíp cảm nhận dùng để đo nhiệt độ
/*************************************************************
Chuong trinh truyen nhiet do di xa o muc nut don. O muc nay` khoang cach
truyen
toi da la 300m ngoai troi, 150m trong nha
*************************************************************/
#include
#include
#include
48
#include
#include
#include
#include
#include
#include
// Temperature packet:
#define TBC_NODE_ID_LENGTH 2 // word
#define TBC_NODE_NAME_LENGTH 20
#define TBC_TEMP_OFFSET (TBC_NODE_ID_LENGTH +
TBC_NODE_NAME_LENGTH)
#define TBC_TEMP_LENGTH 2
#define TBC_DATA_LEN (TBC_NODE_ID_LENGTH +
TBC_NODE_NAME_LENGTH + TBC_TEMP_LENGTH)
// Radio related:
#define TBC_MY_SPP_ADDRESS 1
#define TBC_RX_INTERVAL 50
#define TBC_PREAMBLE_COUNT 4
// Node registration
#define TBC_INVALID_NODE_INDEX 255
#define TBC_UNUSED_NODE_ID 0x0000
// Speed related
byte xdata waitMultiplier;
// The temperature "table":
#define TBC_MAX_NODE_COUNT 16
word xdata nodeIDs[TBC_MAX_NODE_COUNT];
byte xdata
nodeNames[TBC_MAX_NODE_COUNT][TBC_NODE_NAME_LENGTH]
;
word xdata nodeTemps[TBC_MAX_NODE_COUNT];
word xdata nodeLastT[TBC_MAX_NODE_COUNT];
// SPP variables
SPP_SETTINGS xdata sppSettings;
SPP_RX_INFO xdata RXI;
SPP_TX_INFO xdata TXI;
49
byte xdata rxDataBuffer[TBC_DATA_LEN];
byte xdata txDataBuffer[TBC_DATA_LEN];
// Function prototypes
void tbcWaitRandom (void);
void tbcTransmit (void);
void tbcReceive (void);
void tbcPrintTable (void);
// Unit name, stored in Flash
byte code flashUnitName[TBC_NODE_NAME_LENGTH];
// RAM buffer for Flash copy
byte xdata ramBufNonAligned[128];
//----------------------------------------------------------------------------
// MAIN PROGRAM
//----------------------------------------------------------------------------
void main (void) {
byte xdata n;
byte xdata m;
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0xA3, 0x2F, 0x15, // Modem 0, 1 and 2
0x75, 0xA0, 0x00, // Freq A
0x58, 0x32, 0x8D, // Freq B
0x01, 0xAB, // FSEP 1 and 0
0x40, // PLL_RX
0x30, // PLL_TX
0x6C, // CURRENT_RX
0xF3, // CURRENT_TX
0x32, // FREND
0xFF, // PA_POW
0x00, // MATCH
0x00, // PRESCALER
};
// Calibration data
RF_RXTXPAIR_CALDATA xdata RF_CALDATA;
// Initialize peripherals
50
WDT_ENABLE(FALSE);
RLED_OE(TRUE);
YLED_OE(TRUE);
GLED_OE(TRUE);
BLED_OE(TRUE);
// Startup macros for speed and low power consumption
MEM_NO_WAIT_STATES();
FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_READS);
// Seed the random generator:
halRandomNumberGen(&n, 1);
halRandomNumberGen(&m, 1);
srand((n << 8) + m);
waitMultiplier = 1;
// ADC setup
halConfigADC(ADC_MODE_SINGLE |
ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0);
ADC_SELECT_INPUT(ADC_INPUT_AD1);
ADC_POWER(TRUE);
// RF/SPP setup
sppSetupRF(&RF_SETTINGS, &RF_CALDATA, TRUE);
sppSettings.myAddress = TBC_MY_SPP_ADDRESS;
sppSettings.rxTimeout = TBC_RX_INTERVAL;
sppSettings.txAckTimeout = TBC_PREAMBLE_COUNT;
sppSettings.txPreambleByteCount = TBC_PREAMBLE_COUNT;
RXI.maxDataLen = TBC_DATA_LEN;
RXI.pDataBuffer = rxDataBuffer;
TXI.destination = SPP_BROADCAST;
TXI.flags = 0x00;
TXI.pDataBuffer = txDataBuffer;
TXI.dataLen = TBC_DATA_LEN;
// Initialize the SPP timer
sppStartTimer(CC1010EB_CLKFREQ);
SPP_INIT_TIMEOUTS();
51
// Reset the node IDs
for (n = 0; n < TBC_MAX_NODE_COUNT; n++) {
nodeIDs[n] = TBC_UNUSED_NODE_ID;
}
// Reset our name buffer
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
nodeNames[0][n] = 0x00;
}
// Setup UART0 for polled I/O
UART0_SETUP(57600, CC1010EB_CLKFREQ, UART_NO_PARITY |
UART_RX_TX | UART_POLLED);
// Get our name
VT100_CLEAR_SCREEN();
VT100_GO_TOP_LEFT();
// Load name from Flash
memcpy(&nodeNames[0][0],flashUnitName,TBC_NODE_NAME_LENGTH
);
// Get our ID from CRC16(our name)
nodeIDs[0] = TBC_MY_SPP_ADDRESS;
// Prepare the id+name part of the packet
txDataBuffer[0] = (nodeIDs[0] >> 8) & 0xFF;
txDataBuffer[1] = nodeIDs[0] & 0xFF;
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
txDataBuffer[n + TBC_NODE_ID_LENGTH] = nodeNames[0][n];
}
// Loop forever
while (TRUE) {
tbcTransmit();
tbcWaitRandom();
}
} // main
void tbcWaitRandom (void) {
byte xdata time;
byte xdata n;
52
time = rand();
for (n = 0; n < waitMultiplier; n++) {
halWait (time, CC1010EB_CLKFREQ);
}
} // tbcWaitRandom
void tbcTransmit (void) {
word xdata temp;
// Indicate transmission
RLED = LED_ON;
YLED = LED_ON;
// Power up the ADC and sample the temperature
ADC_SAMPLE_SINGLE();
temp = ADC_GET_SAMPLE_10BIT();
// Update the TX buffer and the table with the new temperature
txDataBuffer[TBC_TEMP_OFFSET] = (temp >> 8) & 0xFF;
txDataBuffer[TBC_TEMP_OFFSET + 1] = temp & 0xFF;
nodeTemps[0] = temp;
nodeLastT[0] = (int) sppGetTime();
YLED = LED_OFF;
// Transmit the temperature
sppSend(&TXI);
do { } while (sppStatus() != SPP_IDLE_MODE);
RLED = LED_OFF;
} // tbcTransmit
Mã nguồn chương trình nạp vàp chíp trung gian
/**************************************************************
chuong trinh` nhan va` truyen chuyen tiep tin hieu truyen duoc.
**************************************************************/
#include
#include
#include
#include
#include
53
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// Temperature packet:
#define TBC_NODE_ID_LENGTH 2 // word
#define TBC_NODE_NAME_LENGTH 20
#define TBC_TEMP_OFFSET (TBC_NODE_ID_LENGTH +
TBC_NODE_NAME_LENGTH)
#define TBC_TEMP_LENGTH 2
#define TBC_DATA_LEN (TBC_NODE_ID_LENGTH +
TBC_NODE_NAME_LENGTH + TBC_TEMP_LENGTH)
// Radio related:
#define TBC_MY_SPP_ADDRESS 2
#define TBC_RX_INTERVAL 50
#define TBC_PREAMBLE_COUNT 4
// Node registration
#define TBC_INVALID_NODE_INDEX 255
#define TBC_UNUSED_NODE_ID 0x0000
// Speed related
byte xdata waitMultiplier;
// The temperature "table":
54
#define TBC_MAX_NODE_COUNT 16
word xdata nodeIDs[TBC_MAX_NODE_COUNT];
byte xdata
nodeNames[TBC_MAX_NODE_COUNT][TBC_NODE_NAME_LENGTH]
;
word xdata nodeTemps[TBC_MAX_NODE_COUNT];
word xdata nodeLastT[TBC_MAX_NODE_COUNT];
// SPP variables
SPP_SETTINGS xdata sppSettings;
SPP_RX_INFO xdata RXI;
SPP_TX_INFO xdata TXI;
byte xdata rxDataBuffer[TBC_DATA_LEN];
byte xdata txDataBuffer[TBC_DATA_LEN];
// Function prototypes
void tbcWaitRandom (void);
void tbcTransmit (void);
void tbcReceive (void);
void tbcPrintTable (void);
// Unit name, stored in Flash
byte code flashUnitName[TBC_NODE_NAME_LENGTH];
// RAM buffer for Flash copy
byte xdata ramBufNonAligned[128];
//----------------------------------------------------------------------------
// MAIN PROGRAM
//----------------------------------------------------------------------------
void main (void) {
byte xdata n;
byte xdata m;
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0xA3, 0x2F, 0x15, // Modem 0, 1 and 2
0x75, 0xA0, 0x00, // Freq A
0x58, 0x32, 0x8D, // Freq B
0x01, 0xAB, // FSEP 1 and 0
55
0x40, // PLL_RX
0x30, // PLL_TX
0x6C, // CURRENT_RX
0xF3, // CURRENT_TX
0x32, // FREND
0xFF, // PA_POW
0x00, // MATCH
0x00, // PRESCALER
};
// Calibration data
RF_RXTXPAIR_CALDATA xdata RF_CALDATA;
// Initialize peripherals
WDT_ENABLE(FALSE);
RLED_OE(TRUE);
YLED_OE(TRUE);
GLED_OE(TRUE);
BLED_OE(TRUE);
// Startup macros for speed and low power consumption
MEM_NO_WAIT_STATES();
FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_READS);
// Seed the random generator:
halRandomNumberGen(&n, 1);
halRandomNumberGen(&m, 1);
srand((n << 8) + m);
waitMultiplier = 1;
// RF/SPP setup
sppSetupRF(&RF_SETTINGS, &RF_CALDATA, TRUE);
sppSettings.myAddress = TBC_MY_SPP_ADDRESS;
sppSettings.rxTimeout = TBC_RX_INTERVAL;
sppSettings.txAckTimeout = TBC_PREAMBLE_COUNT;
sppSettings.txPreambleByteCount = TBC_PREAMBLE_COUNT;
RXI.maxDataLen = TBC_DATA_LEN;
RXI.pDataBuffer = rxDataBuffer;
56
TXI.destination = SPP_BROADCAST;
TXI.flags = 0x00;
TXI.pDataBuffer = txDataBuffer;
TXI.dataLen = TBC_DATA_LEN;
// Initialize the SPP timer
sppStartTimer(CC1010EB_CLKFREQ);
SPP_INIT_TIMEOUTS();
// Reset the node IDs
for (n = 0; n < TBC_MAX_NODE_COUNT; n++) {
nodeIDs[n] = TBC_UNUSED_NODE_ID;
}
// Reset our name buffer
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
nodeNames[0][n] = 0x00;
}
// Setup UART0 for polled I/O
UART0_SETUP(57600, CC1010EB_CLKFREQ, UART_NO_PARITY |
UART_RX_TX | UART_POLLED);
// Get our name
VT100_CLEAR_SCREEN();
VT100_GO_TOP_LEFT();
// Load name from Flash
memcpy(&nodeNames[0][0],flashUnitName,TBC_NODE_NAME_LENGTH
);
// Get our ID from CRC16(our name)
nodeIDs[0] = TBC_MY_SPP_ADDRESS;
// Prepare the id+name part of the packet
txDataBuffer[0] = (nodeIDs[0] >> 8) & 0xFF;
txDataBuffer[1] = nodeIDs[0] & 0xFF;
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
txDataBuffer[n + TBC_NODE_ID_LENGTH] = nodeNames[0][n];
57
}
// Loop forever
while (TRUE) {
tbcReceive();
// Tien hanh truyen goi tin nhan duoc
tbcTransmit();
tbcWaitRandom();
}
} // main
void tbcWaitRandom (void) {
byte xdata time;
byte xdata n;
time = rand();
for (n = 0; n < waitMultiplier; n++) {
halWait (time, CC1010EB_CLKFREQ);
}
} // tbcWaitRandom
void tbcTransmit (void) {
word xdata temp;
int m,n;
// Indicate transmission
RLED = LED_ON;
YLED = LED_ON;
for (n = 0; n <= TBC_MAX_NODE_COUNT; n++) {
if (nodeIDs[n] == TBC_UNUSED_NODE_ID) {
continue;
}
// Node name:
for (m = 0; m < TBC_NODE_NAME_LENGTH; m++) {
UART0_WAIT_AND_SEND(nodeNames[n][m]);
}
if(nodeIDs[n]==1){
// Temperature:
temp = nodeTemps[n];
58
break;
}
}
// temp=30;
// Update the TX buffer and the table with the new temperature
txDataBuffer[TBC_TEMP_OFFSET] = (temp >> 8) & 0xFF;
txDataBuffer[TBC_TEMP_OFFSET + 1] = temp & 0xFF;
nodeTemps[0] = temp;
nodeLastT[0] = (int) sppGetTime();
YLED = LED_OFF;
// Transmit the temperature
sppSend(&TXI);
do { /*nothing*/ } while (sppStatus() != SPP_IDLE_MODE);
RLED = LED_OFF;
} // tbcTransmit
void tbcReceive (void) {
byte xdata n,m,o;
byte xdata nodeIndex;
word xdata nodeID;
// Throw out "old" nodes (no updates during the last 3 seconds)
for (n = 0; n < TBC_MAX_NODE_COUNT; n++) {
if (((int) sppGetTime() - nodeLastT[n]) > 300) {
// Re-organize the list (by moving the remaining nodes up one index)
for (m = n; m < (TBC_MAX_NODE_COUNT - 1); m++) {
nodeIDs[m] = nodeIDs[m + 1];
for (o = 0; o < TBC_NODE_NAME_LENGTH; o++) {
nodeNames[m][o] = nodeNames[m + 1][o];
}
nodeTemps[m] = nodeTemps[m + 1];
nodeLastT[m] = nodeLastT[m + 1];
}
}
}
// Receive the packet (if any)
YLED = LED_ON;
sppReceive(&RXI);
do { /*nothing*/ } while (sppStatus() != SPP_IDLE_MODE);
59
YLED = LED_OFF;
// Process the packet
if (RXI.status == SPP_RX_FINISHED) {
GLED = LED_ON;
// Get the node ID
nodeID = (rxDataBuffer[0] << 8) + rxDataBuffer[1];
// Get the node's index in the temperature table
for (n = 0; n < TBC_MAX_NODE_COUNT; n++) {
if (nodeIDs[n] == nodeID) {
nodeIndex = n;
break;
} else if (nodeIDs[n] == TBC_UNUSED_NODE_ID) {
nodeIndex = n;
break;
} else {
nodeIndex = TBC_INVALID_NODE_INDEX;
}
}
// Update the table
if (nodeIndex != TBC_INVALID_NODE_INDEX) {
nodeIDs[nodeIndex] = nodeID;
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
nodeNames[nodeIndex][n] = rxDataBuffer[n +
TBC_NODE_ID_LENGTH];
}
nodeTemps[nodeIndex] = (rxDataBuffer[TBC_TEMP_OFFSET] <<
8) + rxDataBuffer[TBC_TEMP_OFFSET + 1];
nodeLastT[nodeIndex] = (int) sppGetTime();
}
} else {
GLED = LED_OFF;
}
} // tbcReceive
Mã nguồn chương trình nạp vàp chíp nối trực tiếp với máy tính
#include
#include
60
#include
#include
#include
#include
#include
#include
#include
//LCD define
#define LCDPORT P2
sbit _RS=LCDPORT^0;
sbit _RW=LCDPORT^1;
sbit _E =LCDPORT^2;
#include "lcd.h"
// Temperature packet:
#define TBC_NODE_ID_LENGTH 2 // word
#define TBC_NODE_NAME_LENGTH 20
#define TBC_TEMP_OFFSET (TBC_NODE_ID_LENGTH +
TBC_NODE_NAME_LENGTH)
#define TBC_TEMP_LENGTH 2
#define TBC_DATA_LEN (TBC_NODE_ID_LENGTH +
TBC_NODE_NAME_LENGTH + TBC_TEMP_LENGTH)
// Radio related:
#define TBC_MY_SPP_ADDRESS 3
#define TBC_RX_INTERVAL 50
#define TBC_PREAMBLE_COUNT 4
// Node registration
#define TBC_INVALID_NODE_INDEX 255
#define TBC_UNUSED_NODE_ID 0x0000
// Speed related
byte xdata waitMultiplier;
// The temperature "table":
#define TBC_MAX_NODE_COUNT 16
word xdata nodeIDs[TBC_MAX_NODE_COUNT];
61
byte xdata
nodeNames[TBC_MAX_NODE_COUNT][TBC_NODE_NAME_LENGTH]
;
word xdata nodeTemps[TBC_MAX_NODE_COUNT];
word xdata nodeLastT[TBC_MAX_NODE_COUNT];
// SPP variables
SPP_SETTINGS xdata sppSettings;
SPP_RX_INFO xdata RXI;
SPP_TX_INFO xdata TXI;
byte xdata rxDataBuffer[TBC_DATA_LEN];
byte xdata txDataBuffer[TBC_DATA_LEN];
// Function prototypes
void tbcWaitRandom (void);
void tbcTransmit (void);
void tbcReceive (void);
void tbcPrintTable (void);
void delayy(int ms);
// Unit name, stored in Flash
byte code flashUnitName[TBC_NODE_NAME_LENGTH];
// RAM buffer for Flash copy
byte xdata ramBufNonAligned[128];
//----------------------------------------------------------------------------
// MAIN PROGRAM
//----------------------------------------------------------------------------
void main (void) {
byte xdata n;
byte xdata m;
float xdata fTemp;
char so[15];
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0xA3, 0x2F, 0x15, // Modem 0, 1 and 2
62
0x75, 0xA0, 0x00, // Freq A
0x58, 0x32, 0x8D, // Freq B
0x01, 0xAB, // FSEP 1 and 0
0x40, // PLL_RX
0x30, // PLL_TX
0x6C, // CURRENT_RX
0xF3, // CURRENT_TX
0x32, // FREND
0xFF, // PA_POW
0x00, // MATCH
0x00, // PRESCALER
};
// Calibration data
RF_RXTXPAIR_CALDATA xdata RF_CALDATA;
// Initialize peripherals
WDT_ENABLE(FALSE);
RLED_OE(TRUE);
YLED_OE(TRUE);
GLED_OE(TRUE);
BLED_OE(TRUE);
// Startup macros for speed and low power consumption
MEM_NO_WAIT_STATES();
FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_READS);
// Seed the random generator:
halRandomNumberGen(&n, 1);
halRandomNumberGen(&m, 1);
srand((n << 8) + m);
waitMultiplier = 1;
// RF/SPP setup
sppSetupRF(&RF_SETTINGS, &RF_CALDATA, TRUE);
sppSettings.myAddress = TBC_MY_SPP_ADDRESS;
sppSettings.rxTimeout = TBC_RX_INTERVAL;
sppSettings.txAckTimeout = TBC_PREAMBLE_COUNT;
63
sppSettings.txPreambleByteCount = TBC_PREAMBLE_COUNT;
RXI.maxDataLen = TBC_DATA_LEN;
RXI.pDataBuffer = rxDataBuffer;
TXI.destination = SPP_BROADCAST;
TXI.flags = 0x00;
TXI.pDataBuffer = txDataBuffer;
TXI.dataLen = TBC_DATA_LEN;
// Initialize the SPP timer
sppStartTimer(CC1010EB_CLKFREQ);
SPP_INIT_TIMEOUTS();
// Reset the node IDs
for (n = 0; n < TBC_MAX_NODE_COUNT; n++) {
nodeIDs[n] = TBC_UNUSED_NODE_ID;
}
// Reset our name buffer
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
nodeNames[0][n] = 0x00;
}
// Setup UART0 for polled I/O
UART0_SETUP(57600, CC1010EB_CLKFREQ, UART_NO_PARITY |
UART_RX_TX | UART_POLLED);
// Get our name
VT100_CLEAR_SCREEN();
VT100_GO_TOP_LEFT();
// Load name from Flash
memcpy(&nodeNames[0][0],flashUnitName,TBC_NODE_NAME_LENGTH
);
// Get our ID from CRC16(our name)
nodeIDs[0] = TBC_MY_SPP_ADDRESS;
// Prepare the id+name part of the packet
txDataBuffer[0] = (nodeIDs[0] >> 8) & 0xFF;
txDataBuffer[1] = nodeIDs[0] & 0xFF;
64
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
txDataBuffer[n + TBC_NODE_ID_LENGTH] = nodeNames[0][n];
}
// Dat P2 o che do out du lieu
P2DIR = 0X00;
// Loop forever
while (TRUE) {
delay(2000);
tbcReceive();
for (n = 0; n <= TBC_MAX_NODE_COUNT; n++) {
if (nodeIDs[n] == TBC_UNUSED_NODE_ID) {
continue;
}
// Node name:
for (m = 0; m < TBC_NODE_NAME_LENGTH; m++) {
UART0_WAIT_AND_SEND(nodeNames[n][m]);
}
if(nodeIDs[n]==2){
// Temperature:
fTemp = nodeTemps[n];
fTemp -= 492;
fTemp /= 8.192;
sprintf(so,"%2.3f",fTemp);
// Phan doan tinh` trang he thong:
if(fTemp<70){
printf("Nhiet tai nut 1: %2.3f\n",fTemp);
printf("Tinh trang nut 1: An toan\n");
delayy(10000);
}
else{
printf("Nhiet tai nut 1: %2.3f\n",fTemp);
printf("Tinh trang nut 1: Bao dong\n");
delayy(10000);
}
65
}
else{
printf("Hien tai chua co du lieu\n");
}
}
}
} // main
void tbcWaitRandom (void) {
byte xdata time;
byte xdata n;
time = rand();
for (n = 0; n < waitMultiplier; n++) {
halWait (time, CC1010EB_CLKFREQ);
}
} // tbcWaitRandom
void tbcReceive (void) {
byte xdata n,m,o;
byte xdata nodeIndex;
word xdata nodeID;
// Throw out "old" nodes (no updates during the last 3 seconds)
for (n = 0; n < TBC_MAX_NODE_COUNT; n++) {
if (((int) sppGetTime() - nodeLastT[n]) > 300) {
// Re-organize the list (by moving the remaining nodes up one index)
for (m = n; m < (TBC_MAX_NODE_COUNT - 1); m++) {
nodeIDs[m] = nodeIDs[m + 1];
for (o = 0; o < TBC_NODE_NAME_LENGTH; o++) {
nodeNames[m][o] = nodeNames[m + 1][o];
}
nodeTemps[m] = nodeTemps[m + 1];
nodeLastT[m] = nodeLastT[m + 1];
}
}
}
// Receive the packet (if any)
YLED = LED_ON;
66
sppReceive(&RXI);
do { /*nothing*/ } while (sppStatus() != SPP_IDLE_MODE);
YLED = LED_OFF;
// Process the packet
if (RXI.status == SPP_RX_FINISHED) {
GLED = LED_ON;
// Get the node ID
nodeID = (rxDataBuffer[0] << 8) + rxDataBuffer[1];
// Get the node's index in the temperature table
for (n = 0; n < TBC_MAX_NODE_COUNT; n++) {
if (nodeIDs[n] == nodeID) {
nodeIndex = n;
break;
} else if (nodeIDs[n] == TBC_UNUSED_NODE_ID) {
nodeIndex = n;
break;
} else {
nodeIndex = TBC_INVALID_NODE_INDEX;
}
}
// Update the table
if (nodeIndex != TBC_INVALID_NODE_INDEX) {
nodeIDs[nodeIndex] = nodeID;
for (n = 0; n < TBC_NODE_NAME_LENGTH; n++) {
nodeNames[nodeIndex][n] = rxDataBuffer[n +
TBC_NODE_ID_LENGTH];
}
nodeTemps[nodeIndex] = (rxDataBuffer[TBC_TEMP_OFFSET] <<
8) + rxDataBuffer[TBC_TEMP_OFFSET + 1];
nodeLastT[nodeIndex] = (int) sppGetTime();
}
} else {
GLED = LED_OFF;
}
} // tbcReceive
67
// ------------------------------
// ham delayy
// ------------------------------
void delayy(int ms){
int i,j;
for(i=0;i<125;i++) {
for(j=0;j<ms;j++)
{;}
}
}// delay
Các file đính kèm theo tài liệu này:
- Tìm hiểu và tổng quan được những nét lớn , cơ bản của mạng cảm nhận không dây.pdf