|
Forum Index : Microcontroller and PC projects : My Picomite LCD Plotter with 2 Channels
| Author | Message | ||||
| Vampire05 Regular Member Joined: 06/12/2020 Location: GermanyPosts: 88 |
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: AustraliaPosts: 2006 |
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: GermanyPosts: 88 |
Yes, you are absolutely right! When I have implemented all the features, I will layout the board. |
||||
| The Back Shed's forum code is written, and hosted, in Australia. | © JAQ Software 2025 |