Wie lese ich Daten von Arduino mit Raspberry Pi über I2C?

Ich habe ein Raspberry Pi 2 Modell B über einen bidirektionalen Level Shifter mit einem Arduino Uno verbunden, von diesem BLOG :

Raspberry pi    GND    ----------   GND     Arduino
                3.3v   ----------   5v
                SCL    ----------   A5
                SDA    ----------   A4

Ich hoffe meine I2C Verbindung ist korrekt.

Und mein Arduino ist an eine 8-Kanal Relaisplatine angeschlossen.

Jetzt habe ich Code geschrieben, in dem ich die Relaisplatine mit dem Raspberry Pi steuern kann. Zum Beispiel, wenn ich '1' drücke, wird Relais 1 hoch.

Jetzt möchte ich Daten vom Arduino zum Raspberry Pi zurücksenden, um zu überprüfen, ob Relais 1 hoch ist oder nicht. Wenn Relais 1 hoch ist, sollte es einige Daten zurück zum Raspberry Pi senden.

Mein Raspberry Pi Code ist:

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

Mein Arduino-Code:

#include 

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

Jetzt, wenn ich 1 gebe, und wegen einer lockeren Verbindung Relais 1 nicht hoch geht, möchte ich, dass der Arduino Daten von der Relaisplatine nimmt und sie jedes Mal an den Raspberry Pi sendet.

Es wird toll sein, wenn jemand auch erklären kann, wie es funktioniert.

Hoffe ich konnte das Problem erklären. Ich habe viel geforscht, konnte aber keine Antwort finden.

Ich bin ein Anfänger in Python, also bitte hilf mir.

Danke im Voraus.

2
Siehe meine Antwort hier zum Anschluss von I2C zwischen einem 3,3V-Gerät und einem 5V-Gerät.
hinzugefügt der Autor Nick Gammon, Quelle
Zeichen '1' ist nicht Nummer 1. Versuchen Sie "Nummer == '1'.
hinzugefügt der Autor Mikael Patel, Quelle
Das ist nicht die Frage, die Frage ist, wie man den Wert von Digital Pin von Arduino zu Rapsberry Pi übergeben.
hinzugefügt der Autor another 'Homo sapien', Quelle

2 Antworten

Vielleicht möchtest du die pigpio-Bibliothek für die Pi-Seite abschließen.

Hier finden Sie Beispiele, wie es funktioniert.

hier ist ein lustiger, der wie Wireshark ist - zeigt dir den I2C Traffic:

https://github.com/joan2937/pigpio/tree/master/ Beispiele/C/I2C_SNIFFER

Here is the FAQ about I2C

1
hinzugefügt

Zeichen '1' ist nicht Nummer 1. Versuchen Sie "Nummer == '1'. - Mikael Patel 9. März 16 um 11:34

0
hinzugefügt
RaspberryPi D-A-CH
RaspberryPi D-A-CH
106 der Teilnehmer

Hier könnt ihr euch über alles rund um die RasPi's unterhalten, diskutieren und gegenseitig helfen Diese Gruppe ist Mitglied im dach-DACH-Verband @dach_DACH Gespeicherte Nachrichten: /notes Achtet bitte auch auf ein gutes Miteinander