2016-10-27 6 views
1

私はmcp3008と雨水センサーからデータを取るpythonプログラムを持っています。私はwxpythonを使ってguiに表示したいと思っています。これは私のセンサープログラムです:複数のwxpython静的テキストをmcp3008のデータで表示し、動的に更新する方法は?

import spidev 
from time import sleep 
import os 

spi = spidev.SpiDev() 
spi.open(0,0) 

def getAdc (channel): 
    if ((channel>7)or(channel<0)): 
     return -1 

    r = spi.xfer2([1, (8+channel) << 4, 0]) 

    adcOut = ((r[1]&3) << 8) + r[2] 
    percent = int(round(adcOut/10.24)) 
    volts = ((adcOut/1023) * 5) 
    if adcOut >= 0 and adcOut <= 300: 
      print "--------------------------------------------------------------" 
      print ("ADC Output:  {0:4d} Percentage: {1:3}% Voltage : {2} V".format(adcOut,percent,volts)) 
      print ("Rain Condition : Heavy Rain") 
      sleep(5) 

    elif adcOut >= 0 and adcOut <= 500: 
      print "--------------------------------------------------------------" 
      print ("ADC Output:  {0:4d} Percentage: {1:3}% Voltage : {2} V".format(adcOut,percent,volts)) 
      print ("Rain Condition : Moderate Rain") 
      sleep(5) 

    elif adcOut >= 0 and adcOut <= 700: 
      print "--------------------------------------------------------------" 
      print ("ADC Output:  {0:4d} Percentage: {1:3}% Voltage : {2} V".format(adcOut,percent,volts)) 
      print ("Rain Condition : Light Rain") 
      sleep(5) 

    else : 
      print "--------------------------------------------------------------" 
      print ("ADC Output:  {0:4d} Percentage: {1:3}% Voltage : {2} V".format(adcOut,percent,volts)) 
      print ("Rain Condition : No Rain") 
      sleep(5) 
while True: 
    getAdc(0) 

ここに私のwxpythonプログラムを作成して表示します。 2つのプログラムを1つに結合してデータを表示する方法を教えてください。この後

import datetime 

global current_time 
current_time = datetime.datetime.strftime(datetime.datetime.now(), '%d-%m-%y %H:%M:%S') 

try: 
    import wx 
except ImportError: 
    raise ImportError, "The wxPython module is required to run this program." 

class RainSensorApp_wx(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, size = (500, 300)) 
     self.SetBackgroundColour(wx.BLUE) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 
     sizer = wx.GridBagSizer() 
     font = wx.Font(20, wx.DECORATIVE, wx.ITALIC, wx.NORMAL) 
     self.SetFont(font) 

     self.label = wx.StaticText(self, -1, label = u'Rain Sensor Level: {0:4d} Percentage:  {1:3}% Voltage: {2} V'.format(adcOut, percent, volts)) 
     self.label.SetBackgroundColour(wx.BLUE) 
     self.label.SetForegroundColour(wx.WHITE) 
     sizer.Add(self.label, (1,0), (1,2), wx.EXPAND) 

     self.label = wx.StaticText(self, -1, label = u'Rain Condition: {}'.format(rain_condition)) 
     self.label.SetBackgroundColour(wx.BLUE) 
     self.label.SetForegroundColour(wx.WHITE) 
     sizer.Add(self.label, (2,0), (1,3), wx.EXPAND) 

     self.label = wx.StaticText(self, -1, label = u'Time Updated: {}'.format(current_time)) 
     self.label.SetBackgroundColour(wx.BLUE) 
     self.label.SetForegroundColour(wx.WHITE) 
     sizer.Add(self.label, (3,0), (1,4), wx.EXPAND) 

     self.SetSizer(sizer) 
     self.Show(True) 

    def on_timer(self): 
     wx.CallLater(1000, self.on_timer) 

if __name__ == "__main__": 
    app = wx.App() 
    frame = RainSensorApp_wx(None, -1, 'Rain Sensor Monitor') 
    app.Mainloop() 
    getAdc(0) 

私はちょうど昨日、それを学ぶように動的複数wxPythonの静的テキストを更新するCallLaterを使用して、タイマーを追加します。私は誰が私を助け、私のポストを読むことに感謝します。

答えて

0

私はspidevビットをエミュレートする必要がありますが、これはちょっとしたハックですが、これはあなたを起動させるのに十分なはずです。
コードは重要であると思うところで文書化されています。

import datetime 
#import spidev 
from time import sleep 
import os 

#spi = spidev.SpiDev() 
#spi.open(0,0) 
#Setup some variables as I don't have spidev 
global adcOut 
adcOut = 200 
percent = int(round(adcOut/10.24)) 
volts = ((adcOut/1023) * 5) 
rain_condition="none" 

global current_time 
current_time = datetime.datetime.strftime(datetime.datetime.now(), '%d-%m-%y %H:%M:%S') 

try: 
    import wx 
except ImportError: 
    raise ImportError, "The wxPython module is required to run this program." 

class RainSensorApp_wx(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, size = (500, 300)) 
     self.SetBackgroundColour(wx.BLUE) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 
     sizer = wx.GridBagSizer() 
     font = wx.Font(20, wx.DECORATIVE, wx.ITALIC, wx.NORMAL) 
     self.SetFont(font) 
     self.label1 = wx.StaticText(self, -1, label = u'Rain Sensor Level: {0:4d} Percentage:  {1:3}% Voltage: {2} V'.format(adcOut, percent, volts)) 

     #Give the labels unique names 

     self.label1.SetBackgroundColour(wx.BLUE) 
     self.label1.SetForegroundColour(wx.WHITE) 
     sizer.Add(self.label1, (1,0), (1,2), wx.EXPAND) 

     self.label2 = wx.StaticText(self, -1, label = u'Rain Condition: {}'.format(rain_condition)) 
     self.label2.SetBackgroundColour(wx.BLUE) 
     self.label2.SetForegroundColour(wx.WHITE) 
     sizer.Add(self.label2, (2,0), (1,3), wx.EXPAND) 

     self.label3 = wx.StaticText(self, -1, label = u'Time Updated: {}'.format(current_time)) 
     self.label3.SetBackgroundColour(wx.BLUE) 
     self.label3.SetForegroundColour(wx.WHITE) 
     sizer.Add(self.label3, (3,0), (1,4), wx.EXPAND) 

    #Create a timer and perform on_timer every 1000 milliseconds(change to 5000) 
     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.on_timer, self.timer) 
     self.timer.Start(1000) 

     self.SetSizer(sizer) 
     self.Show(True) 

    def on_timer(self,event): 
     channel = 0 
     if ((channel>7)or(channel<0)): 
      return -1 
    #Hack out spidev references and use globals to emulate something happening 

#  r = spi.xfer2([1, (8+channel) << 4, 0]) 
#  adcOut = ((r[1]&3) << 8) + r[2] 

     global adcOut 
     adcOut = adcOut +1 
     percent = int(round(adcOut/10.24)) 
     volts = ((adcOut/1023) * 5) 
     if adcOut >= 0 and adcOut <= 300: 

     # Update the screen output 

       self.label1.SetLabel("ADC Output:  {0:4d} Percentage: {1:3}% Voltage : {2} V".format(adcOut,percent,volts)) 
       self.label2.SetLabel("Rain Condition : Heavy Rain") 

     elif adcOut >= 0 and adcOut <= 500: 
       self.label1.SetLabel("ADC Output:  {0:4d} Percentage: {1:3}% Voltage : {2} V".format(adcOut,percent,volts)) 
       self.label2.SetLabel("Rain Condition : Moderate Rain") 

     elif adcOut >= 0 and adcOut <= 700: 
       self.label1.SetLabel("ADC Output:  {0:4d} Percentage: {1:3}% Voltage : {2} V".format(adcOut,percent,volts)) 
       self.label2.SetLabel("Rain Condition : Light Rain") 

     else : 
       self.lable1.SetLabel("ADC Output:  {0:4d} Percentage: {1:3}% Voltage : {2} V".format(adcOut,percent,volts)) 
       self.lable2.SetLabel("Rain Condition : No Rain") 

if __name__ == "__main__": 
    Rs = wx.App() 
    RainSensorApp_wx(None, -1, 'Rain Sensor Monitor') 
    Rs.MainLoop() 
+0

ご回答ありがとうございます。私はこの火曜日のあなたの解決策を行い、それをテストした後にそれについてのアップデートを与える。誰かが他の答えを持っているなら、もっと解決策として私はそれを歓迎します。私はもっと成功した答えを得るでしょう。 – anubismmt

+0

私はあなたのコードを試していますが、GUIプログラムの起動前にPython 2.7.10シェルで(SyntaxWarning:name 'adcOut'がグローバル宣言の前に割り当てられています。また、ボルトコードを小数点以下2桁に変更し、self.label3.SetLabel( "Time Updated:{}"。format(current_time))をグローバルcurrent_timeに追加して、current_timeを初期化します。時間 – anubismmt

+0

答えとして「十分にあなたを始めてください」と書かれているように、「mcp3008と雨水センサー」にアクセスできないという事実を克服するのはちょっとしたハックでした。フォーマットと時間の問題、元のコードにはそれらが含まれておらず、私は心の読者ではありません。 –

関連する問題