首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将读取和显示雨量传感器数据的wxpython程序从mcp3008更改为软件spi?

如何将读取和显示雨量传感器数据的wxpython程序从mcp3008更改为软件spi?
EN

Stack Overflow用户
提问于 2016-11-07 15:32:53
回答 1查看 215关注 0票数 0

我有一个完整的wxpython代码,可以读取雨量传感器的数据,并用mcp3008将其从模拟转换为数字。问题是,我目前使用的树莓派,已经有一个20x4的lcd显示器,使用引脚24或GPIO 8,我需要为我的雨量传感器程序。我从https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters/mcp3008#software-spi上读到了关于如何将我的spi连接更改为软件spi的文章。这是我的不带液晶显示屏的树莓派的mcp3008引脚: MCP3008 VDD -> 5V

MCP3008正向参考-> 5V

MCP3008和-> GND

MCP3008时钟->引脚23

MCP3008 DOUT ->引脚21

MCP3008 DIN ->引脚19

MCP3008 CS ->引脚24

MCP3008设备->设备

下面是我的雨量传感器的wxpython代码:

代码语言:javascript
复制
import datetime
import spidev
from time import sleep
import os

spi = spidev.SpiDev()
spi.open(0,0)
#global adcOut
adcOut = 0
percent = 0
volts = 0
rain_condition = ""

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 = (700, 300))
        self.SetBackgroundColour(wx.WHITE)
        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))

        self.label1.SetBackgroundColour(wx.WHITE)
        self.label1.SetForegroundColour(wx.BLACK)
        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.WHITE)
        self.label2.SetForegroundColour(wx.BLACK)
        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.WHITE)
        self.label3.SetForegroundColour(wx.BLACK)
        sizer.Add(self.label3, (3,0), (1,4), wx.EXPAND)

        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

        #r = spi.xfer2([1, (8+channel) << 4, 0])
        #REPLACEMENT
        r = [0]*8
        for i in range(8):
        # The read_adc function will get the value of the specified channel (0-7).
            r[i] = mcp.read_adc(i) 
        #END REPLACEMENT
        adcOut = ((r[1]&3) << 8) + r[2]

        #global adcOut
        percent = int(round(adcOut/10.24))
        volts = ((adcOut/float (1023)) * 5)
        volts = round(volts, 2)

        global current_time
        current_time = datetime.datetime.strftime(datetime.datetime.now(), '%d-%m-%y   %H:%M:%S')
        if adcOut >= 0 and adcOut <= 300:
            self.label1.SetLabel("ADC Output: {0:4d}   Percentage: {1:3}%   Voltage: {2}V".format(adcOut, percent, volts))
            self.label2.SetLabel("Rain Condition: Heavy Rain")
            self.label3.SetLabel("Time Updated: {}".format(current_time))

        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")
            self.label3.SetLabel("Time Updated: {}".format(current_time))

        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")
            self.label3.SetLabel("Time Updated: {}".format(current_time))

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

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

以下是在我按照web上给出的步骤安装库之后,AdaFruit_MCP3008中的示例代码:

代码语言:javascript
复制
# Simple example of reading the MCP3008 analog input channels and printing
# them all out.
# Author: Tony DiCola
# License: Public Domain
import time

# Import SPI library (for hardware SPI) and MCP3008 library.
import Adafruit_GPIO.SPI as SPI
import Adafruit_MCP3008


# Software SPI configuration:
CLK  = 18
MISO = 23
MOSI = 24
CS   = 25
mcp = Adafruit_MCP3008.MCP3008(clk=CLK, cs=CS, miso=MISO, mosi=MOSI)

# Hardware SPI configuration:
# SPI_PORT   = 0
# SPI_DEVICE = 0
# mcp = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE))


print('Reading MCP3008 values, press Ctrl-C to quit...')
# Print nice channel column headers.
print('| {0:>4} | {1:>4} | {2:>4} | {3:>4} | {4:>4} | {5:>4} | {6:>4} |     {7:>4} |'.format(*range(8)))
print('-' * 57)
# Main program loop.
while True:
    # Read all the ADC channel values in a list.
    values = [0]*8
    for i in range(8):
        # The read_adc function will get the value of the specified channel (0-7).
        values[i] = mcp.read_adc(i)
    # Print the ADC values.
    print('| {0:>4} | {1:>4} | {2:>4} | {3:>4} | {4:>4} | {5:>4} | {6:>4} | {7:>4} |'.format(*values))
    # Pause for half a second.
    time.sleep(0.5)

有人可以帮助我如何更改我的程序,以便使用软件spi读取数据,因为我需要将软件spi配置更改为:

CLK = 23

MISO = 21

MOSI = 19

CS = 29

EN

回答 1

Stack Overflow用户

发布于 2016-11-08 17:45:51

在不知道Adafruit_MCP3008返回什么,也无法访问硬件进行测试的情况下,我怀疑您现有的代码行:

代码语言:javascript
复制
r = spi.xfer2([1, (8+channel) << 4, 0])

应替换为:

代码语言:javascript
复制
r = [0]*8
for i in range(8):
    # The read_adc function will get the value of the specified channel (0-7).
    r[i] = mcp.read_adc(i) 

唯一确定的方法是打印出当前设置中的r,然后对新的设置执行相同的操作,以查看是否有任何不同之处以及它们是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40459949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档