Home
JAQForum Ver 24.01
Log In or Join  
Active Topics
Local Time 08:41 20 Nov 2025 Privacy Policy
Jump to

Notice. New forum software under development. It's going to miss a few functions and look a bit ugly for a while, but I'm working on it full time now as the old forum was too unstable. Couple days, all good. If you notice any issues, please contact me.

Forum Index : Microcontroller and PC projects : My Picomite LCD Plotter with 2 Channels

Author Message
Vampire05
Regular Member

Joined: 06/12/2020
Location: Germany
Posts: 88
Posted: 05:21pm 18 Jan 2022
Copy link to clipboard 
Print this post

Hi Guys,
here is my actual Project: An LCD Plotter with 2 Channels and 4 different Signal Inputs:
- Voltage (0-12V, 0-6V, 0-3V, 0-0.9V) -> Raspberry Pico ADC with Voltage Devider
- Current (0-3A, 0-900mA, 0-90mA, 0-9mA) -> INA219 Board
- Temperature (0-600DEG, 0-300DEG, 0-90DEG, 0-60DEG) -> MAX6675 Board
- UART with different Baud Rates (not implemented)
- Simple DSO Function:








Here are some Videos:
Part 1:
https://youtu.be/ItWgfYGwKK0

Part 2:
https://youtu.be/hKAYqFlSEQ4


Here is the Code:
Const INA1 = &h41
Const INA2 = &h40
Const INA219_CONFIG_BVOLTRANGE_32 = &h2000
Const INA219_CONFIG_GAIN_8_320MV = &h1800
Const INA219_CONFIG_BADCRES_12BIT_128S = &h0780
Const INA219_CONFIG_SADCRES_12BIT_128S = &h0078
Const INA219_CONFIG_MODE_SNBVOLT_CONT = &h0007
Const INA219_REGISTER_BUSVOLTAGE = &h02
Const INA219_REGISTER_CURRENT = &h04
Const INA219_REGISTER_CALIBRATION = &h05

Dim float v_bias = 0.065
Dim float v1_scaler = 4.876
Dim float v2_scaler = 4.918

Dim float temp_1
Dim float temp_2

Dim INA219_currentDevider_mA As float
Dim INA219_powerDevider_mW As float
Dim INA219_calValue

SetPin gp5, gp4, i2c
I2C open 100, 100
setCalibration_32V_2A(INA1)
setCalibration_32V_2A(INA2)
Dim current As float
Dim busvoltage As float


Dim integer dat
Dim integer dat2
Dim integer buf(320)
Dim integer buf2(320)
SetPin 31, ain
SetPin 32, ain
SetPin 34, ain


SetPin gp0, dout
SetPin gp1, dout
SetPin gp2, din
SetPin gp3, din

SetPin gp10, INTL, key_function, PULLUP
SetPin gp11, INTL, key_range, PULLUP
SetPin gp21, INTL, key_pause, PULLUP
SetPin gp20, INTL, key_channel, PULLUP
SetPin gp19, INTL, key_reset, PULLUP

SetPin gp18, din, pulldown

Dim INTEGER ch = 1
Dim INTEGER function_pointer = 0
Dim STRING function_list(4) = ("VOLTAGE", "CURRENT", " TEMP  ", " UART  ", "")
function_list(4) = "  DSO  "

Dim INTEGER range_pointer = 0
Dim FLOAT v_range_scaler
Dim FLOAT v_range1(3) = (0, 4, 8, 12)
Dim FLOAT v_range2(3) = (0, 2, 4, 6)
Dim FLOAT v_range3(3) = (0, 1, 2, 3)
Dim FLOAT v_range4(3) = (0, 0.3, 0.6, 0.9)

Dim FLOAT a_range_scaler
Dim FLOAT a_range1(3) = (0, 1, 2, 3)
Dim FLOAT a_range2(3) = (0, 300, 600, 900)
Dim FLOAT a_range3(3) = (0, 30, 60, 90)
Dim FLOAT a_range4(3) = (0, 3, 6, 9)

Dim FLOAT t_range_scaler
Dim FLOAT t_range1(3) = (0, 200, 400, 600)
Dim FLOAT t_range2(3) = (0, 100, 200, 300)
Dim FLOAT t_range3(3) = (0, 30, 60, 90)
Dim FLOAT t_range4(3) = (0, 20, 40, 60)
Dim FLOAT labels_y(3) = (0, 0, 0, 0)

Dim INTEGER pause_pointer = 0
Dim INTEGER pause_list(6) = (0, 5, 10, 50, 100, 500, 1000)
Dim Integer baud_list(6) = (1200, 2400, 4800, 9600, 38400, 57600, 115200)
Dim INTEGER tick_list(6) = (125,200,500,1000,2000,5000,10000)
Dim FLOAT unit_x(6) = (6, 9.6, 24, 48, 96, 4, 8)
Dim INTEGER labels_x(4) = (0,0,0,0,0)

Dim INTEGER key_interrupt = 0

Dim INTEGER my_timer
SetTick 1000, my_tick

Dim INTEGER measure = 1

DRAW_SCREEN:

If function_pointer=2 And pause_pointer=0 Then pause_pointer=1

If ch=3 And pause_pointer=0 Then
 If function_pointer <> 3 And function_pointer <> 4 Then
   pause_pointer=1
 EndIf
EndIf

SetTick tick_list(pause_pointer), tick, 2
Print tick_list(pause_pointer)

For i=0 To 320
 buf(i)=-1
 buf2(i)=-1
Next i

my_timer = 0

CLS
key_interrupt = 0
Text 0, 0, function_list(function_pointer), lt, 2, 1, RGB(black), RGB(yellow)

If function_pointer = 0 Then
 pause_text$ = "PERIOD:" + Str$(tick_list(pause_pointer))
 unit_text$ = "V"
 If range_pointer = 0 Then
   v_range_scaler = 12.5
   labels_y(0) = v_range1(3)
   labels_y(1) = v_range1(2)
   labels_y(2) = v_range1(1)
 ElseIf range_pointer = 1 Then
   v_range_scaler = 25
   labels_y(0) = v_range2(3)
   labels_y(1) = v_range2(2)
   labels_y(2) = v_range2(1)
 ElseIf range_pointer = 2 Then
   v_range_scaler = 50
   labels_y(0) = v_range3(3)
   labels_y(1) = v_range3(2)
   labels_y(2) = v_range3(1)
 ElseIf range_pointer = 3 Then
   v_range_scaler = 166.66667
   labels_y(0) = v_range4(3)
   labels_y(1) = v_range4(2)
   labels_y(2) = v_range4(1)
 EndIf

ElseIf function_pointer = 1 Then
 pause_text$ = "PERIOD:" + Str$(tick_list(pause_pointer))
 If range_pointer = 0 Then
   unit_text$ = "A"
   a_range_scaler = 0.05
   labels_y(0) = a_range1(3)
   labels_y(1) = a_range1(2)
   labels_y(2) = a_range1(1)
 ElseIf range_pointer = 1 Then
   unit_text$ = "mA"
   a_range_scaler = 0.16667
   labels_y(0) = a_range2(3)
   labels_y(1) = a_range2(2)
   labels_y(2) = a_range2(1)
 ElseIf range_pointer = 2 Then
   unit_text$ = "mA"
   a_range_scaler = 1.66667
   labels_y(0) = a_range3(3)
   labels_y(1) = a_range3(2)
   labels_y(2) = a_range3(1)
 ElseIf range_pointer = 3 Then
   unit_text$ = "mA"
   a_range_scaler = 16.66667
   labels_y(0) = a_range4(3)
   labels_y(1) = a_range4(2)
   labels_y(2) = a_range4(1)
 EndIf

ElseIf function_pointer = 2 Then
 pause_text$ = "PERIOD:" + Str$(tick_list(pause_pointer))
 unit_text$ = Chr$(96) + "C"
 If range_pointer = 0 Then
   t_range_scaler = 0.25
   labels_y(0) = t_range1(3)
   labels_y(1) = t_range1(2)
   labels_y(2) = t_range1(1)
 ElseIf range_pointer = 1 Then
   t_range_scaler = 0.5
   labels_y(0) = t_range2(3)
   labels_y(1) = t_range2(2)
   labels_y(2) = t_range2(1)
 ElseIf range_pointer = 2 Then
   t_range_scaler = 1.66667
   labels_y(0) = t_range3(3)
   labels_y(1) = t_range3(2)
   labels_y(2) = t_range3(1)
 ElseIf range_pointer = 3 Then
   t_range_scaler = 2.5
   labels_y(0) = t_range4(3)
   labels_y(1) = t_range4(2)
   labels_y(2) = t_range4(1)
 EndIf

ElseIf function_pointer = 3 Then
 pause_text$ = "BAUD:" + Str$(baud_list(pause_pointer))
 unit_text$ = ""

ElseIf function_pointer = 4 Then
 pause_text$ = "PAUSE:" + Str$(pause_list(pause_pointer))
 unit_text$ = "V"
 last_1 = 1
 last_2 = 2
 If range_pointer = 0 Then
   v_range_scaler = 12.5
   labels_y(0) = v_range1(3)
   labels_y(1) = v_range1(2)
   labels_y(2) = v_range1(1)
 ElseIf range_pointer = 1 Then
   v_range_scaler = 25
   labels_y(0) = v_range2(3)
   labels_y(1) = v_range2(2)
   labels_y(2) = v_range2(1)
 ElseIf range_pointer = 2 Then
   v_range_scaler = 50
   labels_y(0) = v_range3(3)
   labels_y(1) = v_range3(2)
   labels_y(2) = v_range3(1)
 ElseIf range_pointer = 3 Then
   v_range_scaler = 166.66667
   labels_y(0) = v_range4(3)
   labels_y(1) = v_range4(2)
   labels_y(2) = v_range4(1)
 EndIf
EndIf

For i=0 To 4
 labels_x(i) = unit_x(pause_pointer) * (i+1)
Next i

If pause_pointer < 5 Then text_x$ = "Sec" Else text_x$ = "Min"




Text 90, 0, pause_text$, lt, 2, 1, RGB(black), RGB(cyan)
Text 33, 30, unit_text$, rt, 4, 1, RGB(yellow)
Line 30,50,30,222,2,RGB(yellow)
Line 30,220,320,220,2,RGB(yellow)
If function_pointer <> 4 Then
 Text 0, 228, text_x$, lt, 7, 1, RGB(yellow)
 Text 32,225, "0", c
 Text 80,225, Str$(labels_x(0)), c
 Text 128,225, Str$(labels_x(1)), c
 Text 176,225, Str$(labels_x(2)), c
 Text 224,225, Str$(labels_x(3)), c
 Text 272,225, Str$(labels_x(4)), c
EndIf

Text 30,215, "0" ,rm
Text 30,165, Str$(labels_y(2)),rm
Text 30,115, Str$(labels_y(1)),rm
Text 30,65,  Str$(labels_y(0)),rm



AQUIRE:
Line 32, 215, 320, 215, 1, RGB(80,80,80)
Line 32, 165, 320, 165, 1, RGB(80,80,80)
Line 32, 115, 320, 115, 1, RGB(80,80,80)
Line 32, 65, 320, 65, 1, RGB(80,80,80)


If function_pointer = 0 Then
 draw_voltage
ElseIf function_pointer = 1 Then
 draw_current
ElseIf function_pointer = 2 Then
 draw_temp
ElseIf function_pointer = 3 Then
 Print "UART"
EndIf

If ch=1 Or ch=3 Then
Text 240, 0, Left$(Str$(last_1), 5), lt, 3, 1, RGB(black), RGB(green)
EndIf
If ch=2 Or ch=3 Then
Text 240, 30, Left$(Str$(last_2),5), lt, 3, 1, RGB(black), RGB(magenta)
EndIf
Text 90, 25, "TIME: " + Str$(my_timer), lt, 2, 1
measure = 0

Do
 If key_interrupt > 0 Then GoTo DRAW_SCREEN
 If measure=1 Then GoTo AQUIRE
 If function_pointer = 4 Then
   clear_aquire_buf
   Pause pause_list(pause_pointer)
 EndIf
Loop

Sub temp
 Pin(gp1)=1
 Pause 40
 Pin(gp1)=0

 Pin(gp0)=1
 Pin(gp0)=0
 temp_raw1 = 0
 temp_raw2 = 0
 For i=12 To 1 Step -1
   Pin(gp0)=1

   b=1
   For j=2 To i
     b = b*2
   Next j
   so1=Pin(gp2)
   so2=Pin(gp3)
   temp_raw1 = temp_raw1 + (b*so1)
   temp_raw2 = temp_raw2 + (b*so2)
   Pin(gp0)=0
 Next i
 last_1 = temp_raw1*0.25
 last_2 = temp_raw2*0.25
 Pin(gp0) = 1
 Pin(gp0) = 0
 Pin(gp1) = 1
End Sub

Sub draw_temp
 temp
 dat = 215 - last_1 * t_range_scaler
 dat2 = 215 -last_2 * t_range_scaler
 For i=32 To 320
  If ch=1 Or ch=3 Then Pixel i, buf(i-1), RGB(black)
  If ch=2 Or ch=3 Then Pixel i, buf2(i-1),RGB(black)
  buf(i-1) = buf(i)
  buf2(i-1)= buf2(i)
  If ch=1 Or ch=3 Then Pixel i, buf(i),RGB(green)
  If ch=2 Or ch=3 Then Pixel i, buf2(i),RGB(magenta)
 Next i
   buf(320)=dat
   buf2(320)=dat2
End Sub

Sub draw_current
 last_1 = Current_mA(INA1)
 last_2 = Current_mA(INA2)
 dat = 215 - last_1 * a_range_scaler
 dat2 = 215 -last_2 * a_range_scaler
 For i=32 To 320
  If ch=1 Or ch=3 Then Pixel i, buf(i-1), RGB(black)
  If ch=2 Or ch=3 Then Pixel i, buf2(i-1),RGB(black)
  buf(i-1) = buf(i)
  buf2(i-1)= buf2(i)
  If ch=1 Or ch=3 Then Pixel i, buf(i),RGB(green)
  If ch=2 Or ch=3 Then Pixel i, buf2(i),RGB(magenta)
 Next i
   buf(320)=dat
   buf2(320)=dat2
End Sub

Sub clear_aquire_buf
 For i=32 To 320
   If ch=1 Or ch=3 Then Pixel i, buf(i), RGB(black)
   If ch=2 Or ch=3 Then Pixel i,buf2(i), RGB(black)
   If ch=1 Or ch=3 Then buf(i) = 215 - ((Pin(32)-v_bias)*v1_scaler)*v_range_sc
aler
   If ch=2 Or ch=3 Then buf2(i) =215 - ((Pin(31)-v_bias)*v2_scaler)*v_range_sc
aler
   If ch=1 Or ch=3 Then Pixel i, buf(i), RGB(green)
   If ch=2 Or ch=3 Then Pixel i, buf2(i), RGB(magenta)
 Next i
End Sub

Sub draw_voltage
 last_1 = (Pin(32)-v_bias)*v1_scaler
 last_2 = (Pin(31)-v_bias)*v2_scaler
 dat = 215 - last_1 * v_range_scaler
 dat2 = 215 -last_2 * v_range_scaler
 For i=32 To 320
  If ch=1 Or ch=3 Then Pixel i, buf(i-1), RGB(black)
  If ch=2 Or ch=3 Then Pixel i, buf2(i-1),RGB(black)
  buf(i-1) = buf(i)
  buf2(i-1)= buf2(i)
  If ch=1 Or ch=3 Then Pixel i, buf(i),RGB(green)
  If ch=2 Or ch=3 Then Pixel i, buf2(i),RGB(magenta)
 Next i
   buf(320)=dat
   buf2(320)=dat2
End Sub

Function Current_mA(ina)
 Local Value
 ReadRegister(ina, INA219_REGISTER_CURRENT, VALUE)
 If ((VALUE >> 15) And 1) = 1 Then
   Value = -((Value Xor &hffff) + 1)
 EndIf
 Current_mA = Value / INA219_currentDevider_mA
End Function

Sub ReadRegister(ina, Register, Value)
 Local GetData(1)
 I2C write ina, 0, 1, Register
 I2C read ina, 0, 2, GetData()
 value = ((GetData(0) << 8) Or GetData(1))
End Sub

Sub WriteRegister(ina, Register, Value)
 Local MSB,LSB
 MSB = Value >> 8
 LSB = Value And &hff
 I2C write ina, 0, 3, Register, MSB, LSB
End Sub

Sub setCalibration_32V_2A(ina)
 Local Config As integer
 INA219_calValue = 4096
 INA219_currentDevider_mA = 10
 INA219_powerDevider_mW = 0.5
 WriteRegister(ina, INA219_REGISTER_CALIBRATION, INA219_calValue)

 Config = INA219_CONFIG_BVOLTAGERANGE_32V Or INA219_CONFIG_GAIN_8_320MV Or INA
219_CONFIG_BADCRES_12BIT_128S

 Config = Config Or INA219_CONFIG_SADCRES_12BIT_128S Or INA219_CONFIG_MODE_SNB
VOLT_CONT
 WriteRegister(ina, INA219_REGISTER_CONFIG,Config)
End Sub

Sub key_function
 If key_interrupt > 0 Then Return
 key_interrupt = 1
 range_pointer = 0
 pause_pointer = 0
 function_pointer = function_pointer + 1
 If function_pointer > 4 Then function_pointer = 0
End Sub

Sub key_range
 If key_interrupt > 0 Then Return
 key_interrupt = 2
 range_pointer = range_pointer + 1
 If range_pointer > 3 Then range_pointer = 0
End Sub

Sub key_pause
 If key_interrupt > 0 Then Return
 key_interrupt = 3
 pause_pointer = pause_pointer + 1
 If pause_pointer > 6 Then pause_pointer = 0
End Sub

Sub key_channel
 If key_interrupt > 0 Then Return
 key_interrupt = 4
 ch = ch + 1
 If ch > 3 Then ch = 1
End Sub

Sub key_reset
 If key_interrupt > 0 Then Return
 key_interrupt = 5
End Sub

Sub my_tick
 my_timer = my_timer + 1
End Sub

Sub tick
 measure = 1
End Sub

Edited 2022-01-19 03:27 by Vampire05
 
palcal

Guru

Joined: 12/10/2011
Location: Australia
Posts: 2006
Posted: 04:54am 19 Jan 2022
Copy link to clipboard 
Print this post

Nice lookin project, would have been nice to see it all on a PCB, not a big fan of using a breadboard for it. They are OK for designing but could be troublesome in a project.
"It is better to be ignorant and ask a stupid question than to be plain Stupid and not ask at all"
 
Vampire05
Regular Member

Joined: 06/12/2020
Location: Germany
Posts: 88
Posted: 07:44am 19 Jan 2022
Copy link to clipboard 
Print this post

Yes, you are absolutely right! When I have implemented all the features, I will layout the board.
 
Print this page


To reply to this topic, you need to log in.

The Back Shed's forum code is written, and hosted, in Australia.
© JAQ Software 2025