如何通过I2C从Raspberry pi读取Arduino数据

shi*_*vam 6 python arduino i2c raspberry-pi

我通过双向电平移位器将Raspberry pi 2模型B与arduino uno连接起来.

Raspberry pi    GND    ----------   GND     Arduino
                3.3v   ----------   5v
                SCL    ----------   A5
                SDA    ----------   A4
Run Code Online (Sandbox Code Playgroud)

希望我的I2C连接正确吗?

我的Arduino连接到8通道继电器板.

现在我编写了代码,我可以通过Raspberry pi控制Relay板.例如,如果按"1",继电器1变为高电平.

现在我想将数据从arduino发送回raspberry pi,以便交叉检查Relay 1是否为高,如果Relay 1为高,那么它应该将一些数据发送回Raspberry pi,否则不会.

我的Rpi代码是

import smbus
import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)

# This is the address we setup in the Arduino Program
address = 0x04

def writeNumber(value):
    bus.write_byte(address, value)
    # bus.write_byte_data(address, 0, value)
    return -1

def readNumber():
    number = bus.read_byte(address)
    # number = bus.read_byte_data(address, 1)
    return number

while True:
    var = input("")
    if not var:
        continue

    writeNumber(var)
    number = readNumber()
Run Code Online (Sandbox Code Playgroud)

我的Arduino代码:

#include <Wire.h>

#define SLAVE_ADDRESS 0x04
#define RELAY1 9

int number = 0;
int state = 0;

void setup() {
    pinMode(RELAY1, OUTPUT);

    Serial.begin(9600); // start serial for output
    // initialize i2c as slave
    Wire.begin(SLAVE_ADDRESS);

    // define callbacks for i2c communication
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);

    Serial.println("Ready!");
}

void loop() {
    delay(100);
}

// callback for received data
void receiveData(int byteCount){

    while(Wire.available()) {
        number = Wire.read();
        Serial.print("data received: ");
        Serial.println(number);

        if (number == 1){

            if (state == 0){
                digitalWrite(RELAY1, HIGH); // set the LED on
                state = 1;
            }
            else{
                digitalWrite(RELAY1, LOW); // set the LED off
                state = 0;
            }
        }
    }
}

// callback for sending data
void sendData(){
    Wire.write(number);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入1并且由于一些松散的连接,继电器1不会变高,所以在这种情况下我希望arduino从中继板获取数据并每次将其发送到Raspberry pi.

如果有人能够解释它是如何工作的,那将是很棒的.

希望我能够解释这个问题.我做了很多研究,但未能找到答案.

我是python的初学者所以请帮助我.

提前致谢.

小智 0

在arduino代码中像这样更改sendData()函数

void sendData(){
    int relay_status;
    relay_status=digitalRead(4);
    Wire.write(relay_status);
    }
Run Code Online (Sandbox Code Playgroud)

同样在硬件中将第 4 个数字引脚(或任何其他空闲 I/O 引脚)连接到继电器输入。

希望能帮助到你:)