Results 1 to 3 of 3

Thread: RGB Lighting Interface

  1. #1
    Automated Home Guru Geps's Avatar
    Join Date
    Nov 2010

    Default RGB Lighting Interface


    I'm renovating my house at the moment and was very keen on the RGB LED lights. With all my other lightning to be controlled by the quad dimmer modules I couldn't find a way to interface these lights to my (future!) Idranet.

    Talking to toscal on here he said he had a couple of RS232 based RGB lightning controllers so I just needed a way to link Cortex to the serial port.

    Talking to Karam and Viv at Idratek they suggested a method of using a virtual quad dimmer - virtual because it only existed in Cortex (turn off the network enabled option). You can then route commands to the device with Cortex and use the Cortex API to pick up these commands and send data to the serial port.

    So that's what I did!

    Attached below is some very rough code. My background is embedded C and whilst I had a go at C# I just didn't want to take the time to fully teach myself. At this stage it's purely designed as a proof of concept and I'll be adding features onto it as and when I get time but it works so thought I'd post it here for others to use should they wish.

    I took Karam's idea and extended it....instead of using the individual dimmer values, at the moment I'm using a single dimmer channel equated to a colour. The idea being that if you want the whole house orange you set a single value rather than each individual R G B one making it slightly easier to use.

    In the future I'll be
    • Tidying up this code
    • Adding RS485 interface so multiple units can share the same bus
    • Creating a rough UI so I can change settings without needing to keep hitting compile

    Screenshot: code (compiled with VS2010 Professional SP1):
    Imports System.Runtime.InteropServices
    Public Class TestCortexAPIForm
        Declare Auto Function SendMessage Lib "user32" ( _
            ByVal hWnd As IntPtr, _
            ByVal Msg As Integer, _
            ByVal wParam As Integer, _
            ByVal lParam As Integer) As Integer
        Declare Auto Function RegisterWindowMessage Lib "User32.Dll" _
           (ByVal lpString As String) As Integer
        Structure CopyDataStruct
            Public ID As String
            Public Length As Int32
            Public Data As String
        End Structure
        Const CortexControlAPIDiscover = "CortexAPIDiscover"
        Const CortexControlAPIAttach = "CortexAPIAttach"
        Const WM_COPYDATA = &H4A
        Dim UM_CortexControlAPIDiscover As UInt32
        Dim UM_CortexControlAPIAttach As UInt32
        Dim HWND_BROADCAST As Long = -1
        Dim MyCortexHandle As IntPtr = IntPtr.Zero
        Dim CortexAPIActive As Boolean
        Dim ReceivedMessage As String
        Dim aCDS As CopyDataStruct
        Dim BoardAddress As Byte
        Dim TransmitBuffer() As Byte = {&HFE, &H4C, &H42, &H2, &HFF}
        Private Sub TestCortexAPIForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            UM_CortexControlAPIDiscover = RegisterWindowMessage(CortexControlAPIDiscover)
            UM_CortexControlAPIAttach = RegisterWindowMessage(CortexControlAPIAttach)
        End Sub
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            If m.Msg = UM_CortexControlAPIAttach Then
                If (m.LParam = 1) And (m.WParam <> Handle) Then
                    Log("< WM_CortexAPIAttach")
                    MyCortexHandle = m.WParam
                    CortexAPIActive = True
                End If
                m.Result = New IntPtr(1) 'Ensure returned response is correct
                If m.Msg = UM_CortexControlAPIDiscover Then
                    If m.LParam = 1 Then
                        If (m.WParam <> Me.Handle) Then
                            MyCortexHandle = m.WParam
                            CortexAPIActive = True
                            Log("< WM_CortexAPIDiscover")
                            Log("> WM_CortexAPIAttach")
                            SendMessage(HWND_BROADCAST, UM_CortexControlAPIAttach, Handle, IntPtr.Zero)
                        End If
                    End If
                    m.Result = New IntPtr(1) 'Ensure returned response is correct
                    If m.Msg = WM_COPYDATA Then
                        If m.WParam = MyCortexHandle Then
                            aCDS = m.GetLParam(GetType(CopyDataStruct))
                            ReceivedMessage = aCDS.Data
                            Log("< " & ReceivedMessage)
                            If ReceivedMessage = "Disconnect" Then
                                CortexAPIActive = False
                                If ReceivedMessage = "Close" Then
                                End If
                            End If
                            m.Result = New IntPtr(1) 'Ensure returned response is correct
                        End If
                    End If
                End If
            End If
        End Sub
        Private Sub TestCortexAPIForm_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
            Log("> WM_CortexAPIDiscover")
            SendMessage(HWND_BROADCAST, UM_CortexControlAPIDiscover, Handle, IntPtr.Zero)
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        End Sub
        Private Sub Command(ByVal theCommand As String) 'USE THIS TO SEND COMMANDS TO CORTEX
            If theCommand <> "" And CortexAPIActive Then
                Log("> " & theCommand)
                aCDS.ID = "1"
                aCDS.Data = theCommand
                aCDS.Length = aCDS.Data.Length + 1
                Dim lParam As IntPtr
                lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(aCDS))
                Marshal.StructureToPtr(aCDS, lParam, False)
                SendMessage(MyCortexHandle, WM_COPYDATA, Me.Handle, lParam)
                Marshal.FreeCoTaskMem(lParam) ' Free allocated memory
            End If
        End Sub
        Private Sub Log(ByVal AString As String)
            TextBox2.AppendText(vbCrLf & DateTime.Now.ToLongTimeString & " " & AString)
            LastReceivedResponse.Text = AString
        End Sub
        Private Sub TestCortexAPIForm_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        End Sub
        ' Modify to suit your setup
        Private Sub Device_Init()
        SerialPort1.BaudRate = 9600
        SerialPort1.PortName = "COM5"
        SerialPort1.DataBits = 8
        SerialPort1.Parity = IO.Ports.Parity.None
        BoardAddress = &H4C
        'Set data
        TransmitBuffer(1) = BoardAddress
        End Sub
    Private Sub set_rgb_value(ByVal RedValue, ByVal GreenValue, ByRef BlueValue)
        If (SerialPort1.IsOpen = False) Then
        End If
        Debug.Print("Setting RGB Values:" & RedValue & " " & GreenValue & " " & BlueValue)
        TransmitBuffer(3) = 1
        TransmitBuffer(4) = RedValue
        SerialPort1.Write(TransmitBuffer, 0, TransmitBuffer.Length)
        TransmitBuffer(3) = 2
        TransmitBuffer(4) = GreenValue
        SerialPort1.Write(TransmitBuffer, 0, TransmitBuffer.Length)
        TransmitBuffer(3) = 3
        TransmitBuffer(4) = BlueValue
        SerialPort1.Write(TransmitBuffer, 0, TransmitBuffer.Length)
    End Sub
    Private Sub process_command(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LastReceivedResponse.TextChanged
        Dim CommandToProcess(2) As String
            If (LastReceivedResponse.Text.Contains("Dimmer")) Then
                Debug.Print("LED RGB")
            End If
            If (LastReceivedResponse.Text.Contains("Lounge Dimmer 1.Set Level (Output)")) Then
                ' Exact colour
            CommandToProcess = LastReceivedResponse.Text.Split("=")
                Select Case Convert.ToDecimal(CommandToProcess(1))
                    Case 100 ' colour
                                set_rgb_value(10, 255, 255)
                    Case 10 ' white
                                set_rgb_value(255, 255, 255)
                End Select
            End If
    End Sub
    Private Sub TrackBar2_Scroll(sender As Object, e As System.EventArgs) Handles rgbBlue.Scroll
        set_rgb_value(rgbRed.Value, rgbGreen.Value, rgbBlue.Value)
    End Sub
    Private Sub rgbRed_Scroll(sender As System.Object, e As System.EventArgs) Handles rgbRed.Scroll
        set_rgb_value(rgbRed.Value, rgbGreen.Value, rgbBlue.Value)
    End Sub
    Private Sub rgbGreen_Scroll(sender As System.Object, e As System.EventArgs) Handles rgbGreen.Scroll
        set_rgb_value(rgbRed.Value, rgbGreen.Value, rgbBlue.Value)
    End Sub
    End Class
    3 trackbars are used to provide a quick method of updating and testing colour combinations.

    Last edited by Geps; 16th November 2011 at 09:46 PM.

  2. #2
    Moderator toscal's Avatar
    Join Date
    Oct 2005
    Near Alicante Spain


    Does this mean I need to get some more RGB RS232 interfaces in then .

  3. #3
    Automated Home Guru Geps's Avatar
    Join Date
    Nov 2010


    I'm good for the foreseeable future - not looking to get everything up and running until summer next year as there is still loads to do!

    Others may though

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts