Hallo,
hier erkäre ich ein wenig wie man einen Zimmer-Alarmanlage baut. Als erstes die bennötigten Materialien:
- Lichtschranke mit Lichtwiderstand kostet 15 € bei Conrad (oder Türschalter) (Best-Nr.: 196037 - 62)
- LaserPointer der auf den Widerstand strahlt.
- Piepser kostet 5 - 10 € bei Conrad Online-Shop
- LPT-Schnittstelle an PC oder Notebook
- Genug Kabel kostet ca. 2 € bei Mobau Klein
Hier erst einmal der Code den ihr braucht! :
Vorher müsst ihr in die Form folgende Controls einfügen :
- 3 Buttons (Bereinigen; Alarm; Datum)
- Textbox (MultiLine aktivieren)
- Eine Form
- 2 Timer (Check, Timer1)
So als erstes die Subs für die LPT-Schnittstelle
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
' API Funktionen der InpOut32.dll
Private Declare Function Inp Lib "inpout32.dll" Alias "Inp32" ( _
ByVal PortAdress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" ( _
ByVal PortAdress As Integer, _
ByVal Value As Integer)
Public Enum LPT
LPT1 = &H378
LPT2 = &H278
End Enum
Public Enum LPT_Daten_Pin
' Als PinNummer
Pin2 = 0
Pin3 = 1
Pin4 = 2
Pin5 = 3
Pin6 = 4
Pin7 = 5
Pin8 = 6
Pin9 = 7
' Als SignalName
Data0 = 0
Data1 = 1
Data2 = 2
Data3 = 3
Data4 = 4
Data5 = 5
Data6 = 6
Data7 = 7
End Enum
Public Enum LPT_Kontroll_Pin
' Als PinNummer
Pin1 = 0
Pin14 = 1
Pin16 = 2
Pin17 = 3
' Als SignalName
Strobe = 0
AutoFdx = 1
InitPrnt = 2
SlctInp = 3
End Enum
Public Enum LPT_Input_Pin
' Als PinNummer
Pin15 = 3
Pin13 = 4
Pin12 = 5
Pin10 = 6
Pin11 = 7
' Als SignalName
Err = 3
Slct = 4
PE = 5
Ack = 6
Busy = 7
End Enum
' Zur Zwischenspeicherung der Ausgangszustände und des Ports
Private oldDaten As Byte
Private oldKontroll As Byte
Private Basisadresse As Integer
Public Sub Init_LPT(ByVal DruckerPort As LPT, _
Optional ByVal DatenByte As Byte = 0, _
Optional ByVal KontrollByte As Byte = 0)
' Diese Funktion muß als erstes aufgerufen werden
' hiermit werden alle Ausgänge des LPT Ports auf GND (0) gelegt
' Optional können andere Ausgangswerte angegeben werden
Basisadresse = DruckerPort
Schreibe_DatenByte(DatenByte)
Schreibe_KontrollByte(KontrollByte)
End Sub
Public Sub Schreibe_DatenByte(ByVal Wert As Byte)
' Dieser Sub gibt ein Byte am DatenPort aus
Dim Ausgabe As Integer
Dim Port As Integer
oldDaten = Wert
Port = CInt(Basisadresse)
Ausgabe = Wert
Out(Port, Ausgabe)
End Sub
Public Sub Schreibe_KontrollByte(ByVal Wert As Byte)
' Dieser Sub gibt ein Byte am KontrollPort aus
Dim Ausgabe As Integer
Dim Port As Integer
oldKontroll = Wert
Port = CInt(Basisadresse) + 2
Ausgabe = Wert Or 32
Ausgabe = Ausgabe Xor 43
Out(Port, Ausgabe)
End Sub
Public Function Lese_InputByte() As Byte
' Diese Funktion liefert ein am InputPort gelesenes Byte zurück
' Die Bits 0,1,2 sind unbenutzt und werden immer als 1 = gesetzt zurückgegeben
Dim Ausgabe As Integer
Dim Port As Integer
Port = CInt(Basisadresse) + 1
Ausgabe = Inp(Port)
' Bit7 muß invertiert werden & die 3 LSB auf 1 setzen
If Ausgabe >= 128 Then Ausgabe = Ausgabe - 128 Else Ausgabe = Ausgabe + 128
Ausgabe = Ausgabe Or 7
Lese_InputByte = CByte(Ausgabe)
End Function
Public Sub Schreibe_DatenString(ByVal Wert As String)
' Dieser Sub gibt ein Byte am DatenPort aus
' Der Übergabewert ist ein String aus 8 Zeichen mit 0en und 1en
' welche als Binärwerte interpretiert werden
' das Erste Zeichen ist das MSB das letzte Zeichen das LSB
Dim Ausgabe As Byte
Ausgabe = String2Byte(Wert)
Schreibe_DatenByte(Ausgabe)
End Sub
Public Sub Schreibe_KontrollString(ByVal Wert As String)
' Dieser Sub gibt ein Byte am KontrollPort aus
' Der Übergabewert ist ein String aus 8 Zeichen mit 0en und 1en
' welche als Binärwerte interpretiert werden
' das Erste Zeichen ist das MSB das letzte Zeichen das LSB
Dim Ausgabe As Byte
Ausgabe = String2Byte(Wert)
Schreibe_KontrollByte(Ausgabe)
End Sub
Public Function Lese_InputString() As String
' Diese Funktion liefert ein am InputPort gelesenes Byte in StringForm zurück
' Das MSB ist das erste und das LSB das letzte Zeichen
' Die Bits 0,1,2 sind unbenutzt und werden immer als 1 = gesetzt zurückgegeben
Dim Ausgabe As Byte
Dim AusString As String
Ausgabe = Lese_InputByte
AusString = Byte2String(Ausgabe)
Lese_InputString = AusString
End Function
Private Function String2Byte(ByVal Wert As String) As Byte
' Diese Funktion wandelt einen 8 Zeichen String mit 0en & 1en
' in ein Byte. Im String ist das MSB das erste und LSB das letzte Zeichen
Dim zähler As Integer
Dim Ausgabe As Byte
For zähler = 0 To 7
If Mid$(Wert, zähler + 1, 1) = "1" Then
Ausgabe = Ausgabe + 2 ^ (7 - zähler)
End If
Next
String2Byte = Ausgabe
End Function
Private Function Byte2String(ByVal Wert As Byte) As String
' Diese Funktion wandelt ein Byte in einen String um
' Im String ist das MSB das erste und das LSB das letzte Zeichen
Dim zähler As Integer
Dim Ausgabe As String = Nothing
For zähler = 7 To 0 Step -1
If Wert >= 2 ^ zähler Then
Ausgabe = Ausgabe & "1"
Wert = Wert - 2 ^ zähler
Else
Ausgabe = Ausgabe & "0"
End If
Next
Byte2String = Ausgabe
End Function
Public Function Lese_InputBit(ByVal Pin As LPT_Input_Pin) As Boolean
' Diese Funktion prüft ob das übergebene Bit auf High liegt (5Volt)
' und gibt ein True zurück wenn dem so ist. Liegt der Eingang auf Low
' wird False zurückgegeben
Dim Ausgabe As String
Dim Position As Integer
Dim Rückgabe As Boolean
Position = 8 - Pin
Ausgabe = Lese_InputString
If Mid$(Ausgabe, Position, 1) = "1" Then Rückgabe = True Else Rückgabe = False
Lese_InputBit = Rückgabe
End Function
Public Sub Schreibe_KontrollBit(ByVal Pin As LPT_Kontroll_Pin, ByVal Ein As Boolean)
' Dieser Sub schaltet einen Ausgangspin des Kontrollport auf High (5Volt)
' wenn Ein = True, bei Ein = False wird das Pin auf GND (0Volt) gelegt
' Alle anderen Ausgänge des Kontrollport bleiben unverändert
Dim Ausgabe As Byte
Ausgabe = 2 ^ Pin
Ausgabe = oldKontroll Or Ausgabe
If Ein = False Then Ausgabe = Ausgabe Xor 2 ^ Pin
Schreibe_KontrollByte(Ausgabe)
End Sub
Public Sub Schreibe_DatenBit(ByVal Pin As LPT_Daten_Pin, ByVal Ein As Boolean)
' Dieser Sub schaltet einen Ausgangspin des Datenport auf High (5Volt)
' wenn Ein = True, bei Ein = False wird das Pin auf GND (0Volt) gelegt
' Alle anderen Ausgänge des Kontrollport bleiben unverändert
Dim Ausgabe As Byte
Ausgabe = 2 ^ Pin
Ausgabe = oldDaten Or Ausgabe
If Ein = False Then Ausgabe = Ausgabe Xor 2 ^ Pin
Schreibe_DatenByte(Ausgabe)
End Sub
|
Das einfach in den Code der Form1 einfügen (Nicht im LoadEvent, auserhalb eines Events)
Jetzt die Zeit und das Datum lesen:
|
Visual Basic Quellcode
|
1
2
|
Dim Closee = True
Dim datadate As String = "Uhrzeit: " & Date.Now.Hour.ToString() & ":" & Date.Now.Minute.ToString() & ":" & Date.Now.Second.ToString() & " Datum: " & Now.Date & " ="
|
Jetzt den Timer1 zum aktualisieren des Datums und der Uhrzeit verwenden (Interval auf 1000 setzen)
|
Visual Basic Quellcode
|
1
2
|
datadate = "Uhrzeit: " & Date.Now.Hour.ToString() & ":" & Date.Now.Minute.ToString() & ":" & Date.Now.Second.ToString() & " Datum: " & Now.Date & " ="
|
Jetzt die Codes für alle Buttons :
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
|
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Clear()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
MsgBox(datadate)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'' Hier kommt euer Alarm
End Sub
|
Jetzt zum Herz : Wir müssen mit dem Timer Check alle paar Sekunden überprüfen ob der Eingang geschaltet wurde. Als erstes müsst ihr zwei Kabel an die Pins 6 und 12 anschließen. An diese Kabel wird später die Lichtschranke angeschlossen. Jetzt folgt ersteinmal der Code zum überprüfen:
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
Init_LPT(LPT.LPT1)
' Alle Ausgänge des DatenPort einschalten
Schreibe_DatenByte(255)
' Im DatenPort BitNr4=Data4=Pin6 auf Low=GND=0=False schalten ohne
' die anderen Ausgänge zu verändern
Schreibe_DatenBit(LPT_Daten_Pin.Data4, False)
' Prüfen ob im Inputport das BitNr5=PE=Pin12 auf Low=GND=0=Flase liegt
If Lese_InputBit(LPT_Input_Pin.PE) = False Then
If Closee = True Then
TextBox1.AppendText(vbNewLine & datadate & " Zimmertür wurde geöffnet")
'Dim NewImage As Image = Form2.copyFrame(Form2.PictureBox1, New RectangleF(0, 0, Form2.PictureBox1.Width, Form2.PictureBox1.Height))
'NewImage.Save("c:\" & datadate & " Beweisfoto.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
' Alarm-Sound wiedergeben!!!
Closee = False
End If
Else
If Closee = False Then
TextBox1.AppendText(vbNewLine & datadate & " Zimmertür wurde geschlossen")
Closee = True
End If
End If
' Im Kontrollport die Bits 0 und 3 setzen, restliche Ausgänge = 0
Schreibe_KontrollString("00001001")
|
Hier trägt er Texte in die Textbox ein wann die Tür geöffnet oder geschlossen wurde. Wenn ihr die Lichtschranke zusammengebaut habt müsst ihr sie nurnoch in die Nähe der Tür ausrichten und einen Laserpointer auf den Lichtwiderstand richten. Jetzt die Lichtschranke anschließen an die Zwei kabel die wir an die Pins 6 und 12 angeschlossen hatten.
Viel Spaß