2016-11-07 1 views
0

J'ai un code wxpython complet qui peut lire les données du capteur de pluie et le convertir d'analogique en numérique avec mcp3008. Le problème est le pi de framboise actuel que j'utilise, a déjà un écran 20x4 lcd qui utilise la broche 24 ou GPIO 8 dont j'ai besoin pour mon programme de capteur de pluie. J'ai lu de https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters/mcp3008#software-spi sur la façon de changer ma connexion spi au logiciel SPI. Voici mon MCP3008 Brochage à pi framboise sans écran LCD: MCP3008 VDD -> 5 VComment changer mon programme wxpython qui lit et affiche les données du capteur de pluie de mcp3008 vers le logiciel spi?

MCP3008 VREF -> 5 V

MCP3008 AGND -> GND

MCP3008 CLK -> pin 23

MCP3008 DOUT -> 21 broches

MCP3008 DIN -> 19 broches

MCP3008 CS -> 24 broches

MCP3008 DGND -> GND

Voici mon code wxpython pour le capteur de pluie:

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() 

Voici l'exemple de code de la AdaFruit_MCP3008 après avoir suivi les étapes sur le Web donnée à installer la bibliothèque :

# 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) 

quelqu'un peut me aider sur la façon de changer mon programme pour lire les données avec le logiciel spi, comme je l'ai besoin de changer la configuration du logiciel à spi:

CLK = 23

MISO = 21

MOSI = 19

CS = 29

+0

Comme je vous l'ai dit dans votre question précédente "Toutes" les références à 'adcOut' autre que l'original' adcOut = ((r [1] & 3) << 8) + r [2] 'ne sont pas pertinentes pour votre code et devrait être retiré. –

+0

pouvez-vous me montrer ce qu'il faut enlever de mon code par le jeu de mot # dans mon code ci-dessus. – anubismmt

+0

J'ai oublié que vous avez besoin des variables pour l'affichage initial. Je l'ai édité et j'espère que c'est maintenant correct. –

Répondre

0

Sans savoir ce que Adafruit_MCP3008 retourne et sans accès au matériel pour pouvoir le tester, Je suspecte que votre ligne existante:

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

devrait être remplacé par:

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) 

La seule façon de savoir à coup sûr serait d'imprimer r comme dans votre configuration actuelle puis faire la même chose pour le nouveau, pour voir s'il y a des différences et ce qu'ils sont.

+0

Maintenant, dois-je supprimer ce code: canal = 0 si ((canal> 7) ou (canal <0)): return -1 adcOut = ((r [1] & 3) << 8) + r [2 ] – anubismmt

+0

ou pouvez-vous poster le code édité terminé afin que je puisse voir plus clairement où le changer. – anubismmt

+0

J'ai modifié le code dans votre question. Sachez que c'est juste une supposition, car je n'ai pas l'équipement à ma disposition pour tester.Cela dit logiquement, cela semble juste, même si vous devrez peut-être ajuster la logique bit à bit et le décalage à gauche. –