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
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é. –
pouvez-vous me montrer ce qu'il faut enlever de mon code par le jeu de mot # dans mon code ci-dessus. – anubismmt
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. –