und [VB 2010] Tutorial - Wie baue ich einen Zimmer-Alarmanlage!

    • VB.NET

    Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von chrissinator.

      und [VB 2010] Tutorial - Wie baue ich einen Zimmer-Alarmanlage!

      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

      VB.NET-Quellcode

      1. ' API Funktionen der InpOut32.dll
      2. Private Declare Function Inp Lib "inpout32.dll" Alias "Inp32" ( _
      3. ByVal PortAdress As Integer) As Integer
      4. Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" ( _
      5. ByVal PortAdress As Integer, _
      6. ByVal Value As Integer)
      7. Public Enum LPT
      8. LPT1 = &H378
      9. LPT2 = &H278
      10. End Enum
      11. Public Enum LPT_Daten_Pin
      12. ' Als PinNummer
      13. Pin2 = 0
      14. Pin3 = 1
      15. Pin4 = 2
      16. Pin5 = 3
      17. Pin6 = 4
      18. Pin7 = 5
      19. Pin8 = 6
      20. Pin9 = 7
      21. ' Als SignalName
      22. Data0 = 0
      23. Data1 = 1
      24. Data2 = 2
      25. Data3 = 3
      26. Data4 = 4
      27. Data5 = 5
      28. Data6 = 6
      29. Data7 = 7
      30. End Enum
      31. Public Enum LPT_Kontroll_Pin
      32. ' Als PinNummer
      33. Pin1 = 0
      34. Pin14 = 1
      35. Pin16 = 2
      36. Pin17 = 3
      37. ' Als SignalName
      38. Strobe = 0
      39. AutoFdx = 1
      40. InitPrnt = 2
      41. SlctInp = 3
      42. End Enum
      43. Public Enum LPT_Input_Pin
      44. ' Als PinNummer
      45. Pin15 = 3
      46. Pin13 = 4
      47. Pin12 = 5
      48. Pin10 = 6
      49. Pin11 = 7
      50. ' Als SignalName
      51. Err = 3
      52. Slct = 4
      53. PE = 5
      54. Ack = 6
      55. Busy = 7
      56. End Enum
      57. ' Zur Zwischenspeicherung der Ausgangszustände und des Ports
      58. Private oldDaten As Byte
      59. Private oldKontroll As Byte
      60. Private Basisadresse As Integer
      61. Public Sub Init_LPT(ByVal DruckerPort As LPT, _
      62. Optional ByVal DatenByte As Byte = 0, _
      63. Optional ByVal KontrollByte As Byte = 0)
      64. ' Diese Funktion muß als erstes aufgerufen werden
      65. ' hiermit werden alle Ausgänge des LPT Ports auf GND (0) gelegt
      66. ' Optional können andere Ausgangswerte angegeben werden
      67. Basisadresse = DruckerPort
      68. Schreibe_DatenByte(DatenByte)
      69. Schreibe_KontrollByte(KontrollByte)
      70. End Sub
      71. Public Sub Schreibe_DatenByte(ByVal Wert As Byte)
      72. ' Dieser Sub gibt ein Byte am DatenPort aus
      73. Dim Ausgabe As Integer
      74. Dim Port As Integer
      75. oldDaten = Wert
      76. Port = CInt(Basisadresse)
      77. Ausgabe = Wert
      78. Out(Port, Ausgabe)
      79. End Sub
      80. Public Sub Schreibe_KontrollByte(ByVal Wert As Byte)
      81. ' Dieser Sub gibt ein Byte am KontrollPort aus
      82. Dim Ausgabe As Integer
      83. Dim Port As Integer
      84. oldKontroll = Wert
      85. Port = CInt(Basisadresse) + 2
      86. Ausgabe = Wert Or 32
      87. Ausgabe = Ausgabe Xor 43
      88. Out(Port, Ausgabe)
      89. End Sub
      90. Public Function Lese_InputByte() As Byte
      91. ' Diese Funktion liefert ein am InputPort gelesenes Byte zurück
      92. ' Die Bits 0,1,2 sind unbenutzt und werden immer als 1 = gesetzt zurückgegeben
      93. Dim Ausgabe As Integer
      94. Dim Port As Integer
      95. Port = CInt(Basisadresse) + 1
      96. Ausgabe = Inp(Port)
      97. ' Bit7 muß invertiert werden & die 3 LSB auf 1 setzen
      98. If Ausgabe >= 128 Then Ausgabe = Ausgabe - 128 Else Ausgabe = Ausgabe + 128
      99. Ausgabe = Ausgabe Or 7
      100. Lese_InputByte = CByte(Ausgabe)
      101. End Function
      102. Public Sub Schreibe_DatenString(ByVal Wert As String)
      103. ' Dieser Sub gibt ein Byte am DatenPort aus
      104. ' Der Übergabewert ist ein String aus 8 Zeichen mit 0en und 1en
      105. ' welche als Binärwerte interpretiert werden
      106. ' das Erste Zeichen ist das MSB das letzte Zeichen das LSB
      107. Dim Ausgabe As Byte
      108. Ausgabe = String2Byte(Wert)
      109. Schreibe_DatenByte(Ausgabe)
      110. End Sub
      111. Public Sub Schreibe_KontrollString(ByVal Wert As String)
      112. ' Dieser Sub gibt ein Byte am KontrollPort aus
      113. ' Der Übergabewert ist ein String aus 8 Zeichen mit 0en und 1en
      114. ' welche als Binärwerte interpretiert werden
      115. ' das Erste Zeichen ist das MSB das letzte Zeichen das LSB
      116. Dim Ausgabe As Byte
      117. Ausgabe = String2Byte(Wert)
      118. Schreibe_KontrollByte(Ausgabe)
      119. End Sub
      120. Public Function Lese_InputString() As String
      121. ' Diese Funktion liefert ein am InputPort gelesenes Byte in StringForm zurück
      122. ' Das MSB ist das erste und das LSB das letzte Zeichen
      123. ' Die Bits 0,1,2 sind unbenutzt und werden immer als 1 = gesetzt zurückgegeben
      124. Dim Ausgabe As Byte
      125. Dim AusString As String
      126. Ausgabe = Lese_InputByte
      127. AusString = Byte2String(Ausgabe)
      128. Lese_InputString = AusString
      129. End Function
      130. Private Function String2Byte(ByVal Wert As String) As Byte
      131. ' Diese Funktion wandelt einen 8 Zeichen String mit 0en & 1en
      132. ' in ein Byte. Im String ist das MSB das erste und LSB das letzte Zeichen
      133. Dim zähler As Integer
      134. Dim Ausgabe As Byte
      135. For zähler = 0 To 7
      136. If Mid$(Wert, zähler + 1, 1) = "1" Then
      137. Ausgabe = Ausgabe + 2 ^ (7 - zähler)
      138. End If
      139. Next
      140. String2Byte = Ausgabe
      141. End Function
      142. Private Function Byte2String(ByVal Wert As Byte) As String
      143. ' Diese Funktion wandelt ein Byte in einen String um
      144. ' Im String ist das MSB das erste und das LSB das letzte Zeichen
      145. Dim zähler As Integer
      146. Dim Ausgabe As String = Nothing
      147. For zähler = 7 To 0 Step -1
      148. If Wert >= 2 ^ zähler Then
      149. Ausgabe = Ausgabe & "1"
      150. Wert = Wert - 2 ^ zähler
      151. Else
      152. Ausgabe = Ausgabe & "0"
      153. End If
      154. Next
      155. Byte2String = Ausgabe
      156. End Function
      157. Public Function Lese_InputBit(ByVal Pin As LPT_Input_Pin) As Boolean
      158. ' Diese Funktion prüft ob das übergebene Bit auf High liegt (5Volt)
      159. ' und gibt ein True zurück wenn dem so ist. Liegt der Eingang auf Low
      160. ' wird False zurückgegeben
      161. Dim Ausgabe As String
      162. Dim Position As Integer
      163. Dim Rückgabe As Boolean
      164. Position = 8 - Pin
      165. Ausgabe = Lese_InputString
      166. If Mid$(Ausgabe, Position, 1) = "1" Then Rückgabe = True Else Rückgabe = False
      167. Lese_InputBit = Rückgabe
      168. End Function
      169. Public Sub Schreibe_KontrollBit(ByVal Pin As LPT_Kontroll_Pin, ByVal Ein As Boolean)
      170. ' Dieser Sub schaltet einen Ausgangspin des Kontrollport auf High (5Volt)
      171. ' wenn Ein = True, bei Ein = False wird das Pin auf GND (0Volt) gelegt
      172. ' Alle anderen Ausgänge des Kontrollport bleiben unverändert
      173. Dim Ausgabe As Byte
      174. Ausgabe = 2 ^ Pin
      175. Ausgabe = oldKontroll Or Ausgabe
      176. If Ein = False Then Ausgabe = Ausgabe Xor 2 ^ Pin
      177. Schreibe_KontrollByte(Ausgabe)
      178. End Sub
      179. Public Sub Schreibe_DatenBit(ByVal Pin As LPT_Daten_Pin, ByVal Ein As Boolean)
      180. ' Dieser Sub schaltet einen Ausgangspin des Datenport auf High (5Volt)
      181. ' wenn Ein = True, bei Ein = False wird das Pin auf GND (0Volt) gelegt
      182. ' Alle anderen Ausgänge des Kontrollport bleiben unverändert
      183. Dim Ausgabe As Byte
      184. Ausgabe = 2 ^ Pin
      185. Ausgabe = oldDaten Or Ausgabe
      186. If Ein = False Then Ausgabe = Ausgabe Xor 2 ^ Pin
      187. Schreibe_DatenByte(Ausgabe)
      188. End Sub


      Das einfach in den Code der Form1 einfügen (Nicht im LoadEvent, auserhalb eines Events)

      Jetzt die Zeit und das Datum lesen:

      VB.NET-Quellcode

      1. Dim Closee = True
      2. 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)

      VB.NET-Quellcode

      1. datadate = "Uhrzeit: " & Date.Now.Hour.ToString() & ":" & Date.Now.Minute.ToString() & ":" & Date.Now.Second.ToString() & " Datum: " & Now.Date & " ="


      Jetzt die Codes für alle Buttons :

      VB.NET-Quellcode

      1. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      2. TextBox1.Clear()
      3. End Sub
      4. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      5. MsgBox(datadate)
      6. End Sub
      7. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
      8. '' Hier kommt euer Alarm
      9. 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:

      VB.NET-Quellcode

      1. Init_LPT(LPT.LPT1)
      2. ' Alle Ausgänge des DatenPort einschalten
      3. Schreibe_DatenByte(255)
      4. ' Im DatenPort BitNr4=Data4=Pin6 auf Low=GND=0=False schalten ohne
      5. ' die anderen Ausgänge zu verändern
      6. Schreibe_DatenBit(LPT_Daten_Pin.Data4, False)
      7. ' Prüfen ob im Inputport das BitNr5=PE=Pin12 auf Low=GND=0=Flase liegt
      8. If Lese_InputBit(LPT_Input_Pin.PE) = False Then
      9. If Closee = True Then
      10. TextBox1.AppendText(vbNewLine & datadate & " Zimmertür wurde geöffnet")
      11. 'Dim NewImage As Image = Form2.copyFrame(Form2.PictureBox1, New RectangleF(0, 0, Form2.PictureBox1.Width, Form2.PictureBox1.Height))
      12. 'NewImage.Save("c:\" & datadate & " Beweisfoto.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
      13. ' Alarm-Sound wiedergeben!!!
      14. Closee = False
      15. End If
      16. Else
      17. If Closee = False Then
      18. TextBox1.AppendText(vbNewLine & datadate & " Zimmertür wurde geschlossen")
      19. Closee = True
      20. End If
      21. End If
      22. ' Im Kontrollport die Bits 0 und 3 setzen, restliche Ausgänge = 0
      23. 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ß

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TS-Development“ ()

      Könntest du bitte die Conrad Artikel Nummer Hinzufügen?

      Danke

      MfG Tobi

      Hallo
      Kleiner Hinweis:
      Wenn ein längerer Quellcod übernommen wird,
      einen Link in den Quellcod setzen.Es ist keine Schande dies zu tun,sondern Fair.
      In Vb 2010 sind bestimmt schon bessere Funktionen implantiert,damit könntest du den Cod überarbeiten.
      Eine Abfrage alle paar sec. erfasst schnelles Öffnen und Schließen der Tür nicht immer exakt.
      Was passiert wenn die Tür offen bleibt(Schalter) oder Lichtschranke betätigt?
      Du musst den Flankenwechsel mit Auswerten.

      Kleine saubere Zeichnung ist immer Hilfreich.

      Vorschlag:Wenn du dies mit Bitwackel der Seriellen und einer EreignisAuslösung machst,braucht du keine Timer,
      also kaum Rechenzeit und das Prog wird Verständlicher und einfacher.
      Außerdem keine Dll.

      P.S.
      Versuche es ,würde mich freuen wenn du es schaffst.

      Gruß
      Ich habe denn Code so hier eingetragen. Wenn man ihn nicht versteht dann ist es nicht mein Problem. Außerdem ist das Net Framework 4 noch in der Beta Phase und deshalb werde ich den Code nicht umschreiben und weil ich keine Zeit habe.

      Wenn du Zeit hast kannst du das ja gerne für mich übernehmen und hier posten!

      Wenn die Tür offen bleibt kann man im Code sehen:

      VB.NET-Quellcode

      1. If Closee = True Then
      2. TextBox1.AppendText(vbNewLine & datadate & " Zimmertür wurde geöffnet")
      3. 'Dim NewImage As Image = Form2.copyFrame(Form2.PictureBox1, New RectangleF(0, 0, Form2.PictureBox1.Width, Form2.PictureBox1.Height))
      4. 'NewImage.Save("c:\" & datadate & " Beweisfoto.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
      5. ' Alarm-Sound wiedergeben!!!
      6. Closee = False
      7. End If


      Das dort steht: " Alarm-Sound wiedergeben!!!" Das passiert solange bis die Tür wieder zugeht. Man kann es nätürlich auch umbauen.
      Ich hab mir die Lichtschranke gekauft komme aber nur auf max.2,5 cm Reichweite 8|
      Habe sie mit dem Ozilloskop durchgemessen und auf max. leistung getrimmt.

      Was soll ich machn?

      MfG Tobi

      Ich lasse auf den Licht-Widerstand einfach einen Laser-Pointer draufstrahlen. Da gibts nichts mit Reichweite oder so. Du kannst den Laserpointer auf den Widerstand von 10 Metern entfernung draufstrahlen lassen und das Releas springt an.

      Es seiden du hast dir eine Lichtschranke gekauft die mit Infrarot arbeitet. Das solltest du dir net kaufen. Sondern eine Lichtschranke mit einem Foto-Widerstand
      8| ich hab mir genau die lichtschranke Art. Nr, oben gekauft!
      Wie kommsde dann auf Lichtwiederstand? Des is ne Infra. Lichtrschranke...

      VCJunk schrieb:

      Lichtschranke Artikel-Nr.:
      191710 - 62
      Link:

      Tja ich habe die Bestellnumm er dir net gegeben. Ich war es net. Zitat war von VC-Junk. Ist leider die Falsche da kann ich dir net merh Weiter helfen. Oben im Thread steht auch Lichtschranke mit Lichtwiderstand (oder Türschalter) und keine Infrarot-Lichtschranke.
      Tja ich habe die Bestellnumm er dir net gegeben. Ich war es net. Zitat war von VC-Junk. Ist leider die Falsche da kann ich dir net merh Weiter helfen. Oben im Thread steht auch Lichtschranke mit Lichtwiderstand (oder Türschalter) und keine Infrarot-Lichtschranke.


      Und welche ist die richtige die man bei Conrad für 15 € kaufen kann?
      Wäre vllt hilfreich wenn du auch die artikel nummer posten könntest bevor sich jetzt jeder irgendein müll kauft das dann nachher nicht geht!
      Ich hab mir auch mal überlegt das zu machen...
      Will das aber mit nem art Schalter machen
      Also zwei dräte die normalerweiße aneinanderhängen also Strom fließt.
      Wenn jetzt die Türe geöffnet wird kommt ja kein Strom mehr an weils ja unterbrochen wurde.
      Geht das mit dem gleichen Code?
      5V ist der Output, das weiß ich aufjedenfall, wie viel es verträgt kann ich nicht sagen und ich wills auch nicht austesten...
      aber ich habe mir auch mal einiges ausprobiert, dabei hab ich eine 9 V Blockbatterie(bw. akku) verwendet und es hat immer noch funktioniert ;)
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---

      jvbsl schrieb:

      aber ich habe mir auch mal einiges ausprobiert, dabei hab ich eine 9 V Blockbatterie(bw. akku) verwendet und es hat immer noch funktioniert

      Um hier etwas genaues zu sagen,muß ich deine "Experimentierschaltung" kennen.


      Mann sollte immer die Grenzwerte einhalten.
      Es kann sonst zu Vorschädigungen kommen,welche sich später auswirken.

      Paraport 4mA gegen +5V bei TTL-Pegel,glaube aber das dies nicht immer gegeben ist.

      Gruß
      es war eine ganz einfache Schaltung welche über einen Transistor ein Relais geschaltet hat, dabei waren natürlich Widerstände dazwischen, sodass die Stromstärke zumindest mal nicht so hoch ist...xD(das Relais hat nur den Durchgang zu ner Steckdose freigeschalten und somit alles mögliche^^). (ich bin mir nicht sicher aber der Transistor war glaub ich ein BC547 evtl. auch 49
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---