Professional Documents
Culture Documents
Đồ án tốt nghiệp - Điều khiển thiết bị gia đình bằng SMS được thể hiện thông qua mô hình nhà thông minh (download tai tailieutuoi.com)
Đồ án tốt nghiệp - Điều khiển thiết bị gia đình bằng SMS được thể hiện thông qua mô hình nhà thông minh (download tai tailieutuoi.com)
MỤC LỤC
LỜI MỞ ĐẦU
Từ những yêu cầu thực tế, xu hướng đòi hỏi ngày càng cao của cuộc sống cùng
với sự phát triển mạnh mẽ của nhiều thiết bị thông minh di động nên em đã chọn đề
tài đồ án tốt nghiệp : " ĐIỀU KHIỂN THIẾT BỊ GIA ĐÌNH BẰNG SMS " được thể
hiện thông qua “ MÔ HÌNH NHÀ THÔNG MINH ”.
Nội dung đồ án :
Đồ án thiết lập một hệ thống điều khiển thiết bị trong nhà từ xa thông qua tin
nhắn SMS gồm có các thiết bị đơn giản như bóng đèn, quạt máy, lò sưởi đến các thiết
bị tinh vi, phức tạp như tivi, máy giặt, điều hòa, hệ thống báo động … Nó hoạt động
như một ngôi nhà thông minh. Nghĩa là tất cả các thiết bị này có thể giao tiếp với
nhau về mặt dữ liệu thông qua một đầu não trung tâm. Đầu não trung tâm ở đây là
một bộ điều khiển dùng PIC 16F887A đã được lập trình sẵn tất cả các chương trình
điều khiển. Bình thường, các thiết bị trong ngồi nhà có thể được điều khiển từ xa
thông qua các tin nhắn của gia chủ. Chẳng hạn như việc tắt quạt, đèn điện … khi gia
chủ quên chưa tắt trước khi ra khỏi nhà. Hay chỉ với một tin nhắn SMS, gia chủ có
thể bật máy điều hòa để làm mát phòng trước khi về nhà trong một khoảng thời gian
nhất định. Bên cạnh đó thiết bị cũng gửi thông báo cho người điều khiển biết khi có
người lạ đột nhập vào nhà thông qua hệ thống báo động dùng hồng ngoại, khi nhiệt
độ tăng cao có nguy cơ cháy hay gửi thông báo cảnh báo sự rò rỉ khí gas trong gia
đình. Ngoài ra, hệ thống còn mang tính bảo mật. Nghĩa là chỉ có gia chủ hay các thành
viên trong gia đình, người biết mật khẩu của ngôi nhà thì mới điều khiển được ngôi
nhà.
Đồ án được nghiên cứu, khảo sát và thực hiện với mục đích áp dụng những
kiến thức đã được học trong nhà trường để thiết kế, tạo ra một hệ thống quản lý, hệ
thống cảnh báo trong nhà một cách hoàn chỉnh. Hệ thống tích hợp module điều khiển
giám sát trung tâm, module công suất cho các thiết bị trong nhà và và module báo
4
động (cảnh báo) cùng các module tiện ích khác. Với module báo động sử dụng cảm
biến hồng ngoại sẽ gửi thông tin dữ liệu về bộ xử lí trung tâm khi có tác động của đối
tượng bên ngoài (người lạ đột nhập). Module cảm biến khí gas/cảm biến nhiệt độ sẽ
gởi thông tin dữ liệu về bộ xử lý trung tâm khi có khí gas bị rò rỉ/nhiệt độ trong nhà
tăng quá giới hạn quy định. Qua xử lý, dữ liệu sẽ được gửi về thiết bị đầu cuối
(mobile) của người điều khiển để báo cho biết có tác động của đối tượng bên ngoài
(người lạ đột nhập), hay khí gas đang rò rỉ để có phương án giải quyết.
Phương pháp tham khảo tài liệu : phần lớn các tài liệu được tham khảo trên
mạng qua các diễn đàn điện tử, trang web cung cấp tài liệu học tập.
Phương pháp quan sát : khảo sát một số mạch thực tế đang có trên thị trường,
các mô hình tốt nghiệp của anh chị các khóa trước và tham khảo thêm một số
dạng mạch từ mạng Internet.
Phương pháp thực nghiệm: từ những ý tưởng và kiến thức vốn có của mình
kết hợp với sự hướng dẫn của giáo viên, em đã lắp ráp thử nghiệm nhiều dạng
mạch khác nhau để từ đó chọn lọc những mạch điện tối ưu. Thiết kế mạch điện
sử dụng các linh kiện thực tế. Thử nghiệm và tối ưu sản phẩm trực quan các
phần không mô phỏng được.
SMS là từ viết tắt của Short Message Service. Đó là một công nghệ cho phép
gửi và nhận các tín nhắn giữa các điện thoại với nhau. Dữ liệu có thể được lưu giữ
bởi một tin nhắn SMS là rất giới hạn. Một tin nhắn SMS có thể chứa tối đa là 140
byte (1120 bit) dữ liệu. Vì vậy, một tin nhắn SMS chỉ có thể chứa :
Tin nhắn SMS dạng text hỗ trợ nhiều ngôn ngữ khác nhau. Nó có thể hoạt động
tốt với nhiều ngôn ngữ mà có hỗ trợ mã Unicode, bao gồm cả Arabic, Trung Quốc,
Nhật bản và Hàn Quốc.
Một modem GSM là một modem wireless, nó làm việc cùng với một mạng
wireless GSM. Một modem wireless thì cũng hoạt động giông như một modem quay
số. Điểm khác nhau chính ở đây là modem quay số thì truyền và nhận dữ liệu thông
qua một đường dây điện thoại cố định trong khi đó một modem wireless thì việc gửi
nhận dữ liệu thông qua sóng.
Giống như một điện thoại di động GSM , một modem GSM yêu cầu 1 thẻ sim
với một mạng wireless để hoạt động.
Module SIM 900 là một trong những loại modem GSM. Nhưng Module SIM
900 được nâng cao hơn có tốc độ truyền dữ liệu nhanh hơn. Nó sử dụng công nghệ
GSM/GPRS hoạt động ở băng tầng GSM 850Mhz, EGSM 900Mhz, DCS 1800 Mhz
và PCS 1900Mhz, có tính năng GPRS của Sim 900.
6
1.2.3 Khảo sát sơ đồ chân và chức năng từng chân của SIM900
Trong đồ án đã sử dụng Breakout SIM 900 tức là SIM 900 đã được thế kế kết
nối phù hợp thành module để tiện phục vụ cho nội dung cần thiết trong đồ án.
9
Sơ đồ chân Breakout:
Chân 1: Chân ON/OFF ta cần kích 1 xung có mức tích cực dương vào
khoảng 1s, lúc này đèn status sẽ sáng, sau đó chớp nháy với tần suất nhanh
báo hiệu SIM900 đang khởi động và tìm mạng. Sau 10s sau Led Status
nhấp nháy chậm báo hiệu SIM900 đã hoạt động bình thường.
Chân 2 : Request to send.
Chân 3 : đầu ra dùng để chỉ báo mạng kết nối được hệ thống.
Chân 4 : Clear to send.
Chân 5 : đầu vào pin dự phòng cho module.
Chân 6 : Data carrier detection.
Chân 7 : Chân vào của bộ chuyển đổi tín hiệu tương tự sang số
Chân 8 : Ring chân ra loa báo hiệu có cuộc gọi đến.
Chân 9, 11 : chân loa nghe cuộc thoại
Chân 13,15 : chân MIC.
Chân 10 : chân đầu cuối dữ liệu.
Chân 12 : chân truyền dữ liệu.
Chân 14 : chân nhận dữ liệu.
Chân 16 : chân RESET SIM900.
Chân 17,19 : chân nguồn cấp cho sim hoạt động.
Chân 18,20 : chân mass.
1.3 Khảo sát tập lệnh AT Command của Module SIM900
Các lệnh AT là các hướng dẫn được sử dụng để điều khiển một modem.
AT là một cách viết gọn của chữ Attention. Mỗi dòng lệnh của nó bắt đầu với
11
“AT” hay “at”. Đó là lý do tại sao các lệnh modem được gọi là các lệnh AT.
Nhiều lệnh của nó được sử dụng để điều khiển các modem quay số sử dụng dây
mối (wired dial-up modems), chẳng hạn như ATD (Dial), ATA (Answer),
ATH (Hool control) và ATO (return to online data state), cũng được hỗ trợ bởi
các modem GSM/GPRS và các điện thoại di động.
Bên cạnh bộ lệnh AT thông dụng này, các modem GSM/GPRS và các
điện thoại di động còn được hỗ trợ bởi một bộ lệnh AT đặc biệt đối với công
nghệ GSM. Nó bao gồm các lệnh liên quan tới SMS như AT+ CMGS (gửi tin
nhắn SMS), AT+CMSS (gửi tin nhắn SMS từ một vùng lưu trữ), AT+CMGL
(chuỗi liệt kê các tin nhắn SMS) và AT+CMGR (đọc tin nhắn SMS). Ngoài ra,
các modem GSM còn hỗ trợ một bộ lệnh AT mở rộng. Những lệnh AT mở rộng
này được định nghĩa trong các chuẩn của GSM. Với các lệnh AT mở rộng này
có thể làm một số thứ như sau :
Số tin nhắn SMS có thể được thực thi bởi một modem SMS trên một phút
thì rất thấp, nó chỉ khoảng từ 6 đến 10 tin nhắn SMS trên 1 phút.
Trong khuôn khổ của đồ án em chỉ tìm hiểu 1 số tập lệnh cơ bản phục vụ
cho công việc của mình. Sau đây em xin giới thiệu 1 số tập lệnh cơ bản để thao
tác dùng cho dịch vụ SMS, bao gồm :
Khởi tạo.
Nhận cuộc gọi.
Thiết lập cuộc gọi.
12
(1) ATZ<CR> reset modem, kiểm tra modem đã hoạt động bình thường chưa.
Gửi nhiều lần cho chắc ăn, cho đến khi nhận được chuỗi :
ATZ<CR><CR><LF>OK<C><LF>
13
ATE0<CR><CR><LF>OK<CR><LF>
(3) AT+CLIP=1<CR> định dạng chuỗi trả về khi nhân cuộc gọi. Thông
thường, ở chế độ mặc định, khi có cuộc gọi đến, chuỗi trả về sẽ có dạng :
<CR><LF>RING<CR><LF>
Sau khi lệnh AT+CLIP=1<CR> đã được thực thi, chuỗi trả về sẽ có dạng :
<CR><LF>RING<CR><LF>
<CR><LF>+CLIP:”0922050808”,129,””,,””,0,<CR><LF>
Chuỗi trả về có chứa thông tin về số điện thoại gọi đến. Thông tin này cho phép
xác định việc có nên nhận cuộc gọi hay từ chối cuộc gọi.
Kết thúc các thao tác khởi tạo cho quá trình nhận cuộc gọi đến. Các bước khởi
tạo tiếp theo liên quan đến các thao tác truyền nhận tin nhắn.
(4) AT&W<CR> Lưu cấu hình cài đặt được thiết bị bởi các tập lệnh AET0 và
AT+CLIP vào bộ nhớ.
(5) AT+CMGF=1<CR> Thiết lập quá trình truyền nhận tin nhắn được thực
hiện ở chế độ text (mặc định là ở chế độ PDU) Chuỗi trả về sẽ có dạng :
<CR><LF>OK<CR><LF>
(7) AT+CSAS<CR>
14
(8) Lưu cấu hình cài đặt được thiết lập bởi các lệnh AT+CMGF và
AT+CNMI.
(1) AT+CMGD=1
(2) AT+CMGD=2
Lệnh này được dùng để xóa tin nhắn được lưu trong ngăn số 2.
Có thể hình dung bộ nhớ lưu tin nhắn trong SIM bao gồm nhiều. Mỗi ngăn
được đại diện bằng một số thứ tự. Khi nhận được tin nhắn mới, nội dung tin nhắn sẽ
được lưu trong một ngăn trống có số thứ tự nhỏ nhất có thể.
Việc xóa nội dung tin nhắn ở hai ngăn 1 và 2 cho phép tin nhắn nhận được
luôn được lưu vào trong hai ô nhớ này, giúp dễ dàng xác định vị trí lưu tin nhắn vừa
nhận được, và giúp cho việc thao tác với tin nhắn mới nhận được trở nên dễ dàng và
đơn giản hơn, giảm khả năng việc tin nhắn mới nhận được bị thất lạc ở vùng nhớ nào
đó mà ta không kiểm soát được.
Ngoài ra, khi bộ nhớ chứa tin nhắn đầy, MT sẽ không được phép nhận thêm
tin nhắn mới nào nữa. Những tin nhắn được gửi đến MT trong trường hợp bộ nhớ
chứa tin nhắn được gửi đến MT trong trường hợp bộ nhớ chứa tin nhắn của MT đã
15
được đầy sẽ được lưu trên tổng đài, và sẽ được gửi đến MT sau khi bộ nhớ chứa tin
nhắn của MT có xuất hiện những ngăn trống dùng để chứa tin nhắn. Việc xóa nội
dung tin nhắn trong các ngăn 1 và 2 sẽ giúp đảm bảo khả năng nhận thêm tin nhắn
mới của MT.
Chuỗi này thông báo lệnh trên đã được nhận và đang được thực thi.
16
Sau đó là những chuỗi thông báo kết quả quá trình kết nối ( nếu như kết nối
không được thực hiện thành công).
(2A) Nếu MT không thực hiện được kết nối do sóng yếu, hoặc không có sóng
( thử bằng cách tháo antenna của modem GSM), chuỗi trả về sẽ có dạng:
(2B) Nếu cuộc gọi bị từ chối bởi người nhận cuộc gọi, hoặc số máy đang gọi
tạm thời không hoạt động ( chẳng hạn như bị tắt máy ) chuỗi trả về có dạng:
<CR><LF>NO CARRIER<CR><LF>
(2C) Nếu cuộc gọi không thể thiết lập được do máy nhận cuộc gọi đang bận
(ví dụ như đang thông thoại với một thuê bao khác), chuỗi trả về sẽ có dạng:
<CR><LF>BUSY<CR><LF>
(4s) Tổng thời gian từ lúc modem nhận lệnh cho đến lúc nhận được chuỗi trên
thông thường là 4 giây.
(2D) Nếu sau 1 phút mà thuê bao nhận cuộc gọi không bắt máy, chuỗi trả về
sẽ có dạng :
(3) Trong trường hợp quá trình thiết lập cuộc gọi diễn ra bình thường, không
có chuỗi thông báo nào (2A, 2B, 2C hay 2D) được trả về, và chuyển sang giai đoạn
thông thoại.
Quá trình kết thúc cuộc gọi được diễn ra trong hai trường hợp:
(4A) Đầu nhận cuộc gọi gác máy trước, chuỗi trả về sẽ có dạng :
<CR><LF>NO CARRIER<CR><LF>
(4B) Đầu thiết lập cuộc gọi gác máy trước: phải tiến hành gửi lệnh ATH, và
chuỗi trả về sẽ có dạng : <CR><LF>OK<CR><LF>
(1) Sau khi được khởi tạo bằng lệnh AT+CLIP=1, khi có cuộc gọi đến, chuỗi
trả về sẽ có dạng: <CR><LF>RING<CR><LF>
<CR><LF>+CLIP:”0929047589”,129,””,0<CR><LF>
(2A) Nếu số điện thoại gọi đến không hợp lệ, từ chối nhận cuộc gọi bằng lệnh
ATH, và chuỗi trả về sẽ có dạng : <CR><LF>OK<CR><LF> Cuộc gọi kết thúc.
(2B) Nếu số điện thoại gọi đến là hợp lệ, nhận cuộc gọi bằng cách gửi lệnh
ATA, và chuỗi trả về sẽ có dạng : <CR><LF>OK<CR><LF>
(4A) Kết thúc cuộc gọi. Đầu còn lại gác máy trước.
(4B) Kết thúc cuộc gọi, chủ động gác máy bằng cách gửi lệnh ATH.
Mọi thao tác liên quan đến quá trình nhận tin nhắn đều được thực hiện trên hai
ngăn 1 và 2 của bộ nhớ nằm trong SIM.
(2A) Nếu ngăn 1 không chứa tin nhắn, nội dung tin nhắn sẽ được gửi trả về TE
với định dạng như sau:
19
<CR><LF>+CMGR: ”REC
UNREAD”,”+84929047589”,,”07/05/15,09:32:05+28” <CR><LF>
<CR><LF>NỘI DUNG<CR><LF>
<CR><LF>OK<CR><LF>
Các tham số trong chuỗi trả về bao gồm trạng thái của tin nhắn (REC
UNREAD), số điện thoại gửi tin nhắn (+84929047589) và thời gian gửi tin nhắn
(07/05/15,09:32:05+28) và nội dung tin nhắn.
Đây là dạng mặc định của module SIM900 lúc khởi động, dạng mở rộng có
thể được thiết lập bằng cách sử dụng lệnh AT+CSDH=1 trước khi thực hiện đọc tin
nhắn.
(3) Sau khi đọc, tin nhắn được xóa đi bằng lệnh AT+CMGD=1
Thao tác tương tự đối với tin nhắn chứa trong ngăn thứ 2 trong các bước
4,(5A), (5B) và 6.
(1) Gửi tin nhắn đến thuê bao bằng cách sử dụng lệnh AT+CMGS=”số điện
thoại”.
(2) Nếu lệnh (1) được thực hiện thành công, chuỗi trả về sẽ có dạng:
(3) Gửi nội dung tin nhắn và kết thúc bằng kí tự có mã ASCII 0x1A.
(3A) Gửi kí tự ESC ( mã ASCII là 27) nếu không muốn tiếp tục gửi tin nhắn
nữa. Khi đó TE sẽ gửi trả về chuỗi <CR><LF>OK<CR><LF>.
(4) Chuỗi trả về thông báo quá trình gửi tin nhắn. Chuỗi trả về có định dạng
như sau:
<CR><LF>+CMGS :62<CR><LF>
20
<CR><LF>OK<CR><LF>.
Trong đó 62 là một số tham chiếu cho tin nhắn đã được gửi. Sau mỗi tin nhắn
được gửi đi, giá trị của tham chiếu này sẽ tăng lên 1 đơn vị. Số tham chiếu này có giá
trị nằm trong khoảng từ 0 đến 255.
Thời gian gửi một tin nhắn vào khoảng 3-4 giây (kiểm tra với mạng
Mobiphone).
(4A) Nếu tình trạng sóng không cho phép thực hiên việc gửi tin nhắn ( thử
bằng cách tháo antenna), hoặc chức năng RF của modem không được cho phép hoạt
động ( do sử dụng các lệnh AT+CFUN=0 hoặc AT+CFUN=4), hoặc số tin nhắn
trong hàng đợi phía tổng đài vượt qua giới hạn cho phép, hoặc bộ nhớ chứa tin nhắn
21
của MT nhận được tin nhắn bị tràn, MT sẽ gửi thông báo lỗi về và có định dạng như
sau:
<CR><LF>+CMS ERROR:193<CR><LF>
<CR><LF>+CMS ERROR:515<CR><LF>
Chức năng truyền nhận tin nhắn và chức năng thoại được tách biệt. Khi đang
thông thoại vẫn có thể truyền nhận được tin nhắn. Khi truyền nhận tin nhắn vẫn có
thể tiến hành thiết lập và kết thúc cuộc gọi.
Ngoài ra còn có các lệnh khác cho GPRS, các tập lệnh khởi tạo kiểm
tra…chúng ta có thể tra datasheet của SIM 900 để biết nhiều thêm các lệnh nếu cần.
Trong khuôn khổ đồ án em chỉ đưa ra một số tập lệnh cơ bản phục vụ cho công việc
của mình.
22
8/16 bit CPU, xây dựng theo kiến truc Harvard có sửa đổi
Flash và ROM có thể tuỳ chọn từ 256 byte đến 256 Kbyte
Các cổng Xuất/ Nhập (I/ O ports) (mức logic thường từ 0V đến
5.5V, ứng với logic 0 và logic 1)
8/16 bit Timer
23
Có thể lập trình ngõ ra vào đến từ những ngõ vào của PIC và
trên điện áp bên trong.
Những ngõ ra của bộ so sánh có thể sử dụng cho bên ngoài.
Tất cả các PIC16/17 đều có cấu trúc RISC. PIC16CXX các đặc tính nổi bậc, 8
mức ngăn xếp Stack, nhiều nguồn ngắt tích hợp bên trong lẫn ngoài. Có cấu trúc
Havard với các bus dữ liệu và bus thực thi chương trình riêng biệt nhau cho phép độ
dài 1 lệnh là 14-bit và bus dữ liệu 8-bit cách biệt nhau. Tất cả các lệnh đều mất 1 chu
kỳ lệnh ngoại trừ các lệnh rẽ nhánh chương trình mất 2 chu kỳ lệnh. Chỉ có 35 lệnh
và 1 lượng lớn các thanh ghi cho phép đáp ứng cao trong ứng dụng.
26
Họ PIC16F8X có nhiều tính năng đặc biệt làm giảm thiểu các thiết bị ngoại vi,
vì vậy kinh tế cao, có hệ thống nổi bật đáng tin cậy và sự tiêu thụ năng lượng thấp. Ở
đây có 4 sự lựa chọn bộ dao dộng và chỉ có 1 chân kết nối bộ dao động RC nên có
giải pháp tiết kiệm cao. Chế độ SLEEP tiết kiệm nguồn và có thể được đánh thức bởi
các nguồn reset.
PIC16F877A có 40/44 chân với sự phân chia cấu trúc như sau :
Có 5 port xuất/nhập
Có 8 kênh chuyển đổi A/D 10-bit
Có bộ nhớ gấp đôi so với PIC16F873A và PIC16F874A
- Các đặc điểm của PIC16F887A :
Tần số hoạt động DC-20MHz
Reset và Delay POR, BOR (PWRT, OST)
Bộ nhớ chương trình Flash 8K
(14-bit word)
Bộ nhớ dữ liệu (byte) 368
Bộ nhớ dữ liệu EEPROM 256
(byte)
Các ngắt 15
Các Port xuất/nhập Port A, B, C, D, E
Timer 3
Module 2
Capture/Compare/PWM
Giao tiếp nối tiếp MSSP, USART
Giao tiếp song song PSP
Module A/D 10-bit 8 kênh ngõ vào
Bộ so sánh tương tự 2
Tập lệnh 35 lệnh
Số chân 40 chân PDIP
44 chân PLCC
44 chân TQFP
44 chân QFN
27
- OSC1 : ngõ vào dao động thạch anh hoặc xung clock bên ngoài.
Ngõ vào Schmit trigger khi được cấu tạo ở chế độ RC ; một cách
khác của CMOS.
- CLKI : ngõ vào nguồn xung bên ngoài. Luôn được kết hợp với
chức năng OSC1.
Chân OSC2/CLKO (13) : ngõ vào dao động thạch anh hoặc xung clock.
- OSC2 : Ngõ ra dao động thạch anh. Kết nối đến thạch anh hoặc
bộ cộng hưởng.
- CLKO : ở chế độ RC, ngõ ra của OSC2, bằng tần số của OSC1
và chỉ ra tốc độ của chu kỳ lệnh.
Chân /VPP (1) :
- MCLR : Hoạt động Reset ở mức thấp
- VPP : ngõ vào áp lập trình
Chân RA0/AN0 (2) :
- RA0 : xuất/nhập số
- AN0 : ngõ vào tương tự 0
Chân RA1/NA1 (3) :
- RA1 : xuất/nhập số
- AN1 : ngõ vào tương tự 1
Chân RA2/NA2/VREF-/CVREF (4) :
- RA2 : xuất/nhập số
- AN2 : ngõ vào tương tự 2
- VREF -: ngõ vào điện áp chuẩn (thấp) của bộ A/D
- CVREF: điện áp tham chiếu VREF ngõ ra bộ so sánh
Chân RA3/NA3/VREF+ (5) :
- RA3 : xuất/nhập số
- AN3 : ngõ vào tương tự 3
- VREF+ : ngõ vào điện áp chuẩn (cao) của bộ A/D
Chân RA4/TOCKI/C1OUT (6) :
29
năng của từng chân xuất nhập trong mỗi cổng hoàn toàn có thể được xác lập và điều
khiển được thông qua các thanh ghi SFR liên quan đến chân xuất nhập đó.
Vi điều khiển PIC16F877A có 5 cổng xuất nhập, bao gồm PORTA, PORTB,
PORTC, PORTD và PORTE.
PORTA
PORTA (RPA) bao gồm 6 I/O pin. Đây là các chân “hai chiều” (bidirectional
pin), nghĩa là có thể xuất và nhập được. Chức năng I/O này được điều khiển bởi
thanh ghi TRIS A (địa chỉ 85h). Muốn xác lập chức năng của một chân trong PORTA
là input, ta “set” bit điều khiển tương ứng với chân đó trong thanh ghi TRISA và
ngược lại, muốn xác lập chức năng của một chân trong PORTA là output, ta “clear”
bit điều khiển tương ứng với chân đó trong thanh ghi TRISA. Thao tác này hoàn toàn
tương tự đối với các PORT và các thanh ghi điều khiên tương ứng TRIS (đối với
PORTA là TRISA, đổi với PORTB là TRISB, đối với PORTC là TRISC, đối với
PORTD là TRISD và đối với PORTE là TRISE).
Bên cạnh đó PORTA còn là ngõ ra của bộ ADC, bộ so sánh, ngõ vào analog
ngõ vào xung clock của TimerO và ngõ vào của bộ giao tiếp MSSP (Master
Synchronous Serial Port).
Các thanh ghi SFR liên quan đến PORTA bao gồm :
PORTA (địa chỉ 05h): chứa giá trị các pin trong PORTA.
TRIS A (địa chỉ 85h): chứa giá trị các pin trong PORTA.
CMCON (địa chỉ 9Ch) : thanh ghi điều khiển bộ so sánh.
CVRCON (địa chỉ 9Dh) : thanh ghi điều khiển bộ so sánh điện áp.
ADCON1 (địa chỉ 9Fh) : thanh ghi điều khiển bộ ADC.
PORTB
PORTB (RPB) gồm 8 pin I/O. Thanh ghi điều khiến xuất nhập tương ứng là
TRISB. Bên cạnh đó một sổ chân của PORTB còn được sử dụng trong quá trình nạp
chương trình cho vi điều khiển với các chế độ nạp khác nhau. PORTB còn liên quan
đến ngắt ngoại vi và bộ TimerO. PORTB còn được tích hợp chức năng điện trở kéo
lên được điều khiển bởi chương trình.
35
Các thanh ghi SFR liên quan đến PORTB bao gồm :
PORTB (địa chỉ 06h,106h) : chứa giá trị các pin trong PORTB
TRISB (địa chỉ 86h,186h) : điều khiển xuất nhập
OPTION_REG (địa chỉ 81 h, 181 h) : điều khiển ngắt ngoại vi và bộ
TimerO.
PORTC
PORTC (RPC) gồm 8 pin I/O. Thanh ghi điều khiển xuất nhập tương ứng là
TRISC. Bên cạnh đó PORTC còn chứa các chân chức năng của bộ so sánh, bộ Timerl,
bộ PWM và các chuẩn giao tiếp nối tiếp I2C, SPI, SSP, USART.
Các thanh ghi điều khiển liên quan đến PORTC :
PORTC (địa chỉ 07h) : chứa giá trị các pin trong PORTC
TRISC (địa chỉ 87h) : điều khiển xuất nhập.
PORTD
PORTD (RPD) gồm 8 chân I/O, thanh ghi điều khiển xuất nhập tương ứng là
TRISD. PORTD còn là cổng xuất dừ liệu của chuẩn giao tiếp PSP (Parallel Slave
Port).
Các thanh ghi liên quan đến PORTD bao gồm :
Thanh ghi PORTD : chứa giá trị các pin trong PORTD.
Thanh ghi TRISD : điều khiển xuất nhập.
PORTE
PORTE (RPE) gồm 3 chân I/O. Thanh ghi điều khiển xuất nhập tương ứng là
TRISE. Các chân của PORTE có ngõ vào analog. Bên cạnh đó PORTE còn là các
chân điều khiên của chuấn giao tiếp PSP.
Các thanh ghi liên quan đến PORTE bao gồm :
PORTE : chứa giá trị các chân trong PORTE.
TRISE : điều khiên xuất nhập và xác lập các thông số cho chuẩn giao
tiếp PSP.
ADCON1 : thanh ghi điều khiển khối ADC.
36
Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ flash, dung
lượng bộ nhớ 8K word (1 word = 14 bit) và được phân thành nhiều trang (từ page0
đến page3). Như vậy bộ nhớ chương trình có khả năng chứa được 8*1024 = 8192
lệnh (vì một lệnh sau khi mã hóa sẽ có dung lượng 1 word (14 bit). Để mã hóa được
địa chỉ của 8K word bộ nhớ chương trình, bộ đếm chương trình có dung lượng 13 bit
(PC<12:0>).
Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h
(Reset vector). Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h
(Interrupt vector).
Bộ nhớ dữ liệu :
Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được chia ra làm nhiều bank. Đối
với PIC16F877A bộ nhớ dữ liệu được chia ra làm 4 bank. Mỗi bank có dung lượng
128 byte, bao gồm các thanh ghi có chức năng đặc biệt SFG (Special Function
Register) nằm ở các vùng địa chỉ thấp và các thanh ghi mục đích chung GPR (General
Purpose Register) nằm ở vùng địa chỉ còn lại trong bank. Các thanh ghi SFR thường
xuyên được sử dụng (ví dụ như thanh ghi STATUS) sẽ được đặt ở tất cả các bank của
bộ nhớ dữ liệu giúp thuận tiện trong quá trình truy xuất và làm giảm bớt lệnh của
chương trình.
2.3.6 Thanh ghi chức năng đặc biệt SFR:
Đây là các thanh ghi được sử dụng bởi CPU hoặc được dùng để thiết lập và
điều khiển các khối chức năng được tích hợp bên trong vi điều khiển. Có thể phân
thanh ghi SFR làm hai lọai: thanh ghi SFR liên quan đến các chức năng bên trong
(CPU) và thanh ghi SRF dùng để thiết lập và điều khiển các khối chức năng bên ngoài
(ví dụ như ADC, PWM, …).
+ Thanh ghi STATUS (03h, 83h, 103h, 183h): thanh ghi chứa kết quả thực hiện
phép toán của khối ALU, trạng thái reset và các bit chọn bank cần truy xuất
trong bộ nhớ dữ liệu. Thanh ghi OPTION_REG (81h, 181h): thanh ghi này
cho phép đọc và ghi, cho phép điều khiển chức năng pull-up của các chân
38
trong PORTB, xác lập các tham số về xung tác động, cạnh tác động của ngắt
ngoại vi và bộ đếm Timer0.
+ Thanh ghi INTCON (0Bh, 8Bh,10Bh, 18Bh): thanh ghi cho phép đọc và ghi,
chứa các bit điều khiển và các bit cờ hiệu khi timer0 bị tràn, ngắt ngoại vi
RB0/INT và ngắt interrput-on-change tại các chân của PORTB.
+ Thanh ghi PIE1 (8Ch): chứa các bit điều khiển chi tiết các ngắt của các khối
chức năng ngoại vi.
+ Thanh ghi PIR1 (0Ch) chứa cờ ngắt của các khối chức năng ngoại vi, các ngắt
này được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE1.
+ Thanh ghi PIE2 (8Dh): chứa các bit điều khiển các ngắt của các khối chức
năng CCP2, SSP bus, ngắt của bộ so sánh và ngắt ghi vào bộ nhớ EEPROM.
+ Thanh ghi PIR2 (0Dh): chứa các cờ ngắt của các khối chức năng ngoại vi, các
ngắt này được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE2.
+ Thanh ghi PCON (8Eh): chứa các cờ hiệu cho biết trạng thái các chế độ reset
của vi điều khiển.
39
Power-on Reset POR: Reset khi cấp nguồn hoạt động cho vi điều
khiển.
MCLR reset trong quá trình hoạt động.
MCLR từ chế độ Sleep.
WDT reset:reset do khối WDT tạo ra trong quá trình hoạt động.
WDT wake up từ chế độ Sleep.
Vi điều khiển có thể được “đánh thức” dưới tác động của một trong số các hiện
tượng sau:
Ngoài ra còn có một số nguồn tác động khác từ các chức năng ngoại vi bao gồm :
PIC16F877A có đến 15 nguồn tạo ra hoạt động ngắt được điều khiên bởi thanh
ghi INTCON (bit GIE). Bên cạnh đó mỗi ngắt còn có một bit điều khiển và cờ ngắt
riêng. Các cờ ngắt vẫn được set bình thường khi thỏa mãn điều kiện ngắt xảy ra bất
41
chấp trạng thái của bit GIE, tuy nhiên hoạt động ngắt vẫn phụ thuôc vào bit GIE và
các bit điều khiên khác. Bit điều khiển ngắt RBO/INT và TMRO nằm trong thanh ghi
INTCON, thanh ghi này còn chứa bit cho phép các ngắt ngoại vi PEIE. Bit điều khiển
các ngắt nằm trong thanh ghi PIE1 và PIE2. Cờ ngắt của các ngắt nằm trong thanh
ghi PIR1 và PIR2.
Trong một thời điểm chỉ có một chương trình ngắt được thực thi, chương trình
ngắt được kết thúc bàng lệnh RETFIE. Khi chương trình ngắt được thực thi, bit GIE
tự động được xóa, địa chỉ lệnh tiếp theo của chương trình chính được cất vào trong
bộ nhớ Stack và bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h. Lệnh RETFIE được
dùng để thoát khỏi chương trình ngắt và quay trở về chương trình chính, đồng thời
bit GIE cũng sẽ được set để cho phép các ngắt hoạt động trở lại. Các cờ hiệu được
dùng để kiêm tra ngắt nào đang xảy ra và phải được xóa bằng chương trình trước khi
cho phép ngắt tiếp tục hoạt động trở lại để ta có thể phát hiện được thời điểm tiếp
theo mà ngắt xảy ra.
Đối với các ngắt ngoại vi như ngắt từ chân INT hay ngắt từ sự thay đối trạng
thái các pin của PORTB (PORTB Interrupt on change), việc xác định ngắt nào xảy
ra cần 3 hoặc 4 chu kì lệnh tùy thuộc vào thời điểm xảy ra ngắt.
- Ngắt INT
Ngắt này dựa trên sự thay đổi trạng thái của pin RBO/INT. Cạnh tác động gây
ra ngắt có thể là cạnh lên hay cạnh xuống và được điều khiến bởi bit INTEDG (thanh
ghi OPTION_REG <6>). Khi có cạnh tác động thích hợp xuất hiện tại pin RBO/INT,
cờ ngắt ĨNTF được set bất chấp trạng thái các bit điều khiển GIE và PEIE. Ngắt này
có khả năng đánh thức vi điều khiển từ chế độ sleep nếu bit cho phép ngắt được set
trước khi lệnh SLEEP được thực thi.
- NGẮT DO SỤ THAY ĐỔI TRẠNG THÁI CÁC PIN TRONG PORTB
Các pin PORTB<7:4> được dùng cho ngắt này và được điều khiển bởi bit
RBIE (thanh ghi INTCON<4>). Cờ ngắt của ngắt này là bit RBIF (INTCC)N<0>).
2.4 Bộ chuyển đổi ADC trong PIC16F887A
42
ADC (Analog to Digital Converter) là bộ chuyển đồi tín hiệu giữa hai dạng
tương tự và số. PIC16F877A có 8 ngõ vào analog (RA4:RA0 và RE2:RE0). Hiệu
điện thế chuẩn VREF có thể được lựa chọn là VDD, Vss hay hiệu điện thế chuẩn được
xác lập trên hai chân RA2 và RA3. Kết quả chuyến đổi từ tín tiệu tương tự sang tín
hiệu số là 10 bit số tương ứng và được lưu trong hai thanh ghi ADRESH:ADRESL.
Khi không sử dụng bộ chuyển đổi ADC, các thanh ghi này có thể được sử dụng
như các thanh ghi thông thường khác. Khi quá trình chuyển đổi hoàn tất, kết quả sẽ
được lưu vào hai thanh ghi ADRESH:ADRESL, bit GO/DONE (ADCONO<2>)
được xóa về 0 và cờ ngắt ADIF được set.
- Quy trình chuyển đổi từ tương tự sang số bao gồm các bước sau :
1. Thiết lập các thông số cho bộ chuyển đổi ADC:
- Chọn ngõ vào analog, chọn điện áp mẫu (dựa trên các thông số của thanh
ghi ADCON1)
- Chọn kênh chuyển đổi A/D (thanh ghi ADCONO).
- Chọn xung clock cho kênh chuyển đổi A/D (thanh ghi ADCONO).
- Cho phép bộ chuyển đổi A/D hoạt động (thanh ghi ADCONO).
2. Thiết lập các cờ ngắt cho bộ A/D
- Clear bit ADIF.
- Set bit ADIE.
- Set bit PEIE.
- Set bit GIE.
3. Đợi cho tới khi quá trình lấy mẫu hoàn tất.
4. Bắt đầu quá trình chuyển đổi (set bit GO/DONE)
5. Đợi cho tới khi quá trình chuyển đổi hoàn tất bằng cách:
- Kiểm tra bit, nếu bit GO/DONE =0, quá trình chuyển đổi đã hoàn tất.
- Kiểm tra cờ ngắt.
6. Đọc kết quả chuyển đối và xóa cờ ngắt, set bit GO/DONE (nếu cần tiếp tục
chuyển đổi).
Tiếp tục thực hiện các bước 1 và 2 cho quá trình chuyền đổi tiếp theo.
43
Hình 2.4.2 Các cách lưu kêt quả chuyển đổi A/D
- Các thanh ghi liên quan đến bộ chuyển đổi ADC bao gồm:
- INTCON (địa chỉ OBh, 8Bh, lOBh, 18Bh): cho phép các ngắt (các bit
GIE,PEIE).
- PIR1 (địa chỉ OCh): chứa cờ ngắt A/D (bit ADIF).
- PIE1 (địa chỉ 8Ch): chứa bit điều khiển A/D (ADIE)
44
- ADRESH (địa chỉ lEh) và ADRESL (địa chỉ 9Eh): các thanh ghi chứa
kết quả chuyển đổi A/D.
- ADCONO (địa chỉ lFh) và ADCON1 (địa chỉ 9Fh): xác lập các thông
số cho bộ chuyển đổi A/D.
- PORTA (địa chỉ 05h) và TRISA (địa chỉ 85h): liên quan đến các ngõ
vào analog ở PORTA.
- PORTE (địa chỉ 09h) và TRISE (địa chỉ 89h): liên quan đến các ngõ
vào analog ở PORTE.
45
Khối nguồn là một trong những yếu tố quan trọng của một mạch điện, là một
trong những yếu tố quyết định giúp mạch hoạt động ổn định và an toàn. Trong mạch
em sử dụng 2 nguồn để cung cấp điện áp : 5V và 3V8. Nguồn chính được cấp từ
adapter 12V 4A. Lý do em sử dụng dòng 4A là vì chỉ riêng module sim900 khi hoạt
động đã cần dòng > 2A, ngoài ra còn có các mạch khác sử dụng để hoạt động. Vì đặc
tính của dòng là xài bao nhiêu lấy bấy nhiêu nên mức ampe cao cũng không ảnh
hưởng đến mạch. Vì vậy việc chọn dòng có ampe càng cao càng tốt.
Do module sim và vi điều khiển đều hoạt động ở mức điện áp dưới 5v nên em
đã sử dụng mạch nguồn dùng ic LM2576 để định áp đầu ra cho phù hợp với điện áp
hoạt động của 2 module này. Nguồn 5v dùng ic ổn áp 7805 cung cấp điện áp cho các
linh kiện khác hoạt động ở mức điện áp 5v.
3.4 Nguyên lý hoạt động
Sơ đồ nguyên lý toàn mạch :
RO1
1K
RL1
LO1 4
3
5
1
OUT8 2
12V
MOTOR
1
U2 RO2 2
1K
1 CON2
1 5V
12V
LO2 RL2
2
3
4
R_RS1 3
2
3
ANT 5
10K 1
3V3 R_RS2 470 OUT7 2
RST
STATUS
NETLIGHT
C_RS1 12V
LCD 20x4
10uF
68
67
66
65
64
63
62
61
60
59
58
57
56
55
54
53
52
LCD 16x2 3V3 RO3
GND
GND
GND
GND
GND
GND
GND
GND
GND
VBAT
VBAT
VBAT
3V3 1K
VSS
VDD
VEE
RS
RW
E
D0
D1
D2
D3
D4
D5
D6
D7
A
K
GPIO12
GPIO11
STATUS
RF_ANT
R_LM35 1K LM35 JNAP RN1
NETLIGHT
JDK1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PWRKEY 1 51 ADC 2 1
2 PWRKEY GPIO10/KBC0 50 3V3 RST 1 DK1 2 RL3 2
3 PWRKEY_OUT GPIO9/KBC1 49 VDD 2 DK2 3 LO3 4 1
DTR GPIO8/KBC2 VSS DK3
DB4
DB5
DB6
DB7
4 48 C_LM351 C_LM352 3 4 3
RS
EN
RI GPIO7/KBC3
3
5 47 PGD 4 DK4 5 5
6 DCD GPIO6/KBC4 46 10uF 104 PGC 5 DK5 6 1 CON2
7 DSR GND 45 DK6 7 OUT6 2
5V CTS GND DK7
5V 8 M1 44 8
R18 RXD 9 RST GPIO5/KBR0 43 3V3 DK8 9 12V
11
32
TXD 10 TXD MODULE SIM900A GPIO4/KBR1 42 U1
RV ADJ 10K 10K 11 RXD GPIO3/KBR2 41 RST 1 40 PGD
12 DISP_CLK GPIO2/KBR3 40 ADC 2 MCLR/VPP RB7/PGD 39 PGC 10K
VDD
VDD
13 DISP_DATA GPIO1/KBR4 39 3 RA0/AN0 RB6/PGC 38 RS
14 DISP_D/C GND 38 VREF 4 RA1/AN1 RB5 37 EN RO4
15 DISP_CS SCL 37 5 RA2/AN2/VREF-/CVREF RB4 36 DB4
16 VDD_EXT SDA 36 6 RA3/AN3/VREF+ RB3/PGM 35 DB5 1K
17 NRESET PWM2 35 7 RA4/T0CKI/C1OUT RB2 34 DB6 U5
GND PWM1 10K CV1 CV2 8 RA5/AN4/SS/C2OUT RB1 33 DB7
9 RE0/RD/AN5 RB0/INT DK1 1 18 OUT1 JDK2
104 10uF IN2 10 RE1/WR/AN6 DK2 2 IN1 OUT1 17 OUT2 RL4 2
CX1 22 13 RE2/CS/AN7 30 COI DK3 3 IN2 OUT2 16 OUT3 LO4 4 1
OSC1/CLKI RD7/PSP7 29 DK4 4 IN3 OUT3 15 OUT4 3
GND
MIC_P
MIC_N
SPK_P
SPK_N
LINEIN_R
LINEIN_L
ADC
VRTC
DBG_TXD
DBG_RXD
GND
SIM_VDD
SIM_DATA
SIM_CLK
SIM_RST
SIM_PRESENCE
Y1 RD6/PSP6 28 DK5 5 IN4 OUT4 14 OUT5 5
20Mhz RD5/PSP5 27 PWSIM DK6 6 IN5 OUT5 13 OUT6 1 CON2
RD4/PSP4 IN6 OUT6
18
19
20
21
22
23
24
25
26
27
28
29
33
34
CX2 22 14 26 RXD DK7 7 12 OUT7 OUT5 2
CK1 15 OSC2/CLKO RC7/RX/DT 25 TXD DK8 8 IN7 OUT7 11 OUT8
IN1 16 RC0/T1OSO/T1CKI RC6/TX/CK 24 DK1 IN8 OUT8
DK8 17 RC1/T1OSI/CCP2 RC5/SDO 23 DK2 10 12V
GND
SIM_VDD 30
SIM_CLK 32
19 21
SIM_DATA 31
SIM_RST
RD0/PSP0 RD2/PSP2
9
DK5 20 ULN2803
VSS
VSS
RD1/PSP1
RO5
12
31
16F877A
1K
JDK3
VSS
RL5 2
LO5 4 1
49
C1 3
5
220nF 1 CON2
SIM_VDD U3 OUT4 2
1 12V
R10 22 2 SIM_VDD
SIM_RST 3 SIM_RST 3V3 3V3 12V
4 SIM_CLK
GND COI
R11 22 5
SIM_CLK 6 VPP
SIM_DATA DCOI
R12 22 SIM CARD D1 D2 RO6
SIM_DATA 3V3
LED LED 1K
5V 5V 5V
COI Q1
C945 5V RA1 JDK4
R6 R9 R_COI1 4K7 RL6 2
12V RA6 RA5 2K2 LO6 4 1
7805 220 220 RA7 3
U8A CK1 5
8
GND
PWRKEY NETLIGHT STATUS +
Q2 Q3 1 QA
CN4 CN5 2 C945 12V
-
2
R1 4K7 C945 C945
2200uF 104 5V 3V3 PWSIM Q1 R5 R8 RA2
VSS
C945 47K 47K DA1 3K3
R2 RO7
RLN1 RLN2 LED LED 100K
U4 47K 1K
3V3 330 330
1 4
V_IN FB JDK5
CN1 L1 RL7 2
J1 5 R15 4K7 D5 D6 LO7 4 1
1 2200uF ON/OFF 2 CN2 CN3 3
GND
2 OUT 5
100uH R17 2200uF 104 1 CON2
3
LM2576 OUT2 2
CON2 R16 220 2K2
12V
RO8
1K
JDK6
RL8 2
LO8 4 1
3
5
1 CON2
OUT1 2
3V3
RM1 RM2
10K 10K
JMOTOR
IN1 3
IN2 2
1
CON3
50
- Nguyên lý hoạt động truyền nhận tin nhắn và điều khiển thiết bị như
sau :
Ví dụ : bật đèn phòng khách.
Dùng điện thoại nhắn tin đến số điện thoại trong module sim với cú pháp
#123456denpkbat. Thì module sim sẽ nhận được chuỗi kí tự tin #123456denpkbat.
Khi nhận được tin nhắn mới thì modue sim sẽ gửi ngay đến vi điều khiển thông qua
kết nối UART. Tại đây vi điều khiển tiến hành phân tích gói tin mà module sim gửi
đến. Cụ thể như sau :
1. Trước tiên vi điều khiển lưu tất các các kí tự vào mãng để so sánh (các kí tự
được lưu bắt đầu bằng # và kết thúc bằng ). Do đó nếu cú pháp tin nhắn không
có dấu # và dấu . thì vi điều khiển sẽ không thực hiện lệnh.
2. Sau khi lưu các kí tự vào mãng, vi điều khiển lấy 6 kí tự mật mã để so sánh,
nếu đúng mật khẩu sẽ là điều kiện cần để thực hiện lệnh.
3. Sau đó vi điều khiển so sánh cấu trúc lệnh ( char tb1_on[] = "denpkbat"; ).
Để điều khiển cho đúng thiết bị, vi điều khiển so sánh toàn bộ chuỗi kí tự được
gửi đến, chuỗi kí tự này ứng với cấu trúc lệnh nào thì lệnh đó sẽ được thực
hiện. Cụ thể ở đây chuỗi kí tự "denpkbat" ứng với cấu trúc lệnh “tb1_on” nên
vi điều khiển sẽ kích relay bật đèn.
4. Khi đã điều khiển xong thiết bị, vi điều khiển gửi kí tự trả lời (kí tự lưu sẵn
trong các case do người lập trình cài đặt) đến điện thoại thông qua module sim
bằng kết nối UART.
Các thao tác điều khiển các thiết bị khác cũng tương tự như trên.
51
.......... Sau khi lắp linh kiện lên mạch và hàn chân lên bo đồng thì được bo mạch
điều khiển như hình :
54
Để thực hiện được các chức năng nêu trên, em đã tìm hiểu, nghiên cứu các vấn
đề có liên quan tới đề tài như : PIC16F887A, Module SIM 900, các ngôn ngữ lập
trình tương ứng như C, bộ lệnh AT Command dành cho Module sim900, và các vấn
đề khác liên quan tới đề tài.
Cuối cùng, theo nhận định chủ quan của em thì đồ án đã được hoàn thành đúng
thời gian, đạt được mục tiêu đề ra và đã trình bày khá đầy đủ các mảng kiến thức, các
vấn đề liên qua tới đề tài.
5.2 Hướng phát triển đề tài
Mục tiêu đề ra dù đã được hoàn thành nhưng chỉ là một phần khía cạnh trong
tiêu chuẩn của nhà thông minh. Vì vậy, để đề tài này thêm phong phú, mang nhiều
tính thực tế, ứng dụng cao hơn thì cần đưa thêm vào những yêu cầu như sau :
Ngoài việc điều khiển giám sát bằng tin nhắn SMS, người dùng có thể
điều khiển – giám sát ngôi nhà thông qua mạng LAN.
Sử dụng thêm nhiều loại cảm biến khác phục vụ nhu cầu của con người
như : cảm biến độ ẩm, cảm biến chuyển động, cảm biến âm thanh, v.v...
Mở rộng điều khiển được nhiều hơn nữa các thiết bị trong nhà.
Đề tài không những chỉ áp dụng cho với ngôi nhà mà nên được mở rộng
áp dụng cho các thiết bị sử dụng nơi công cộng, trung tâm thương mại,
cao ốc, văn phòng, v.v...
Hy vọng với những hướng phát triển nêu trên cùng với những ý tưởng khác
của người đọc, thế hệ đàn em đi sau sẽ phát triển hơn nữa về nội dung đề tài, làm cho
đề tài trở nên phong phú hơn, mang tính ứng dụng cao hơn vào trong thực tế, phục
vụ cho những lợi ích của con người và xã hội trong tương lai.
5.3 Tài liệu tham khảo
[1] Kỹ thuật lập trình C – GS Phạm Văn Ất.
[2] Giáo trình vi điều khiển PIC tại trang http://www.thuvienmienphi.com
Ngoài ra, nguồn tài liệu trên mạng cũng rất phong phú, các trang web hỗ trợ
em về kiến thức và datasheet linh kiện mà em sử dụng trong đồ án :
[3] http://www.alldatasheet.com
59
[4] http://www.dientuvietnam.net
[5] https://www.google.com.vn
[6] http://www.simcom.us
[7] http://at-sky.com.vn/nghien-cuu/gsmgprs-gps/32-dieu-khien-thiet-bi-su-
dung-module-sim900-p2-tiep-theo.html
[8] http://at-sky.com.vn/.UfnRAazebBM
60
Về phần mềm em dùng ngôn ngữ lập trình là C, trình biên dịch CCS
Complier, nạp chương trình bằng Pickit2. Code đã được em chú thích tương đối rõ
ràng và chi tiết.
Nội dung phần mềm
#define buffer_size 80
unsigned buffer[buffer_size];
unsigned int8 c = 0, c1 = 0, counter_buffer = 0;
int1 sms_mode = false;
char *ptr1 = 0;
char *ptr2 = 0;
void read_sms(char index);
void send_sms(unsigned int8 n);
void doc_nhiet_do();
unsigned int8 nhiet_do = 0,pre_nhiet_do = 0;
void check_cam_bien();
int1 bit_cam_bien = 0;
int1 bit_cam_bien_gas = 0;
#define nhiet_do_max 50
char data[15];
char data_len;
void init();
int1 get_ok(void);
void erase_buffer();
char sdt[15];
char number;
char st_sms = 0xff;
void main(){
init();
while(TRUE)
{
read_sms(1); //Đọc tin nhắn
if(st_sms != 0xff){
63
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk2,0);
s_dk2 = 0;
st_sms = 4;
};
};
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk4,1);
s_dk4 = 1;
st_sms = 7;
}
else{
strcpy(data,"dennbtat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk4,0);
s_dk4 = 0;
st_sms = 8;
};
};
// Thiết bị 5 (đèn toilet)
strcpy(data,"dentlbat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk5,1);
s_dk5 = 1;
st_sms = 9;
}
else{
strcpy(data,"dentltat");
data_len = strlen(data);
67
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk5,0);
s_dk5 = 0;
st_sms = 10;
};
};
// Thiết bị 6 (quạt phòng khách)
strcpy(data,"quatpkbat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk6,1);
s_dk6 = 1;
st_sms = 11;
}
else{
strcpy(data,"quatpktat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk6,0);
s_dk6 = 0;
st_sms = 12;
};
};
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk7,1);
s_dk7 = 1;
st_sms = 13;
}
else{
strcpy(data,"quatn1tat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk7,0);
s_dk7 = 0;
st_sms = 14;
};
};
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk8,0);
s_dk8 = 0;
st_sms = 16;
};
};
// Điều khiển đóng mở cửa
strcpy(data,"mocua");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_cuadong,0);
output_bit(pin_cuamo,1);
s_cua = 1;
st_sms = 17;
}
else{
strcpy(data,"dongcua");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_cuamo,0);
output_bit(pin_cuadong,1);
s_cua = 0;
st_sms = 18;
};
};
70
};
write_eeprom(20,number); //Ghi độ dài của số điện thoại
st_sms = 20;
};
};
};
};
sms_mode = false;
erase_buffer(); //Xóa bộ đệm
printf("AT+CMGD=%d\r\n",index); //Xóa tin nhắn
delay_ms(100);
output_bit(pin_coi,0);
delay_ms(1000);
}
// Chống trộm
void check_cam_bien() //Kiem tra cam bien hong ngoai
{
if(input(cam_bien) == 1){ //Nếu cảm biến = 1 (có trộm)
delay_ms(10);
if((input(cam_bien) == 1) && (bit_cam_bien == 0)){ //Nếu có trộm và chưa
báo động sẽ báo động
bit_cam_bien = 1; //Bit ghi nhớ đã báo động
output_bit(pin_coi,1); //Báo còi ( chuông )
send_sms(22); //Gửi tin nhắn báo động về sdt
};
}
else{
bit_cam_bien = 0; //Xóa bít ghi nhớ báo động để báo động lần kế tiếp
72
lcd_gotoxy(1,2);
printf(lcd_putc," Nhiet do:%3u%cC",nhiet_do,0xdf); //Hiển thị ra LCD
if((nhiet_do >= nhiet_do_max) && (pre_nhiet_do < nhiet_do_max)){//Nếu quá 50
độ C báo động
send_sms(21);
};
}
// Tắt hết ngõ ra
void init(){
unsigned int8 i;
output_bit(pin_dk1,0);
output_bit(pin_dk2,0);
output_bit(pin_dk3,0);
output_bit(pin_dk4,0);
output_bit(pin_dk5,0);
output_bit(pin_dk6,0);
output_bit(pin_cuamo,0);
output_bit(pin_cuadong,1);
// Khởi tạo ADC
SETUP_ADC(ADC_CLOCK_DIV_32);
SETUP_ADC_PORTS(sAN0 | VSS_VREF);
SET_ADC_CHANNEL(0);
lcd_init(); //Khởi tạo LCD
ENABLE_INTERRUPTS(INT_RDA); //Cho phép ngắt
ENABLE_INTERRUPTS(GLOBAL);
erase_buffer(); //Xóa bộ đệm
delay_ms(200);
printf("AT\r"); //Test modul sim
delay_ms(200);
74
sdt[i] = 0;
}
number = read_eeprom(20); //Đọc số điện thoại
if(number < 15){
for(i = 0; i < number; i ++){
sdt[i] = read_eeprom(i);
};
};
}
int1 get_ok(void){
char *ptr; char string_s1[]="OK";
ptr = strstr(buffer,string_s1);
if(strncmp(ptr,string_s1,2) == 0){
return 1;
}
else{
return 0;
}
}
void erase_buffer(){
unsigned int8 i;
for(i = 0; i < buffer_size; i ++){
buffer[i] = 0x00;
};
counter_buffer = 0;
}
76
case 7:
printf("Den nha bep da bat!");
break;
case 8:
printf("Den nha bep da tat!");
break;
case 9:
printf("Den toilet da bat!");
break;
case 10:
printf("Den toilet da tat!");
break;
case 11:
printf("Quat phong khach da bat!");
break;
case 12:
printf("Quat phong khach da tat!");
break;
case 13:
printf("Quat phong ngu 1 da bat!");
break;
case 14:
printf("Quat phong ngu 1 da tat!");
break;
case 15:
printf("Quat phong ngu 2 da bat!");
break;
case 16:
printf("Quat phong ngu 2 da tat!");
78
break;
case 17:
printf("Cua da mo!");
break;
case 18:
printf("Cua da dong!");
break;
case 19:
if(s_dk1 == 1) printf("Den pk bat!\r");
else printf("Den pk tat!\r");
if(s_dk2 == 1) printf("Den pn1 bat!\r");
else printf("Den pn1 tat!\r");
if(s_dk3 == 1) printf("Den pn2 bat!\r");
else printf("Den pn2 tat!\r");
if(s_dk4 == 1) printf("Den nb bat!\r");
else printf("Den nb tat!\r");
if(s_dk5 == 1) printf("Den toilet bat!\r");
else printf("Den toilet tat!\r");
if(s_dk6 == 1) printf("Quat pk bat!\r");
else printf("Quat pk tat!\r");
if(s_dk7 == 1) printf("Quat pn1 bat!\r");
else printf("Quat pn1 tat!\r");
if(s_dk8 == 1) printf("Quat pn2 da bat!\r");
else printf("Quat pn2 tat!\r");
if(s_cua == 1) printf("Cua dang mo!\r");
else printf("Cua dang dong!\r");
printf("Nhiet do: %u do C\r",nhiet_do);
break;
case 20:
79