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

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ó

pdf67 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2431 | Lượt tải: 0download
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:

  • pdfTì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
Luận văn liên quan