3. Nội dung các phần thuyết minh:
7.2. Hướng phát triển đề tài
Do thời gian thực hiện đề tài có hạn và lượng kiến thức cá nhân mỗi thành viên của nhóm là nhất định nên đề tài thực hiện xong chỉ đáp ứng được một phần nhỏ của một hệ thống hoàn chỉnh. Vì vậy, để đề tài này thêm phong phú hơn, mang nhiều tính thực tế hơn nữa, có khả năng ứng dụng cao hơn thì đề tài cần đưa thêm vào những yêu cầu như sau:
Ngoài việc giám sát trên máy tính, ta cũng có thể điều khiển Camera để chụp hình rồi sau đó gửi tin nhắn đa phương tiện đến điện thoại. Lúc này ta cần kết nối 1 Modem GSM thay thế cho việc kết nối điện thoại trong đề tài vì những ưu điểm của nó.
Ngoài việc điều khiển các thiết bị trong nhà và thiết bị dân dụng, ta còn có thể sử dụng tin nhắn SMS để truy cập vào cơ sở dữ liệu SQL của WinCC và điều khiển các máy móc công nghiệp thông qua phần mềm này. Lúc này ta cần xây dựng giao diện phần mềm kết nối với SQL của WinCC và lập trình cho WinCC lấy cơ sở dữ liệu đó để thực hiện các yêu cầu.
Sử dụng thêm nhiều loại cảm biến khác kết hợp với cảm biến nhiệt độ, chẳng hạn như cảm biến độ ẩm không khí,… và tất cả các thông số này nên được hiển thị trên cùng một giao diện phần mềm. Như thế người dùng có thể hình dung ra được toàn bộ không gian trong ngồi nhà.
Mở rộng điều khiển được nhiều hơn nữa các thiết bị trong nhà.
Phần cứng cho mỗi module cần được tách rời nhằm dễ dàng cho việc chỉnh sửa, thay đổi.
Đề tài không những chỉ áp dụng cho với các tòa nhà mà nên được mở rộng áp
dụng đối với điều khiển các thiết bị sử dụng nơi công cộng.
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 các đồng nghiệp, của người đọc- những người đi sau - sẽ phát triển hơn nữa đề tài này, khắc phục những hạn chế, tồn tại của đề 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ế cuộc sống, phục vụ cho những lợi ích của con người trong tương lai.
PHẦN C
I. PHẦN MỀM VB.NET 1. GIỚI THIỆU
Ngôn ngữ BASIC (Beginner's All Purpose Symbolic Instruction Code) đã có từ năm 1964. BASIC rất dễ học và dễ dùng. Trong vòng 15 năm đầu, có rất nhiều chuyên gia tin học và công ty tạo các chương trình thông dịch (Interpreters) và biên dịch (Compilers) cho ngôn ngữ làm BASIC trở nên rất phổ thông. Năm 1975, Microsoft tung ra thị trường sản phẩm đầu tay Microsoft BASIC và tiếp đó Quick BASIC (còn gọi là QBASIC) và đã thành công rực rỡ.
Quick BASIC phát triển trong nền Windows nhưng vẫn khó khăn khi tạo giao diện kiểu Windows. Sau đó nhiều năm, Microsoft bắt đầu tung ra 1 sản phẩm mới cho phép ta kết hợp ngôn ngữ dễ học BASIC và môi trường phát triển lập trình với giao diện bằng hình ảnh (Graphic User Interface - GUI) trong Windows. Đó là Visual Basic Version 1.0.
Sự chào đời của Visual Basic Version 1.0 vào năm 1991 thật sự thay đổi bộ mặt lập trình trong Công Nghệ Tin Học. Trước đó, ta không có 1 giao diện bằng hình ảnh (GUI) với một IDE (Integrated Development Environment) giúp các chuyên gia lập trình tập trung công sức và thì gìờ vào các khó khăn liên hệ đến doanh nghiệp của mình. Mỗi người phải tự thiết kế giao diện qua thư viện có sẵn Windows API (Phương pháp Aplication Programming Interface) trong nền Windows. Điều này tạo ra những trở ngại không cần thiết làm phức tạp việc lập trình.
Visual Basic giúp ta bỏ qua những hệ lụy đó, chuyên gia lập trình có thể tự vẽ cho mình giao diện cần thiết trong ứng dụng ( Phương pháp Aplication) 1 cách dễ dàng và như vậy, tập trung nổ lực giải đáp các vần đề cần giải quyết trong doanh nghiệp hay kỹ thuật.
Ngoài ra, còn nhiều công ty phụ phát triển thêm các khuôn mẫu (modules), công cụ (tools, controls) hay ứng dụng (phương pháp Application) phụ giúp dưới hình thức VBX cộng thêm vào giao diện chính càng lúc càng thêm phong phú.
Khi Visual Basic phiên bản 3.0 được giới thiệu, thế giới lập trình lại thay đổi lần nữa. Kỳ này, ta có thể thiết kế các ứng dụng (aPhương pháplication) liên hệ đến Cơ Sở Dữ Liệu (Database) trực tiếp tác động (interact) đến người dùng qua DAO (Data Access Object). Ứng dụng này thường gọi là ứng dụng tiền diện (front-end phương pháp application) hay trực diện.
Phiên bản 4.0 và 5.0 mở rộng khả năng VB nhắm đến Hệ Điều Hành Windows 95. Phiên bản 6.0 đưa ra 1 phương pháp mới đối với Cơ Sở Dữ Liệu (Database) qua sự kết hợp của ADO (Active Data Object). ADO còn giúp các chuyên gia phát triển mạng nối với Cơ Sở Dữ Liệu (Database) khi dùng Active Server Pages (ASP).Visual Basic.NET (VB.NET) là ngôn ngữ lập trình khuynh hướng đối tượng (Object Oriented Programming Language) do Microsoft thiết kế lại từ con số không. Visual Basic.NET
(VB.NET) không kế thừa VB6 hay bổ sung, phát triển từ VB6 mà là một ngôn ngữ lập trình hoàn toàn mới trên nền Microsoft 's .NET Framework. Do đó, nó cũng không phải là VB phiên bản 7. Thật sự, đây là ngôn ngữ lập trình mới và rất mạnh, không những lập nền tảng vững chắc theo kiểu mẫu đối tượng như các ngôn ngữ lập trình hùng mạnh khác đã vang danh C++, Java mà còn dễ học, dễ phát triển và còn tạo mọi cơ hội hoàn hảo để giúp ta giải đáp những vấn đề khúc mắc khi lập trình. Hơn nữa, dù không khó khăn gì khi cần tham khảo, học hỏi hay đào sâu những gì xảy ra bên trong ... hậu trường Visual Basic.NET (VB.NET) giúp ta đối phó với các phức tạp khi lập trình trên nền Windows và do đó, ta chỉ tập trung công sức vào các vấn đề liên quan đến dự án, công việc hay doanh nghiệp mà thôi.
2. CÁC TẬP LỆNH SỬ DỤNG
Người lập trình dùng Microsoft’s.NET Framework có thể sử dụng SerialPort class để truy cập vào thiết bị cổng COM. Những ứng dụng có thể sử dụng thuộc tính, những phương pháp và sự kiện của class để truy cập mà không phải dùng đến lập trình mức thấp hoặc Window API .
Truy cập đến PORT
Để truy cập vào cổng COM, ta đặt các tham số truyền tin, và mở một kết nối đến cổng .
Tìm Cổng
GetPortNames của lớp SerialPort là phương pháp trả về 1 mảng tên của tất cả cổng COM của hệ thống. Các yếu tố của mảng không được đảm bảo để là những chữ cái .
Phương pháp Sort có thể sắp xếp lại nếu cần .
VB Dim nameArray() As String
‘khai báo biến namArray
nameArray = SerialPort.GetPortNames
‘nhận dữ liệu vào nameArray.
Array.Sort(nameArray)
‘sắp xếp các chữ cái.
Mở Cổng
Trước khi truyền tin qua 1 cổng thì ứng dụng phải mở 1 kết nối đến SerialPort . Dùng phương pháp OPEN sử dụng những thông số được chỉ định hay thông số mặc dịnh chưa được chỉ định trước đó :
COM1.OPEN()
Để ngăn ngừa những điều không mong muốn, ứng dụng có thể đọc thuộc tính
VB If (Not COM1.IsOpen) Then COM1.Open()
End If
TIMEOUT
Là thời gian mà cổng chưa muốn nhận hoặc gửi dữ liệu thì nó sẽ thoát ra
VB myComPort.ReadTimeout = 3000
myComPort.WriteTimeout = 5000
Giá trị mặc định của cổng SerialPort.InfiniteTimeout, không bao giờ hết thời gian.
Receive Threshold (Nhận giá trị ngưỡng)
Sự kiện DataReceived cho biết được ứng dụng đang đọc dữ liệu vào bộ đệm nhận hay không . Thuộc tính ReceivedBytesThreshold xác định xem có bao nhiệu Byte được có mặt trước khi xảy ra sự kiện . Mặc dịnh là 1 byte . Nếu bạn đặt thuộc tính với số quá lớn
Close Port
Một ứng dụng mà hoàn tất việc truyền tin thì cổng sẽ đóng và trả cổng cho ứng dụng khác . Phướng pháp Close sẽ đóng cổng và xóa bộ đệm truyền, nhận . Phương pháp Dispose sẽ đóng cổng và giải phóng các nguồn đang dược sử dụng để nó có thể mở cổng lại ngay sau khi đóng cổng.
Trước khi đóng thì nên xem xét xem cổng đang đóng hay chưa. Khi Cổng đang truyền mà ta thực hiện đóng cổng có thể sẽ gây ra lỗi hệ thống . để tránh điều này thì ta phải đợi tất cả dữ liệu được truyền xong trước khi đóng cổng. Thuộc tính WriteTimeout được sử dụng, vì khi time out thì BytetoWrite của cổng được đặt về 0, điều này sẽ không xảy ra lỗi khi đóng cổng .
VB If (Not (COM1 Is Nothing)) Then
‘ nếu cổng tồn tại If COM1.IsOpen Then ‘ nếu cổng đang mở Do While (COM1.BytesToWrite > 0) ‘ dữ liệu đang truyền Loop COM1.Dispose()
‘ truyền xong thì đóng cổng và xóa bộ đệm
End If End If
Có một cách khác để đóng cổng là sử dụng khối Using …
End Using
COM1.PortName = "COM1" COM1.BaudRate = 9600 COM1.Open()
COM1.WriteLine("hello") End Using
;sau khi truyền xong thì tự động đóng cổng và xóa đệm
Chú ý: đóng cổng mất một khoảng thời gian nên cần delay trước khi mở lại cổng.
Transmit data (Truyền dữ liệu)
NetFrameWork hỗ trợ nhiều phương pháp cho đọc và gửi dữ liệu cổng COM Lớp SerialPort cung cấp phương pháp đọc và ghi ra Port . Ứng dụng cũng có thể sử dụng thuộc tính BaseStream của SerialPort để chứa BinaryReader, BinaryWriter, StreamReader, and StreamWriter
Loại dữ liệu cơ bản cho dữ liệu cổng COM là loại dư liệu mảng
Oject Method Data Type Blocking
Write Byte array, Char array or
subarray, String Yes
Write line String+NewLine. NewLine
or NewLiney. Yes
Serial Port
Write Byte Byte Yes
Trong những ứng dụng để truyền những dữ liệu dạng TEXT, có số lượng lớn hơn Byte. Ta có lớp SerialPort bao gồm phương pháp mã hóa và giải mã những dữ liệu loại này. Cho ví dụ, những ứng dụng mà muốn gửi “CMD1”:
VB Dim datatosend(4) As Byte
Datatosend(0) = Asc(“C”)
Datatosend(1) = Asc(“M”)
Datatosend(2) = Asc(“D”)
Datatosend(3) = Asc(“1”)
COM1.write(datatosend,0,4)
VB Dim datatosend As String
Datatosend = “CMD1”
COM1.Writeline (datatosend)
Đó là phương thức truyền mảng kí tự theo lệnh Write Ta có thể truyền 1 chuỗi như trên với lệnh Writeline Còn truyền theo Byte thì có WriteByte
Lớp SerialPort cung cấp 5 giải pháp để đọc một văn bản.
Phương pháp ReadExisting trả về nội dung của một chuỗi tất cả các kí tự có trong bộ đệm nhận được. Nếu bộ đệm rỗng, thì phương pháp sẽ trả về 1 chuỗi rỗng tương tự.
Dim receivedText as String
receivedText = myComPort.ReadExisting
Phương pháp ReadLine là đọc tất cả các dữ liệu nhận được cho đến khi gặp kí tự xuống dòng mới:
Dim receivedText as String
receivedText = myComPort.ReadLine
Chuỗi trả về chứa mọi dữ liệu cho đến khi cập nhật Newline. Kí tự NewLine
được gỡ bỏ chi bộ đệm nhận. Nếu nộ đệm nhận không chứa đựng một NewLine, thì
Phương pháp sẽ đợi đến khi có giá trị ReadTimeout
Phương pháp ReadTo cũng giống như ReadLine nhưng cho phép xác định một vài giá trị như dấu phân cách
Phương pháp Read co thể sao chép kí tự nhận cho trước thành dạng kí tự mảng tại địa chỉ OffSet đặt trước
Ví dụ này ta cho đọc đến 3 kí tự nhận, và lưu trữ những Bytes này bắt đầu tại địa chỉ Offset 0 trong mảng Byte, và hiển thị ra kết quả:
Dim charBuffer(7) As Char Dim count As Integer
myComPort.Read(charBuffer, 0, 3) For count = 0 To 2
Console.WriteLine(CStr(charBuffer(count))) Next count
Nếu bộ đệm nhận chứa các kí tự “a”,”b”,”c” thì sẽ hiển thị như sau Số Bytes nhận = 3
a b c
Những kí tự mà đã được đọc thì không còn trong bộ đệm nhận.
Khi đọc một mảng Byte, phương pháp Read lưu trữ một Byte trong mỗi phần tử của màng.
Khi đọc một mảng Kí tự thì phương pháp read lưu trữ dữ liệu nhận như kí tự Unicode. Mỗi phần tử trong mảng kí tự biểu diễn cho một kí tự.
Phương pháp ReaDECLAREhar đọc 1 kí tự đơn từ bộ đệm nhận. Phương pháp này trả về một số nguyên mà chứa một kí tự được mã hóa.
Dim charToRead As Integer
charToRead = myComPort.ReaDECLAREhar() Console.WriteLine(ChrW(charToRead))
3. GIAO DIỆN CHƯƠNG TRÌNH ĐIỀU KHIỂN Giao diện lúc đăng nhập:
Giới thiệu các thành phần :
Khung Username : nhập tên người dùng, mặc định là “SPKT”
Khung Password : nhập mật mã do người dùng đặt, mặc định là “1234”. Ta có thể thay đổi trong chương trình chính.
Khi nhập sai tên và mật khẩu trong 3 lần thì chương trình sẽ tự tắt.
Chú ý : khi trong quá trình đăng nhập không được bấm dấu “X” để thoát ra. Vì khi đăng nhập thì chương trình chính vẫn được Load lên nhưng các chức năng được ẩn
đi nên muốn tắt chương trình thì bấm nút Cancel
Lập trình :
Imports System.IO
Public Class LoginForm1
Public username As String
Public i As Integer
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles OK.Click
Dim pw As New StreamReader("password.txt")
password = pw.ReadLine
pw.Close()
If UsernameTextBox.Text = username Then
If PasswordTextBox.Text = password Then
form1.Enabled = True form1.username = Me.username Me.Close() End If Else i = i ‐ 1
MsgBox("Bạn còn " & " " & i & " " & " lần nhập", MsgBoxStyle.Information,
"Thông Báo") End If If i = 0 Then form1.Close() Me.Close() End If End Sub
Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Cancel.Click
Me.Close()
My.Forms.form1.Close()
End Sub
Private Sub LoginForm1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
i = 3
username = "SPKT"
End Class
4. GIAO DIỆN CHÍNH LÚC CHƯA KẾT NỐI THIẾT BỊ
5. CHƯƠNG TRÌNH “ĐỌC TIN NHẮN VÀ TRUYỀN DỮ LIỆU ĐIỀU KHIỂN CHO PIC”
Public bitspersecond As Integer Public databits As Integer
Public parity As String Public stopbit As String Public handshaking As String ‘ Khai báo biến SerialPort1.BaudRate = ComboBox3.Text SerialPort1.PortName = ComboBox1.Text SerialPort2.PortName = ComboBox2.Text SerialPort2.BaudRate = bitspersecond SerialPort2.DataBits = databits
If stopbit = "None" Then SerialPort2.StopBits = StopBits.None
If stopbit = "One" Then SerialPort2.StopBits = StopBits.One
If stopbit = "Two" Then SerialPort2.StopBits = StopBits.Two
If parity = "None" Then SerialPort2.Parity = Ports.Parity.None
If parity = "Odd" Then SerialPort2.Parity = Ports.Parity.Odd
If parity = "Even" Then SerialPort2.Parity = Ports.Parity.Even
If handshaking = "None" Then SerialPort2.Handshake = Handshake.None
If handshaking = "XOnOff" Then SerialPort2.Handshake = Handshake.XOnXOff
If handshaking = "RequestToSend" Then
SerialPort2.Handshake = Handshake.RequestToSend ‘ chọn thuộc tính
If Not SerialPort1.IsOpen Then SerialPort1.Open()
End If
If (Not SerialPort2.IsOpen) Then SerialPort2.Open()
End If
time.Text = TimeOfDay
If light1.Text = "Open" Then trangthai1 = "off" If light1.Text = "Close" Then trangthai1 = "on" If light2.Text = "Open" Then trangthai2 = "off" If light2.Text = "Close" Then trangthai2 = "on" If light3.Text = "Open" Then trangthai3 = "off" If light3.Text = "Close" Then trangthai3 = "on" If light4.Text = "Open" Then trangthai4 = "off" If light4.Text = "Close" Then trangthai4 = "on" If light5.Text = "Open" Then trangthai5 = "off" If light5.Text = "Close" Then trangthai5 = "on" If light6.Text = "Open" Then trangthai6 = "off" If light6.Text = "Close" Then trangthai6 = "on" If light7.Text = "Open" Then trangthai7 = "off" If light7.Text = "Close" Then trangthai7 = "on" If light8.Text = "Open" Then trangthai8 = "off"
If light8.Text = "Close" Then trangthai8 = "on" ‘ truyền lệnh điều khiển xuống Pic16F877A
If SerialPort1.IsOpen Then Dim RC As String
SerialPort1.Write("at+cmgl=" & """" & "REC UNREAD" & """" & vbCrLf)
RC = SerialPort1.ReadExisting
If InStr(RC, phonenumbers(0)) Then 'kiểm tra số điện thoại cài sẵn
If InStr(RC, "status") Or InStr(RC, "Status") Then SerialPort1.Write("at+csms=1" + vbCrLf)
SerialPort1.WriteLine("at+cmgs=" + """" + phonenumbers(0) + """" + vbCrLf + "Report :light1" & trangthai1 &
",light2" & trangthai2 & ",temperature : " &
TextBox1.Text + Char.ConvertFromUtf32(26) + vbCrLf) SerialPort1.DiscardOutBuffer()
End If
If InStr(RC, "open") Or InStr(RC, "Open") Then SerialPort2.WriteLine(222)
End If
If InStr(RC, "light1") Or InStr(RC, "Light1") Then
PictureBox1.ImageLocation = path & "\den1" + den + ".jpg" light1.Text = trangthai
SerialPort2.WriteLine(1 & bit) End If
If InStr(RC, "light2") Or InStr(RC, "Light2") Then
PictureBox2.ImageLocation = path & "\den1" + den + ".jpg" light2.Text = trangthai
SerialPort2.WriteLine(2 & bit) End If
If InStr(RC, "light3") Or InStr(RC, "Light3") Then
Piclight3.ImageLocation = path & "\den1" + den + ".jpg" light3.Text = trangthai
SerialPort2.WriteLine(3 & bit) End If
If InStr(RC, "light4") Or InStr(RC, "Light4") Then
Piclight4.ImageLocation = path & "\den1" + den + ".jpg" light4.Text = trangthai
SerialPort2.WriteLine(4 & bit) End If
If InStr(RC, "light5") Or InStr(RC, "Light5") Then
Piclight5.ImageLocation = path & "\den1" + den + ".jpg" light5.Text = trangthai
SerialPort2.WriteLine(5 & bit) End If
If InStr(RC, "light6") Or InStr(RC, "Light6") Then
Piclight6.ImageLocation = path & "\den1" + den + ".jpg" light6.Text = trangthai
SerialPort2.WriteLine(6 & bit) End If
If InStr(RC, "light7") Or InStr(RC, "Light7") Then
Piclight7.ImageLocation = path & "\den1" + den + ".jpg" light7.Text = trangthai
SerialPort2.WriteLine(7 & bit) End If
If InStr(RC, "light8") Or InStr(RC, "Light8") Then
Piclight8.ImageLocation = path & "\den1" + den + ".jpg" light8.Text = trangthai
SerialPort2.WriteLine(8 & bit) End If
If InStr(RC, "all light") Then
PictureBox2.ImageLocation = path & "\den1" & den & ".jpg" light1.Text = trangthai light2.Text = trangthai light3.Text = trangthai light4.Text = trangthai