In this tutorial we will create a currency converter solution that shows the conversion from USD to other currencies on the LCD panel. The user can click on the up and down buttons to switch to different currencies.
This is a nice example as it shows how B4X tools can be used to program both the Arduino side and the Raspberry Pi side.
Arduino and Raspberry Pi complete each other nicely. The Arduino is easier to connect to external hardware and the Raspberry Pi is a full and powerful computer.
The two devices are connected with a USB cable using the Arduino built-in usb to serial converter.
During development it is convenient to run the RPi side on the PC. Otherwise you need to disconnect the Arduino each time you want to compile and connect it to the PC.
Once the program is ready we connect B4J to the RPi with B4J-Bridge and run it on the RPi instead of the PC.
The B4J program will download and parse the currency data from the web service: https://openexchangerates.org
The B4R program sends the value of the pressed button to the RPi which then sends back the currency name and currency value.
Note that there is no Log calls in the B4R program as the log messages will be sent to the RPi and interfere with the other commands.
The B4R program depends on rRandomAccessFile v1.10+ (v1.10 is attached).
B4R code:
B4X:
Sub Process_Globals
Public Serial1 As Serial
Private astream As AsyncStreams
Private lcd As LiquidCrystal
Private pin0 As Pin
'These are the analog values that identify the LCD shield buttons.
Private btnValues() As UInt = Array As UInt(50, 250, 450, 650, 850)
Private const RIGHT = 0, UP = 1, DOWN = 2, LEFT = 3, SELECT_BTN = 4, NONE = 5 As Byte 'ignore
Private lastValue As Byte = NONE
End Sub
Private Sub AppStart
'don't use Log as it sends the data to the serial port
Serial1.Initialize(115200)
astream.Initialize(Serial1.Stream, "astream_NewData", "astream_Error")
lcd.Initialize(8, 255, 9, Array As Byte (4, 5, 6, 7))
lcd.Begin(16, 2)
lcd.Write("waiting for data")
pin0.Initialize(0, pin0.MODE_INPUT)
'CheckButton will be called repeatedly as fast as possible.
AddLooper("CheckButton")
'Send the first request to the RPi.
astream.Write(Array As Byte(0, SELECT_BTN))
End Sub
Sub CheckButton
'reading the buttons of the LCD keypad shield
Dim reading As UInt = pin0.AnalogRead
For i = 0 To btnValues.Length - 1
If reading < btnValues(i) Then Exit
Next
If i <> lastValue Then
lastValue = i
astream.Write(Array As Byte(0, i))
End If
End Sub
Sub AStream_NewData (Buffer() As Byte)
lcd.Clear
If Buffer.Length <> 7 Then
lcd.Write("error")
Return
End If
Dim raf As RandomAccessFile
raf.Initialize(Buffer, True)
lcd.Write(raf.ReadBytes2(3, raf.CurrentPosition)) '3 letters currency
lcd.SetCursor(0, 1)
lcd.Write(raf.ReadDouble32(raf.CurrentPosition))
End Sub
Sub AStream_Error
End Sub
The B4J program is attached.
Attachments
Last edited: