B4R Question spi & i2c

Erel

B4X founder
Staff member
Licensed User
Please try the attached library.
B4X:
Sub Process_Globals
   Public Serial1 As Serial
   Private led As LedControl
End Sub

Private Sub AppStart
   Serial1.Initialize(115200)
   Log("AppStart")
   led.Initialize(12, 11, 10, 1)
   led.Shutdown(0, False)
   led.SetIntensity(0, 8)
   led.ClearDisplay(0)
End Sub
 

Attachments

  • rLedControl.zip
    6.8 KB · Views: 362
Upvote 0

whcir

Member
Licensed User
What are you trying to connect to?
Are there generic spi commands? Not looking to connect to any specific device. I have built a circuit with an spi interface (Mcp3301) that needs 2 bytes sent to it to return an ADC value. Bytes sent can be any value. Also need to be able to control CS line
 
Upvote 0

inakigarm

Well-Known Member
Licensed User
Please try the attached library.
B4X:
Sub Process_Globals
   Public Serial1 As Serial
   Private led As LedControl
End Sub

Private Sub AppStart
   Serial1.Initialize(115200)
   Log("AppStart")
   led.Initialize(12, 11, 10, 1)
   led.Shutdown(0, False)
   led.SetIntensity(0, 8)
   led.ClearDisplay(0)
End Sub

Thanks, works fine (I'll have to create a map function between ASCII codes and Matrix led -> this library: LedControlMS has native led.writeString function to send a string message to the LED Matrix)
 
Upvote 0

Hypnos

Active Member
Licensed User
image.jpeg
Thanks, works fine (I'll have to create a map function between ASCII codes and Matrix led -> this library: LedControlMS has native led.writeString function to send a string message to the LED Matrix)

Just tried this library on my 8x8 LED matrix and it works fine! If you can add the writeString and text scroll function in this library, would you please share to us? It's very useful. thanks!
 
Last edited:
Upvote 0

inakigarm

Well-Known Member
Licensed User
Well, sorry if I wasn't clear about it; I didn't mention to Wrap the LedControlMS (I'd like to do it but surely I didn't know so C to do it)

If I've time, I will try to map the ASCII codes to Matrix Led single LED activation.
 
Upvote 0

Hypnos

Active Member
Licensed User
Just got my WeMos D1 board but got the following error, any idea please? (no problem on UNO board)

B4X:
B4R version: 1.20
Parsing code.    (0.00s)
Compiling code.    (0.01s)
Building project    (0.02s)
Compiling & deploying Ino project (WeMos D1 R2 & mini (UploadSpeed=512000) - COM13)    Error

In file included from sketch\rLedControl.h:3:0,
                 from sketch\B4RDefines.h:24,
                 from C:\Development\B4R\LED Matrix plus 7 Segment\Objects\src\src.ino:1:
sketch\LedControl.h:30:26: fatal error: avr/pgmspace.h: No such file or directory
#include <avr/pgmspace.h>
                          ^
compilation terminated.
exit status 1
Error compiling for board WeMos D1 R2 & mini.
 
Upvote 0

Eme Fibonacci

Well-Known Member
Licensed User
Please try the attached library.
B4X:
Sub Process_Globals
   Public Serial1 As Serial
   Private led As LedControl
End Sub

Private Sub AppStart
   Serial1.Initialize(115200)
   Log("AppStart")
   led.Initialize(12, 11, 10, 1)
   led.Shutdown(0, False)
   led.SetIntensity(0, 8)
   led.ClearDisplay(0)
End Sub

I try this:
B4X:
led.SetChar(0,0,"A",False)


This should show an "A" on my LED matrix? What am I doing wrong?
 
Upvote 0

inakigarm

Well-Known Member
Licensed User
Attached a working example of rLedControl library with rmax7219 8x8 Led with Arduino UNO ( Thanks to @Mostez for his code to access a charmap characters on Nokia LCDs)
videotogif_2016.11.16_16.42.20.gif




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

Sub Process_Globals
    Public Serial1 As Serial
    Private led As LedControl

    Public DINPin As Pin
    Public CSpin As Pin
    Public CLKPin As Pin
    Public Timer1 As Timer
    Public count As Byte
    Public stringtext As String="B4R is great!"  'Text to display
    Public Timerinterval As Long=2000              '2 seconds
    Public bc As ByteConverter
    Public indextext As Int
    Public rows As Int=8                'rmax7219 8x8 display
    Public columns As Int=8

    Public firstchar As Int=2           'place on LCD to begin displaying char
    Public appearchareffect As Int=100 'appear effect on displaying string

End Sub

Private Sub AppStart
    Serial1.Initialize(115200)
    Timer1.Initialize("Timer1_Tick",Timerinterval)
    DINPin.Initialize(10,DINPin.MODE_OUTPUT)
    CSpin.Initialize(9,CSpin.MODE_OUTPUT)
    CLKPin.Initialize(8,CLKPin.MODE_OUTPUT)

    Log("AppStart")

    led.Initialize(DINPin.PinNumber,CLKPin.PinNumber,CSpin.PinNumber,1)
    led.Shutdown(0, False)
    led.SetIntensity(0, 8)

    If firstchar >3 Then firstchar=2  'char (5 rows values) + firstchar place <=8

    Timer1.Enabled=True

End Sub

Sub GetByte(Index As UInt) As Byte
   Return RunNative("getdata", Index)
End Sub

Sub Timer1_Tick

    led.ClearDisplay(0)

    Dim charmapindex As Int=stringtext.GetBytes(indextext)  'Get character

    For j=0 To 4  'Get the five rows that build the char (see charmap Inline C# code)
        led.setRow(0,firstchar+j,GetByte((charmapindex-31)*5+j)) ' Substracting 31 as first char in charmap begins before sp (ASCII)
        Delay(appearchareffect)
    Next

    If indextext=stringtext.Length-1 Then
        indextext=0
    Else
        indextext=indextext+1
    End If


End Sub

#if C
#include <avr/pgmspace.h>
    const PROGMEM byte data[] = { //change the data here
    0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, // sp
    0x00, 0x00, 0x2f, 0x00, 0x00, // !
    0x00, 0x07, 0x00, 0x07, 0x00, // "
    0x14, 0x7f, 0x14, 0x7f, 0x14,  // #
    0x24, 0x2a, 0x7f, 0x2a, 0x12, //$
    0xc4, 0xc8, 0x10, 0x26, 0x46,  //%
    0x36, 0x49, 0x55, 0x22, 0x50,  //&
    0x00, 0x05, 0x03, 0x00, 0x00,  //'
    0x00, 0x1c, 0x22, 0x41, 0x00,  //(
    0x00, 0x41, 0x22, 0x1c, 0x00,  //)
    0x14, 0x08, 0x3E, 0x08, 0x14, // *
    0x08, 0x08, 0x3E, 0x08, 0x08,  //+
    0x00, 0x00, 0x50, 0x30, 0x00,  //,
    0x10, 0x10, 0x10, 0x10, 0x10,  //-
    0x00, 0x60, 0x60, 0x00, 0x00, // .
    0x20, 0x10, 0x08, 0x04, 0x02,  ///
    0x3E, 0x51, 0x49, 0x45, 0x3E,  //0
    0x00, 0x42, 0x7F, 0x40, 0x00,  //1
    0x42, 0x61, 0x51, 0x49, 0x46,  //2
    0x21, 0x41, 0x45, 0x4B, 0x31,  //3
    0x18, 0x14, 0x12, 0x7F, 0x10,  //4
    0x27, 0x45, 0x45, 0x45, 0x39,  //5
    0x3C, 0x4A, 0x49, 0x49, 0x30,  //6
    0x01, 0x71, 0x09, 0x05, 0x03, // 7
    0x36, 0x49, 0x49, 0x49, 0x36,  //8
    0x06, 0x49, 0x49, 0x29, 0x1E,  //9
    0x00, 0x36, 0x36, 0x00, 0x00,  //:
    0x00, 0x56, 0x36, 0x00, 0x00,  //;
    0x08, 0x14, 0x22, 0x41, 0x00,  //<
    0x14, 0x14, 0x14, 0x14, 0x14,  //=
    0x00, 0x41, 0x22, 0x14, 0x08,  //>
    0x02, 0x01, 0x51, 0x09, 0x06,  //?
    0x32, 0x49, 0x59, 0x51, 0x3E,  //@
    0x7E, 0x11, 0x11, 0x11, 0x7E,  //A
    0x7F, 0x49, 0x49, 0x49, 0x36,  //B
    0x3E, 0x41, 0x41, 0x41, 0x22,  //C
    0x7F, 0x41, 0x41, 0x22, 0x1C,  //D
    0x7F, 0x49, 0x49, 0x49, 0x41,  //E
    0x7F, 0x09, 0x09, 0x09, 0x01,  //F
    0x3E, 0x41, 0x49, 0x49, 0x7A,  //G
    0x7F, 0x08, 0x08, 0x08, 0x7F,  //H
    0x00, 0x41, 0x7F, 0x41, 0x00,  //I
    0x20, 0x40, 0x41, 0x3F, 0x01,  //J
    0x7F, 0x08, 0x14, 0x22, 0x41,  //K
    0x7F, 0x40, 0x40, 0x40, 0x40,  //L
    0x7F, 0x02, 0x0C, 0x02, 0x7F,  //M
    0x7F, 0x04, 0x08, 0x10, 0x7F,  //N
    0x3E, 0x41, 0x41, 0x41, 0x3E,  //O
    0x7F, 0x09, 0x09, 0x09, 0x06,  //P
    0x3E, 0x41, 0x51, 0x21, 0x5E,  //Q
    0x7F, 0x09, 0x19, 0x29, 0x46,  //R
    0x46, 0x49, 0x49, 0x49, 0x31,  //S
    0x01, 0x01, 0x7F, 0x01, 0x01, // T
    0x3F, 0x40, 0x40, 0x40, 0x3F,  //U
    0x1F, 0x20, 0x40, 0x20, 0x1F,  //V
    0x3F, 0x40, 0x38, 0x40, 0x3F,  //W
    0x63, 0x14, 0x08, 0x14, 0x63,  //X
    0x07, 0x08, 0x70, 0x08, 0x07,  //Y
    0x61, 0x51, 0x49, 0x45, 0x43,  //Z
    0x00, 0x7F, 0x41, 0x41, 0x00,  //[
    0x55, 0x2A, 0x55, 0x2A, 0x55,  //55
    0x00, 0x41, 0x41, 0x7F, 0x00,  //]
    0x04, 0x02, 0x01, 0x02, 0x04,  //^
    0x40, 0x40, 0x40, 0x40, 0x40, //,
    0x00, 0x01, 0x02, 0x04, 0x00,  //'
    0x20, 0x54, 0x54, 0x54, 0x78,  //a
    0x7F, 0x48, 0x44, 0x44, 0x38,  //b
    0x38, 0x44, 0x44, 0x44, 0x20,  //c
    0x38, 0x44, 0x44, 0x48, 0x7F,  //d
    0x38, 0x54, 0x54, 0x54, 0x18,  //e
    0x08, 0x7E, 0x09, 0x01, 0x02,  //f
    0x0C, 0x52, 0x52, 0x52, 0x3E,  //g
    0x7F, 0x08, 0x04, 0x04, 0x78, // h
    0x00, 0x44, 0x7D, 0x40, 0x00,  //i
    0x20, 0x40, 0x44, 0x3D, 0x00,  //j
    0x7F, 0x10, 0x28, 0x44, 0x00, // k
    0x00, 0x41, 0x7F, 0x40, 0x00, // l
    0x7C, 0x04, 0x18, 0x04, 0x78, // m
    0x7C, 0x08, 0x04, 0x04, 0x78,  //n
    0x38, 0x44, 0x44, 0x44, 0x38,  //o
    0x7C, 0x14, 0x14, 0x14, 0x08, // p
    0x08, 0x14, 0x14, 0x18, 0x7C,  //q
    0x7C, 0x08, 0x04, 0x04, 0x08,  //r
    0x48, 0x54, 0x54, 0x54, 0x20,  //s
    0x04, 0x3F, 0x44, 0x40, 0x20,  //t
    0x3C, 0x40, 0x40, 0x20, 0x7C,  //u
    0x1C, 0x20, 0x40, 0x20, 0x1C,  //v
    0x3C, 0x40, 0x30, 0x40, 0x3C, // w
    0x44, 0x28, 0x10, 0x28, 0x44,  //x
    0x0C, 0x50, 0x50, 0x50, 0x3C,  //y
    0x44, 0x64, 0x54, 0x4C, 0x44   //z

    };

B4R::Object beo1;
B4R::Object* getdata(B4R::Object* o) {
   return beo1.wrapNumber(pgm_read_byte_near(data + o->toLong()));
}
#end if
 
Upvote 0
Top