Tiềm năng:
Hệ thống dễ dàng nâng cấp và ứng dụng vào thực tế. Hệ cho phép kết nối gần nhƣ không hạn chế số lƣợng cảm biến nhiệt độ, có thể đo đồng thời nhiệt độ của nhiều nơi, nhiều vị trí khác nhau, cho phép thu thập, kiểm soát nhiệt độ của nhiều đối tƣợng cùng lúc. Hệ thống có thể kết nối thêm các cảm biến các thông số khác theo yêu cầu sử dụng nhƣ cảm biến nồng độ khí CO2 cảm biến cƣờng độ sáng, lƣu lƣợng gió hay phát hiện khói… Hệ thống rất có tiềm năng để áp dụng ngay vào thực tế phục vụ các yêu cầu riêng.
Nâng cấp thiết bị:
Kết nối thêm các cảm biến theo yêu cầu nhƣ cảm biến nồng độ khí CO2 , tiếng ồn... Hiện tại thiết bị đang đƣợc nâng cấp thêm phần kết nối mạng không dây qua môi trƣờng sóng điện thoại di động GSM/GPRS. Cho phép thiết bị hoạt động và kết nối độc lập ở những nơi xa khó khăn cho kết nối mạng có dây. Nâng cấp phần mềm, webserver thêm các tính năng dự tính sẽ có thêm nhƣ quản lý dữ liệu theo cơ sở dữ liệu, dễ dàng tìm kiếm và phân tích. Nâng cấp giao diện ngƣời dùng, thêm các công cụ vẽ đồ thị, phân tích dữ liệu. Tích hợp thêm các modul cung cấp năng lƣợng nhƣ năng lƣợng mặt trời để hệ thống có thể hoạt động đƣợc liên tục tại những nơi không có điều kiện lắp điện lƣới.
69
KẾT LUẬN
Trong quá trình làm khóa luận, hệ thu thập số liệu nhiệt độ và độ ẩm không khí đã đƣợc xây dựng thành công với các chức năng cơ bản nhƣ lƣu trữ vào thẻ nhớ đến 4GB, truyền dữ liệu và thay đổi cấu hình qua internet, hiển thị dữ liệu dƣới dạng web server, cụ thể là:
- Có thể gắn số lƣợng đầu đo lớn: Về nguyên tắc thì hệ thống có 90 chân in/out có thể gắn tới các thiết bị, hoặc có thể nối tới các ghi dịch, phân kênh để đến các thiết bị. Ngoài ra hệ thống sử dụng giao tiếp 1-dây cho phép kết nối không hạn chế các thiết bị trên bus. Tuy nhiên thông thƣờng tại một trạm đo chỉ cần đo dƣới 20 thông số.
- Hệ thống sử dụng nguồn 1 chiều DC, tiêu thụ ít năng lƣợng. Do đó phù hợp với các yêu cầu đo ở các địa điểm ở xa.
- Giao diện web để hiển thị thông tin đơn giản và cho phép thiết lập từ xa. Có tích hợp cổng WAN nên không cần phải có thêm router trong trƣờng hợp đo qua internet.
- Cảm biến 1-dây, thuận tiện cho lắp đặt. Việc lắp đặt Bus 1-dây tối da chỉ cần 3 dây cho cả hệ thống nhiều đầu đo. Khoảng cách truyền giao tiếp xa, có thể lên tới 300m. Rất thuận tiện cho việc lắp đặt hệ thống nhiều đầu đo tại nhiều địa điểm khác nhau.
Tuy nhiên, để hệ thống hoạt động có hiệu quả, và phù hợp với ngƣời sử dụng thì ta cần phải hoàn thiện thêm một số tính năng khác:
- Hiện nay hệ thống mới chỉ có thể đo và thu thập đƣợc thông tin về nhiệt độ và độ ẩm. Để đánh giá hết về các yếu tố môi trƣờng ta cần thêm các thông tin khác nhƣ hƣớng gió, tốc độ gió, mực nƣớc, áp suất, hàm lƣợng CO2, … Do đó, hệ thống cần đƣợc bổ sung thêm các module để đo thêm các thông tin khác.
70
- Để đảm bảo đo đƣợc trong thời gian dài thì vấn đề năng lƣợng là một trong những yếu tố quan trọng nhất. Do đó, cũng cần phải có những cải tiến để có thêm các chế độ tiết kiệm năng lƣợng để giảm năng lƣợng hao phí hoặc là kết hợp sử dụng nguồn năng lƣợng mặt trời.
- Hiện nay các thông tin đo đƣợc chỉ đƣợc lƣu trữ trên 1 file, webserver còn đơn giản và chƣa có các tiền xử lý nhƣ tính trung bình, giá trị cao nhất và thấp nhất, cảnh báo... Để dễ dàng trong xử lý số liệu ta có thể tạo số liệu thành một cơ sở dữ liệu để thuận tiện cho ngƣời sử dụng. Tuy nhiên, để làm đƣợc điều này thì Web server cũng cần phải nâng cấp.
- Ngoài ra, hiện nay hệ thống chỉ truyền tín hiệu qua hệ thống Internet có dây nên khi sử dụng ở các khu vực không có đƣờng truyền internet thì dữ liệu chỉ đƣợc lƣu trên thẻ nhớ. Trong thời gian sắp tới, tôi hi vọng có thể cải tiến hệ thống để có thể sử dụng mạng internet không dây GPRS, 3G,… để phục vụ cho các địa điểm đo không có đƣờng truyền internet.
- Tóm lại, tuy hệ thống còn có một số hạn chế nhƣng đã đáp ứng đƣợc những chức năng cơ bản nhất của một hệ thu thập các thông số môi trƣờng và có khả năng truyền dữ liệu và điều khiển từ xa qua mạng.
71
TÀI LIỆU THAM KHẢO Tiếng Anh
1. Atmel Corp.(2009),AVR32 AP7000 datasheet.
2. Atmel Corp.(2006),AT32NGW100 schematics.
3. Atmel Corp.(2007),AP7: Linux training: Getting start.
4. Atmel Corp.(2007),AP7: Linux training: Linux modules.
5. Atmel Corp. (2007),AP7: Linux training: Getting start with buildroot.
6. Atmel Corp.(2007), AP7: Linux training: Adding costom software to buildroot.
7. Barnes, G.; Warren, S.; A wearable, Bluetooth-enabled system for home health care, Engineering in Medicine and Biology, 2002. 24th Annual Conference and the Annual Fall Meeting of the Biomedical Engineering Society EMBS/BMES Conference, 2002. Volume: 3, 2002, Page(s): 1879 - 1880 vol.3
8. Coopmans, C.; YangQuan Chen; A general-purpose low-cost compact spatial-temporal data logger and its applications, AUTOTESTCON, 2008,IEEE Conferences 2008 , Page(s): 64 - 68
9. D. Geer, “Survey: Embedded Linux Ahead of the Pack” Distributed Systems Online, IEEE, Vol. 5, Issue 10, pp. 1-6, Oct. 2004
10. Dataq Instrument Inc.(2011),MT100 paperless chart recorder and data logger.
11. Fairchild semiconductor Corp., (2002), LM555/NE555/SA555 single timer datasheet.
12. Humirel Corp.(2002), Relative humidity sensor datasheet.
13. Hayes, J.; Crowley, K.; Diamond, D. , 2005 Simultaneous Web-based real-time temperature monitoring using multiple wireless sensor networks, Sensors, 2005 IEEE Conferences
72
14. Hsueh-Chun Lin; Yiao-Chiang Kan; Yao-Ming Hong IEEEVolume: 11, 2011,; The Comprehensive Gateway Model for Diverse Environmental Monitoring Upon Wireless Sensor Network, Sensors Journal, Page(s): 1293 – 1303.
15. Ku, K.K.K.; Bradbeer, R.; Hodgson, P.; Lam, K.; Lam Yeung; A low-cost, three-dimensional and real-time marine environment monitoring system, Data buoy with connection to the internet, OCEANS 2008 - MTS/IEEE Kobe Techno-Ocean 2008 , Page(s): 1 – 5.
16. Maxim intergrated Corp. (2005) iButton Devices : ibutton standard.
17.Jon Williams (2001) Searching The 1-Wire, The Nuts and Volts of BASIC Stamps (Vol. 2), pp 401-417
18. Jakkree Srinonchat(2009), Improvement of a Data logger system for renewable energy, As. J. Energy Env, pp 142-148.
19. Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman,
Linux device driver, O’Reilly
20. Kuchta R., Stefan P., Barton Z., Vrba R., Sveda M.(2005), wireless temperature data logger, IEEE Xplore, pp 208-212.
21. Kato, K.; Yamamoto, T.; Hirota, T., and Mizuyama, M., “Embedded Linux Technologies to Develop Mobile Phones for the Mainstream Market,” Consumer Communications and Networking Conference, 2006. CCNC 2006. 2006 3rd IEEE Vol. 2, pp. 1073 – 1077, 8-10 Jan. 2006.
22. Lennon, A., “Embedding Linux,” IEEE Review, Vol. 47, Issue 3, pp. 33 - 37, May 2001.Henkel, J., “Software development in embedded Linux – informal collaboration of competing firms,” Proceedings of the 6th International Tagung Wirtschaftsinformatik, Vol. 2, pp. 81-99,September, 2003.
73
23. Lee, Che-Tai; Hong, Zeng-Wei, and Lin, Jim-Min, “Linux kernel Customization for Embedded Systems by Using Call Graph Approach,”
Design Automation Conference, 2003. Proceedings of the ASP-DAC 2003. Asia and South Pacific, pp. 689 – 692, January, 2003.
24. Lin, K. J., and Wang, Y.C., “The Design and Implementation of Real- Time schedulers in RED-Linux,” Proceedings of the IEEE, Vol. 91, No. 7, July 2003.
25. Li, Yun-Chen, and Chiang, Mei-Ling, “LyraNet: A Zero-Copy TCP/IP Protocol Stack for Embedded Operating Systems,” Proceedings of the 11th IEEE International Conference on embedded and Real-Time Computing Systems and Applications, pp. 123-128, August, 2005.
26. Luharuka, E. and Gao, R.X.(2002), A microcontroller-based data logger for physiological sensing, IEEE Xplore vol. 1, pp 175-180.
27. M. Tim Jones(2007),Anatomy of the Linux kernel.
28. Microchip Technology Inc (2008),1-Wire Communication with
PICMicrocontroller
29. Maxim Corp., DS18B20 programable resolution 1-wire digital thermometer datasheet.
30. Motorola Corp., Decade counter; devide-by-twelve counter; 4-bit binary counter datasheet.
31. Panahi, S.S. Ventosa, S. Cadena, J. Manuel-Lazaro, A. Bermudez, A. Sallares, V. Piera, J. (2008), A Low-Power Datalogger Based on CompactFlash Memory for Ocean Bottom Seismometers, IEEE Xplore, volume 57 issue 10.
32. Prabhudesai, R.G.; Joseph, A.; Agarwadekar, Y.; Mehra, P.; Kumar, K.V.; Luis, R.; Integrated Coastal Observation Network (ICON) for real-
74
time monitoring of sea-level, sea-state, and surface-meteorological data, OCEANS 2010, IEEE 2010 , Page(s): 1 – 9
33. R Anderson and G M Lyons(2001), Data logging technology in ambulatory medical instrument, Physiol. Meas. 22, pp R1-R13
34. Supco Inc.(2007), DVTH data logger manual.
35. Thakur, S.; Conrad, J.M., (2007). An embedded linux based navigation system for an autonomous underwater vehicle, SoutheastCon, Proceedings. IEEE Issue March 2007, page(s): 237 – 242
36. Segars, S., “The ARM9 Family – High Performance Microprocessors for Embedded Applications,” (1998) Proceedings of the International Conference on Computer Design: VLSI in Computers and Processors, pp. 230 - 235, 5th October,.
37.Xavier Calbet(2006), Writing device driver in Linux: A brief tutorial, Free software magazine.
Các Website: 38. www.avrfreaks.net 39. www.advantech.com/ 40. www.wikipedia.com 41 .www.ni.com/data_logger/ 42. www.icpdas.com/products/Products-list.htm#P2 43. www.mccdaq.com/solutions/Logger-Solutions.aspx
75
PHỤ LỤC
Nội dung file code của các driver. Các file code driver đo nhiệt độ: ds18b20_module.c #include <linux/module.h> #include <linux/init.h> //#include <linux/config.h> #include <linux/fs.h> #include <linux/types.h> #include "ds18b20_dev.h" #include "ds18b20_ctrl.h" #include "wire_ctrl.h"
//Initialise module: call when module is loaded static int __init InitModule(void)
{
int ret_val;
ret_val=register_ds18b20_chrdev(); // need for initialize if (ret_val < 0)
{
printk(KERN_ALERT "Couldn't register module \n"); return (ret_val);
}
ret_val=ds18b20_init(0,50,1); // templow=0,temp_h=50
resolution=10bit
if (ret_val == 0) //gia tri co the thay doi {
printk(KERN_ALERT "There isn't any device"); }
printk(KERN_ALERT "DS18B20 has loaded \n"); return 0;
}
//Cleanup Module: call when module is removed static void __exit CleanupModule (void)
{
// int ret_val;
// ret_val=
unregister_ds18b20_chrdev();
printk(KERN_ALERT "Module has removed"); }
module_init(InitModule); module_exit(CleanupModule);
76 ds18b20_dev.c //IOdev // #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <asm/uaccess.h> #include "ds18b20_dev.h" #include "wire_ctrl.h" #include "ds18b20_ctrl.h"
static int Device_Open = 0;
static int device_open(struct inode *inode, struct file *file) { if(Device_Open) return -EBUSY; Device_Open++; try_module_get(THIS_MODULE); return 0; }
static int device_release(struct inode *inode, struct file *file) {
Device_Open--;
module_put(THIS_MODULE); return 0;
}
static ssize_t device_read(struct file *file, char __user *buffer, size_t length, loff_t *offset)
{
int u; //u is the temperature
u = ds18b20_temparature(); //u=129934;
//printk (KERN_ALERT "temp: %d",u); copy_to_user(buffer,&u,sizeof(int)); return 0;
}
static ssize_t device_write(struct file *file, const char __user *buffer,
size_t length, loff_t *offset)
{
return 0; //donot need to write anything to device
77 struct file_operations Fops =
{ .read = device_read, .write = device_write, .ioctl = NULL, .open = device_open, .release= device_release, }; // // int register_ds18b20_chrdev(void) { int ret;
ret = register_chrdev( MAJOR_NUM, DEVICE_FILE_NAME, &Fops); if( ret < 0 ) return ret; return ret; } //--- int unregister_ds18b20_chrdev(void) { unregister_chrdev(MAJOR_NUM, DEVICE_FILE_NAME); return 0; } ds18b20_dev.h #include <linux/ioctl.h> #define MAJOR_NUM 190 #define DEVICE_FILE_NAME "ds18b20" int register_ds18b20_chrdev(void); int unregister_ds18b20_chrdev(void); ds18b20_ctrl.c #include "ds18b20_ctrl.h" #include "wire_ctrl.h" #include <asm/delay.h>
78 #include <linux/delay.h>
struct __ds18b20_scratch_pad_struct __ds18b20_scratch_pad; int conv_delay[4]={100,200,400,800}; int bit_mask[4]={0xFFF8,0xFFFC,0xFFFE,0xFFFF}; char ds18b20_select(void) { return 0; } char ds18b20_read_spd(void) { unsigned char i; unsigned char *p; if (w1_init()==0) return 0; w1_write(0xCC); w1_write(0xbe); i=0; p=(char *) &__ds18b20_scratch_pad; do *(p++)=w1_read(); while (++i<9); //return !w1_dow_crc8(&__ds18b20_scratch_pad,9); return 1; }
int ds18b20_temparature(void) //with skip rom {
int u;
if (w1_init()==0) return -9999;
w1_write(0xCC); //skip rom: use for only 1 device
w1_write(0x44); //conversion command
while(w1_line_status()==0){}; //wait status to be 1 msleep(550); if (ds18b20_read_spd()==0) return 9999; u=((__ds18b20_scratch_pad.temp_msb<<8)|(__ds18b20_scratch_pad.te mp_lsb)); return u; }
unsigned char ds18b20_init (char temp_low, char temp_high,unsigned char resolution)
{
if (w1_init()==0) return 0;
w1_write(0xCC); //skip rom: use only 1 device resolution=(resolution<<5) | 0x1f;
w1_write(0x4e); // write scratch
w1_write(temp_high); w1_write(temp_low); w1_write(resolution);
79 if ((__ds18b20_scratch_pad.temp_low!=temp_low) || (__ds18b20_scratch_pad.temp_high!=temp_high) || (__ds18b20_scratch_pad.conf_register!=resolution)) return 0; return 1; } ds18b20_ctrl.h
#define DS18B20_9BIT_RES 0 // 9 bit thermometer resolution #define DS18B20_10BIT_RES 1 // 10 bit thermometer resolution #define DS18B20_11BIT_RES 2 // 11 bit thermometer resolution #define DS18B20_12BIT_RES 3 // 12 bit thermometer resolution
#define DS18B20_FAMILY_CODE 0x28 #define DS18B20_SEARCH_ROM_CMD 0xf0 #define DS18B20_ALARM_SEARCH_CMD 0xec
extern struct __ds18b20_scratch_pad_struct {
unsigned char temp_lsb,temp_msb, temp_high,temp_low, conf_register, res1, res2, res3, crc; } __ds18b20_scratch_pad; char ds18b20_select(void);
80 char ds18b20_read_spd(void); int ds18b20_temparature(void);
unsigned char ds18b20_init (char temp_low, char temp_high,unsigned char resolution);
wire_ctrl.c #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/delay.h> #include <asm/io.h> #include <asm/delay.h> #include "wire_ctrl.h" // initializes 1wire // #define W1_PIN 27 // PB27 #define W1_MASK 0x08000000 //0b 0000 1000 0000 0000 0000 0000 0000 0000
#define W1_D_OUT iowrite32be(W1_MASK,PORTB+PIO_OER)
#define W1_D_IN iowrite32be(W1_MASK,PORTB+PIO_ODR)
#define W1_ENABLE iowrite32be(W1_MASK,PORTB+PIO_PER)
#define W1_DATA ((ioread32be(PORTB+PIO_PDSR))&(W1_MASK))
#define W1_OUT_L iowrite32be(W1_MASK,PORTB+PIO_CODR)
#define W1_OUT_H iowrite32be(W1_MASK,PORTB+PIO_SODR)
//Code //
unsigned char w1_init(void) { W1_ENABLE; W1_D_OUT; W1_OUT_L; // __raw_writel(1<<27,PORTB+PIO_PER); // __raw_writel(1<<27,PORTB+PIO_OER); // iowrite32(W1_MASK,PORTB+PIO_SODR); udelay(480); W1_D_IN; udelay(30); if (W1_DATA) return 0; udelay(150); if (W1_DATA==0) return 0; udelay(200); return 1; }
void w1_write(unsigned char data) {
unsigned char i; for (i=0;i<=7;i++) {
81 W1_D_OUT; W1_OUT_L; udelay(2); if ((data)&(1<<i)) { W1_D_IN; udelay(50); } else { udelay(50); W1_D_IN; } udelay(10); } }
unsigned char w1_read(void) {
unsigned char data,i; data=0; for (i=0;i<=7;i++) { W1_D_OUT; W1_OUT_L; udelay(2); W1_D_IN; udelay(12); if (W1_DATA) data|=(1<<i); udelay(60); } return data; }
unsigned char w1_search(unsigned char cmd, void *p) {
return 1; }
unsigned char w1_dow_crc8(void *p, unsigned char n) {
return 1; }
unsigned char w1_line_status (void) { if (W1_DATA) return 1; return 0; } //int IOctrl_init(void) //{
// iowrite32be(0x00080000, PORTA + PIO_PER); // PA19 is controlled by PIOA
// iowrite32be(0x00080000, PORTA + PIO_OER); // PA19 is o/p // iowrite32be(0x00080000, PORTA + PIO_SODR); // SET PA19, SYS A LED off
//
82 //}
// Just define port and function in 1wire_ctrl.c //Haven't finish this file
#define PORTB (void*)0xffe02c00 // Base address
#define PIO_PER 0x0000 // PIO Enable Register
#define PIO_PDR 0x0004 // PIO Disable Register
#define PIO_OER 0x0010 // Output Enable Register
#define PIO_ODR 0x0014
#define PIO_SODR 0x0030 // Set Output Data Register
#define PIO_CODR 0x0034 // Clear Output Data Register
#define PIO_ODSR 0x0038
#define PIO_PDSR 0x003c // Pin data Status Register
//#define PIO_MDER //pin multidrive
//#define PIO_MDDR //#define PIO_MDSR
//#define PIO_PUDR //pull up
//#define PIO_PUER //#define PIO_PUSR
//#define PIO_ASR //peripheral A select
//#define PIO_BSR //peripheral B select
//#define PIO_OWER //ouput write en: for write directly in
ODSR
83
#define W1_PIN 27 // PB27
#define W1_MASK 0x08000000 //0b 0000 1000 0000 0000 0000 0000 0000 0000
1-wire.h
unsigned char w1_init(void);
void w1_write(unsigned char data); unsigned char w1_read(void);
unsigned char w1_search(unsigned char cmd, void *p); unsigned char w1_dow_crc8(void *p, unsigned char n); unsigned char w1_line_status (void);
Các file code driver đo độ ẩm hs1100_module.c #include <linux/module.h> #include <linux/init.h> //#include <linux/config.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/sched.h> #include <linux/workqueue.h>
#include <linux/interrupt.h> /* We want an interrupt */ #include <linux/time.h> #include <asm/io.h> #include <asm/io.h> #include <asm/irq.h> #include <asm/gpio.h> #include <asm/system.h> #include "hs_dev.h" //#define INPUT_PIN 57
//#define INPUT_IRQ gpio_to_irq(INPUT_PIN) //Initialise module: call when module is loaded
static int __init InitModule(void) {
int ret_val;
84 if (ret_val < 0)
{
printk(KERN_ALERT "Couldn't register module \n"); return (ret_val);
}
printk(KERN_ALERT "HS1100 has loaded \n"); return 0;
}
//Cleanup Module: call when module is removed static void __exit CleanupModule (void)
{ // int ret_val; // ret_val= free_irq(INPUT_IRQ, NULL); gpio_free(INPUT_PIN); unregister_hs1100_chrdev();
printk(KERN_ALERT "Module has removed"); } module_init(InitModule); module_exit(CleanupModule); hs1100_dev.c // IOdev // #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <asm/uaccess.h> #include <linux/sched.h> #include <linux/workqueue.h>
#include <linux/interrupt.h> /* We want an interrupt */ #include <asm/io.h> #include <asm/irq.h> #include <asm/gpio.h> #include <asm/system.h> #include <linux/time.h> #include <asm/delay.h> #include <linux/delay.h> #include "hs_dev.h"
static int Device_Open = 0; static int PORT_INPUT; static int count=0;