sudden
Goto Top

Velleman Board: Digital Channel soll 3 Sekunden länger aktiv bleiben.

Hallo Admins,

vielleicht kennt ihr das Experimentierboard K8055N von Velleman. Ich habe eine Schaltung aufgebaut, die mit Hilfe einer Lichtschranke eine analoge Klingel schaltet.
D.h.: wenn jemand die Lichtschranke passiert, läutet die Klingel. Jetzt habe ich aber folgendes Problem: Das Klingeln ist zu Kurz. ich möchte dass der Digitale Ausgang an dem das Relais montiert ist, welches die Klingel auslöst 3 Sekunden aktiviert ist und nicht nur die kurze Zeit in der die Lichtschranke unterbrochen ist.
Muss ich einen zweiten Timer benutzen oder so? Mir fällt wirklich nichts ein.

Hier ist der Code:

Public Class Form1
    Private Declare Function OpenDevice Lib "k8055d.dll" (ByVal CardAddress As Integer) As Integer  
    Private Declare Sub CloseDevice Lib "k8055d.dll" ()  
    Private Declare Function Version Lib "k8055d.dll" () As Integer  
    Private Declare Function SearchDevices Lib "k8055d.dll" () As Integer  
    Private Declare Function SetCurrentDevice Lib "k8055d.dll" (ByVal CardAddress As Integer) As Integer  
    Private Declare Function ReadAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer) As Integer  
    Private Declare Sub ReadAllAnalog Lib "k8055d.dll" (ByRef Data1 As Integer, ByRef Data2 As Integer)  
    Private Declare Sub OutputAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer, ByVal Data As Integer)  
    Private Declare Sub OutputAllAnalog Lib "k8055d.dll" (ByVal Data1 As Integer, ByVal Data2 As Integer)  
    Private Declare Sub ClearAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer)  
    Private Declare Sub SetAllAnalog Lib "k8055d.dll" ()  
    Private Declare Sub ClearAllAnalog Lib "k8055d.dll" ()  
    Private Declare Sub SetAnalogChannel Lib "k8055d.dll" (ByVal Channel As Integer)  
    Private Declare Sub WriteAllDigital Lib "k8055d.dll" (ByVal Data As Integer)  
    Private Declare Sub ClearDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer)  
    Private Declare Sub ClearAllDigital Lib "k8055d.dll" ()  
    Private Declare Sub SetDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer)  
    Private Declare Sub SetAllDigital Lib "k8055d.dll" ()  
    Private Declare Function ReadDigitalChannel Lib "k8055d.dll" (ByVal Channel As Integer) As Boolean  
    Private Declare Function ReadAllDigital Lib "k8055d.dll" () As Integer  
    Private Declare Function ReadCounter Lib "k8055d.dll" (ByVal CounterNr As Integer) As Integer  
    Private Declare Sub ResetCounter Lib "k8055d.dll" (ByVal CounterNr As Integer)  
    Private Declare Sub SetCounterDebounceTime Lib "k8055d.dll" (ByVal CounterNr As Integer, ByVal DebounceTime As Integer)  
    Private Declare Function ReadBackDigitalOut Lib "k8055d.dll" () As Integer  
    Private Declare Sub ReadBackAnalogOut Lib "k8055d.dll" (ByRef Buffer As Integer)  
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        OpenDevice(0)
        Label1.Text = "Alarm scharf!"  
        CheckBox2.Checked = True

        Timer1.Enabled = True
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        CloseDevice()
        Label1.Text = "Alarm unscharf!"  
        CheckBox2.Checked = False


    End Sub

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked Then SetDigitalChannel(1) Else ClearDigitalChannel(1)
    End Sub

    Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim i As Integer
        i = ReadAllDigital
        Timer1.Enabled = False
        CheckBox3.Checked = i And 1
        Timer1.Enabled = True
    End Sub

    Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged
        If CheckBox3.Checked Then SetDigitalChannel(2) Else ClearDigitalChannel(2)
    End Sub
End Class

Vilen Dank schonmal im vorraus. Bin echt gespannt wie ich das lösen kann.


MfG,


Sudden

Content-ID: 223794

Url: https://administrator.de/contentid/223794

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

colinardo
Lösung colinardo 07.12.2013, aktualisiert am 11.12.2013 um 11:10:59 Uhr
Goto Top
Hallo Sudden,
kannst du z.B. mit einem zweiten Timer machen welcher einen Intervall von 3 Sekunden hat, und welcher in seinem Tick Event den digitalen Port ausschaltet und sich danach selber deaktiviert. Zusätzlich musst du dann aber in deinem Haupt-Timer abfragen ob der zweite Timer läuft, und nur wenn er nicht läuft soll die Klingel abgeschaltet werden können.
Der Timer heißt im Beispiel counter.
Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged
        If CheckBox3.Checked Then 
           if not counter.Enabled then
              SetDigitalChannel(2) 
              counter.Enabled = True
           end if
        Else 
           if not counter.Enabled then
              ClearDigitalChannel(2)
           end if
        End if
End Sub

 Private Sub counter_Tick(sender As System.Object, e As System.EventArgs) Handles counter.Tick
        ClearDigitalChannel(2)
        counter.Enabled = False
 End Sub

p.s. Das Gedöns mit dem Binden an die Checked-Ereignisse der Checkboxen ist, hust..., nicht gerade optimal ....
Kenne das Board jetzt nicht, aber mach das doch alternativ so: (counter hat einen Interval von 3000ms)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    OpenDevice(0)
    Label1.Text = "Alarm scharf!"  
    CheckBox2.Checked = True
    Timer1.Enabled = True
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    CloseDevice()
    Label1.Text = "Alarm unscharf!"  
    CheckBox2.Checked = False
    Timer1.Enabled = False
End Sub

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    If CheckBox1.Checked Then SetDigitalChannel(1) Else ClearDigitalChannel(1)
End Sub


Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim i As Integer
    i = ReadAllDigital

    If i And 1 Then
        If Not counter.Enabled Then
            SetDigitalChannel(2)
            checkbox3.checked = True
        End If
    Else
        If Not counter.Enabled Then
            ClearDigitalChannel(2)
            checkbox3.checked = False
        End If
    End If
End Sub

Private Sub counter_Tick(sender As System.Object, e As System.EventArgs) Handles counter.Tick
    counter.Enabled = False
End Sub
Grüße Uwe
Sudden
Sudden 10.12.2013 um 14:51:48 Uhr
Goto Top
Hi Uwe,

Vielen Dank für den Denkanstoß. Sitze leider noch in der Schule herum. Melde mich wenn ichs probiert habe.

MfG,

Sudden
Sudden
Sudden 11.12.2013 um 11:09:26 Uhr
Goto Top
Hi Uwe,

habs verstanden. Vielen, vielen Dank!

MfG,

Sudden