Pylab and pyserial plot in real time

Discussion in 'Python' started by googlinggoogler@hotmail.com, Nov 6, 2005.

  1. Guest

    Hiya,

    I've got a PIC microcontroller reading me humidity data via rs232, this
    is in ASCII format. I can view this data easily using hyperterminal or
    pyserial and convert it to its value (relative humidty with ord(input))

    But what im trying to do is plot the data in real time, ideally with
    pylab - as it looks simple to use and simple is the way i want to go!

    My code is below, it doesnt show a graph, I was wondering whether
    someone could suggest whats wrong?

    thank you in advance

    David

    ########################################################################

    import serial
    from pylab import *

    ser = serial.Serial(0)
    t = arange(0.0, 1.0+0.01, 0.01)

    xlabel('time')
    ylabel('RH %')
    title(' RH sensor data sampled at 1 sec intervals ')
    #grid(true)

    x = 0

    while 1:
    s = ser.read()
    b = ord(s)
    h = []
    h.append(b)
    x = x + 1
    plot(t,h)

    ser.close

    ########################################################################
     
    , Nov 6, 2005
    #1
    1. Advertising

  2. Peter Hansen Guest

    wrote:
    > I've got a PIC microcontroller reading me humidity data via rs232, this
    > is in ASCII format.


    What do you mean when you say it's in ASCII format? ASCII defines a
    convention for representing control and printable characters. Do you
    mean that the readings you get are shown in hyperterminal as numbers
    such as "101"? Or something else?

    > I can view this data easily using hyperterminal or
    > pyserial and convert it to its value (relative humidty with ord(input))


    Okay, since you don't show examples, we'll have to assume you know what
    you're doing there...

    > My code is below, it doesnt show a graph, I was wondering whether
    > someone could suggest whats wrong?


    What does it do? What does it do if you put a print statement after the
    ord() line? Maybe try "print repr(s), b"...

    > while 1:
    > s = ser.read()
    > b = ord(s)
    > h = []
    > h.append(b)
    > x = x + 1
    > plot(t,h)
    >
    > ser.close


    Note that the last line is incorrect: it should be ser.close(). Without
    the parentheses it just creates a temporary reference to the method,
    then discards it. (Of course, this isn't what's stopping your code from
    working.)

    You haven't provided us much detail, but what happens if you change the
    line that reads from the serial port to the following?

    s = '5'

    This, of course, will partition the problem, showing you whether the
    problem is with the serial reading or with the plotting. If it's still
    not plotting, you can assume you have missed a critical step in using
    pylab and you should probably go back a step and make sure you can run
    whatever tutorial or example code is included with pylab. (This is the
    first I've heard of pylab, so I can't help you there.)

    -Peter
     
    Peter Hansen, Nov 6, 2005
    #2
    1. Advertising

  3. Guest

    Yea I know the data is correct, all I do is sample my data with an ADC
    and then send it to the serial port. using hyper terminal or indeed
    pyserial presents the data as a ASCII charecters, the value of these
    Charecters is the converted to there equivalent decimal value using the
    ord() command.

    Basically the code was supposed to get the values from the serial port,
    place them in some sort of FIFO buffer with no limits on size and then
    plot the values each time a new value is recieved, constantly updating
    and presented near enough the graph of the current events.

    I can't actually get to the computer with the hardware setup on so i
    can't test the ideas you had, however I will do so tommmorw and report
    back...

    Im pretty certain however that its the plotting aspect of my routine
    that doesnt work as I have mucked around with the data fed from the
    serial port and its OK, for instance the sensor placed in an oven that
    has been heated and dried for hours presnets a value a lot less than
    that of the sensor placed in the spout of a boiling kettle - so the
    values here are ok for my purposes.

    thanks for the clues. wish there was a pylab expert around here as my
    example is copied from there tutorial, maybe I need to destory the
    window on each iteration or something?

    Does anyone know of a module designed for ploting real time data thats
    more appropriate for the above mentioned task than pylab??

    thanks

    David






    Peter Hansen wrote:
    > wrote:
    > > I've got a PIC microcontroller reading me humidity data via rs232, this
    > > is in ASCII format.

    >
    > What do you mean when you say it's in ASCII format? ASCII defines a
    > convention for representing control and printable characters. Do you
    > mean that the readings you get are shown in hyperterminal as numbers
    > such as "101"? Or something else?
    >
    > > I can view this data easily using hyperterminal or
    > > pyserial and convert it to its value (relative humidty with ord(input))

    >
    > Okay, since you don't show examples, we'll have to assume you know what
    > you're doing there...
    >
    > > My code is below, it doesnt show a graph, I was wondering whether
    > > someone could suggest whats wrong?

    >
    > What does it do? What does it do if you put a print statement after the
    > ord() line? Maybe try "print repr(s), b"...
    >
    > > while 1:
    > > s = ser.read()
    > > b = ord(s)
    > > h = []
    > > h.append(b)
    > > x = x + 1
    > > plot(t,h)
    > >
    > > ser.close

    >
    > Note that the last line is incorrect: it should be ser.close(). Without
    > the parentheses it just creates a temporary reference to the method,
    > then discards it. (Of course, this isn't what's stopping your code from
    > working.)
    >
    > You haven't provided us much detail, but what happens if you change the
    > line that reads from the serial port to the following?
    >
    > s = '5'
    >
    > This, of course, will partition the problem, showing you whether the
    > problem is with the serial reading or with the plotting. If it's still
    > not plotting, you can assume you have missed a critical step in using
    > pylab and you should probably go back a step and make sure you can run
    > whatever tutorial or example code is included with pylab. (This is the
    > first I've heard of pylab, so I can't help you there.)
    >
    > -Peter
     
    , Nov 6, 2005
    #3
  4. Kent Johnson Guest

    wrote:
    > Hiya,
    >
    > I've got a PIC microcontroller reading me humidity data via rs232, this
    > is in ASCII format. I can view this data easily using hyperterminal or
    > pyserial and convert it to its value (relative humidty with ord(input))
    >
    > But what im trying to do is plot the data in real time, ideally with
    > pylab - as it looks simple to use and simple is the way i want to go!
    >
    > My code is below, it doesnt show a graph, I was wondering whether
    > someone could suggest whats wrong?


    You have to call pylab.show() for the graph to be drawn. I don't know if it will work incrementally if you call show() in the loop.

    Kent

    >
    > thank you in advance
    >
    > David
    >
    > ########################################################################
    >
    > import serial
    > from pylab import *
    >
    > ser = serial.Serial(0)
    > t = arange(0.0, 1.0+0.01, 0.01)
    >
    > xlabel('time')
    > ylabel('RH %')
    > title(' RH sensor data sampled at 1 sec intervals ')
    > #grid(true)
    >
    > x = 0
    >
    > while 1:
    > s = ser.read()
    > b = ord(s)
    > h = []
    > h.append(b)
    > x = x + 1
    > plot(t,h)
    >
    > ser.close
    >
    > ########################################################################
    >
     
    Kent Johnson, Nov 6, 2005
    #4
  5. Juho Schultz Guest

    wrote:
    > Hiya,
    >
    > I've got a PIC microcontroller reading me humidity data via rs232, this
    > is in ASCII format. I can view this data easily using hyperterminal or
    > pyserial and convert it to its value (relative humidty with ord(input))
    >
    > But what im trying to do is plot the data in real time, ideally with
    > pylab - as it looks simple to use and simple is the way i want to go!
    >

    This might be close to what you are trying to do:

    import time
    import pylab
    # interactive mode on
    pylab.ion()
    timefig = pylab.figure(1)
    timesub = pylab.subplot(111)
    dt = 0.1
    t = pylab.arange(0.0, 2.0, dt)
    h = 1.2*pylab.sin(t)
    lines = pylab.plot(t,h)
    for i in range(8):
    t = t + dt
    h = 1.2*pylab.sin(t)
    lines[0].set_data(t,h)
    timesub.set_xlim((t[0],t[-1]))
    pylab.draw()
    time.sleep(1.0)

    It shows a piece of sine curve, and updates the x-axis with time.
     
    Juho Schultz, Nov 8, 2005
    #5
  6. wrote:

    > Does anyone know of a module designed for ploting real time data thats
    > more appropriate for the above mentioned task than pylab??


    You could have a look at my plotting package, Veusz, which can be embedded
    in other apps. You can update the data in real time, as the windowing runs
    in a separate thread.

    The main problem is that I have only really tested it on Unix, but I have
    reports that it "mostly" works in Windows (I'm looking into supporting this
    soon).

    http://home.gna.org/veusz/

    Alternatively matplotlib may be another solution.

    --
    Jeremy Sanders
    http://www.jeremysanders.net/
     
    Jeremy Sanders, Nov 8, 2005
    #6
  7. Guest

    Juho Schultz: Thanks for that, havent got time to modify it for my
    needs at the moment, but im sure it'll work as i've just tried it

    Jeremy Sanders: Cheers for that, i'll check it out.

    thanks to everyone else to!

    Thanks

    David
     
    , Nov 8, 2005
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jan Wienhausen

    pylab: plot update

    Jan Wienhausen, May 11, 2005, in forum: Python
    Replies:
    1
    Views:
    685
    Skip Montanaro
    May 11, 2005
  2. oyinbo55
    Replies:
    1
    Views:
    367
    three3q
    Jun 28, 2008
  3. W. eWatson
    Replies:
    0
    Views:
    377
    W. eWatson
    Apr 30, 2009
  4. bdb112
    Replies:
    2
    Views:
    2,597
    Carl Banks
    Oct 20, 2009
  5. Robert Kern
    Replies:
    0
    Views:
    1,773
    Robert Kern
    Nov 3, 2011
Loading...

Share This Page