2016-09-05 9 views
0

В настоящее время я делаю проект, который требует мониторинга в реальном времени различных величин, таких как температура, давление, влажность и т. Д. Я следую за подходом к созданию отдельных массивов всех датчиков и построению графика с использованием matplotlib и drwnow.Графическое отображение температуры в реальном времени с помощью python

HOST = "localhost" 
PORT = 4223 

UID1 = "tsJ" # S1 

from tinkerforge.ip_connection import IPConnection 
from tinkerforge.bricklet_ptc import BrickletPTC 
import numpy as np 
import serial 

import matplotlib 
from matplotlib.ticker import ScalarFormatter, FormatStrFormatter 

import matplotlib.pyplot as plt 
from matplotlib import style 
style.use('ggplot') 

from drawnow import * 

# creating arrays to feed the data 

tempC1 = [] 

def makeafig(): 

    # creating subplots 
    fig1 = plt.figure(1) 

    a = fig1.add_subplot(111) 

    #setting up axis label, auto formating of axis and title 
    a.set_xlabel('Time [s]', fontsize = 10) 
    a.set_ylabel('Temperature [°C]', fontsize = 10) 
    y_formatter = matplotlib.ticker.ScalarFormatter(useOffset=False) 
    a.yaxis.set_major_formatter(y_formatter) 
    title1 = "Current Room Temperature (Side1): " + str(temperature1/100) + " °C" 
    a.set_title(title1, fontsize = 10) 

    #plotting the graph 
    a.plot(tempC1, "#00A3E0") 

    #saving the figure 
    fig1.savefig('RoomTemperature.png', dpi=100) 

while True: 

    ipcon = IPConnection() # Create IP connection 
    ptc1 = BrickletPTC(UID1, ipcon) # S1 

    ipcon.connect(HOST, PORT) # Connect to brickd 

    #setting the temperature from PTC bricklet 

    temperature1 = ptc1.get_temperature() 


    #processing data from a temperature sensor to 1st array 
    dataArray1=str(temperature1/100).split(',') 
    temp1 = float(dataArray1[0]) 
    tempC1.append(temp1) 

    #making a live figure 
    drawnow(makeafig) 
    plt.draw() 

Это подход, который я нашел хорошо в Интернете, и он работает. Единственная проблема, с которой я столкнулся, - она ​​потребляет больше времени, если я делаю больше массивов для других датчиков, а график получается задерживается в реальном времени, когда я сравниваю его с секундомером.

Есть ли хороший и эффективный подход к получению живых графиков, которые будут эффективны с множеством датчиков и отсутствием задержки в реальном времени. Или любая команда для очистки значений уже построенных массивов?

Я был бы обязан, если кто-нибудь может помочь мне с этой проблемой.

+0

Вы показывая их на сайте? Если да, то как насчет генерации json (ваши данные графика) с помощью python и создания интерактивной диаграммы с помощью javascript? – PhilipB

+0

@PhilipB Спасибо, что ответили. Нет. Я не показываю его прямо на веб-сайте. Сохраненный график продолжает обновляться до запуска скрипта, а затем у меня есть другой совершенно другой скрипт, который отправляет эту сохраненную цифру на облачный сервер. – Ajay

+0

Обсуждали ли вы использование потоков для получения данных? Кроме того, может быть, слишком много данных для отправки сразу с другим скриптом? – mpurg

ответ

0

Я хотел бы спросить, постоянно ли заполняет данные в массивах, что замедляет процесс или это мое заблуждение?

Это легко проверить; создавая пустой список и добавляя несколько тысяч значений, он занимает примерно 10^-4 секунды, поэтому это не должно быть проблемой. Для меня несколько удивительно, что это на самом деле быстрее, чем создание и заполнение фиксированного размера numpy.ndarray (но это, вероятно, будет зависеть от размера списка/массива).

Я быстро играл с makeafig() функции, размещение a = fig1.add_subplot(111) до (включительно) a.plot(..) в простом for i in range(1,5) цикле, с a = fig1.add_subplot(2,2,i); что составляет makeafig() примерно на 50% медленнее, но разница составляет всего лишь 0,1-0,2 секунды. Это в соответствии с задержкой, которую вы испытываете?

Это о том, что я могу проверить без реальных данных, моим следующим шагом будет время от части от ipcon=.. до temperature1=... Возможно, узким местом является просто поиск данных? Я уверен, что есть несколько примеров по SO о том, как ко времени части скриптов Python, для такого рода проблем, как-то в приведенном ниже примере, должно быть достаточно:

import time 
t0 = time.time() 
# do something 
dt = time.time() - t0 
+0

Большое вам спасибо за ваше время и помощь. Вид отставания, который я испытываю, составляет 7 секунд на моем графике до 1 в реальном времени. Во всяком случае, я попробую узнать эту функцию времени, о которой вы упомянули, и реализовать в моем скрипте. Еще раз спасибо за ценные отзывы. – Ajay

Смежные вопросы