Live Data Chart ve Seri Port için Python

Başlatan muhittin_kaplan, 21 Aralık 2016, 03:01:43

muhittin_kaplan

Visual Studio çalışmak gerçekten çok rahat. ama birkaç iş için o kadar bileşen yüklenmesinden artık gına geldi. Elimdeki GPS modulunden aldığım bilgilerle yapmak istediğim bir kaç iş için yığınla dosyayı yüklemek istemedim. Bu konu için pythona başvurmak , Python 3 ü ve pycharm yüklemek mathplotlib ile de live olarak chart çizdirmek istedim. Çünkü manyağım.

Donanım tarafında birşey yok ublox uno 6m ve ft232 usart-usb dönüştürücü mevcut. Program, seriporttan aldığı gps datasının (NMEA) içinden önce GPGGA yı buluyor. Bu gelen srteam içeriğinden elevatin u seçiyor ( splitString[9] ). Yükseklik verisini önce kalman a sonrada aritmetik ortalama tabi tutarak grafikte gösteriyor.

Kodlarım çok sofistikedir lütfen kurcalamayınız..

#!/usr/bin/python

import serial
import codecs

import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
import numpy

#Kalman Değişkenler
Xk = 0.0
Pk = 1.0
Rvalue = 0.01

#MATHPLOTLIB ile alakalı ayarlar

#style.use('fivethirtyeight')
fig=plt.figure()
ax1=fig.add_subplot(1,1,1)
ax2=fig.add_subplot(1,1,1)
ax3=fig.add_subplot(1,1,1)

#SeriPort Ayarlamaları

ser = serial.Serial()
ser.baudrate=9600
ser.port="COM3"
ser.open()


x=0
xs = []
ys = []
zs=[]
ts=[]

#COM3', 9600, timeout=0,parity=serial.PARITY_NONE, rtscts=1)
def KALMAN(zk):
    global Xk
    global  Pk
    global Rvalue

    KK=0.0
    KK = Pk / (Pk + Rvalue)
    Xk = Xk + KK * (zk - Xk)
    Pk = (1 - KK) * Pk
    return Xk


def animate(i):
    try:

        global x
        s = ser.readline()
        splitString = (codecs.decode(s)).split(",")

        if ((splitString[0]) == "$GPGGA"):
            # print(s) "Saat:",splitString[1]," Lon:",splitString[2],splitString[3]," Lat:",splitString[4],splitString[5],
            KalmanValue = KALMAN(float(splitString[9]))

            x=x+1
            xs.append(x)
            ys.append(KalmanValue)
            zs.append(float(splitString[9]))

            OrtArray=zs[-10:]#ilk 20 yok.
            print(splitString[9],"    ",OrtArray)

            Ortalama = sum(OrtArray) / len(OrtArray)
            ts.append(Ortalama)

            #print(" Elev", splitString[9], " Kalman", KalmanValue, " ORT", Ortalama)
            ax1.clear()
            ax1.plot(xs,ys)
            ax2.plot(xs, zs)
            ax3.plot(xs,ts)

            if (x>100):#100 ü geçerse ilkini sil ortalamada da 50 olur
                xs.pop(0)
                ys.pop(0)
                zs.pop(0)
                ts.pop(0)
    except:
        print ("HATA")

ani=animation.FuncAnimation(fig,animate,interval=100)
plt.show()



https://youtu.be/kkzn3m_T1RI



ekleme...

python3 ü ve diğer gerekli modülleri için (matplotlib numpy gibi) anaconda yı yükleyiniz ki tüm gereksinimler gelsin. anaconda iyidir.
https://www.continuum.io/downloads.

bunu yüklemiş olmanız serialport modülünü yüklediğiniz anlamınada gelmez onun içinde aşağıdaki serial modülünü yüklemeniz gerekir.
https://pythonhosted.org/pyserial/

serial modul dosyasını indirdikten sonra