Python 使用I2C从arduino上的模拟引脚读取值,并将其发送到raspberry pi。它返回像122或255这样的奇怪数字

Python 使用I2C从arduino上的模拟引脚读取值,并将其发送到raspberry pi。它返回像122或255这样的奇怪数字,python,arduino,raspberry-pi,i2c,Python,Arduino,Raspberry Pi,I2c,设置: 主设备:Raspberry Pi型号B Rev2 从设备:Arduino Uno版本3 问题: 每当我在命令行中输入“r”时,它都会返回一个与实际值完全不符的数字。例如,当我将跨接导线连接到模拟引脚A0至5V并按下命令行上的“r”时,它应返回5伏。它返回255。当我把粗钢丝连接到3.3V引脚时,它返回169 注: 编写此代码的人确实注意到了一些我认为可能与此问题有关的内容。他的话如下 “然后,Arduino中的setup函数设置两个将要使用的回调函数。每当发生on Receive事件时,

设置:

主设备:Raspberry Pi型号B Rev2

从设备:Arduino Uno版本3

问题:

每当我在命令行中输入“r”时,它都会返回一个与实际值完全不符的数字。例如,当我将跨接导线连接到模拟引脚A0至5V并按下命令行上的“r”时,它应返回5伏。它返回255。当我把粗钢丝连接到3.3V引脚时,它返回169

注:

编写此代码的人确实注意到了一些我认为可能与此问题有关的内容。他的话如下

“然后,Arduino中的setup函数设置两个将要使用的回调函数。每当发生on Receive事件时,都将调用函数processMessage。每当从Raspberry Pi发送命令时,就会出现这种情况。另一个回调函数sendAnalogReading与onRequest事件关联。当Raspberry Pi请求数据并将读取模拟值除以4以使其适合单个字节,然后将其发送回Raspberry Pi时,就会发生这种情况。”

我不知道他把值除以一个字节是什么意思。这就是为什么我会得到奇怪的数字吗?有人能解释一下吗

为了让这个线程更清晰,这里是我的设置和通过发出多个命令显示的输出

sudo python ardu_pi_i2c.py//运行了我的程序

第一个场景,我将跳线从引脚A0连接到arduino上的GRD。然后我选择了“r”选项,它给了我“0”

第二种情况是,我将跳线从arduino的引脚A0连接到5V。然后我选择“r”,它给了我“255”

第三种情况下,我将跨接导线从引脚A0连接到3.3V,它给了我171

第四种情况下,我将跨接导线从针脚A0连接到LED的负极,它给了我“0”

第五种情况是,我将跨接导线从针脚A0连接到LED的正极,结果显示为“105”

由于第一个和第四个场景似乎很成功,我很好奇为什么其他数字还有差距,以及它们对它们是否有实际意义

PSUEDO代码:

//Creates instance of SMBus called bus
//Prompts user for command "l" (toggles led) or "r" (reads from Analog pin 0)
//if command is l it writes it to arduino and causes onReceive handler(processmessage)
//if command is r then request_reading function will be called
//this will call read_byte in SMBus library that causes the on Request event to be     invoked. 
PYTHON程序

import smbus
import time
bus = smbus.SMBus(1)
SLAVE_ADDRESS = 0x04
def request_reading():
    reading = int(bus.read_byte(SLAVE_ADDRESS))
    print(reading)
while True:
    command = raw_input("Enter command: l - toggle LED, r - read A0 ")
    if command == 'l' :
        bus.write_byte(SLAVE_ADDRESS, ord('l'))
    elif command == 'r' :
        request_reading()
阿杜伊诺计划

#include <Wire.h>
int SLAVE_ADDRESS = 0x04;
int ledPin = 13;
int analogPin = A0;
boolean ledOn = false;
void setup() 
{
    pinMode(ledPin, OUTPUT);
    Wire.begin(SLAVE_ADDRESS);
    Wire.onReceive(processMessage);
    Wire.onRequest(sendAnalogReading);
    Serial.begin(9600);
}
void loop()
{
}
void processMessage(int n){
  Serial.println("In processMessage");
  char ch = Wire.read();
    if (ch == 'l'){
       toggleLED();}}
void toggleLED(){
  ledOn = ! ledOn;
  digitalWrite(ledPin, ledOn);}
void sendAnalogReading(){
  Serial.println("In sendAnalogReading");
  int reading = analogRead(analogPin);
  Wire.write(reading >> 2);}
#包括
int-SLAVE_地址=0x04;
int-ledPin=13;
int模拟引脚=A0;
布尔ledOn=false;
无效设置()
{
引脚模式(LED引脚,输出);
连线开始(从站地址);
onReceive(processMessage);
在线请求(发送/读取);
Serial.begin(9600);
}
void循环()
{
}
无效处理消息(int n){
Serial.println(“进程内消息”);
char ch=Wire.read();
如果(ch='l'){
切换();}}
void toggled(){
莱顿=!莱顿;
数字写入(ledPin,ledOn);}
void sendreading(){
Serial.println(“In-sendAnalogReading”);
int reading=模拟读取(模拟引脚);
Wire.write(读取>>2);}

我认为输出是一个0-255范围内的数字(一个字节内的所有值),对应于0-5伏的范围。因此,为了将读取的数字转换为电压,您需要

voltage = number * 5.0 / 255.
您会发现,对于
number=255
,您会得到
电压=5.0

对于
number=171
,您会得到
电压=3.35

听起来不错。这意味着LED+ve侧的电压为

105 * 5.0 / 255 = 2.05 V
这不是一个疯狂的价值观