Analogue 感测器 On 的Raspberry Pi Using An MCP3008

99

树莓派没有内置模拟输入,这意味着要使用许多可用的传感器有点麻烦。我想通过使用更多传感器的功能来更新我的车库安全系统,所以我决定研究一种简单且便宜的方法。 MCP3008就是答案。

MCP3008是10位8通道模数转换器(ADC)。它便宜,易于连接并且没有 ’不需要任何其他组件。它使用Pi支持的SPI总线协议’s 通用输入输出 header.

本文介绍了如何使用MCP3008器件提供8个模拟输入,您可以将其与一系列传感器配合使用。在下面的示例电路中,我使用MCP3008读取温度和光传感器。

这是我使用的位:

  • 树莓派
  • MCP3008 8通道ADC
  • 光敏电阻(LDR)
  • TMP36温度传感器
  • 10 Kohm电阻

的first step is enabling the SPI 接口 上 the Pi which is usually disabled by default.

请跟随我的 Enabling 的SPI Interface On 的Raspberry Pi 设置SPI和安装SPI 蟒蛇包装器的文章。

电路图

MCP3008

的following list shows how the MCP3008 can be connected. It requires 4 通用输入输出 pins 上 the Pi P1 Header.

VDD   3.3V
VREF  3.3V
AGND  GROUND
CLK   通用输入输出11 (P1-23)
DOUT  通用输入输出9  (P1-21)
DIN   通用输入输出10 (P1-19)
CS    通用输入输出8  (P1-24)
DGND  GROUND

的CH0-CH7 pins are the 8 analogue inputs.

这是我的实验板电路:

MCP3008面包板It uses CH0 for the light 传感器 和 CH1 for the TMP36温度传感器. 的other 6 inputs are spare.

这是我的测试电路在小面包板上的照片:

MCP3008示例电路2

LDR示例光敏电阻

我选择了一个不错的矮胖LDR(NORPS-12, 数据表)。在正常照明下,其电阻约为10Kohm,而在黑暗中,该电阻会增加到2Mohm以上。

当光线充足时,LDR的电阻较低,导致输出电压下降至0V。

黑暗时,LDR电阻增加,导致输出电压增加至3.3V。

TMP36温度传感器TMP36温度传感器

的TMP36温度传感器 is a 3 pin device (数据表)。您可以使用3.3V为其供电,中间的Vout引脚将提供与温度成比例的电压。

25摄氏度的温度将产生0.750V的输出。每度会产生10mV的输出电压。

因此0度将提供0.5V,而100度将提供1.5V。

Reading 的Data Using a 蟒蛇 Script

ADC为10位,因此它可以报告从0到1023(2到10的幂)的数字范围。读数为0表示输入为0V,读数为1023表示输入为3.3V。使用TMP36,我们的0-3.3V范围相当于-50至280摄氏度的温度范围。

要读取数据,我使用了以下Python脚本:

#!/usr/bin/python

import Spidev
import time
import os

# Open SPI bus
spi = Spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz=1000000

# Function 至 read SPI data from MCP3008 chip
# Channel must be an integer 0-7
def 阅读频道(channel):
  adc = spi.xfer2([1,(8 + channel)<<4,0])
  数据= ((adc[1]&3) << 8) + adc[2]
  返回数据

# Function 至 convert data 至 voltage level,
# rounded 至 specified number of decimal 地方.
def ConvertVolts(data,places):
  volts = (data * 3.3) / 浮动(1023)
  volts = round(volts,places)
  return volts

# Function 至 calculate 温度 from
# TMP36 data, rounded 至 specified
# number of decimal 地方.
def ConvertTemp(data,places):

  # ADC Value
  # (approx)  Temp  Volts
  #    0      -50    0.00
  #   78      -25    0.25
  #  155        0    0.50
  #  233       25    0.75
  #  310       50    1.00
  #  465      100    1.50
  #  775      200    2.50
  # 1023      280    3.30

  temp = ((data * 330)/float(1023))-50
  temp = round(temp,places)
  return temp

# Define 传感器 channels
light_channel = 0
temp_channel  = 1

# Define delay between readings
delay = 5

while True:

  # Read the light 传感器 data
  light_level = 阅读频道(light_channel)
  light_volts = ConvertVolts(light_level,2)

  # Read the 温度 传感器 data
  temp_level = 阅读频道(temp_channel)
  temp_volts = ConvertVolts(temp_level,2)
  temp       = ConvertTemp(temp_level,2)

  # Print out results
  print "--------------------------------------------"
  print("Light: {} ({}V)".format(light_level,light_volts))
  print("Temp : {} ({}V) {} deg C".format(temp_level,temp_volts,temp))

  # Wait before repeating loop
  time.sleep(delay)

这是输出的屏幕截图:

MCP3008截图

您可以使用以下命令将此脚本直接下载到您的Pi:

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/mcp3008/mcp3008_tmp36.py

然后可以使用以下命令运行它:

sudo 蟒蛇 mcp3008_tmp36.py

另外,如果您是Git爱好者,则可以使用以下命令克隆我的Raspberry Pi misc脚本存储库:

git clone //bitbucket.org/MattHawkinsUK/rpispy-misc.git

spi.xfer2的附加说明

Lots of people have asked about the spi.xfer2 line. This sends 3 bytes 至 the device. 的first byte is 1 which is equal 至 00000001 in binary.

“8+channel”二进制为00001000(通道为0)。“<<4” shifts those bits 至 the left which gives 10000000. 的last byte is 0 which is 00000000 in binary.

So “spi.xfer2([1,(8 + channel)<<4,0])”发送00000001 10000000 00000000到设备。然后,设备将发送回3个字节​​作为响应。的“data=”行从该响应中提取10位,这代表测量值。

的exact reason why you do the above is explained in the 数据表 but that is outside the scope of this 文章.

更多信息

如果您需要有关该设备的更多技术信息,请查看 官方Microchip MCP3008数据表。如果您想了解有关SPI总线的更多信息,请查看 串行外围设备接口总线Wikipedia页面.

 

分享。

99条留言

  1. 理查德·莱恩斯

    伟大的文章解决了其中之一’s main shortcomings.

    当MCP3208花费几美分而只有12位时,为什么人们会选择使用MCP3008获得10位呢?我相信这个’的引脚和代码也兼容。您最好选择所有可用的分辨率…admittedly it’用户可以对输入进行模拟滤波,以充分利用可用的分辨率。

    • 安迪克罗夫茨

      模拟滤波’d可以工作,但平均计算软件中的输入电压要便宜。
      想起我早期使用Nicolet频谱分析仪的日子,通过增加一点点,我们获得了额外的½位分辨率’s值的模拟输入噪声。我们必须先过滤(抗锯齿–奈奎斯特等…),但临时测量混叠不是’t an issue, so any ‘noise’如果平均,例如在演示前说4个样本,则可能实际上是有益的…然后在‘places’变量。值得尝试的YMMV。

  2. 理查德·莱恩斯

    是的,模拟过滤取决于您的应用…if all you’r doing is monitoring an essentially static voltage then software filtering is fine for removing the residual 噪声 ….if you’重新查看具有已知AC含量的信号,则需要担心Nyquist采样率和抗混叠。

    抖动是低分辨率转换器的老把戏。超过12位,您通常可以免费获得,尤其是面包板布局。

    I’d想看到使用Raspberry Pi完成的功能完善的数据记录器。 Adafruit出售组装在小型PCB上的16位4通道ADC。带有RTC芯片的其中四个将构成一个非常有用的16通道数据记录器,该记录器可以使用12v电池,相当低的功率且没有活动部件(风扇,磁盘驱动器等)运行,并且不会’捆绑一台电脑。我一直计划自己做,但从不解决…..
    RL

    • 戴夫·戈德史密斯

      我知道这篇文章很老,但是我’m现在从树莓派构建数据记录器。我使用的是3008,但我使用的是COTS数据记录仪’我尝试仿制的分辨率比我的Pi好,所以我’m尝试修改代码并立即切换到3208。

      • 我尝试保持此帖子的最新状态’很受欢迎。希望它在您的项目中仍然有用。让我知道您是否遇到任何问题。

    • You could use any LDR. 的article deals specifically with the MCP3008 ADC but you could use another …但它必须与引脚兼容并且还使用SPI协议。

      • 嗨,马特,

        我只是用其他LDR,TEPT5700 Vishay光电二极管和IR光电二极管进行了尝试。

        我为每个人使用相同的电路和电阻器(10K欧姆),结果几乎相同。

        的fun begins….

  3. 嘿,如果不时读取SPI可能是什么问题…

    It’s始终为0,然后突然显示正确的值,然后再次为0?

    谢谢s 马特

  4. 你好

    只是想说谢谢您发布这个。
    刚去买了一个和一些红外发光二极管。

    I’以前,我们已经建立了一种将莫尔斯电码从一个RPi传递到另一个RPi的方法,因此这是一种轻巧地尝试该方法的王牌方法。

    乔治

    • 我可以’t see why it wouldn’t work with the 型号A. 的GPIO pins are the same so should be identical 至 the B型 as far as the MCP3008 is concerned.

  5. 你好

    感谢您的回答。当我尝试使网络无线电太阳能/电池供电时,我将获得A模型。与模型B相比,它们应该仅吸收大约1/3的能量。

    的one existing usb-port will be used for a wlan-adapter.

    施瓦宾格

    • 当我对AA电池进行测试时,模型A的功耗确实约为模型B的1/3。我通常在模型B上进行开发,然后在不使用时将卡移至模型A。’不再需要网络插座。

  6. 巴尼·沃德

    对于我们这些试图同时使用两个Python的Spi接口的人,您能解释一下调用spi.xfer2函数并组织数据的两行括号中的位实际上是如何工作的:

    adc = spi.xfer2([1,(8 + channel)<<4,0])
    数据= ((adc[1]&3) << 8) + adc[2]

    的datasheet is pretty complex from a standing start!

    问候,

    巴尼·沃德

  7. 你好
    感谢这篇文章,它’真的很有趣!
    但是我有一个疑问。

    是否可以使用MCP3008和RPi监视12V电池电压?
    并在同一个MCP3008中使用温度传感器/ LDR以及监视12V电池电压吗?

    为此将如何连接?
    我想用pi管理一些可再生能源’我现在用12F675来做),但在这种情况下,我不’知道怎么做,因为我需要电池的接地和正极,然后用Pi读取MCP:/

    提前致谢。

    • I’确保您可以监控0-12V的电平,但是您需要将12V的最大值缩放至3.3V。也许使用简单的电阻分压器? MCP3008具有8个输入通道,因此您可以同时监视电压和光传感器。

  8. I’按照本教程进行操作,仅使用光电管。一世’取消了温度传感器。

    当我在空闲状态下运行python代码时,我总是会得到相同的数据
    adc [0,3,255]
    电压3.3v
    轻1023

    No matter what I do, 我可以’似乎无法弄清楚我的问题是什么。
    的photocell I have has been tested 和 it works.
    I’ve在mcp3008上尝试了不同的通道并给出了相同的读数。

    My next test is going 至 be with a potentiometer 至 see if 我可以 get readings from it.

    任何帮助将不胜感激。

    谢谢s,
    乔治

      • 我刚刚尝试过,电压保持在3.3v

        当我测试锅上的欧姆时,它会以应有的变化电阻返回。

        但是,当将其连接到pi时不会反映出来。

        还有其他想法吗?

        • 嗨乔治,

          我的设置存在类似问题。 1023是我得到的常数值,不要’t know why doesn’它改变了。如果您现在知道如何解决问题,可以帮我进行故障排除吗?提前致谢。

  9. 我的全尺寸面包板实际上一分为二。我在一半而不是另一半上运行3v。因此,芯片永远无法获得电源。

    新秀错误….

  10. 你好出色的教程。

    我仅使用温度部分,因此已注释掉了光传感器的行。一切正常,但是我有两个问题:
    1 – 的temperature 上ly ever reads in full degrees, even though it’s保留到小数点后一位。我是否真的缺少明显的东西?一世’d非常想获得更详细的温度读数。
    2 –我在大约1m的电缆(cat5的备用电缆)上安装了tmp36。它的读数似乎比已知温度低4至5度。大概电缆的长度可能是这里的问题(我’我尝试了两种不同类型的电缆,结果大致相同)。我将如何对此进行某种纠正?

    I’我希望这些是真的简单的东西,像我这样的菜鸟才没看到。一世’d非常非常感谢任何正确方向的指点。

    谢谢s,
    史蒂夫。

    • 嗨史蒂夫,

      您发现了一个错误。除以整数(1023)时,它将强制输出为整数。因此,它将丢失计算中的小数点。我将1023的值包装在“float” which now retains the decimal 地方. These are then rounded 至 2 decimal 地方.

      至于精度我’我不确定我还没有’•在长电缆上使用了传感器。可能是由于电线干扰造成的吗?如果尝试较短的长度怎么办?

      • 出色且写得很好的教程,感谢马特(Matt)花费的时间和精力,使我们所有人都能轻松完成此任务。一世’使用温度传感器也有类似的偏移量。但是,当检查传感器的输出时,电压与温度是正确的。快速浏览一下使我相信这可能是由于MCP3008的输入阻抗所致,并且可能需要一些其他简单电路来增强来自传感器的信号。

          • 嗨,Ulf。感谢您的建议。我慢慢得出的结论是,电线长度可能会造成干扰,在我的情况下约为5m。即使导线长度为零,我仍然可以读取约5C。用这么长的线,它的温度为-25C!如果干扰是因素,那么您建议Vin和Vout两端的电容值是多少? (Vin和Vout等于Din和Dout吗?)谢谢Clive。

  11. 嗨,马特,

    感谢您的快速回复。

    That all makes sense. I have wrapped the 1023 division with 浮动 和 now it returns the 温度 至 two decimal 地方 (just like I’d希望如此)。那’s brilliant!

    I’将使用一根电线将tmp36直接放入面包板进行实验。烦人的我’将tmp36密封在多个热收缩层中以使其防水。我知道我可以使用DS18B20(我有一个),但是我’我们已经在GPIO4上运行了另一个需要1-wire接口使用的项目。另外,我想学习如何使用mcp3008。

    慢慢地但可以肯定的是’大家在一起很好-

    谢谢s,
    史蒂夫。

  12. 嗨,您好,

    我有一个简单的问题。我正在尝试找出如何修改“xfer2” 和 “data =”我是否使用8通道12位MCP3208?

    感谢您的帮助!

    罗曼

    • 我认为数据线将变为:

      数据= ((adc[1]&15) << 8) + adc[2]If your received data is : XXXXXXXX XXXXDDDD ddddddddIt grabs the first 4 bits of the second byte (DDDD), shifts them 8 至 the left (to give (DDDD0000). It then adds 上 the third byte 至 give DDDDdddddddd. That's your 12 bits.In the calculation 至 convert the data value into volts you should use 4095 (2^12) rather than 1023 (2^10).I haven't tried this as 我不't have an MCP3208 but I think it looks right 🙂

  13. I’我是树莓派和python的新手,但是我想创建一个具有模拟输入的项目,但是我希望它们在图形中实时显示,有人可以在代码/其他示例中给我一些帮助吗?

    谢谢s a lot

    PS:您创建了一个非常好的指南,已经对我有所帮助-

    西蒙

  14. 嗨,马特,
    精彩的帖子。我正在尝试在Beaglebone Black上做同样的事情。是的,我知道Black有无尽的模拟IO,但我’m使用MCP3008作为保护,看到BBB只能承受1.8伏。
    到目前为止,这是我的代码:

    导入Adafruit_BBIO.SPI,时间,操作系统
    spi = Adafruit_BBIO.SPI.SPI()
    spi.open(0,0)

    def 阅读频道(channel):
    adc = spi.xfer2([1,(8 + channel)<<4,0]) #
    数据= ((adc[1]&3) << 8) + adc[2]
    返回数据

    从此以后,其余部分与您的相同。

    的problem is I keep getting this error message when I run my program.

    ***检测到glibc *** 蟒蛇:双重释放或损坏(fasttop):0x0008fbb0 ***

    你能阐明一点吗?提前致谢。

  15. 嗨我’试图使光不纯净,但是,R如何影响该电路中的V? V始终为3.3V,因为电阻随电流而变化…V等于3.3V。我错了吗?

    • 它形成一个分压器。如果LDR为10K,则ADC输入端的电压为1.65V。如果LDR为大电阻,则电压接近3.3V。如果LDR非常小,则电压趋于0V。因此,随着电阻的变化,电压将在3.3V至0V之间变化。

  16. 乔恩·塞登

    A few people have asked about the code changes for an MCP3208. You have 至 change four lines. 的first is 至 send the data earlier 至 allow time for the greater number of bits in the response:

    adc = spi.xfer2([6 +((4&channel)>>2),(3&channel)<<6,0])

    然后,在计算输出时,您必须包括额外的位:

    数据= ((adc[1]&15) << 8) + adc[2]

    最后,在转换为电压和温度时,您必须应对额外的位:

    volts = (data * 3.3) / 浮动(4095)
    温度=((data * 330)/ float(4095))-50

    我的完整代码位于 http://www.jseddon.co.uk/mcp3208_jon.py

    感谢您的精彩教程–节省了我很多时间。

  17. 大家好,我’得益于本指南,我终于可以工作了!! :0)

    刚才想将此链接到GUI,即Glade或WebIOPi。

    您或任何人有这样做的例子吗?一世’已经尝试了很长时间,但是却无处可寻。只是基本上看到一个值–文本框中的温度……..??

  18. 马特

    这是一篇写得很好并且有用的文章。我需要创建确切的电路,而您的指南则帮助我弄清楚了它。

    感谢您抽出宝贵的时间来发布此内容,以便像我这样的人可以真正理解需要ADC工具时的情况。

    Sopwith

  19. RPi固件更新后,该操作停止了。 (它今天作为Raspbian Jessie aptitude更新; aptitude升级的一部分安装。)在升级之后,/ dev / Spidevx.x设备出了点问题。
    我的解决方案是回到较旧的内核/固件。
    的last working 上e can be installed by using this:
    rpi更新f74b92120e0d469fc5c2dc85b2b5718d877e1cbb
    给我:uname -a
    的Linux raspberrypi 3.12.36+#737 PREEMPT 2015年1月14日星期三19:40:07 GMT 2015 armv6l GNU / 的Linux
    如果有人知道如何在最近的(Raspberry Pi 2 -Ready)Raspbian中工作,请在此处发布和/或修改博客。
    干杯,
    最高

  20. 不错的教程,尽管当我在pi上运行此代码时,spi.xfer2行为我提供了‘invalid syntax’错误。有人可以告诉我我’m doing wrong?
    PS- It seems like I have the Spidev module installed
    提前致谢

  21. 嗨!

    很棒的教程,非常清楚的解释!

    我想测量汽车中的温度传感器。这些传感器接地到汽车,因此只有一个连接器。它们通常与12V一起使用。
    我可以使用该芯片通过Raspberry Pi测量这些传感器吗?

    问候,
    格勒特。

    • 您是使用wget从Bitbucket抓取文本文件还是从网页复制并粘贴?如果复制并粘贴,有时会将空格转换为奇怪的ASCII字符。

  22. 您能否解释一下为什么将Vdd和Vref连接到同一输入?我正在使用AD22100。它需要5V输入。这是否意味着我必须在电路中的Vref上使用5V电压而不是3.3V?我主要可以使用2条不同的电源轨为A / D转换器提供3.3V电压,为传感器和Vref提供5V电压吗?
    谢谢s.

    • Vref设置输入的电压范围,因此我连接到3.3V。 Vdd是电源电压,MCP3008的工作电压为3.3V,因此我将其连接到同一引脚。如果您使用的是Pi,则不想在Pi上施加5V的电压’s 通用输入输出引脚。如果从5V供电,并将5V用作Vref,我认为这将导致5V输出。不好因此,我将其以3.3V电压运行。您可以假设,如果您不是’反之,如果温度超过85度,传感器将永远不会超过3.3V。

      • 不知道这是否安全,但我在玩一个模拟反馈伺服器(我认为)返回的电压在0至5V之间(因为我使用5 V电源驱动伺服器)。反馈电压为您提供伺服的位置。我只是将反馈引线连接到MCP3008。自从我’为了确定如何使用Vref,我将其保持在3.3V电源轨上(与Vdd相同)。它似乎工作正常。我连接了两个反馈伺服器,并且将MCP3008读数校准到其中一个的位置。然后,我可以使用该读数并将位置镜像到第二个伺服器上。我以为它很光滑。一世’我是一个新手,因此可以将此事实作为免责声明。

  23. 弗朗西斯科·萨拉维亚

    我才刚刚开始。您可否发布有关如何将树莓派连接到MCP3008的视频。我是这个新手。

    • 弗朗西斯科·S。

      忽略我的最后评论。有效。我正在使用IDE电缆。但是去了直的连接器。完美,谢谢!

  24. 我想使用MCP3008,但我’m无法将python 3的SPI安装到Raspberry A +上。一世’通过raspi-config并似乎启用了SPI,但是在安装SPI包装程序之后,我的python程序似乎无法找到它。

    我正在使用idle3,因为我喜欢该界面。由于需要通过root特权完成GPIO操作,因此我使用了终端和“sudo idle3”启动空闲3。那’到现在为止对我来说一直很好。

    我找到了另一个教程,展示了如何在通用GPIO引脚上使用MCP3008,并使它工作正常。但是我想了解更多关于SPI的信息,所以来到这里。

    任何帮助将非常感激。谢谢。

    • 我想到了…..

      一时兴起(无奈),我改变了:

      须藤apt-get install 蟒蛇2.7-dev

      须藤apt-get install 蟒蛇3.2-dev

      sudo 蟒蛇 setup.py安装

      sudo 蟒蛇3 setup.py安装

      现在它’的工作。因此,如果其他人有此问题,请尝试。

  25. 如果我想使用树莓派显示频率高于1Mhz的模拟信号怎么办,mcp3008可以完成该工作吗?否则显示速度会很慢。什么是最好的替代选择,我是指ADC。

  26. 你好
    谢谢你这个不错的教程。
    对于我当前的应用,我需要同时读取两个ADC,因此我得到了两个MCP3008,一个连接到CE0,另一个连接到CE1。使用spi.open(0,x)命令,我可以寻址其中两个。但是我怎样才能读出它们呢?
    检查xfer协议,似乎没有包含地址。这是否意味着我必须在读出任何一个MCP后必须打开和关闭spi连接才能切换到另一个?对于总线协议来说这似乎很愚蠢,但是我不能’还没有一个可行的解决方案。
    有什么建议吗?

  27. 你好,

    当我尝试使用您的代码时,出现了以下错误提示:

    TypeError:参数必须是至少一个但不超过4096的列表

    我不’t understand why?

    您知道如何纠正此错误吗?

    谢谢s,

  28. 您好,我也遇到了MAT错误。一切都与您遇到TypeError相同:参数必须是adc = spi.xfer2([1,(8 + channel)行中至少一个但不超过4096的列表<<4,0])。读取频道功能不起作用。我们该如何解决?谢谢

  29. I’使用MCP3008连接到Raspberry Pi。 MCP Vdd为3.3V,来自与Raspberry Pi相同的电源。 MCP的模拟输入之一来自仪表放大器(运放)AD620。一世’我们发现,在5V电压下操作AD620(用于连接称重传感器)比在3.3V电压下工作效果更好。从AD620到MCP3008输入的模拟输入摆幅最大为3.6V。总结一下,我’MCP3008的工作电压为3.3V,其中一个模拟最大可达到3.6V。

    题:
    1 –它是安全的,并且会损坏我的MCP3008。一世’浏览了数据手册并认为它应该是安全的,因为MCP3008的工作电压范围为2.7V– 5.0V
    2一’使用SPI接口将MCP3008连接到Raspberry’s DIN和DOUT引脚。假设MCP3008内部的电路在模拟和数字电路之间是分开的,我认为MCP上的DOUT引脚不会超过Raspberry的最大值并损坏它。

    任何帮助,将不胜感激。

    • 我认为,尽管电压范围是2.7-5.0V,但这仅是用5V供电的。即使有效,我怀疑它不会’不能正确处理3.6V,因为它会高于电源电压。我将添加一个基本电阻分压器,以将incominbg 3.6V缩放至3.3V。

  30. 感谢您的指导。我正在使用LM35温度传感器和mcp3008。我正在获得3.3伏特和280摄氏度的连续值。请您帮忙可能是问题所在。

  31. 嗨,马特

    我已经复制了这个项目,但是它对我不起作用。我遵循了每条指令,并且在从终端进行编译后,它什么也没显示…

    • 我认为Mathworks页面是错误的。他们自己承认0 = 0V和1023 = 3.3V。因此,每个单位等于3.3 / 1023。

      读数0000(最低)为0x(3.3 / 1023)= 0V
      读数1023(最高)是1023x(3.3 / 1023)= 3.3V

      使用其代码获得最大读数1023时,电压计算为1023x(3.3 / 1024)= 3.297V。

      假设范围是0-3,而不是MCP’s 0-1023。 0000 = 0V和0003 = 3.3V您将除以3。每个单位代表1.1。
      0000 = 0x1.1 = 0V
      0001 = 1×1.1=1.1V
      0002 = 2×1.1=2.2V
      0003 = 2×1.1=3.3V
      您将最大电压除以最大值而不是值的总数。

  32. 乔纳斯·隆伯格

    我正在为Brothers赛车的数据记录器工作,这真是太好了,我该如何添加第二个3208?使用两个spi通道来编写此代码?

  33. 戈德比张言彬

    的“spi.xfer2的附加说明”部分将我引向MCP3008数据表,我可以清楚地知道’s going 上 in the “ReadChannel”我在数据手册中看到了图6-1后,便可以使用该功能。

    本文是我最亲切的教程’在Google上进行了搜索。

    非常感谢 !

  34. 嗨,马特,感谢您的教程。
    我正在将MCP3008与Raspberry pi和模拟振动传感器一起使用。我按照您在项目中描述的方式连接了所有电缆,但是当我运行代码时,我得到的值仅在500-550之间。有趣的是:当我触摸传感器时,电压应该增加,但不会增加。我的意思是,无论我是否触摸,它都保持不变。我正在使用CH0来获取电压,但是,当我使用传感器时,CH1值是否正在变化?怪异吗?当传感器连接CHO时,是否可以从CH1获取值?

    • It depends 上 what voltage range the vibration 传感器 outputs. 的MCP3008 will measure a 0-3.3V range. What is the range from the 传感器? If you have nothing connected 至 the other channels ignore them. They will just be measuring random 噪声/interference. Tie them 至 ground 和 they will read 0.

    • 嗨,胡森!您能找到如何获得以勒克斯为单位的光强度值吗?一世’我正在从事与该项目有很多关系的项目,对我来说以勒克斯(lux)展示它非常有用,谢谢!

      • 我认为获取LUX读数的唯一方法是:a)使用已校准的传感器以提供已知LUX水平的已知值,或b)使用测光表来测量传感器在设定的LUX水平下给出的值。

  35. 非常感谢您的这篇文章。 Ive刚刚使用Pi3制作了一个在我们实验室中的某台设备上记录电压的设备,以检查几天内的漂移。我修改了代码以将数据保存为txt文件—一个简单的python插件。还修改了Pi3以直接启动和启动脚本,因此不需要键盘或显示器。如此处所述,您的构建在第一次尝试时就可以完美地工作,并且提供了易于复制的高层次细节。再次感谢您提供非常有用的项目提示。

  36. 嗨!很棒的教程,谢谢!

    那里’但是,在计算中有一点错误:您’d需要除以1024,而不是除1023(如果使用MCP3208,则为4096)

    • 对此有争论。我认为是1023。0V给出的读数为0。5V给出的读数为1023。当馈入纯5V时,读数为1023。然后乘以(5/1024),得到的电压为4.995不是5V 1023除以5V。

    • 的CLK pin is part of the SPI 接口. So it is controlled by the SPI library so you won’在我的代码中看不到对此的任何引用。

  37. 马修·纳蒙(Matthew Najmon)

    我尝试按照自己的Pi进行操作,但是当我开始将您的python代码输入IDLE时,我发现“import Spidev”,并显示一条错误消息,指出没有此类库可供导入。如何获取该库并将其添加到我的Pi中,以便可以继续学习本教程要教的内容?

  38. 沃尔特·菲普斯

    谢谢。经过几年与其他网站的多次尝试,“启用SPI接口”教程中的Python Spi包装器系列终于使我能够安装“spidev” correctly:
    须藤apt-get install 蟒蛇3-spidev 蟒蛇-spidev
    没有它“import Spidev”总是造成故障!我还不知道2个模块的存储位置,但是&您在此页面上的Python代码Spi&Mcp3008正在通信。

发表评论

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.