B4R Tutorial SevSeg with inline C

Discussion in 'B4R Tutorials' started by Johan Schoeman, Jun 21, 2019.

Similar threads

B4R Tutorial Inline C / C++
B4R Tutorial HC 05 Classic Bluetooth
B4R Tutorial Additional Hardware Serial Ports
B4R Code Snippet GFX and Bitmaps
B4R Tutorial Big/Large Alphanumeric Characters(LCD1602)
  1. Johan Schoeman

    Johan Schoeman Expert Licensed User

    This B4R project uses the SevSeg library via inline C to display characters on a 4 digit x 7 segment LED display (I am using a SMA420364L) - hard wired.

    The inline C code via the SevSeg library does all the heavy lifting to display the chars on the 4 digit display. It can be used for common Anode and common Cathode displays as well as 1 to 4 digit displays. I have only tested in on a common Cathode display with 4 digits. The is an abundance of comments in the B4R code that explains setting the mode, number of digits, pins that will be used (see below wiring diagram), position of where the decimal point should be displayed, and brightness of the display (brightness from 0 to 100)

    The attached B4R project simulates a clock. It displays the Hours:Minutes, then the Minutes:Seconds, and then just "HALO" and then cycles through the same sequence again.

    Extract SevSeg.zip and copy the folder (with the .h and .cpp files) to your arduino libs folder.

    Edit: Have posted a wrapper for SevSeg here

    SevSegInline_bb.png

    Sample Code:

    Code:
    #Region Project Attributes
        
    #AutoFlushLogs: True
        
    #CheckArrayBounds: True
        
    #StackBufferSize: 300
    #End Region

    Sub Process_Globals
        
    'These global variables will be declared once when the application starts.
        'Public variables can be accessed from all modules.
        Public Serial1 As Serial
       
    '    Dim bc As ByteConverter
       
        
    Dim mode_in As Boolean = False                    'common cathode (set to True for display with common Anode)    
        Dim numOfDigits As Byte = 4                       'Using a 4 digit x 7 segment LED display
        Dim digit1 As Byte = 13                           'Most significant digit i.e most left - pin 13
        Dim digit2 As Byte = 12                           '2nd digit from left - pin 12
        Dim digit3 As Byte = 11                           '3rd digit from left - pin 11
        Dim digit4 As Byte = 10                           'Least significant digit i.e most right - pin 10
        Dim segmentDP As Byte = 9                         'digital point - pin 9
        Dim segment1 As Byte = 2                          'Segment A - pin 2
        Dim segment2 As Byte = 3                          'Segment B - pin 3
        Dim segment3 As Byte = 4                          'Segment C - pin 4
        Dim segment4 As Byte = 5                          'Segment D - pin 5
        Dim segment5 As Byte = 6                          'Segment E - pin 6
        Dim segment6 As Byte = 7                          'Segment F - pin 7
        Dim segment7 As Byte = 8                          'Segment G - pin 8
        Dim brightness As Byte = 100                      'Set the brightness of the LED display between 0 and 100
       
        
    Dim min1, min10, hr1, hr10, sec10, sec1 As Byte   'keeping track of out clock thta we are setting up in AppStart
        Dim decimalposition As Byte = 2                   'set the decimal position to 2 (the 2nd DP from the left)
        Dim prevtime, currenttime As ULong
       
        
    Dim dat1() As Byte = "HALO"                       'set dat1 to "abcd" - we will pass it to the dsipaly in the timer
       
        
    Dim cnt As UInt = 0                               'a counter to decide what to display
                                                          'display will chnage between showing hour and minutes, minutes and seconds, "abcd", and then repeating this sequence of display
        Dim t As Timer                                    'We need a timer
       
    End Sub

    Private Sub AppStart
        Serial1.Initialize(
    115200)
        
    Log("AppStart")
        t.Initialize(
    "t_tick"20)                        'initialize the timer - tick every 20ms
        prevtime = Millis                                 'get the millis since MCU started
       
        hr10 = 
    1                                          'Set the hours, minuntes, and seconds here that you want to start the clock with
        hr1 = 9
        min10 = 
    2
        min1 = 
    2
        sec10 = 
    0
        sec1 = 
    0
       
        RunNative(
    "begin"Null)                          'call Begin in SevSeg
        Delay(1)
        RunNative(
    "SetBrightness"Null)                  'set the brightness of the LED's
        Delay(1)
        t.Enabled = 
    True                                  'Enable the timer
       
    End Sub

    Sub t_tick
       
        cnt = cnt + 
    1                                     'increment the counter
       
        currenttime = Millis                              
    'get the current Millis
        If (currenttime - prevtime) > 1000 Then           'has 1 second gone by since previous "get Millis"?
            prevtime = currenttime                        'if so, then store current time to previous time
            sec1 = sec1 + 1                               'increment seconds 1's
            If sec1 > 9 Then
                sec1 = 
    0
                sec10 = sec10 + 
    1                         'increment seconds 10's
                If sec10 > 5 Then                         '.....sure you will follow the rest of the logic
                    sec10 = 0
                    min1 = min1 + 
    1
                    
    If min1 > 9 Then
                        min1 = 
    0
                        min10 = min10 + 
    1
                        
    If min10 > 5 Then
                            min10 = 
    0
                            hr1 = hr1 + 
    1
                            
    If hr1 > 9 Then
                                hr1 = 
    0
                                hr10 = hr10 + 
    1
                            
    End If
                        
    End If
                    
    End If
                
    End If
            
    End If
        
    End If
       
        
    If hr10 = 2 Then                             'check for midnight and if so set hr10 and hr1 to 0
            If hr1 = 4 Then
                hr10 = 
    0
                hr1 = 
    0
            
    End If
        
    End If
       
        
    If cnt < 500 Then                                                            'if counter is less than 500 then display HH.MM
            decimalposition = 2
            
    Dim c As String = JoinStrings(Array As String(hr10, hr1, min10, min1))   'build the string
            Dim b() As Byte = c                                                      'convert the string to a byte array
            RunNative("DisplayString", b)                                            'call DisplayString in SevSeg and pass it the byte array
        else if cnt < 1000 Then                                                      'if counter is > 500 and less than 1000 then display MM.SS
            decimalposition = 2
            
    Dim c As String = JoinStrings(Array As String(min10, min1, sec10, sec1))  
            
    Dim b() As Byte = c
            RunNative(
    "DisplayString", b)
        
    else if cnt < 1500 Then                                                      'if counter >= 1000 but < 1500 then display dat1 = abcd
            decimalposition = 0
            RunNative(
    "DisplayString", dat1)
        
    Else
            cnt = 
    0  
        
    End If
       
    End Sub

    #if C

    #include <SevSeg.h>

    SevSeg sevseg;                                                                 //We are using the SevSeg library

    void begin(B4R::Object* o) {                                                   //begin - called from B4R code to set up mode(common cathode/anode), number of digits on the display, pins that are used, and where the digital point should be displayed
       sevseg.Begin(b4r_main::_mode_in, b4r_main::_numofdigits, b4r_main::_digit1, b4r_main::_digit2, b4r_main::_digit3, b4r_main::_digit4, b4r_main::_segment1, b4r_main::_segment2, b4r_main::_segment3, b4r_main::_segment4, b4r_main::_segment5, b4r_main::_segment6, b4r_main::_segment7, b4r_main::_segmentdp);
    }

    void SetBrightness(B4R::Object* o) {                                           //set the brightness of the LED's on the 7 segment display
       sevseg.SetBrightness(b4r_main::_brightness);
    }

    void DisplayString(B4R::Object* o) {                                          //what do display - passed in from the B4R code and received here as a B4R Object
       B4R::Array* conversion = (B4R::Array*)B4R::Object::toPointer(o);
       char* toDisplay = (char*)conversion->data;                                
       sevseg.DisplayString(toDisplay, b4r_main::_decimalposition);
    }


    #End If
    20190621_201236.jpg
     

    Attached Files:

    Last edited: Jun 22, 2019
    Erel, Mostez, inakigarm and 2 others like this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice